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
- ScriptRef.cs
- Site.cs
- CommandLineParser.cs
- StaticContext.cs
- DebugView.cs
- OutKeywords.cs
- CollectionBuilder.cs
- ElementMarkupObject.cs
- LowerCaseStringConverter.cs
- XmlElementAttributes.cs
- wgx_commands.cs
- FlowLayout.cs
- DataBinding.cs
- ClientRolePrincipal.cs
- Property.cs
- EncoderParameter.cs
- LayoutExceptionEventArgs.cs
- LogReserveAndAppendState.cs
- MaskedTextBox.cs
- MetadataItemSerializer.cs
- NumericUpDownAccelerationCollection.cs
- ExclusiveCanonicalizationTransform.cs
- StaticExtension.cs
- SqlRewriteScalarSubqueries.cs
- XmlSchemaInclude.cs
- RegexWriter.cs
- SafeNativeMethodsMilCoreApi.cs
- CacheMode.cs
- TdsParserHelperClasses.cs
- serverconfig.cs
- PriorityQueue.cs
- XmlSecureResolver.cs
- StringDictionaryCodeDomSerializer.cs
- LinqDataSourceView.cs
- ConfigXmlAttribute.cs
- AutomationProperty.cs
- TableItemStyle.cs
- iisPickupDirectory.cs
- ByteStream.cs
- MD5CryptoServiceProvider.cs
- CollectionBuilder.cs
- LockedBorderGlyph.cs
- DependencyObject.cs
- CompoundFileReference.cs
- AssemblyUtil.cs
- _AutoWebProxyScriptHelper.cs
- UnionExpr.cs
- TemplateBindingExpression.cs
- XPathDocumentIterator.cs
- RequestDescription.cs
- WebPartConnectionCollection.cs
- NameValuePair.cs
- Decimal.cs
- _SafeNetHandles.cs
- updateconfighost.cs
- NativeMethods.cs
- relpropertyhelper.cs
- PropertyChangedEventArgs.cs
- AddInContractAttribute.cs
- DelegateTypeInfo.cs
- ImageUrlEditor.cs
- SettingsProperty.cs
- adornercollection.cs
- PlainXmlDeserializer.cs
- TraceFilter.cs
- securestring.cs
- EnumerableRowCollectionExtensions.cs
- RuntimeVariablesExpression.cs
- StateRuntime.cs
- AvtEvent.cs
- CodeGeneratorOptions.cs
- XmlIlVisitor.cs
- WebPartCatalogAddVerb.cs
- CurrencyManager.cs
- ToolStripSplitStackLayout.cs
- AttachmentService.cs
- IResourceProvider.cs
- UriSectionData.cs
- SendMailErrorEventArgs.cs
- RegistryPermission.cs
- IgnoreFileBuildProvider.cs
- PolicyChain.cs
- VoiceObjectToken.cs
- InputScope.cs
- IntSecurity.cs
- ParameterSubsegment.cs
- CodeAttributeArgumentCollection.cs
- HttpCachePolicy.cs
- WinFormsUtils.cs
- WebReference.cs
- DesignerHelpers.cs
- PerformanceCounterManager.cs
- BitmapEffectInputData.cs
- XmlSchemaAnnotation.cs
- EncryptedXml.cs
- ByteStreamGeometryContext.cs
- ToolTipAutomationPeer.cs
- WeakReferenceEnumerator.cs
- XmlSchemaSequence.cs
- DecimalStorage.cs