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
- SiteOfOriginContainer.cs
- MetaChildrenColumn.cs
- BasePattern.cs
- Events.cs
- PopupRoot.cs
- XmlSchemaAttribute.cs
- ToolStripProgressBar.cs
- ToolStripItem.cs
- WindowsAuthenticationModule.cs
- SchemaImporterExtensionsSection.cs
- DependencyPropertyAttribute.cs
- DiscoveryDocumentReference.cs
- TreeBuilderBamlTranslator.cs
- ClientData.cs
- TaskFormBase.cs
- OracleException.cs
- TwoPhaseCommit.cs
- MediaSystem.cs
- ItemChangedEventArgs.cs
- Html32TextWriter.cs
- DataSetMappper.cs
- MetadataItemCollectionFactory.cs
- ManageRequest.cs
- UserControlAutomationPeer.cs
- XsltArgumentList.cs
- SiteMapHierarchicalDataSourceView.cs
- HttpAsyncResult.cs
- XPathMessageFilter.cs
- ScriptReferenceEventArgs.cs
- EncodingFallbackAwareXmlTextWriter.cs
- COM2Properties.cs
- ManagementPath.cs
- Visitor.cs
- MessageEnumerator.cs
- DataGridViewRowEventArgs.cs
- HttpHeaderCollection.cs
- WebConfigurationFileMap.cs
- AssemblyBuilderData.cs
- datacache.cs
- ReaderOutput.cs
- LogManagementAsyncResult.cs
- StringToken.cs
- CriticalHandle.cs
- XhtmlConformanceSection.cs
- SiteMembershipCondition.cs
- RawUIStateInputReport.cs
- ParameterCollection.cs
- DesignerLoader.cs
- SourceInterpreter.cs
- AutoGeneratedFieldProperties.cs
- PerformanceCounterCategory.cs
- SchemaTableColumn.cs
- CallContext.cs
- CurrentChangedEventManager.cs
- SecurityToken.cs
- PrefixQName.cs
- XmlSchemaGroupRef.cs
- EventTrigger.cs
- MatrixCamera.cs
- TableRowGroup.cs
- PropertyMapper.cs
- ComponentCache.cs
- DbDataRecord.cs
- EntityClassGenerator.cs
- NegationPusher.cs
- QueryConverter.cs
- RuleSettings.cs
- PropertyPath.cs
- DbBuffer.cs
- XmlElementAttribute.cs
- FullTextLine.cs
- VisualStyleRenderer.cs
- SQLInt64Storage.cs
- TdsEnums.cs
- AsymmetricKeyExchangeFormatter.cs
- ReadOnlyPropertyMetadata.cs
- Identifier.cs
- ContextProperty.cs
- FormViewDeletedEventArgs.cs
- LayoutTableCell.cs
- DynamicAttribute.cs
- StructuredType.cs
- WindowsSysHeader.cs
- TableColumn.cs
- DataGridViewBindingCompleteEventArgs.cs
- InstanceLockLostException.cs
- XmlSchemaAnyAttribute.cs
- PropertyKey.cs
- TraceListeners.cs
- ImageDrawing.cs
- XmlSchemaCollection.cs
- CompleteWizardStep.cs
- PostBackTrigger.cs
- AssemblyHash.cs
- FullTrustAssemblyCollection.cs
- BrowserTree.cs
- DataServiceProcessingPipelineEventArgs.cs
- VScrollProperties.cs
- TextControl.cs
- DataListItem.cs