Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlLiftIndependentRowExpressions.cs / 1 / SqlLiftIndependentRowExpressions.cs
using System; using System.Collections.Generic; using System.Text; using System.Diagnostics.CodeAnalysis; namespace System.Data.Linq.SqlClient { ////// Find projection expressions on the right side of CROSS APPLY that do not /// depend exclusively on right side productions and move them outside of the /// CROSS APPLY by enclosing the CROSS APPLY with a new source. /// class SqlLiftIndependentRowExpressions { internal static SqlNode Lift(SqlNode node) { ColumnLifter cl = new ColumnLifter(); node = cl.Visit(node); return node; } private class ColumnLifter : SqlVisitor { SelectScope expressionSink; SqlAggregateChecker aggregateChecker; internal ColumnLifter() { this.aggregateChecker = new SqlAggregateChecker(); } class SelectScope { // Stack of projections lifted from the right to be pushed on the left. internal Stack> Lifted = new Stack
>(); internal IEnumerable
LeftProduction; internal HashSet ReferencedExpressions = new HashSet (); } internal override SqlSelect VisitSelect(SqlSelect select) { SelectScope s = expressionSink; // Don't lift through a TOP. if (select.Top != null) { expressionSink = null; } // Don't lift through a GROUP BY (or implicit GROUP BY). if (select.GroupBy.Count > 0 || this.aggregateChecker.HasAggregates(select)) { expressionSink = null; } // Don't lift through DISTINCT if (select.IsDistinct) { expressionSink = null; } if (expressionSink != null) { List keep = new List (); List lift = new List (); foreach (SqlColumn sc in select.Row.Columns) { bool referencesLeftsideAliases = SqlAliasesReferenced.ReferencesAny(sc.Expression, expressionSink.LeftProduction); bool isLockedExpression = expressionSink.ReferencedExpressions.Contains(sc); if (referencesLeftsideAliases && !isLockedExpression) { lift.Add(sc); } else { keep.Add(sc); } } select.Row.Columns.Clear(); select.Row.Columns.AddRange(keep); if (lift.Count > 0) { expressionSink.Lifted.Push(lift); } } SqlSelect sel = base.VisitSelect(select); expressionSink = s; return sel; } internal override SqlExpression VisitColumnRef(SqlColumnRef cref) { if (expressionSink!=null) { expressionSink.ReferencedExpressions.Add(cref.Column); } return cref; } internal override SqlSource VisitJoin(SqlJoin join) { if (join.JoinType == SqlJoinType.CrossApply) { // Visit the left side as usual. join.Left = this.VisitSource(join.Left); // Visit the condition as usual. join.Condition = this.VisitExpression(join.Condition); // Visit the right, with the expressionSink set. SelectScope s = expressionSink; expressionSink = new SelectScope(); expressionSink.LeftProduction = SqlGatherProducedAliases.Gather(join.Left); join.Right = this.VisitSource(join.Right); // Were liftable expressions found? SqlSource newSource = join; foreach (List cols in expressionSink.Lifted) { newSource = PushSourceDown(newSource, cols); } expressionSink = s; return newSource; } return base.VisitJoin(join); } [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Unknown reason.")] private SqlSource PushSourceDown(SqlSource sqlSource, List cols) { SqlSelect ns = new SqlSelect(new SqlNop(cols[0].ClrType, cols[0].SqlType, sqlSource.SourceExpression), sqlSource, sqlSource.SourceExpression); ns.Row.Columns.AddRange(cols); return new SqlAlias(ns); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections.Generic; using System.Text; using System.Diagnostics.CodeAnalysis; namespace System.Data.Linq.SqlClient { /// /// Find projection expressions on the right side of CROSS APPLY that do not /// depend exclusively on right side productions and move them outside of the /// CROSS APPLY by enclosing the CROSS APPLY with a new source. /// class SqlLiftIndependentRowExpressions { internal static SqlNode Lift(SqlNode node) { ColumnLifter cl = new ColumnLifter(); node = cl.Visit(node); return node; } private class ColumnLifter : SqlVisitor { SelectScope expressionSink; SqlAggregateChecker aggregateChecker; internal ColumnLifter() { this.aggregateChecker = new SqlAggregateChecker(); } class SelectScope { // Stack of projections lifted from the right to be pushed on the left. internal Stack> Lifted = new Stack
>(); internal IEnumerable
LeftProduction; internal HashSet ReferencedExpressions = new HashSet (); } internal override SqlSelect VisitSelect(SqlSelect select) { SelectScope s = expressionSink; // Don't lift through a TOP. if (select.Top != null) { expressionSink = null; } // Don't lift through a GROUP BY (or implicit GROUP BY). if (select.GroupBy.Count > 0 || this.aggregateChecker.HasAggregates(select)) { expressionSink = null; } // Don't lift through DISTINCT if (select.IsDistinct) { expressionSink = null; } if (expressionSink != null) { List keep = new List (); List lift = new List (); foreach (SqlColumn sc in select.Row.Columns) { bool referencesLeftsideAliases = SqlAliasesReferenced.ReferencesAny(sc.Expression, expressionSink.LeftProduction); bool isLockedExpression = expressionSink.ReferencedExpressions.Contains(sc); if (referencesLeftsideAliases && !isLockedExpression) { lift.Add(sc); } else { keep.Add(sc); } } select.Row.Columns.Clear(); select.Row.Columns.AddRange(keep); if (lift.Count > 0) { expressionSink.Lifted.Push(lift); } } SqlSelect sel = base.VisitSelect(select); expressionSink = s; return sel; } internal override SqlExpression VisitColumnRef(SqlColumnRef cref) { if (expressionSink!=null) { expressionSink.ReferencedExpressions.Add(cref.Column); } return cref; } internal override SqlSource VisitJoin(SqlJoin join) { if (join.JoinType == SqlJoinType.CrossApply) { // Visit the left side as usual. join.Left = this.VisitSource(join.Left); // Visit the condition as usual. join.Condition = this.VisitExpression(join.Condition); // Visit the right, with the expressionSink set. SelectScope s = expressionSink; expressionSink = new SelectScope(); expressionSink.LeftProduction = SqlGatherProducedAliases.Gather(join.Left); join.Right = this.VisitSource(join.Right); // Were liftable expressions found? SqlSource newSource = join; foreach (List cols in expressionSink.Lifted) { newSource = PushSourceDown(newSource, cols); } expressionSink = s; return newSource; } return base.VisitJoin(join); } [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Unknown reason.")] private SqlSource PushSourceDown(SqlSource sqlSource, List cols) { SqlSelect ns = new SqlSelect(new SqlNop(cols[0].ClrType, cols[0].SqlType, sqlSource.SourceExpression), sqlSource, sqlSource.SourceExpression); ns.Row.Columns.AddRange(cols); return new SqlAlias(ns); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RoutedPropertyChangedEventArgs.cs
- TextLineResult.cs
- XmlSchemaObject.cs
- ByteStack.cs
- UpDownEvent.cs
- DbXmlEnabledProviderManifest.cs
- _ConnectStream.cs
- Single.cs
- ScriptRef.cs
- LinqDataSourceHelper.cs
- ExpressionLexer.cs
- ValidationContext.cs
- GenericRootAutomationPeer.cs
- DesignTimeTemplateParser.cs
- RowSpanVector.cs
- UnionCodeGroup.cs
- SafeProcessHandle.cs
- Char.cs
- ClonableStack.cs
- WebPartAuthorizationEventArgs.cs
- BitmapEffectOutputConnector.cs
- SeparatorAutomationPeer.cs
- HttpPostedFile.cs
- MetadataItemSerializer.cs
- CatchDesigner.xaml.cs
- Label.cs
- DependencyObjectPropertyDescriptor.cs
- SqlRowUpdatedEvent.cs
- DataTableClearEvent.cs
- XmlDataFileEditor.cs
- ContainerActivationHelper.cs
- AQNBuilder.cs
- WebMessageEncodingElement.cs
- ServiceDescriptionReflector.cs
- ScrollBarAutomationPeer.cs
- ScriptingWebServicesSectionGroup.cs
- WebPartVerb.cs
- FilteredDataSetHelper.cs
- PersonalizationStateQuery.cs
- TimeSpanConverter.cs
- CustomErrorsSectionWrapper.cs
- HyperlinkAutomationPeer.cs
- Base64Decoder.cs
- TypeBuilderInstantiation.cs
- XmlTextWriter.cs
- XmlChildEnumerator.cs
- UnsafeNativeMethodsTablet.cs
- DataGridItemEventArgs.cs
- HttpCapabilitiesSectionHandler.cs
- Internal.cs
- ArglessEventHandlerProxy.cs
- AnonymousIdentificationSection.cs
- DiscriminatorMap.cs
- SplineKeyFrames.cs
- SafeRightsManagementHandle.cs
- APCustomTypeDescriptor.cs
- HtmlInputPassword.cs
- CommonDialog.cs
- initElementDictionary.cs
- Panel.cs
- Image.cs
- XmlExpressionDumper.cs
- IsolationInterop.cs
- Throw.cs
- TextServicesCompartmentEventSink.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- PickBranch.cs
- KeyEventArgs.cs
- unitconverter.cs
- HttpResponse.cs
- StackBuilderSink.cs
- ExeContext.cs
- XmlDataCollection.cs
- ProfileBuildProvider.cs
- DocumentApplicationJournalEntry.cs
- UrlMappingCollection.cs
- NotImplementedException.cs
- DelegateTypeInfo.cs
- GeometryCollection.cs
- DocumentPageViewAutomationPeer.cs
- FixedFindEngine.cs
- CalendarDateChangedEventArgs.cs
- IApplicationTrustManager.cs
- SspiSecurityTokenParameters.cs
- RenamedEventArgs.cs
- SamlAudienceRestrictionCondition.cs
- PageBreakRecord.cs
- unitconverter.cs
- ErrorStyle.cs
- BitmapCodecInfoInternal.cs
- Switch.cs
- IxmlLineInfo.cs
- Attributes.cs
- cache.cs
- DefaultValueTypeConverter.cs
- QueryOperationResponseOfT.cs
- InvalidCastException.cs
- ListViewCancelEventArgs.cs
- DataGridViewComponentPropertyGridSite.cs
- TypeSemantics.cs