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 / Visitors / LinqMaximalSubtreeNominator.cs / 1 / 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
- LineSegment.cs
- ScriptManager.cs
- IISUnsafeMethods.cs
- ObjectDataSourceEventArgs.cs
- SimpleBitVector32.cs
- SimpleHandlerFactory.cs
- BufferedOutputAsyncStream.cs
- RealProxy.cs
- SchemaElementLookUpTableEnumerator.cs
- DocumentPageViewAutomationPeer.cs
- TypeBuilderInstantiation.cs
- DnsPermission.cs
- DescriptionAttribute.cs
- BitmapEffectrendercontext.cs
- List.cs
- BuilderPropertyEntry.cs
- HashSetEqualityComparer.cs
- BridgeDataReader.cs
- ServiceMemoryGates.cs
- HelpInfo.cs
- CompoundFileStreamReference.cs
- XmlSchemaSimpleTypeRestriction.cs
- HttpSocketManager.cs
- DataMemberConverter.cs
- CachedRequestParams.cs
- PerformanceCounterPermissionAttribute.cs
- SiteMapDataSourceView.cs
- _FixedSizeReader.cs
- OrderByLifter.cs
- DataSourceView.cs
- SqlDataSourceSelectingEventArgs.cs
- CodeExpressionStatement.cs
- KeyPullup.cs
- ScrollData.cs
- datacache.cs
- ExeConfigurationFileMap.cs
- NullableConverter.cs
- KeyConstraint.cs
- PrePostDescendentsWalker.cs
- IPAddress.cs
- Attributes.cs
- OlePropertyStructs.cs
- KnowledgeBase.cs
- DropShadowEffect.cs
- MimeParameters.cs
- StringUtil.cs
- ContentIterators.cs
- ChildChangedEventArgs.cs
- FrameworkTemplate.cs
- WebColorConverter.cs
- ChannelManager.cs
- NavigationPropertyEmitter.cs
- CssStyleCollection.cs
- Metafile.cs
- CheckBox.cs
- HttpModuleActionCollection.cs
- SwitchElementsCollection.cs
- Array.cs
- AstNode.cs
- WebFormsRootDesigner.cs
- RectangleHotSpot.cs
- CompatibleIComparer.cs
- BCLDebug.cs
- TextStore.cs
- UrlMappingCollection.cs
- RequestTimeoutManager.cs
- InputScopeAttribute.cs
- EditorPartChrome.cs
- ICspAsymmetricAlgorithm.cs
- RuntimeWrappedException.cs
- SpellerHighlightLayer.cs
- HttpDebugHandler.cs
- CommonDialog.cs
- LogSwitch.cs
- BaseWebProxyFinder.cs
- Transactions.cs
- NamespaceList.cs
- DropShadowBitmapEffect.cs
- AttributeQuery.cs
- XmlLoader.cs
- WorkflowPrinting.cs
- TextEditorContextMenu.cs
- InstanceLockQueryResult.cs
- PathFigureCollectionValueSerializer.cs
- DurableInstanceManager.cs
- BoolExpr.cs
- Bold.cs
- StateItem.cs
- SoapProtocolImporter.cs
- LicenseException.cs
- SelectionWordBreaker.cs
- QilStrConcatenator.cs
- TranslateTransform3D.cs
- UpdateException.cs
- X509ChainElement.cs
- SqlUtil.cs
- XslAstAnalyzer.cs
- EventManager.cs
- QueueNameHelper.cs
- RetrieveVirtualItemEventArgs.cs