Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Objects / ELinq / Visitors / LinqMaximalSubtreeNominator.cs / 3 / LinqMaximalSubtreeNominator.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System.Linq.Expressions; using System.Collections.Generic; using System.Diagnostics; namespace System.Data.Objects.ELinq { ////// Goes from the bottom to top and nominates nodes where all the nodes /// below the node return true from the shouldBeNominatedDelegate /// internal sealed class LinqMaximalSubtreeNominator : ExpressionVisitor { readonly HashSet_candidates; readonly Func _shouldBeNominatedDelegate; bool _cannotBeNominated = false; // not creatable private LinqMaximalSubtreeNominator(HashSet candidates, Func shouldBeNominatedDelegate) { _candidates = candidates; _shouldBeNominatedDelegate = shouldBeNominatedDelegate; } internal static HashSet Nominate(Expression expression, HashSet candidates, Func shouldBeNominatedDelegate) { Debug.Assert(candidates != null, "Candidates hashset cannot be null"); LinqMaximalSubtreeNominator nominator = new LinqMaximalSubtreeNominator(candidates, shouldBeNominatedDelegate); nominator.Visit(expression); return nominator._candidates; } internal static HashSet FindMaximalSubtrees(Expression expression, Func shouldBeNominatedDelegate) { HashSet nominees = Nominate(expression, new HashSet (), shouldBeNominatedDelegate); return MaximalSubtreeVisitor.FindMaximalSubtrees(nominees, expression); } internal override Expression Visit(Expression exp) { if (exp != null) { bool saveCannotBeNominated = _cannotBeNominated; _cannotBeNominated = false; base.Visit(exp); if (!_cannotBeNominated) { // everyone below me can be nominated, so // see if this one can be also if (_shouldBeNominatedDelegate(exp)) { _candidates.Add(exp); } else { _cannotBeNominated = true; } } _cannotBeNominated |= saveCannotBeNominated; } return exp; } /// /// Visitor that identifies maximal subtrees given a set of nominees. It walks the tree top down /// and when it identifies a nominated node, adds it to the _subtree set and stops walking. /// private sealed class MaximalSubtreeVisitor : ExpressionVisitor { private readonly HashSet_subtrees; private readonly HashSet _nominees; private MaximalSubtreeVisitor(HashSet nominees) { _nominees = nominees; _subtrees = new HashSet (); } internal static HashSet FindMaximalSubtrees(HashSet nominees, Expression query) { MaximalSubtreeVisitor visitor = new MaximalSubtreeVisitor(nominees); visitor.Visit(query); return visitor._subtrees; } internal override Expression Visit(Expression exp) { if (exp != null && _nominees.Contains(exp)) { _subtrees.Add(exp); return exp; } return base.Visit(exp); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System.Linq.Expressions; using System.Collections.Generic; using System.Diagnostics; namespace System.Data.Objects.ELinq { ////// Goes from the bottom to top and nominates nodes where all the nodes /// below the node return true from the shouldBeNominatedDelegate /// internal sealed class LinqMaximalSubtreeNominator : ExpressionVisitor { readonly HashSet_candidates; readonly Func _shouldBeNominatedDelegate; bool _cannotBeNominated = false; // not creatable private LinqMaximalSubtreeNominator(HashSet candidates, Func shouldBeNominatedDelegate) { _candidates = candidates; _shouldBeNominatedDelegate = shouldBeNominatedDelegate; } internal static HashSet Nominate(Expression expression, HashSet candidates, Func shouldBeNominatedDelegate) { Debug.Assert(candidates != null, "Candidates hashset cannot be null"); LinqMaximalSubtreeNominator nominator = new LinqMaximalSubtreeNominator(candidates, shouldBeNominatedDelegate); nominator.Visit(expression); return nominator._candidates; } internal static HashSet FindMaximalSubtrees(Expression expression, Func shouldBeNominatedDelegate) { HashSet nominees = Nominate(expression, new HashSet (), shouldBeNominatedDelegate); return MaximalSubtreeVisitor.FindMaximalSubtrees(nominees, expression); } internal override Expression Visit(Expression exp) { if (exp != null) { bool saveCannotBeNominated = _cannotBeNominated; _cannotBeNominated = false; base.Visit(exp); if (!_cannotBeNominated) { // everyone below me can be nominated, so // see if this one can be also if (_shouldBeNominatedDelegate(exp)) { _candidates.Add(exp); } else { _cannotBeNominated = true; } } _cannotBeNominated |= saveCannotBeNominated; } return exp; } /// /// Visitor that identifies maximal subtrees given a set of nominees. It walks the tree top down /// and when it identifies a nominated node, adds it to the _subtree set and stops walking. /// private sealed class MaximalSubtreeVisitor : ExpressionVisitor { private readonly HashSet_subtrees; private readonly HashSet _nominees; private MaximalSubtreeVisitor(HashSet nominees) { _nominees = nominees; _subtrees = new HashSet (); } internal static HashSet FindMaximalSubtrees(HashSet nominees, Expression query) { MaximalSubtreeVisitor visitor = new MaximalSubtreeVisitor(nominees); visitor.Visit(query); return visitor._subtrees; } internal override Expression Visit(Expression exp) { if (exp != null && _nominees.Contains(exp)) { _subtrees.Add(exp); return exp; } return base.Visit(exp); } } } } // 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
- DateBoldEvent.cs
- TypeContext.cs
- OLEDB_Enum.cs
- EntityTypeEmitter.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- ObjectAssociationEndMapping.cs
- SecurityVerifiedMessage.cs
- DocumentPaginator.cs
- PingReply.cs
- CounterCreationData.cs
- DataGridViewComboBoxCell.cs
- CacheForPrimitiveTypes.cs
- CompilerResults.cs
- ServerType.cs
- HealthMonitoringSectionHelper.cs
- EventItfInfo.cs
- ItemDragEvent.cs
- RNGCryptoServiceProvider.cs
- _CookieModule.cs
- HttpPostProtocolReflector.cs
- FontFamily.cs
- InternalBase.cs
- SafeUserTokenHandle.cs
- FormViewInsertEventArgs.cs
- MultipleViewProviderWrapper.cs
- ParentQuery.cs
- DataGridBoundColumn.cs
- ListBoxAutomationPeer.cs
- TextRangeAdaptor.cs
- PEFileReader.cs
- ProcessModelSection.cs
- XmlKeywords.cs
- DataExpression.cs
- VersionedStreamOwner.cs
- PrimaryKeyTypeConverter.cs
- QilUnary.cs
- InvalidProgramException.cs
- ContentElement.cs
- AnnouncementEndpoint.cs
- NodeInfo.cs
- _RequestLifetimeSetter.cs
- DataServiceQueryException.cs
- FilterException.cs
- SimpleApplicationHost.cs
- WindowsAuthenticationModule.cs
- RemotingServices.cs
- SafeMILHandle.cs
- ProbeMatchesMessage11.cs
- MenuEventArgs.cs
- EditingCoordinator.cs
- CustomErrorsSection.cs
- CalendarDateChangedEventArgs.cs
- FileLevelControlBuilderAttribute.cs
- TrackingParticipant.cs
- InputReport.cs
- Int32CAMarshaler.cs
- ConnectionPoint.cs
- DataTable.cs
- SpecularMaterial.cs
- DataGridRowClipboardEventArgs.cs
- DocumentScope.cs
- GradientStop.cs
- ValidateNames.cs
- counter.cs
- XmlMembersMapping.cs
- TextModifierScope.cs
- Header.cs
- Camera.cs
- VirtualPathUtility.cs
- ObjectMemberMapping.cs
- CurrentTimeZone.cs
- DataGridBoolColumn.cs
- RootBrowserWindow.cs
- RenderingEventArgs.cs
- UserInitiatedNavigationPermission.cs
- Console.cs
- DragStartedEventArgs.cs
- ReferencedType.cs
- PreparingEnlistment.cs
- SqlFormatter.cs
- TimelineClockCollection.cs
- StringSorter.cs
- SpnEndpointIdentityExtension.cs
- XmlTextWriter.cs
- ToolStripDesignerUtils.cs
- SiteIdentityPermission.cs
- XmlQueryType.cs
- OperatingSystem.cs
- Logging.cs
- LZCodec.cs
- DesignerAttribute.cs
- MDIWindowDialog.cs
- TypeResolver.cs
- Queue.cs
- Query.cs
- RepeaterItem.cs
- BitmapEffectDrawing.cs
- OutputCacheModule.cs
- CompositeTypefaceMetrics.cs
- RegexCaptureCollection.cs