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
- SiteMapDataSourceDesigner.cs
- PackWebRequest.cs
- Accessible.cs
- ListenerAdapter.cs
- PrivilegeNotHeldException.cs
- XmlEntityReference.cs
- MouseEventArgs.cs
- StrokeRenderer.cs
- KeyedCollection.cs
- CodeLabeledStatement.cs
- ApplicationSettingsBase.cs
- IntSecurity.cs
- AuthenticationServiceManager.cs
- Condition.cs
- EncryptedKeyIdentifierClause.cs
- BindMarkupExtensionSerializer.cs
- LinkTarget.cs
- StructuredProperty.cs
- _ConnectionGroup.cs
- ContainerSelectorGlyph.cs
- XXXInfos.cs
- SystemWebSectionGroup.cs
- RenderDataDrawingContext.cs
- SharedDp.cs
- SmiEventSink.cs
- DataControlFieldCollection.cs
- RsaKeyIdentifierClause.cs
- HttpListenerContext.cs
- PipeConnection.cs
- ObjectFullSpanRewriter.cs
- AnimationClockResource.cs
- XPathScanner.cs
- PropertyBuilder.cs
- CompilationSection.cs
- brushes.cs
- UidPropertyAttribute.cs
- NavigationProgressEventArgs.cs
- ProfileSettings.cs
- BrowserTree.cs
- Main.cs
- ControlBindingsCollection.cs
- XmlSchemaComplexContentRestriction.cs
- UTF8Encoding.cs
- FormsAuthentication.cs
- ReverseQueryOperator.cs
- SBCSCodePageEncoding.cs
- httpserverutility.cs
- GCHandleCookieTable.cs
- PeerToPeerException.cs
- UrlAuthFailedErrorFormatter.cs
- LinqDataSourceContextData.cs
- XpsS0ValidatingLoader.cs
- KnownTypes.cs
- StateManagedCollection.cs
- ImageSourceValueSerializer.cs
- TableLayoutRowStyleCollection.cs
- OutputCacheModule.cs
- SafeMemoryMappedFileHandle.cs
- LocationUpdates.cs
- PropertyStore.cs
- ScrollBarRenderer.cs
- Visual.cs
- Emitter.cs
- SafeNativeMethodsMilCoreApi.cs
- SigningCredentials.cs
- SystemGatewayIPAddressInformation.cs
- AutomationPattern.cs
- Panel.cs
- XhtmlTextWriter.cs
- RoleService.cs
- ArrayExtension.cs
- TextDocumentView.cs
- SessionEndedEventArgs.cs
- MethodAccessException.cs
- HttpCacheParams.cs
- EventsTab.cs
- ButtonAutomationPeer.cs
- ToolStripPanel.cs
- CounterSample.cs
- DataTableNewRowEvent.cs
- PeerApplicationLaunchInfo.cs
- SignerInfo.cs
- TransactionScope.cs
- InfoCardHelper.cs
- AspProxy.cs
- XmlTextEncoder.cs
- DateTime.cs
- OptimizerPatterns.cs
- DataGridView.cs
- RowSpanVector.cs
- DrawingCollection.cs
- GeometryGroup.cs
- returneventsaver.cs
- DesignerContextDescriptor.cs
- PathGradientBrush.cs
- SourceSwitch.cs
- AddInPipelineAttributes.cs
- WindowProviderWrapper.cs
- Certificate.cs
- DataGridView.cs