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
- CharacterShapingProperties.cs
- AppSecurityManager.cs
- DataMemberAttribute.cs
- DoubleCollectionValueSerializer.cs
- SqlDataSourceEnumerator.cs
- XmlExtensionFunction.cs
- XPathMultyIterator.cs
- ScriptingWebServicesSectionGroup.cs
- BuildProvider.cs
- AssemblyBuilder.cs
- XmlSerializerFaultFormatter.cs
- DetailsView.cs
- WorkflowTransactionOptions.cs
- InstanceData.cs
- BooleanKeyFrameCollection.cs
- SqlFileStream.cs
- JoinGraph.cs
- OperationCanceledException.cs
- LowerCaseStringConverter.cs
- RuleValidation.cs
- WorkflowPrinting.cs
- HorizontalAlignConverter.cs
- PageThemeBuildProvider.cs
- IntegerValidatorAttribute.cs
- XMLUtil.cs
- DbConnectionPoolCounters.cs
- TableAdapterManagerNameHandler.cs
- XmlSchemaInfo.cs
- VirtualDirectoryMappingCollection.cs
- ValidatingReaderNodeData.cs
- ToolboxItem.cs
- PartialCachingControl.cs
- TextViewSelectionProcessor.cs
- OperatorExpressions.cs
- ElementsClipboardData.cs
- ExtensionSurface.cs
- ConstraintEnumerator.cs
- BasicKeyConstraint.cs
- PageAsyncTask.cs
- XmlSchemaAttributeGroup.cs
- DataControlFieldHeaderCell.cs
- XmlSignatureManifest.cs
- XmlChildEnumerator.cs
- FamilyTypeface.cs
- WindowsRegion.cs
- TreeNodeEventArgs.cs
- DataGridViewLinkCell.cs
- SynthesizerStateChangedEventArgs.cs
- ResourceDescriptionAttribute.cs
- FieldToken.cs
- XpsS0ValidatingLoader.cs
- InputLanguageSource.cs
- XmlRawWriterWrapper.cs
- SkewTransform.cs
- Helper.cs
- SQLInt16.cs
- BitArray.cs
- XhtmlTextWriter.cs
- StringUtil.cs
- JsonXmlDataContract.cs
- ProtectedConfigurationProviderCollection.cs
- SafeCryptHandles.cs
- CodeSpit.cs
- DatatypeImplementation.cs
- WorkflowNamespace.cs
- HandlerBase.cs
- PrintDialog.cs
- ScriptingRoleServiceSection.cs
- sqlnorm.cs
- SendKeys.cs
- UpdateCompiler.cs
- ReferenceConverter.cs
- RoleGroup.cs
- StartUpEventArgs.cs
- XPathNodePointer.cs
- xml.cs
- CodeGroup.cs
- WindowsTitleBar.cs
- Line.cs
- TransformPattern.cs
- StrongTypingException.cs
- NegotiationTokenAuthenticatorState.cs
- AsyncStreamReader.cs
- dataSvcMapFileLoader.cs
- ConfigXmlReader.cs
- ContextMenu.cs
- AttachedAnnotationChangedEventArgs.cs
- DataGridHelper.cs
- PropertyNames.cs
- SqlDataRecord.cs
- XPathParser.cs
- OleDbConnectionFactory.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- HtmlTitle.cs
- Material.cs
- ErrorFormatterPage.cs
- SafeNativeMethods.cs
- DefaultTraceListener.cs
- XPathSelectionIterator.cs
- AppModelKnownContentFactory.cs