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
- ISessionStateStore.cs
- DataGridViewRowEventArgs.cs
- WmlSelectionListAdapter.cs
- SecurityPermission.cs
- CharAnimationUsingKeyFrames.cs
- RegexRunner.cs
- SafeMemoryMappedViewHandle.cs
- Ops.cs
- XsltCompileContext.cs
- PresentationTraceSources.cs
- ExtenderControl.cs
- DNS.cs
- ZipFileInfo.cs
- SafeRightsManagementSessionHandle.cs
- Size.cs
- TimeEnumHelper.cs
- GridViewAutomationPeer.cs
- CompiledIdentityConstraint.cs
- ButtonField.cs
- ResourceSet.cs
- RecommendedAsConfigurableAttribute.cs
- PanelDesigner.cs
- XmlElementList.cs
- ScrollBar.cs
- Int32KeyFrameCollection.cs
- RsaSecurityToken.cs
- TCEAdapterGenerator.cs
- WebCategoryAttribute.cs
- MsmqIntegrationMessageProperty.cs
- ActivityScheduledQuery.cs
- SqlAliaser.cs
- ChtmlTextWriter.cs
- CollectionViewGroup.cs
- EmptyStringExpandableObjectConverter.cs
- VSWCFServiceContractGenerator.cs
- BinaryQueryOperator.cs
- CodeTypeConstructor.cs
- VerificationAttribute.cs
- ConfigurationFileMap.cs
- TypeDescriptionProviderAttribute.cs
- SQlBooleanStorage.cs
- UpdatePanelControlTrigger.cs
- DataGridViewCellToolTipTextNeededEventArgs.cs
- CodeTypeMemberCollection.cs
- CodeSubDirectoriesCollection.cs
- XmlNavigatorStack.cs
- SerializationException.cs
- ScrollableControlDesigner.cs
- BamlMapTable.cs
- ExpressionEditorAttribute.cs
- IntMinMaxAggregationOperator.cs
- IndexerNameAttribute.cs
- RelAssertionDirectKeyIdentifierClause.cs
- DisposableCollectionWrapper.cs
- ReverseInheritProperty.cs
- EraserBehavior.cs
- Column.cs
- NegatedCellConstant.cs
- VectorAnimationUsingKeyFrames.cs
- DataFormat.cs
- KeySpline.cs
- CollectionsUtil.cs
- CodeDOMUtility.cs
- ClientSideQueueItem.cs
- DelegateSerializationHolder.cs
- WindowsComboBox.cs
- UpWmlMobileTextWriter.cs
- TextEditorDragDrop.cs
- HttpUnhandledOperationInvoker.cs
- DBAsyncResult.cs
- StringDictionary.cs
- SubMenuStyle.cs
- PathHelper.cs
- SecurityUtils.cs
- PackagePart.cs
- DocumentGridContextMenu.cs
- SmtpFailedRecipientsException.cs
- HTMLTagNameToTypeMapper.cs
- ProfilePropertySettings.cs
- CollectionViewSource.cs
- DetailsViewPageEventArgs.cs
- ItemCheckedEvent.cs
- CursorConverter.cs
- SafeUserTokenHandle.cs
- ToolStripContainer.cs
- ComponentManagerBroker.cs
- DataGridViewColumnStateChangedEventArgs.cs
- DataObjectMethodAttribute.cs
- BindingListCollectionView.cs
- XmlBufferReader.cs
- sqlser.cs
- PackageDigitalSignature.cs
- ResolveCompletedEventArgs.cs
- WrapPanel.cs
- BodyGlyph.cs
- SafeRightsManagementPubHandle.cs
- PropertyEmitter.cs
- TextRangeBase.cs
- OuterGlowBitmapEffect.cs
- Rect3D.cs