Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- NavigationProgressEventArgs.cs
- ListViewInsertEventArgs.cs
- PointHitTestParameters.cs
- PagedDataSource.cs
- PinnedBufferMemoryStream.cs
- HandleCollector.cs
- MetadataItemCollectionFactory.cs
- GradientSpreadMethodValidation.cs
- NamedObjectList.cs
- InputScopeNameConverter.cs
- EntityDataSourceEntityTypeFilterItem.cs
- BitStack.cs
- Container.cs
- RewritingValidator.cs
- ProfileProvider.cs
- ControlEvent.cs
- RemoteWebConfigurationHostStream.cs
- HtmlInputFile.cs
- ErrorsHelper.cs
- ApplicationHost.cs
- IDQuery.cs
- SqlDataSourceSelectingEventArgs.cs
- ScrollableControlDesigner.cs
- PanelStyle.cs
- OdbcPermission.cs
- GestureRecognitionResult.cs
- ServiceBehaviorElementCollection.cs
- TargetException.cs
- SwitchElementsCollection.cs
- HtmlLink.cs
- CrossContextChannel.cs
- HandleCollector.cs
- FieldNameLookup.cs
- OdbcEnvironment.cs
- RuleProcessor.cs
- NominalTypeEliminator.cs
- WebScriptMetadataMessage.cs
- CodeThrowExceptionStatement.cs
- InstanceData.cs
- LocalValueEnumerator.cs
- UnmanagedBitmapWrapper.cs
- CodeValidator.cs
- DmlSqlGenerator.cs
- AdRotator.cs
- AtomParser.cs
- CodeDOMUtility.cs
- UrlMappingsModule.cs
- LambdaCompiler.ControlFlow.cs
- CharacterMetrics.cs
- SHA1.cs
- LexicalChunk.cs
- RelatedCurrencyManager.cs
- PrimitiveXmlSerializers.cs
- TransactedReceiveScope.cs
- TextAnchor.cs
- ObjectPropertyMapping.cs
- QuaternionAnimationBase.cs
- ListViewDesigner.cs
- ClientSideQueueItem.cs
- ModelFactory.cs
- CompilerError.cs
- AuthenticationService.cs
- ImmComposition.cs
- AppDomainAttributes.cs
- SafeProcessHandle.cs
- QilInvokeEarlyBound.cs
- DoubleKeyFrameCollection.cs
- PersistenceTypeAttribute.cs
- DataColumnCollection.cs
- SoapReflectionImporter.cs
- CacheVirtualItemsEvent.cs
- ReachDocumentReferenceCollectionSerializerAsync.cs
- CollectionTypeElement.cs
- TrackingServices.cs
- EventMappingSettings.cs
- UrlAuthorizationModule.cs
- PerfCounterSection.cs
- SchemaElementDecl.cs
- Freezable.cs
- BindingSource.cs
- HandlerWithFactory.cs
- StrongNameKeyPair.cs
- PasswordBoxAutomationPeer.cs
- TextBoxRenderer.cs
- PropertyGeneratedEventArgs.cs
- DetailsViewInsertEventArgs.cs
- IIS7UserPrincipal.cs
- GenericWebPart.cs
- MobileCategoryAttribute.cs
- X509CertificateStore.cs
- baseaxisquery.cs
- XmlByteStreamWriter.cs
- HostElement.cs
- MSAANativeProvider.cs
- RNGCryptoServiceProvider.cs
- SafeRightsManagementSessionHandle.cs
- ArrayElementGridEntry.cs
- PlatformCulture.cs
- AppearanceEditorPart.cs
- DesignTimeData.cs