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
- GridViewPageEventArgs.cs
- AdornerDecorator.cs
- DbExpressionBuilder.cs
- RowCache.cs
- FatalException.cs
- RenderTargetBitmap.cs
- SemanticResultValue.cs
- SQLSingle.cs
- ExtenderProvidedPropertyAttribute.cs
- FileAuthorizationModule.cs
- PropertyMetadata.cs
- WebControlsSection.cs
- ProcessRequestArgs.cs
- BitmapDecoder.cs
- QilList.cs
- DesignTimeVisibleAttribute.cs
- Function.cs
- WebPartDescriptionCollection.cs
- WebPartRestoreVerb.cs
- Filter.cs
- SubMenuStyleCollection.cs
- ClassImporter.cs
- XmlElementAttribute.cs
- ImportedPolicyConversionContext.cs
- ParameterBuilder.cs
- ChtmlTextWriter.cs
- X509SecurityToken.cs
- ExtensionFile.cs
- QilChoice.cs
- SingletonConnectionReader.cs
- SequenceRangeCollection.cs
- ErrorFormatterPage.cs
- PropertyRecord.cs
- ArrowControl.xaml.cs
- DataColumnPropertyDescriptor.cs
- RuntimeConfigurationRecord.cs
- DbProviderFactory.cs
- TextTrailingCharacterEllipsis.cs
- ParameterCollectionEditor.cs
- XmlDataDocument.cs
- WCFBuildProvider.cs
- RootProfilePropertySettingsCollection.cs
- RegexMatch.cs
- TextSearch.cs
- ElementProxy.cs
- DbQueryCommandTree.cs
- DictionaryManager.cs
- GridViewColumnHeaderAutomationPeer.cs
- XmlArrayItemAttribute.cs
- DynamicILGenerator.cs
- ErrorReporting.cs
- RequestCacheEntry.cs
- ResizeGrip.cs
- ClonableStack.cs
- TraceInternal.cs
- GlyphElement.cs
- EventToken.cs
- CustomLineCap.cs
- Propagator.JoinPropagator.cs
- List.cs
- XmlSchemaAttributeGroupRef.cs
- AttachmentCollection.cs
- SoapAttributeAttribute.cs
- ManifestBasedResourceGroveler.cs
- ToolStripItem.cs
- GroupJoinQueryOperator.cs
- Repeater.cs
- DiscoveryClientReferences.cs
- keycontainerpermission.cs
- CharacterMetricsDictionary.cs
- QueryContinueDragEventArgs.cs
- UIElementAutomationPeer.cs
- EventLogPermissionAttribute.cs
- StorageInfo.cs
- CounterCreationDataCollection.cs
- ProgressiveCrcCalculatingStream.cs
- propertytag.cs
- Point.cs
- ColumnResizeUndoUnit.cs
- SqlAliasesReferenced.cs
- AppDomainFactory.cs
- TextStore.cs
- WebZoneDesigner.cs
- httpserverutility.cs
- DataGridViewAccessibleObject.cs
- SchemaHelper.cs
- EventBindingService.cs
- PropertyPushdownHelper.cs
- SqlEnums.cs
- ProfileEventArgs.cs
- ServiceCredentialsElement.cs
- CachedTypeface.cs
- HtmlTableRowCollection.cs
- TimeSpan.cs
- TransactionManager.cs
- WrapperSecurityCommunicationObject.cs
- XNodeNavigator.cs
- ClockGroup.cs
- FormViewCommandEventArgs.cs
- SQLDecimalStorage.cs