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
- TextCompositionEventArgs.cs
- AssociationEndMember.cs
- Convert.cs
- SrgsDocumentParser.cs
- WebException.cs
- HtmlImage.cs
- StringCollection.cs
- ApplicationGesture.cs
- XPathSingletonIterator.cs
- SyndicationItem.cs
- AssemblyNameProxy.cs
- HandleRef.cs
- XmlNullResolver.cs
- TypedDataSourceCodeGenerator.cs
- ChtmlCommandAdapter.cs
- DetailsViewUpdateEventArgs.cs
- HyperLinkDesigner.cs
- PersonalizablePropertyEntry.cs
- XmlCustomFormatter.cs
- FilterException.cs
- Enlistment.cs
- TypeBuilderInstantiation.cs
- TableRow.cs
- BinaryWriter.cs
- RepeaterDataBoundAdapter.cs
- ExceptionRoutedEventArgs.cs
- CornerRadius.cs
- OverloadGroupAttribute.cs
- AuthenticationModuleElementCollection.cs
- MaskPropertyEditor.cs
- HwndTarget.cs
- RenderData.cs
- PointLight.cs
- EnvelopedSignatureTransform.cs
- AttachedAnnotationChangedEventArgs.cs
- ByteBufferPool.cs
- FullTextState.cs
- ReadWriteControlDesigner.cs
- BooleanAnimationBase.cs
- PropertyValueChangedEvent.cs
- SHA512.cs
- PathTooLongException.cs
- PropertyIDSet.cs
- AuthenticationModuleElement.cs
- SimpleWebHandlerParser.cs
- LayoutInformation.cs
- COM2EnumConverter.cs
- ComponentCommands.cs
- _TransmitFileOverlappedAsyncResult.cs
- DataTemplate.cs
- ConfigXmlElement.cs
- httpstaticobjectscollection.cs
- LicenseContext.cs
- NetCodeGroup.cs
- DataSourceConverter.cs
- DynamicDataRouteHandler.cs
- InfoCardProofToken.cs
- Brush.cs
- Frame.cs
- RequiredAttributeAttribute.cs
- Size.cs
- SafeLocalAllocation.cs
- XamlVector3DCollectionSerializer.cs
- LinearGradientBrush.cs
- GenerateTemporaryTargetAssembly.cs
- DateTimeOffsetConverter.cs
- OperationCanceledException.cs
- ICspAsymmetricAlgorithm.cs
- SrgsDocumentParser.cs
- UserNameSecurityTokenAuthenticator.cs
- MetadataArtifactLoaderFile.cs
- SyndicationItemFormatter.cs
- MetabaseServerConfig.cs
- ItemsControlAutomationPeer.cs
- WebServiceClientProxyGenerator.cs
- PatternMatcher.cs
- XmlCollation.cs
- PropertyTab.cs
- ControlUtil.cs
- LineUtil.cs
- InkCanvasSelection.cs
- ChannelManagerHelpers.cs
- EdmType.cs
- TypeUtil.cs
- WorkflowInstanceQuery.cs
- Stack.cs
- EncodingNLS.cs
- DetailsViewActionList.cs
- FactoryGenerator.cs
- DBParameter.cs
- InvalidMessageContractException.cs
- InputLanguageCollection.cs
- SetterBase.cs
- MSHTMLHost.cs
- EventToken.cs
- LocalizedNameDescriptionPair.cs
- CapabilitiesPattern.cs
- PointConverter.cs
- UnicodeEncoding.cs
- RangeValueProviderWrapper.cs