Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlLiftIndependentRowExpressions.cs / 2 / 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
- TextFormatterImp.cs
- ClientScriptManager.cs
- StylusPointPropertyInfo.cs
- BitmapVisualManager.cs
- ApplyTemplatesAction.cs
- ReadOnlyHierarchicalDataSource.cs
- DesignerProperties.cs
- ClientSettingsProvider.cs
- HttpProtocolImporter.cs
- ReflectionTypeLoadException.cs
- WSHttpBindingBaseElement.cs
- AccessedThroughPropertyAttribute.cs
- RtfControlWordInfo.cs
- InvalidPropValue.cs
- ClientConfigurationSystem.cs
- CounterSample.cs
- IOException.cs
- EncoderFallback.cs
- GlyphCache.cs
- ServiceHttpModule.cs
- DynamicValidator.cs
- XmlComplianceUtil.cs
- WorkflowWebHostingModule.cs
- RunInstallerAttribute.cs
- CreateUserErrorEventArgs.cs
- MemberRelationshipService.cs
- UnionExpr.cs
- SafeNativeMethodsCLR.cs
- ScriptComponentDescriptor.cs
- UInt32Converter.cs
- ExtensionSimplifierMarkupObject.cs
- Binding.cs
- InheritablePropertyChangeInfo.cs
- WebPartConnectionsCloseVerb.cs
- CookieParameter.cs
- DBConnectionString.cs
- DataConnectionHelper.cs
- TextEditorCharacters.cs
- XmlCodeExporter.cs
- Switch.cs
- ArrangedElementCollection.cs
- DeploymentSectionCache.cs
- ThemeableAttribute.cs
- SmtpNegotiateAuthenticationModule.cs
- Rect3DValueSerializer.cs
- AmbiguousMatchException.cs
- SqlProviderServices.cs
- CardSpaceSelector.cs
- LineInfo.cs
- Rights.cs
- ColorTransformHelper.cs
- StorageEndPropertyMapping.cs
- ElementHostAutomationPeer.cs
- designeractionbehavior.cs
- StreamAsIStream.cs
- OptimalTextSource.cs
- CheckBoxAutomationPeer.cs
- ColorInterpolationModeValidation.cs
- DispatchOperationRuntime.cs
- LineBreakRecord.cs
- ConnectionOrientedTransportManager.cs
- DelayedRegex.cs
- SafeRegistryHandle.cs
- Quad.cs
- TimeSpanMinutesOrInfiniteConverter.cs
- _UriTypeConverter.cs
- Odbc32.cs
- ExitEventArgs.cs
- WebPartZoneBase.cs
- DtcInterfaces.cs
- BaseComponentEditor.cs
- WCFServiceClientProxyGenerator.cs
- LayoutTable.cs
- Ops.cs
- CoreSwitches.cs
- CursorConverter.cs
- DataException.cs
- PageClientProxyGenerator.cs
- ScopedKnownTypes.cs
- MetafileHeader.cs
- AvTraceDetails.cs
- DomNameTable.cs
- LicenseProviderAttribute.cs
- WindowsListViewSubItem.cs
- Code.cs
- DataGridViewMethods.cs
- Pen.cs
- DefaultTraceListener.cs
- BidPrivateBase.cs
- ControlPersister.cs
- WorkflowDesigner.cs
- GeneralTransform3DGroup.cs
- StrokeCollectionConverter.cs
- RSAPKCS1SignatureFormatter.cs
- HostProtectionPermission.cs
- ClientTargetSection.cs
- XPathNavigatorReader.cs
- EntityDataSourceWrapperCollection.cs
- DoubleLink.cs
- VolatileResourceManager.cs