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
- DateTimeParse.cs
- StateMachineSubscription.cs
- IconConverter.cs
- Timer.cs
- _RegBlobWebProxyDataBuilder.cs
- DeclaredTypeElement.cs
- DrawListViewColumnHeaderEventArgs.cs
- TemplateKeyConverter.cs
- ToolStripScrollButton.cs
- InkCanvasSelectionAdorner.cs
- followingquery.cs
- AppDomainProtocolHandler.cs
- InstallerTypeAttribute.cs
- ByteRangeDownloader.cs
- StubHelpers.cs
- SchemaTypeEmitter.cs
- FilterElement.cs
- PostBackOptions.cs
- ZipQueryOperator.cs
- DateTimeValueSerializer.cs
- LowerCaseStringConverter.cs
- SatelliteContractVersionAttribute.cs
- CompareValidator.cs
- FileSecurity.cs
- Comparer.cs
- ADMembershipUser.cs
- OracleDataAdapter.cs
- Debug.cs
- HMACRIPEMD160.cs
- Closure.cs
- WindowsSysHeader.cs
- ObjectDataSourceDisposingEventArgs.cs
- Attributes.cs
- SamlEvidence.cs
- AppDomainCompilerProxy.cs
- PropertyDescriptorCollection.cs
- FieldAccessException.cs
- ToolStripDropTargetManager.cs
- DataBindEngine.cs
- EnumUnknown.cs
- GeneralTransform.cs
- MonthCalendar.cs
- DetailsViewCommandEventArgs.cs
- ComponentDispatcherThread.cs
- Light.cs
- StructuredTypeEmitter.cs
- TextContainerHelper.cs
- NativeMethods.cs
- IdentityHolder.cs
- XmlComplianceUtil.cs
- SafeNativeMethods.cs
- PlanCompiler.cs
- InvokePatternIdentifiers.cs
- FixedDocument.cs
- OleDbStruct.cs
- AppearanceEditorPart.cs
- Parallel.cs
- CompilerTypeWithParams.cs
- safex509handles.cs
- ColorInterpolationModeValidation.cs
- RegexInterpreter.cs
- ApplicationFileCodeDomTreeGenerator.cs
- AuthorizationRuleCollection.cs
- XmlLangPropertyAttribute.cs
- QilList.cs
- EncryptedReference.cs
- SQLStringStorage.cs
- String.cs
- CoreSwitches.cs
- ScaleTransform3D.cs
- ExceptionCollection.cs
- ResourceDefaultValueAttribute.cs
- WebGetAttribute.cs
- LineServicesCallbacks.cs
- X509ChainPolicy.cs
- WebPartConnectionsDisconnectVerb.cs
- ExecutionContext.cs
- MessageEnumerator.cs
- EdmRelationshipRoleAttribute.cs
- MoveSizeWinEventHandler.cs
- EventDescriptorCollection.cs
- MsmqOutputChannel.cs
- MsmqInputSessionChannelListener.cs
- WindowsListBox.cs
- DiscoveryServerProtocol.cs
- PageParserFilter.cs
- XmlSubtreeReader.cs
- FlowPosition.cs
- SortExpressionBuilder.cs
- KeyedCollection.cs
- Int32CollectionConverter.cs
- CustomErrorsSection.cs
- ConsoleCancelEventArgs.cs
- JsonFormatGeneratorStatics.cs
- LOSFormatter.cs
- __ConsoleStream.cs
- _FixedSizeReader.cs
- MatrixValueSerializer.cs
- StickyNoteContentControl.cs
- HttpRequestCacheValidator.cs