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
- CollectionViewGroupInternal.cs
- Point3D.cs
- TreeNodeMouseHoverEvent.cs
- filewebrequest.cs
- MessageFilterException.cs
- RemotingException.cs
- storepermission.cs
- OleDbConnection.cs
- DtdParser.cs
- SchemaUtility.cs
- SettingsAttributeDictionary.cs
- ActivityValidator.cs
- BitmapEffectState.cs
- PageAsyncTask.cs
- LocalizableAttribute.cs
- InheritablePropertyChangeInfo.cs
- CfgSemanticTag.cs
- PreservationFileWriter.cs
- SafeSecurityHelper.cs
- XhtmlStyleClass.cs
- UInt64Storage.cs
- DataSourceProvider.cs
- XmlDsigSep2000.cs
- HtmlProps.cs
- WebBrowserBase.cs
- KeyboardInputProviderAcquireFocusEventArgs.cs
- ZipIOLocalFileHeader.cs
- OracleTimeSpan.cs
- StoreContentChangedEventArgs.cs
- ArrowControl.xaml.cs
- FamilyTypeface.cs
- DataGridTextBoxColumn.cs
- CroppedBitmap.cs
- AnnotationAuthorChangedEventArgs.cs
- CodeMethodReturnStatement.cs
- ManagedFilter.cs
- BindingManagerDataErrorEventArgs.cs
- EntityDataSourceStatementEditor.cs
- InternalDispatchObject.cs
- Point3D.cs
- ExternalFile.cs
- ToolStripContainerDesigner.cs
- PropertyCollection.cs
- SByteConverter.cs
- SafeRightsManagementQueryHandle.cs
- DataGridViewComboBoxColumn.cs
- LogLogRecordEnumerator.cs
- XmlElement.cs
- Triplet.cs
- XPathNodePointer.cs
- AdditionalEntityFunctions.cs
- HwndTarget.cs
- DataGridTable.cs
- FormViewInsertedEventArgs.cs
- HostVisual.cs
- ServiceAuthorizationElement.cs
- CodeGen.cs
- BuildProviderAppliesToAttribute.cs
- ExpressionBuilderCollection.cs
- MenuScrollingVisibilityConverter.cs
- RegistryExceptionHelper.cs
- Tile.cs
- X509WindowsSecurityToken.cs
- RijndaelManaged.cs
- DescendantOverDescendantQuery.cs
- SiteMapDataSource.cs
- Site.cs
- HttpApplicationFactory.cs
- SoapIncludeAttribute.cs
- SendMessageRecord.cs
- TypedDataSourceCodeGenerator.cs
- ForEachDesigner.xaml.cs
- DictationGrammar.cs
- ControlBuilderAttribute.cs
- ContextStack.cs
- DeferredTextReference.cs
- BadImageFormatException.cs
- SimpleBitVector32.cs
- DataSysAttribute.cs
- IdentityValidationException.cs
- RadioButtonRenderer.cs
- ResourceAttributes.cs
- OneOfElement.cs
- ProcessThreadDesigner.cs
- RuntimeWrappedException.cs
- StructuralCache.cs
- DataColumnPropertyDescriptor.cs
- HttpListenerRequest.cs
- IDQuery.cs
- CommandLibraryHelper.cs
- RowCache.cs
- SystemPens.cs
- SoapProtocolImporter.cs
- EntityModelBuildProvider.cs
- SaveFileDialog.cs
- TypeGeneratedEventArgs.cs
- RectangleHotSpot.cs
- GridLength.cs
- DeferredTextReference.cs
- HuffCodec.cs