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
- HuffModule.cs
- ImmutablePropertyDescriptorGridEntry.cs
- ConfigurationPropertyCollection.cs
- ColorAnimationBase.cs
- SqlCharStream.cs
- SerializationAttributes.cs
- FrameworkPropertyMetadata.cs
- Button.cs
- Vector3DKeyFrameCollection.cs
- ClientBuildManagerCallback.cs
- TimeStampChecker.cs
- X509RecipientCertificateClientElement.cs
- BaseParser.cs
- MsdtcWrapper.cs
- BufferModesCollection.cs
- EncoderNLS.cs
- BinaryObjectInfo.cs
- SemanticKeyElement.cs
- ToolStripPanelSelectionGlyph.cs
- DataSourceIDConverter.cs
- TableLayoutPanelCellPosition.cs
- Point4D.cs
- querybuilder.cs
- CodeExporter.cs
- BidOverLoads.cs
- RtfToken.cs
- TreeNodeEventArgs.cs
- sqlstateclientmanager.cs
- ValidationRuleCollection.cs
- WindowsListViewSubItem.cs
- DesignBindingPropertyDescriptor.cs
- XPathDocumentNavigator.cs
- AutomationPatternInfo.cs
- XmlRawWriterWrapper.cs
- BaseAppDomainProtocolHandler.cs
- UpdatePanelControlTrigger.cs
- XpsFixedPageReaderWriter.cs
- ReferencedAssemblyResolver.cs
- StringArrayConverter.cs
- ClientRolePrincipal.cs
- TypeUsageBuilder.cs
- KeyboardNavigation.cs
- ListSortDescription.cs
- DesignerAutoFormatStyle.cs
- SHA256Managed.cs
- TextLine.cs
- Font.cs
- MatrixStack.cs
- PrintPreviewDialog.cs
- FormatterConverter.cs
- SecuritySessionServerSettings.cs
- NavigationPropertyAccessor.cs
- PluralizationService.cs
- ConnectionManagementElement.cs
- SymbolEqualComparer.cs
- DelayedRegex.cs
- CancelEventArgs.cs
- AssociationProvider.cs
- ByteKeyFrameCollection.cs
- ProcessModuleCollection.cs
- FormViewUpdateEventArgs.cs
- UpdatePanelTriggerCollection.cs
- ResourceReader.cs
- PrintDialog.cs
- DataExpression.cs
- PublisherMembershipCondition.cs
- XpsException.cs
- XmlSerializerVersionAttribute.cs
- ParseChildrenAsPropertiesAttribute.cs
- StringSorter.cs
- DesignerAttribute.cs
- NamedObject.cs
- DesignerExtenders.cs
- HandledEventArgs.cs
- ToolboxDataAttribute.cs
- FixedPageStructure.cs
- DeferredElementTreeState.cs
- WebPartAddingEventArgs.cs
- CompositeControl.cs
- InitializeCorrelation.cs
- ExcludeFromCodeCoverageAttribute.cs
- WeakEventManager.cs
- IisTraceWebEventProvider.cs
- SecurityKeyIdentifier.cs
- LinearKeyFrames.cs
- PageEventArgs.cs
- ThreadAttributes.cs
- DesignerDataSourceView.cs
- XPathConvert.cs
- MemoryFailPoint.cs
- WindowPatternIdentifiers.cs
- TransformCollection.cs
- CodeCommentStatement.cs
- ConfigXmlWhitespace.cs
- EntityDataSourceReferenceGroup.cs
- SystemException.cs
- ElementHostPropertyMap.cs
- XmlWrappingReader.cs
- TextRangeSerialization.cs
- CaseInsensitiveHashCodeProvider.cs