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
- TemplateBindingExpression.cs
- CustomErrorsSection.cs
- SchemaHelper.cs
- SpeakInfo.cs
- XmlCustomFormatter.cs
- OAVariantLib.cs
- prefixendpointaddressmessagefilter.cs
- XsdCachingReader.cs
- MemberHolder.cs
- ListViewDataItem.cs
- DbSetClause.cs
- DataGridViewComboBoxColumn.cs
- PointLightBase.cs
- XmlExtensionFunction.cs
- StyleModeStack.cs
- AccessDataSource.cs
- ReferenceEqualityComparer.cs
- ManagementObject.cs
- AdornedElementPlaceholder.cs
- safelink.cs
- AddInIpcChannel.cs
- LayoutEvent.cs
- SymmetricKeyWrap.cs
- BindingSource.cs
- TypeLibConverter.cs
- CodeValidator.cs
- ThreadInterruptedException.cs
- SchemaCreator.cs
- EventMemberCodeDomSerializer.cs
- DoubleAnimationUsingPath.cs
- IdentifierElement.cs
- DateTimeOffsetConverter.cs
- MatrixKeyFrameCollection.cs
- ChildrenQuery.cs
- NavigationHelper.cs
- Graph.cs
- EntityProviderServices.cs
- FontDialog.cs
- ToolStripItemTextRenderEventArgs.cs
- ImmComposition.cs
- CacheMemory.cs
- SelfIssuedAuthProofToken.cs
- Vector3D.cs
- SystemUnicastIPAddressInformation.cs
- Point3DAnimationUsingKeyFrames.cs
- RPIdentityRequirement.cs
- ZipIOFileItemStream.cs
- WmlValidatorAdapter.cs
- Menu.cs
- MethodRental.cs
- ConnectionStringEditor.cs
- TextEditorDragDrop.cs
- ProxyWebPart.cs
- ArrayMergeHelper.cs
- GestureRecognizer.cs
- StringDictionary.cs
- ExpressionQuoter.cs
- SpinWait.cs
- RSACryptoServiceProvider.cs
- CharAnimationUsingKeyFrames.cs
- StylusPointPropertyUnit.cs
- EventDescriptorCollection.cs
- CompositeCollection.cs
- util.cs
- CapabilitiesSection.cs
- BoundColumn.cs
- AudioException.cs
- Animatable.cs
- Utility.cs
- ResourceLoader.cs
- OledbConnectionStringbuilder.cs
- TextSimpleMarkerProperties.cs
- DbConnectionPoolIdentity.cs
- QueryStringParameter.cs
- HWStack.cs
- Message.cs
- PropertyItem.cs
- MemberProjectionIndex.cs
- ClientSession.cs
- TrackingDataItemValue.cs
- XmlCountingReader.cs
- CreateUserWizardStep.cs
- SortableBindingList.cs
- AutomationProperties.cs
- AQNBuilder.cs
- LineSegment.cs
- MenuTracker.cs
- VisualTreeHelper.cs
- AnnotationAdorner.cs
- DataGridTablesFactory.cs
- HtmlMeta.cs
- FileStream.cs
- PassportAuthenticationEventArgs.cs
- X509Utils.cs
- DataStorage.cs
- ProtocolsSection.cs
- PassportAuthenticationModule.cs
- OdbcConnectionOpen.cs
- ReverseInheritProperty.cs
- ImageFormatConverter.cs