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
- TypePropertyEditor.cs
- RuntimeConfigLKG.cs
- ClientSideProviderDescription.cs
- GACMembershipCondition.cs
- FormViewUpdatedEventArgs.cs
- PageThemeCodeDomTreeGenerator.cs
- IteratorDescriptor.cs
- XmlAutoDetectWriter.cs
- SqlConnection.cs
- ServiceContractListItemList.cs
- FileLoadException.cs
- EmbossBitmapEffect.cs
- COM2AboutBoxPropertyDescriptor.cs
- XmlWrappingReader.cs
- _KerberosClient.cs
- Rect3D.cs
- ReflectEventDescriptor.cs
- ProviderSettingsCollection.cs
- DataListItemCollection.cs
- ImageDrawing.cs
- ObjectKeyFrameCollection.cs
- ModelChangedEventArgsImpl.cs
- KnownBoxes.cs
- ProxyManager.cs
- Binding.cs
- NavigationProperty.cs
- Debug.cs
- RemoteTokenFactory.cs
- CollectionsUtil.cs
- DataGridLinkButton.cs
- WebContentFormatHelper.cs
- ImageCodecInfoPrivate.cs
- StatusBarDesigner.cs
- webproxy.cs
- WindowsEditBoxRange.cs
- _AutoWebProxyScriptHelper.cs
- SelectionEditor.cs
- ProfileParameter.cs
- AncestorChangedEventArgs.cs
- FlagsAttribute.cs
- HandleRef.cs
- XmlKeywords.cs
- WeakReferenceEnumerator.cs
- CopyAttributesAction.cs
- ContentFileHelper.cs
- AsymmetricSecurityBindingElement.cs
- RemotingAttributes.cs
- StringReader.cs
- CqlQuery.cs
- CreationContext.cs
- RawStylusInputReport.cs
- XmlnsDefinitionAttribute.cs
- Application.cs
- DocumentPage.cs
- ThousandthOfEmRealPoints.cs
- WebScriptMetadataInstanceContextProvider.cs
- XpsException.cs
- JsonUriDataContract.cs
- ISFTagAndGuidCache.cs
- WebPartAddingEventArgs.cs
- LowerCaseStringConverter.cs
- ToolStripDropDownMenu.cs
- CodeTypeDelegate.cs
- DbConnectionInternal.cs
- WorkflowDurableInstance.cs
- SessionStateModule.cs
- ObjectStateFormatter.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- TabControlAutomationPeer.cs
- ConstraintEnumerator.cs
- DecimalStorage.cs
- XmlQuerySequence.cs
- ConcurrentQueue.cs
- TextParagraph.cs
- HebrewNumber.cs
- DBAsyncResult.cs
- FileUpload.cs
- DefaultBinder.cs
- LoginAutoFormat.cs
- DataViewSettingCollection.cs
- CommandArguments.cs
- StreamUpgradeInitiator.cs
- SimpleLine.cs
- MediaCommands.cs
- ProjectionPathSegment.cs
- PathFigureCollection.cs
- XLinq.cs
- StaticDataManager.cs
- ValidatingReaderNodeData.cs
- NotCondition.cs
- TraceUtility.cs
- BamlTreeUpdater.cs
- XhtmlBasicCalendarAdapter.cs
- RequestContextBase.cs
- ReadOnlyDataSource.cs
- DataKey.cs
- ReflectionServiceProvider.cs
- TerminatorSinks.cs
- DataRecordInternal.cs
- ImageSourceValueSerializer.cs