Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Objects / ELinq / GroupByExpressionRewriter.cs / 1 / 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
- XmlTextAttribute.cs
- ReferenceService.cs
- DesignTimeParseData.cs
- ObjectResult.cs
- NumericUpDownAccelerationCollection.cs
- BuildProvidersCompiler.cs
- StylusPlugin.cs
- ExtendedPropertyDescriptor.cs
- OperationInvokerBehavior.cs
- TextPenaltyModule.cs
- FixUpCollection.cs
- SelectionItemProviderWrapper.cs
- RemoveStoryboard.cs
- StorageFunctionMapping.cs
- DataChangedEventManager.cs
- SettingsBindableAttribute.cs
- CodeMemberMethod.cs
- XmlAnyElementAttributes.cs
- UnmanagedBitmapWrapper.cs
- QueryTaskGroupState.cs
- RootCodeDomSerializer.cs
- SessionEndingCancelEventArgs.cs
- DesignerActionMethodItem.cs
- SqlDataSourceCommandEventArgs.cs
- PopOutPanel.cs
- ProtocolsSection.cs
- DataGridParentRows.cs
- Separator.cs
- EditorPartChrome.cs
- ValidatingReaderNodeData.cs
- BinaryWriter.cs
- DataColumnSelectionConverter.cs
- SqlDataSourceStatusEventArgs.cs
- TcpHostedTransportConfiguration.cs
- QuaternionAnimationUsingKeyFrames.cs
- CodeDelegateInvokeExpression.cs
- SymLanguageType.cs
- Pen.cs
- AssemblyCacheEntry.cs
- EncoderParameters.cs
- URLIdentityPermission.cs
- WebPart.cs
- TriggerBase.cs
- EdmEntityTypeAttribute.cs
- OdbcConnectionPoolProviderInfo.cs
- TextShapeableCharacters.cs
- FlowchartDesigner.xaml.cs
- ControlOperationBehavior.cs
- TypeSystemHelpers.cs
- StreamWriter.cs
- JumpTask.cs
- CodeGenerator.cs
- Attributes.cs
- StorageAssociationTypeMapping.cs
- localization.cs
- ObjectStateEntryOriginalDbUpdatableDataRecord.cs
- DetailsViewInsertEventArgs.cs
- SimpleHandlerFactory.cs
- MemoryFailPoint.cs
- ServiceReference.cs
- GeometryDrawing.cs
- OptimizerPatterns.cs
- DataFormats.cs
- _BufferOffsetSize.cs
- XslAst.cs
- XmlSchemaSequence.cs
- ScriptRef.cs
- LayoutTableCell.cs
- TableLayoutStyleCollection.cs
- LassoHelper.cs
- UnmanagedMemoryStreamWrapper.cs
- SmtpSection.cs
- InstanceKeyNotReadyException.cs
- PlanCompilerUtil.cs
- ButtonFieldBase.cs
- DataMemberFieldEditor.cs
- SpinWait.cs
- RightsController.cs
- TreeNodeEventArgs.cs
- _ServiceNameStore.cs
- WebException.cs
- MulticastDelegate.cs
- HMACMD5.cs
- _StreamFramer.cs
- Point3DAnimationUsingKeyFrames.cs
- SqlConnectionHelper.cs
- ConfigurationSettings.cs
- ParamArrayAttribute.cs
- TcpPortSharing.cs
- NegotiateStream.cs
- Clipboard.cs
- ThreadExceptionDialog.cs
- BufferedResponseStream.cs
- BaseDataList.cs
- UserCancellationException.cs
- ControlSerializer.cs
- LinkConverter.cs
- ListViewItem.cs
- TableNameAttribute.cs
- TextEditorLists.cs