Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Objects / ELinq / GroupByExpressionRewriter.cs / 2 / GroupByExpressionRewriter.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System.Data.Common.CommandTrees; using System.Collections.Generic; using CqtExpression = System.Data.Common.CommandTrees.DbExpression; using LinqExpression = System.Linq.Expressions.Expression; using System.Diagnostics; using System.Data.Metadata.Edm; namespace System.Data.Objects.ELinq { internal sealed partial class ExpressionConverter { ////// Expression visitor that tries to rewrite a given inputExpression to be over the /// optimized translation of a group by input. /// private class GroupByExpressionRewriter : DbExpressionVisitor{ #region Private State private Dictionary > _aggregateDefaultTranslationToOptimizedTranslationInfoMap; private DbCommandTree _commandTree; private string _sourceBindingVariableName; private DbVariableReferenceExpression _optimizedSourceBindingVarRef; private DbGroupByTemplate _optimizedGroupByTemplate; #endregion #region Constructor private GroupByExpressionRewriter(ExpressionConverter parent, CqtExpression inputExpression, string sourceBindingVariableName, DbVariableReferenceExpression optimizedSourceBindingVarRef, DbGroupByTemplate optimizedGroupByTemplate) { _commandTree = parent._commandTree; _aggregateDefaultTranslationToOptimizedTranslationInfoMap = parent._aggregateDefaultTranslationToOptimizedTranslationInfoMap; _sourceBindingVariableName = sourceBindingVariableName; _optimizedSourceBindingVarRef = optimizedSourceBindingVarRef; _optimizedGroupByTemplate = optimizedGroupByTemplate; } #endregion #region Public Surface internal static bool TryRewrite(ExpressionConverter parent, CqtExpression inputExpression, string sourceBindingVariableName, DbVariableReferenceExpression optimizedSourceBindingVarRef, DbGroupByTemplate optimizedGroupByTemplate, out CqtExpression outputExpression) { GroupByExpressionRewriter rewriter = new GroupByExpressionRewriter(parent, inputExpression, sourceBindingVariableName, optimizedSourceBindingVarRef, optimizedGroupByTemplate); outputExpression = rewriter.VisitExpr(inputExpression); return (outputExpression != null); } #endregion #region Visitor Helper Methods public IList VisitList (IList exprList) where T : DbExpression { IList retList = new List (); bool allEqual = true; // if all arguments come back as equal we simply return the input list for (int idx = 0; idx < exprList.Count; idx++) { CqtExpression newListMember = this.VisitExpr(exprList[idx]); if (newListMember == null) { return null; } if (newListMember != exprList[idx]) { allEqual = false; } retList.Add((T)newListMember); } if (allEqual) { retList = exprList; } return retList; } public IList VisitExprList(IList exprList) { return VisitList (exprList); } public DbExpression VisitExpr(DbExpression expr) { return expr.Accept (this); } #endregion #region DbExpressionVisitor Members public override DbExpression Visit(DbExpression e) { throw EntityUtil.NotSupported(System.Data.Entity.Strings.Cqt_General_UnsupportedExpression(e.GetType().FullName)); } public override DbExpression Visit(DbConstantExpression e) { return e; } public override DbExpression Visit(DbNullExpression e) { return e; } public override DbExpression Visit(DbVariableReferenceExpression e) { return null; } public override DbExpression Visit(DbParameterReferenceExpression e) { Debug.Assert(TypeSemantics.IsPrimitiveType(e.ResultType), "Parameters are expected to be of primitive types only"); return e; } public override DbExpression Visit(DbFunctionExpression e) { return null; } public override DbExpression Visit(DbPropertyExpression e) { if (e.Instance.ExpressionKind == DbExpressionKind.VariableReference) { DbVariableReferenceExpression varRefExpression = (DbVariableReferenceExpression)e.Instance; if (varRefExpression.VariableName == _sourceBindingVariableName) { if (e.Property.Name != KeyColumnName) { return null; } return _commandTree.CreatePropertyExpression(KeyColumnName, _optimizedSourceBindingVarRef); } //it may be case that can be handled, but not handling for now return null; } CqtExpression propertyInstance = this.VisitExpr(e.Instance); if (propertyInstance == null) { return null; } return _commandTree.CreatePropertyExpression(e.Property.Name, propertyInstance); } public override DbExpression Visit(DbComparisonExpression e) { DbExpression left = VisitExpr(e.Left); if (left == null) { return null; } DbExpression right = VisitExpr(e.Right); if (right == null) { return null; } if (e.Left == left && e.Right == right) { return e; } switch (e.ExpressionKind) { case DbExpressionKind.Equals: return _commandTree.CreateEqualsExpression(left, right); case DbExpressionKind.NotEquals: return _commandTree.CreateNotEqualsExpression(left, right); case DbExpressionKind.LessThan: return _commandTree.CreateLessThanExpression(left, right); case DbExpressionKind.GreaterThan: return _commandTree.CreateGreaterThanExpression(left, right); case DbExpressionKind.LessThanOrEquals: return _commandTree.CreateLessThanOrEqualsExpression(left, right); case DbExpressionKind.GreaterThanOrEquals: return _commandTree.CreateGreaterThanOrEqualsExpression(left, right); default: Debug.Fail("Unhandled expression kind?"); return null; } } public override DbExpression Visit(DbLikeExpression e) { return null; } public override DbExpression Visit(DbLimitExpression e) { return null; } public override DbExpression Visit(DbIsNullExpression e) { DbExpression operand = this.VisitExpr(e.Argument); if (operand == null) { return null; } if (operand == e.Argument) { return e; } return this._commandTree.CreateIsNullExpression(operand); } public override DbExpression Visit(DbArithmeticExpression e) { IList args = VisitExprList(e.Arguments); if (args == null) { return null; } if (args == e.Arguments) { return e; } switch (e.ExpressionKind) { case DbExpressionKind.Plus: return _commandTree.CreatePlusExpression(args[0], args[1]); case DbExpressionKind.Minus: return _commandTree.CreateMinusExpression(args[0], args[1]); case DbExpressionKind.Multiply: return _commandTree.CreateMultiplyExpression(args[0], args[1]); case DbExpressionKind.Divide: return _commandTree.CreateDivideExpression(args[0], args[1]); case DbExpressionKind.Modulo: return _commandTree.CreateModuloExpression(args[0], args[1]); case DbExpressionKind.UnaryMinus: return _commandTree.CreateUnaryMinusExpression(args[0]); default: Debug.Fail("Unhandled expression kind?"); return null; } } public override DbExpression Visit(DbAndExpression e) { DbExpression left = VisitExpr(e.Left); if (left == null) { return null; } DbExpression right = VisitExpr(e.Right); if (right == null) { return null; } if (e.Left == left && e.Right == right) { return e; } return _commandTree.CreateAndExpression(left, right); } public override DbExpression Visit(DbOrExpression e) { DbExpression left = VisitExpr(e.Left); if (left == null) { return null; } DbExpression right = VisitExpr(e.Right); if (right == null) { return null; } if (e.Left == left && e.Right == right) { return e; } return _commandTree.CreateOrExpression(left, right); } public override DbExpression Visit(DbNotExpression e) { DbExpression operand = this.VisitExpr(e.Argument); if (operand == null) { return null; } if (operand == e.Argument) { return e; } return this._commandTree.CreateNotExpression(operand); } public override DbExpression Visit(DbDistinctExpression e) { return null; } public override DbExpression Visit(DbElementExpression e) { //Aggregate by default get translated as ElementExpressions KeyValuePair optimizedAggregateInfo; if (!_aggregateDefaultTranslationToOptimizedTranslationInfoMap.TryGetValue(e, out optimizedAggregateInfo)) { return null; } //Make sure it was optimized over this group by. if (optimizedAggregateInfo.Key != _optimizedGroupByTemplate) { return null; } return _commandTree.CreatePropertyExpression(optimizedAggregateInfo.Value, _optimizedSourceBindingVarRef); } public override DbExpression Visit(DbIsEmptyExpression e) { return null; } public override DbExpression Visit(DbUnionAllExpression e) { return null; } public override DbExpression Visit(DbIntersectExpression e) { return null; } public override DbExpression Visit(DbExceptExpression e) { return null; } public override DbExpression Visit(DbTreatExpression e) { return null; } public override DbExpression Visit(DbCastExpression e) { CqtExpression arg = this.VisitExpr(e.Argument); if (arg == null) { return null; } if (arg == e.Argument) { return e; } return _commandTree.CreateCastExpression(arg, e.ResultType); } public override DbExpression Visit(DbIsOfExpression e) { return null; } public override DbExpression Visit(DbOfTypeExpression e) { return null; } public override DbExpression Visit(DbCaseExpression e) { IList whens = VisitExprList(e.When); if (whens == null) { return null; } IList thens = VisitExprList(e.Then); if (thens == null) { return null; } CqtExpression elseClause = VisitExpr(e.Else); if (elseClause == null) { return null; } if (whens == e.When && thens == e.Then && elseClause == e.Else) { return e; } return _commandTree.CreateCaseExpression(whens, thens, elseClause); } public override DbExpression Visit(DbNewInstanceExpression e) { IList newArguments = VisitExprList(e.Arguments); if (newArguments == null) { return null; } if (newArguments == e.Arguments) { return e; } return _commandTree.CreateNewInstanceExpression(e.ResultType, newArguments); } public override DbExpression Visit(DbRefExpression e) { return null; } public override DbExpression Visit(DbRelationshipNavigationExpression e) { return null; } public override DbExpression Visit(DbDerefExpression e) { return null; } public override DbExpression Visit(DbRefKeyExpression e) { return null; } public override DbExpression Visit(DbEntityRefExpression e) { return null; } public override DbExpression Visit(DbScanExpression e) { return null; } public override DbExpression Visit(DbFilterExpression e) { return null; } public override DbExpression Visit(DbProjectExpression e) { return null; } public override DbExpression Visit(DbCrossJoinExpression e) { return null; } public override DbExpression Visit(DbJoinExpression e) { return null; } public override DbExpression Visit(DbApplyExpression e) { return null; } public override DbExpression Visit(DbGroupByExpression e) { return null; } public override DbExpression Visit(DbSkipExpression e) { return null; } public override DbExpression Visit(DbSortExpression e) { return null; } public override DbExpression Visit(DbQuantifierExpression e) { return null; } #endregion } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System.Data.Common.CommandTrees; using System.Collections.Generic; using CqtExpression = System.Data.Common.CommandTrees.DbExpression; using LinqExpression = System.Linq.Expressions.Expression; using System.Diagnostics; using System.Data.Metadata.Edm; namespace System.Data.Objects.ELinq { internal sealed partial class ExpressionConverter { ////// Expression visitor that tries to rewrite a given inputExpression to be over the /// optimized translation of a group by input. /// private class GroupByExpressionRewriter : DbExpressionVisitor{ #region Private State private Dictionary > _aggregateDefaultTranslationToOptimizedTranslationInfoMap; private DbCommandTree _commandTree; private string _sourceBindingVariableName; private DbVariableReferenceExpression _optimizedSourceBindingVarRef; private DbGroupByTemplate _optimizedGroupByTemplate; #endregion #region Constructor private GroupByExpressionRewriter(ExpressionConverter parent, CqtExpression inputExpression, string sourceBindingVariableName, DbVariableReferenceExpression optimizedSourceBindingVarRef, DbGroupByTemplate optimizedGroupByTemplate) { _commandTree = parent._commandTree; _aggregateDefaultTranslationToOptimizedTranslationInfoMap = parent._aggregateDefaultTranslationToOptimizedTranslationInfoMap; _sourceBindingVariableName = sourceBindingVariableName; _optimizedSourceBindingVarRef = optimizedSourceBindingVarRef; _optimizedGroupByTemplate = optimizedGroupByTemplate; } #endregion #region Public Surface internal static bool TryRewrite(ExpressionConverter parent, CqtExpression inputExpression, string sourceBindingVariableName, DbVariableReferenceExpression optimizedSourceBindingVarRef, DbGroupByTemplate optimizedGroupByTemplate, out CqtExpression outputExpression) { GroupByExpressionRewriter rewriter = new GroupByExpressionRewriter(parent, inputExpression, sourceBindingVariableName, optimizedSourceBindingVarRef, optimizedGroupByTemplate); outputExpression = rewriter.VisitExpr(inputExpression); return (outputExpression != null); } #endregion #region Visitor Helper Methods public IList VisitList (IList exprList) where T : DbExpression { IList retList = new List (); bool allEqual = true; // if all arguments come back as equal we simply return the input list for (int idx = 0; idx < exprList.Count; idx++) { CqtExpression newListMember = this.VisitExpr(exprList[idx]); if (newListMember == null) { return null; } if (newListMember != exprList[idx]) { allEqual = false; } retList.Add((T)newListMember); } if (allEqual) { retList = exprList; } return retList; } public IList VisitExprList(IList exprList) { return VisitList (exprList); } public DbExpression VisitExpr(DbExpression expr) { return expr.Accept (this); } #endregion #region DbExpressionVisitor Members public override DbExpression Visit(DbExpression e) { throw EntityUtil.NotSupported(System.Data.Entity.Strings.Cqt_General_UnsupportedExpression(e.GetType().FullName)); } public override DbExpression Visit(DbConstantExpression e) { return e; } public override DbExpression Visit(DbNullExpression e) { return e; } public override DbExpression Visit(DbVariableReferenceExpression e) { return null; } public override DbExpression Visit(DbParameterReferenceExpression e) { Debug.Assert(TypeSemantics.IsPrimitiveType(e.ResultType), "Parameters are expected to be of primitive types only"); return e; } public override DbExpression Visit(DbFunctionExpression e) { return null; } public override DbExpression Visit(DbPropertyExpression e) { if (e.Instance.ExpressionKind == DbExpressionKind.VariableReference) { DbVariableReferenceExpression varRefExpression = (DbVariableReferenceExpression)e.Instance; if (varRefExpression.VariableName == _sourceBindingVariableName) { if (e.Property.Name != KeyColumnName) { return null; } return _commandTree.CreatePropertyExpression(KeyColumnName, _optimizedSourceBindingVarRef); } //it may be case that can be handled, but not handling for now return null; } CqtExpression propertyInstance = this.VisitExpr(e.Instance); if (propertyInstance == null) { return null; } return _commandTree.CreatePropertyExpression(e.Property.Name, propertyInstance); } public override DbExpression Visit(DbComparisonExpression e) { DbExpression left = VisitExpr(e.Left); if (left == null) { return null; } DbExpression right = VisitExpr(e.Right); if (right == null) { return null; } if (e.Left == left && e.Right == right) { return e; } switch (e.ExpressionKind) { case DbExpressionKind.Equals: return _commandTree.CreateEqualsExpression(left, right); case DbExpressionKind.NotEquals: return _commandTree.CreateNotEqualsExpression(left, right); case DbExpressionKind.LessThan: return _commandTree.CreateLessThanExpression(left, right); case DbExpressionKind.GreaterThan: return _commandTree.CreateGreaterThanExpression(left, right); case DbExpressionKind.LessThanOrEquals: return _commandTree.CreateLessThanOrEqualsExpression(left, right); case DbExpressionKind.GreaterThanOrEquals: return _commandTree.CreateGreaterThanOrEqualsExpression(left, right); default: Debug.Fail("Unhandled expression kind?"); return null; } } public override DbExpression Visit(DbLikeExpression e) { return null; } public override DbExpression Visit(DbLimitExpression e) { return null; } public override DbExpression Visit(DbIsNullExpression e) { DbExpression operand = this.VisitExpr(e.Argument); if (operand == null) { return null; } if (operand == e.Argument) { return e; } return this._commandTree.CreateIsNullExpression(operand); } public override DbExpression Visit(DbArithmeticExpression e) { IList args = VisitExprList(e.Arguments); if (args == null) { return null; } if (args == e.Arguments) { return e; } switch (e.ExpressionKind) { case DbExpressionKind.Plus: return _commandTree.CreatePlusExpression(args[0], args[1]); case DbExpressionKind.Minus: return _commandTree.CreateMinusExpression(args[0], args[1]); case DbExpressionKind.Multiply: return _commandTree.CreateMultiplyExpression(args[0], args[1]); case DbExpressionKind.Divide: return _commandTree.CreateDivideExpression(args[0], args[1]); case DbExpressionKind.Modulo: return _commandTree.CreateModuloExpression(args[0], args[1]); case DbExpressionKind.UnaryMinus: return _commandTree.CreateUnaryMinusExpression(args[0]); default: Debug.Fail("Unhandled expression kind?"); return null; } } public override DbExpression Visit(DbAndExpression e) { DbExpression left = VisitExpr(e.Left); if (left == null) { return null; } DbExpression right = VisitExpr(e.Right); if (right == null) { return null; } if (e.Left == left && e.Right == right) { return e; } return _commandTree.CreateAndExpression(left, right); } public override DbExpression Visit(DbOrExpression e) { DbExpression left = VisitExpr(e.Left); if (left == null) { return null; } DbExpression right = VisitExpr(e.Right); if (right == null) { return null; } if (e.Left == left && e.Right == right) { return e; } return _commandTree.CreateOrExpression(left, right); } public override DbExpression Visit(DbNotExpression e) { DbExpression operand = this.VisitExpr(e.Argument); if (operand == null) { return null; } if (operand == e.Argument) { return e; } return this._commandTree.CreateNotExpression(operand); } public override DbExpression Visit(DbDistinctExpression e) { return null; } public override DbExpression Visit(DbElementExpression e) { //Aggregate by default get translated as ElementExpressions KeyValuePair optimizedAggregateInfo; if (!_aggregateDefaultTranslationToOptimizedTranslationInfoMap.TryGetValue(e, out optimizedAggregateInfo)) { return null; } //Make sure it was optimized over this group by. if (optimizedAggregateInfo.Key != _optimizedGroupByTemplate) { return null; } return _commandTree.CreatePropertyExpression(optimizedAggregateInfo.Value, _optimizedSourceBindingVarRef); } public override DbExpression Visit(DbIsEmptyExpression e) { return null; } public override DbExpression Visit(DbUnionAllExpression e) { return null; } public override DbExpression Visit(DbIntersectExpression e) { return null; } public override DbExpression Visit(DbExceptExpression e) { return null; } public override DbExpression Visit(DbTreatExpression e) { return null; } public override DbExpression Visit(DbCastExpression e) { CqtExpression arg = this.VisitExpr(e.Argument); if (arg == null) { return null; } if (arg == e.Argument) { return e; } return _commandTree.CreateCastExpression(arg, e.ResultType); } public override DbExpression Visit(DbIsOfExpression e) { return null; } public override DbExpression Visit(DbOfTypeExpression e) { return null; } public override DbExpression Visit(DbCaseExpression e) { IList whens = VisitExprList(e.When); if (whens == null) { return null; } IList thens = VisitExprList(e.Then); if (thens == null) { return null; } CqtExpression elseClause = VisitExpr(e.Else); if (elseClause == null) { return null; } if (whens == e.When && thens == e.Then && elseClause == e.Else) { return e; } return _commandTree.CreateCaseExpression(whens, thens, elseClause); } public override DbExpression Visit(DbNewInstanceExpression e) { IList newArguments = VisitExprList(e.Arguments); if (newArguments == null) { return null; } if (newArguments == e.Arguments) { return e; } return _commandTree.CreateNewInstanceExpression(e.ResultType, newArguments); } public override DbExpression Visit(DbRefExpression e) { return null; } public override DbExpression Visit(DbRelationshipNavigationExpression e) { return null; } public override DbExpression Visit(DbDerefExpression e) { return null; } public override DbExpression Visit(DbRefKeyExpression e) { return null; } public override DbExpression Visit(DbEntityRefExpression e) { return null; } public override DbExpression Visit(DbScanExpression e) { return null; } public override DbExpression Visit(DbFilterExpression e) { return null; } public override DbExpression Visit(DbProjectExpression e) { return null; } public override DbExpression Visit(DbCrossJoinExpression e) { return null; } public override DbExpression Visit(DbJoinExpression e) { return null; } public override DbExpression Visit(DbApplyExpression e) { return null; } public override DbExpression Visit(DbGroupByExpression e) { return null; } public override DbExpression Visit(DbSkipExpression e) { return null; } public override DbExpression Visit(DbSortExpression e) { return null; } public override DbExpression Visit(DbQuantifierExpression e) { return null; } #endregion } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AncestorChangedEventArgs.cs
- EntityDataSourceDataSelectionPanel.cs
- NamedObject.cs
- WebServicesSection.cs
- CrossContextChannel.cs
- KeyEvent.cs
- ParserOptions.cs
- AddInAttribute.cs
- MediaEntryAttribute.cs
- SymbolMethod.cs
- OdbcException.cs
- BindingListCollectionView.cs
- Directory.cs
- KnownTypeHelper.cs
- EntityKeyElement.cs
- NamespaceCollection.cs
- CalendarAutoFormat.cs
- InstancePersistenceException.cs
- HttpCachePolicyElement.cs
- PolyQuadraticBezierSegment.cs
- SqlDataSourceEnumerator.cs
- LayoutEvent.cs
- CngProperty.cs
- TableParagraph.cs
- FormViewPageEventArgs.cs
- LazyTextWriterCreator.cs
- TextCompositionEventArgs.cs
- ListViewItem.cs
- FactoryGenerator.cs
- ColorAnimationUsingKeyFrames.cs
- mediaeventshelper.cs
- namescope.cs
- LogArchiveSnapshot.cs
- BindingSource.cs
- CompiledXpathExpr.cs
- AnnotationAuthorChangedEventArgs.cs
- HostExecutionContextManager.cs
- BadImageFormatException.cs
- Effect.cs
- DesignerAutoFormat.cs
- OdbcDataAdapter.cs
- SourceFilter.cs
- RuleSetCollection.cs
- ReadOnlyDataSource.cs
- assemblycache.cs
- BlurEffect.cs
- ContextMenu.cs
- XPathNodePointer.cs
- SharingService.cs
- TouchEventArgs.cs
- QuaternionKeyFrameCollection.cs
- NavigationWindow.cs
- HtmlLink.cs
- UpDownEvent.cs
- CollectionChangeEventArgs.cs
- HttpCacheParams.cs
- MessageDirection.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- TextEffectResolver.cs
- ToolStripContainerDesigner.cs
- KnownBoxes.cs
- LayoutUtils.cs
- IntranetCredentialPolicy.cs
- CacheEntry.cs
- TargetException.cs
- ServiceActivationException.cs
- TemplatedMailWebEventProvider.cs
- RegexReplacement.cs
- DispatcherExceptionEventArgs.cs
- AesCryptoServiceProvider.cs
- GradientSpreadMethodValidation.cs
- PathFigureCollection.cs
- QueueProcessor.cs
- LowerCaseStringConverter.cs
- OfTypeExpression.cs
- XPathNodeIterator.cs
- TextContainerChangeEventArgs.cs
- DbQueryCommandTree.cs
- BlurBitmapEffect.cs
- ByeOperation11AsyncResult.cs
- CircleHotSpot.cs
- EntityException.cs
- SqlAliaser.cs
- WindowsBrush.cs
- DynamicPhysicalDiscoSearcher.cs
- ProgressBarBrushConverter.cs
- CustomAttributeBuilder.cs
- XmlCountingReader.cs
- IssuanceTokenProviderBase.cs
- DesignerActionUIService.cs
- CompilerWrapper.cs
- DataGridViewButtonColumn.cs
- ChannelToken.cs
- GregorianCalendarHelper.cs
- XmlSubtreeReader.cs
- BaseCodeDomTreeGenerator.cs
- Misc.cs
- Int16.cs
- PolicyException.cs
- HashHelper.cs