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
- SystemWebCachingSectionGroup.cs
- SqlConnectionPoolGroupProviderInfo.cs
- TextElement.cs
- DataGridColumnHeadersPresenterAutomationPeer.cs
- ServiceMetadataContractBehavior.cs
- CapabilitiesUse.cs
- RpcCryptoRequest.cs
- SqlDataReader.cs
- Enlistment.cs
- XsdValidatingReader.cs
- HttpContextWrapper.cs
- VirtualDirectoryMappingCollection.cs
- JsonFormatReaderGenerator.cs
- BaseParaClient.cs
- CharacterMetricsDictionary.cs
- FlowNode.cs
- ZipFileInfoCollection.cs
- XomlSerializationHelpers.cs
- TypefaceMetricsCache.cs
- RelationshipDetailsCollection.cs
- Expressions.cs
- FocusWithinProperty.cs
- PageParserFilter.cs
- OleDbSchemaGuid.cs
- X509CertificateValidationMode.cs
- formatter.cs
- XmlCustomFormatter.cs
- DrawingDrawingContext.cs
- DesignerResources.cs
- SynchronizedPool.cs
- UnknownBitmapDecoder.cs
- cache.cs
- VectorKeyFrameCollection.cs
- ExtendedProperty.cs
- ProviderSettingsCollection.cs
- MissingSatelliteAssemblyException.cs
- GenericUriParser.cs
- BooleanConverter.cs
- LoginView.cs
- DtdParser.cs
- dtdvalidator.cs
- TranslateTransform.cs
- BlockUIContainer.cs
- FunctionDetailsReader.cs
- DesignerTransactionCloseEvent.cs
- unitconverter.cs
- DataGridRelationshipRow.cs
- SerializationHelper.cs
- PolicyManager.cs
- ScriptingAuthenticationServiceSection.cs
- selecteditemcollection.cs
- codemethodreferenceexpression.cs
- SubtreeProcessor.cs
- SafeHandles.cs
- SspiNegotiationTokenProvider.cs
- SmiSettersStream.cs
- TypeUsageBuilder.cs
- CustomAssemblyResolver.cs
- SiteMapNodeItem.cs
- GenericXmlSecurityToken.cs
- ScaleTransform.cs
- FileLevelControlBuilderAttribute.cs
- WindowsFormsSynchronizationContext.cs
- CancellableEnumerable.cs
- ReversePositionQuery.cs
- WebPartMenuStyle.cs
- TemplatedMailWebEventProvider.cs
- TagPrefixAttribute.cs
- SmtpReplyReaderFactory.cs
- WebZone.cs
- NoResizeSelectionBorderGlyph.cs
- EdmToObjectNamespaceMap.cs
- HelloOperationCD1AsyncResult.cs
- PackWebResponse.cs
- _HTTPDateParse.cs
- RepeaterItemEventArgs.cs
- processwaithandle.cs
- WebServiceParameterData.cs
- EntityObject.cs
- SaveWorkflowCommand.cs
- MimeMapping.cs
- XsltConvert.cs
- AsyncPostBackTrigger.cs
- TreeNode.cs
- ThreadTrace.cs
- oledbmetadatacollectionnames.cs
- GacUtil.cs
- ArrayList.cs
- XslAst.cs
- Variable.cs
- SymLanguageVendor.cs
- EntityContainerEmitter.cs
- ClientBuildManager.cs
- PassportIdentity.cs
- CodeNamespaceImportCollection.cs
- UniqueCodeIdentifierScope.cs
- InvalidCastException.cs
- TransformerTypeCollection.cs
- InheritablePropertyChangeInfo.cs
- SecurityUtils.cs