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
- OdbcConnectionHandle.cs
- LambdaCompiler.Binary.cs
- querybuilder.cs
- DifferencingCollection.cs
- XPathAxisIterator.cs
- CodeRegionDirective.cs
- ClipboardProcessor.cs
- MaskDescriptor.cs
- FileVersionInfo.cs
- ServicePointManager.cs
- BaseCodeDomTreeGenerator.cs
- TextUtf8RawTextWriter.cs
- SecuritySessionServerSettings.cs
- OutputCacheModule.cs
- ByteStorage.cs
- MimeFormReflector.cs
- ExpressionBinding.cs
- GradientStopCollection.cs
- DataBindingList.cs
- ApplicationSecurityManager.cs
- TypePropertyEditor.cs
- TransformGroup.cs
- CryptoProvider.cs
- DefaultSerializationProviderAttribute.cs
- XmlExceptionHelper.cs
- TextureBrush.cs
- SerializationFieldInfo.cs
- FormsAuthenticationTicket.cs
- DiagnosticsConfigurationHandler.cs
- OpenTypeLayoutCache.cs
- ProfileBuildProvider.cs
- ReadOnlyState.cs
- ExecutionEngineException.cs
- DragEventArgs.cs
- DecoderFallback.cs
- NonDualMessageSecurityOverHttpElement.cs
- DataColumn.cs
- CqlLexerHelpers.cs
- HandleCollector.cs
- X509ChainPolicy.cs
- SafeViewOfFileHandle.cs
- PocoPropertyAccessorStrategy.cs
- SQLResource.cs
- ExpressionLexer.cs
- OleDbDataAdapter.cs
- UTF7Encoding.cs
- ThumbAutomationPeer.cs
- Color.cs
- WindowsIPAddress.cs
- OracleParameterCollection.cs
- SystemEvents.cs
- SkewTransform.cs
- WindowInteractionStateTracker.cs
- FixedHyperLink.cs
- BitmapEffectRenderDataResource.cs
- MaskDescriptor.cs
- GatewayDefinition.cs
- ThumbAutomationPeer.cs
- Menu.cs
- ContainerCodeDomSerializer.cs
- XmlSignatureManifest.cs
- VariantWrapper.cs
- BamlLocalizationDictionary.cs
- Cursor.cs
- GeometryValueSerializer.cs
- ConfigXmlDocument.cs
- ConfigurationPermission.cs
- SafeFileMappingHandle.cs
- HtmlInputHidden.cs
- BinaryReader.cs
- ErrorCodes.cs
- DataControlPagerLinkButton.cs
- HMACSHA1.cs
- User.cs
- DbParameterHelper.cs
- Crypto.cs
- EncoderParameter.cs
- AsymmetricAlgorithm.cs
- TextEndOfSegment.cs
- PropertyEmitterBase.cs
- Quaternion.cs
- ChannelServices.cs
- AttributeCollection.cs
- MemberDomainMap.cs
- InternalConfigEventArgs.cs
- SizeAnimationUsingKeyFrames.cs
- RenderData.cs
- GC.cs
- Directory.cs
- DateTimeUtil.cs
- DataError.cs
- HandleCollector.cs
- StringToken.cs
- CompositeCollectionView.cs
- ViewStateException.cs
- GuidelineCollection.cs
- InputMethod.cs
- PreservationFileWriter.cs
- Function.cs
- DocumentsTrace.cs