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
- AutomationPropertyInfo.cs
- WebPartTracker.cs
- base64Transforms.cs
- SoapTypeAttribute.cs
- BufferCache.cs
- MultiPartWriter.cs
- GC.cs
- LogicalExpr.cs
- Int32CollectionValueSerializer.cs
- Shape.cs
- DbParameterCollectionHelper.cs
- MultiPageTextView.cs
- SQLInt16Storage.cs
- QilCloneVisitor.cs
- ImageInfo.cs
- ScriptHandlerFactory.cs
- HttpGetProtocolImporter.cs
- TimeSpanMinutesConverter.cs
- CultureSpecificCharacterBufferRange.cs
- UnknownWrapper.cs
- RegexWorker.cs
- PersonalizationDictionary.cs
- XmlNullResolver.cs
- Label.cs
- ObjectTag.cs
- UnmanagedHandle.cs
- ClientSettingsProvider.cs
- __ConsoleStream.cs
- PerspectiveCamera.cs
- ExecutionContext.cs
- ExpressionLink.cs
- XmlTextWriter.cs
- BorderGapMaskConverter.cs
- LeafCellTreeNode.cs
- WebPartDisplayModeCancelEventArgs.cs
- XmlEntity.cs
- WCFServiceClientProxyGenerator.cs
- FileDialogPermission.cs
- UserControlBuildProvider.cs
- CodeSnippetStatement.cs
- Substitution.cs
- MenuAutomationPeer.cs
- SQLDouble.cs
- EditorAttribute.cs
- OdbcConnectionOpen.cs
- ProviderConnectionPoint.cs
- TreeViewCancelEvent.cs
- XamlTypeMapperSchemaContext.cs
- PageResolution.cs
- DSACryptoServiceProvider.cs
- AncestorChangedEventArgs.cs
- M3DUtil.cs
- DefaultPrintController.cs
- ColorContextHelper.cs
- ContentOperations.cs
- PageAsyncTask.cs
- PropertyOverridesTypeEditor.cs
- DivideByZeroException.cs
- QueryStringParameter.cs
- AddInActivator.cs
- PerformanceCounter.cs
- versioninfo.cs
- SwitchAttribute.cs
- InternalConfigConfigurationFactory.cs
- PostBackOptions.cs
- NegationPusher.cs
- ObjectDataSourceView.cs
- AstTree.cs
- Stylesheet.cs
- OleDbMetaDataFactory.cs
- Attributes.cs
- Queue.cs
- ToolStripDropDownItem.cs
- BitmapEffectDrawing.cs
- GenericParameterDataContract.cs
- UIElementAutomationPeer.cs
- XpsColorContext.cs
- loginstatus.cs
- MouseDevice.cs
- DataListItemCollection.cs
- XmlMembersMapping.cs
- Form.cs
- XmlSchemaAnnotated.cs
- x509utils.cs
- XamlSerializer.cs
- PriorityChain.cs
- ServiceModelStringsVersion1.cs
- XPathNavigatorKeyComparer.cs
- GridViewRow.cs
- ComponentChangingEvent.cs
- MessageFilterException.cs
- ExpressionVisitor.cs
- ReadOnlyDataSource.cs
- CompilerWrapper.cs
- QilTargetType.cs
- FindCriteriaElement.cs
- ErrorHandler.cs
- DmlSqlGenerator.cs
- oledbmetadatacollectionnames.cs
- XPathSelfQuery.cs