Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Objects / ELinq / Visitors / LinqMaximalSubtreeNominator.cs / 3 / 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
- ServiceNameCollection.cs
- PassportAuthentication.cs
- DbgCompiler.cs
- SyndicationItem.cs
- Query.cs
- ListParagraph.cs
- WindowsListViewScroll.cs
- TextBreakpoint.cs
- EncryptionUtility.cs
- ObjectDataSourceStatusEventArgs.cs
- RIPEMD160.cs
- AuthenticationModulesSection.cs
- Point3DCollectionConverter.cs
- FontDialog.cs
- InputBuffer.cs
- NativeMethods.cs
- HybridDictionary.cs
- DrawingBrush.cs
- XmlNodeWriter.cs
- BamlRecordHelper.cs
- HttpModuleAction.cs
- ExecutionContext.cs
- UrlMappingCollection.cs
- XamlHostingSection.cs
- NullRuntimeConfig.cs
- OleDbParameterCollection.cs
- HtmlHead.cs
- InitializationEventAttribute.cs
- DataComponentNameHandler.cs
- ImportDesigner.xaml.cs
- EventHandlingScope.cs
- HwndKeyboardInputProvider.cs
- ToolStripPanel.cs
- FieldToken.cs
- OletxResourceManager.cs
- KnownColorTable.cs
- XmlQueryCardinality.cs
- ScrollProperties.cs
- Point3DConverter.cs
- XmlRootAttribute.cs
- SchemaMapping.cs
- SchemaImporter.cs
- Pool.cs
- CaretElement.cs
- _IPv4Address.cs
- BuildProvider.cs
- InternalConfigRoot.cs
- ServiceInfo.cs
- EventSinkActivity.cs
- ListenerServiceInstallComponent.cs
- VectorCollectionValueSerializer.cs
- FixedSOMImage.cs
- DesignerToolboxInfo.cs
- AsyncStreamReader.cs
- OrderByBuilder.cs
- HostingEnvironmentException.cs
- GenerateHelper.cs
- Span.cs
- NullableFloatAverageAggregationOperator.cs
- WhereQueryOperator.cs
- Action.cs
- XmlRootAttribute.cs
- Token.cs
- ComNativeDescriptor.cs
- InputBuffer.cs
- EUCJPEncoding.cs
- Expander.cs
- BindingMAnagerBase.cs
- XpsSerializerFactory.cs
- StylusPointPropertyUnit.cs
- LoginNameDesigner.cs
- SHA384.cs
- FileVersionInfo.cs
- TextRunCache.cs
- TransformedBitmap.cs
- TypeUtil.cs
- UIElementParagraph.cs
- WebPartPersonalization.cs
- PhotoPrintingIntent.cs
- Mapping.cs
- MultiDataTrigger.cs
- SByte.cs
- GradientStopCollection.cs
- ProfileParameter.cs
- Pair.cs
- ComponentEditorPage.cs
- OpCodes.cs
- BufferedStream.cs
- PermissionSetEnumerator.cs
- ControlParameter.cs
- ListChunk.cs
- SafeBuffer.cs
- StateDesigner.LayoutSelectionGlyph.cs
- PropertyRef.cs
- HttpWriter.cs
- ImportContext.cs
- AutomationIdentifierGuids.cs
- AssemblyBuilder.cs
- ByteViewer.cs
- Misc.cs