Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Query / PlanCompiler / PlanCompilerUtil.cs / 1305376 / PlanCompilerUtil.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Data.Common.Utils; using System.Data.Metadata.Edm; using System.Data.Query.InternalTrees; namespace System.Data.Query.PlanCompiler { ////// Utility class for the methods shared among the classes comprising the plan compiler /// internal static class PlanCompilerUtil { ////// Utility method that determines whether a given CaseOp subtree can be optimized. /// Called by both PreProcessor and NominalTypeEliminator. /// /// If the case statement is of the shape: /// case when X then NULL else Y, or /// case when X then Y else NULL, /// where Y is of row type, and the types of the input CaseOp, the NULL and Y are the same, /// return true /// /// /// ///internal static bool IsRowTypeCaseOpWithNullability(CaseOp op, Node n, out bool thenClauseIsNull) { thenClauseIsNull = false; //any default value will do if (!TypeSemantics.IsRowType(op.Type)) { return false; } if (n.Children.Count != 3) { return false; } //All three types must be equal if (!n.Child1.Op.Type.EdmEquals(op.Type) || !n.Child2.Op.Type.EdmEquals(op.Type)) { return false; } //At least one of Child1 and Child2 needs to be a null if (n.Child1.Op.OpType == OpType.Null) { thenClauseIsNull = true; return true; } if (n.Child2.Op.OpType == OpType.Null) { // thenClauseIsNull stays false return true; } return false; } /// /// Is this function a collection aggregate function. It is, if /// - it has exactly one child /// - that child is a collection type /// - and the function has been marked with the aggregate attribute /// /// the function op /// the current subtree ///true, if this was a collection aggregate function internal static bool IsCollectionAggregateFunction(FunctionOp op, Node n) { return ((n.Children.Count == 1) && TypeSemantics.IsCollectionType(n.Child0.Op.Type) && TypeSemantics.IsAggregateFunction(op.Function)); } ////// Is the given op one of the ConstantBaseOp-s /// /// ///internal static bool IsConstantBaseOp(OpType opType) { return opType == OpType.Constant || opType == OpType.InternalConstant || opType == OpType.Null || opType == OpType.NullSentinel; } /// /// Combine two predicates by trying to avoid the predicate parts of the /// second one that are already present in the first one. /// /// In particular, given two nodes, predicate1 and predicate2, /// it creates a combined predicate logically equivalent to /// predicate1 AND predicate2, /// but it does not include any AND parts of predicate2 that are present /// in predicate1. /// /// /// /// ///internal static Node CombinePredicates(Node predicate1, Node predicate2, Command command) { IEnumerable andParts1 = BreakIntoAndParts(predicate1); IEnumerable andParts2 = BreakIntoAndParts(predicate2); Node result = predicate1; foreach (Node predicatePart2 in andParts2) { bool foundMatch = false; foreach (Node predicatePart1 in andParts1) { if (predicatePart1.IsEquivalent(predicatePart2)) { foundMatch = true; break; } } if (!foundMatch) { result = command.CreateNode(command.CreateConditionalOp(OpType.And), result, predicatePart2); } } return result; } /// /// Create a list of AND parts for a given predicate. /// For example, if the predicate is of the shape: /// ((p1 and p2) and (p3 and p4)) the list is p1, p2, p3, p4 /// The predicates p1,p2, p3, p4 may be roots of subtrees that /// have nodes with AND ops, but /// would not be broken unless they are the AND nodes themselves. /// /// /// private static IEnumerableBreakIntoAndParts(Node predicate) { return Helpers.GetLeafNodes (predicate, node => (node.Op.OpType != OpType.And), node => (new[] {node.Child0, node.Child1})); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Data.Common.Utils; using System.Data.Metadata.Edm; using System.Data.Query.InternalTrees; namespace System.Data.Query.PlanCompiler { ////// Utility class for the methods shared among the classes comprising the plan compiler /// internal static class PlanCompilerUtil { ////// Utility method that determines whether a given CaseOp subtree can be optimized. /// Called by both PreProcessor and NominalTypeEliminator. /// /// If the case statement is of the shape: /// case when X then NULL else Y, or /// case when X then Y else NULL, /// where Y is of row type, and the types of the input CaseOp, the NULL and Y are the same, /// return true /// /// /// ///internal static bool IsRowTypeCaseOpWithNullability(CaseOp op, Node n, out bool thenClauseIsNull) { thenClauseIsNull = false; //any default value will do if (!TypeSemantics.IsRowType(op.Type)) { return false; } if (n.Children.Count != 3) { return false; } //All three types must be equal if (!n.Child1.Op.Type.EdmEquals(op.Type) || !n.Child2.Op.Type.EdmEquals(op.Type)) { return false; } //At least one of Child1 and Child2 needs to be a null if (n.Child1.Op.OpType == OpType.Null) { thenClauseIsNull = true; return true; } if (n.Child2.Op.OpType == OpType.Null) { // thenClauseIsNull stays false return true; } return false; } /// /// Is this function a collection aggregate function. It is, if /// - it has exactly one child /// - that child is a collection type /// - and the function has been marked with the aggregate attribute /// /// the function op /// the current subtree ///true, if this was a collection aggregate function internal static bool IsCollectionAggregateFunction(FunctionOp op, Node n) { return ((n.Children.Count == 1) && TypeSemantics.IsCollectionType(n.Child0.Op.Type) && TypeSemantics.IsAggregateFunction(op.Function)); } ////// Is the given op one of the ConstantBaseOp-s /// /// ///internal static bool IsConstantBaseOp(OpType opType) { return opType == OpType.Constant || opType == OpType.InternalConstant || opType == OpType.Null || opType == OpType.NullSentinel; } /// /// Combine two predicates by trying to avoid the predicate parts of the /// second one that are already present in the first one. /// /// In particular, given two nodes, predicate1 and predicate2, /// it creates a combined predicate logically equivalent to /// predicate1 AND predicate2, /// but it does not include any AND parts of predicate2 that are present /// in predicate1. /// /// /// /// ///internal static Node CombinePredicates(Node predicate1, Node predicate2, Command command) { IEnumerable andParts1 = BreakIntoAndParts(predicate1); IEnumerable andParts2 = BreakIntoAndParts(predicate2); Node result = predicate1; foreach (Node predicatePart2 in andParts2) { bool foundMatch = false; foreach (Node predicatePart1 in andParts1) { if (predicatePart1.IsEquivalent(predicatePart2)) { foundMatch = true; break; } } if (!foundMatch) { result = command.CreateNode(command.CreateConditionalOp(OpType.And), result, predicatePart2); } } return result; } /// /// Create a list of AND parts for a given predicate. /// For example, if the predicate is of the shape: /// ((p1 and p2) and (p3 and p4)) the list is p1, p2, p3, p4 /// The predicates p1,p2, p3, p4 may be roots of subtrees that /// have nodes with AND ops, but /// would not be broken unless they are the AND nodes themselves. /// /// /// private static IEnumerableBreakIntoAndParts(Node predicate) { return Helpers.GetLeafNodes (predicate, node => (node.Op.OpType != OpType.And), node => (new[] {node.Child0, node.Child1})); } } } // 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
- HTMLTextWriter.cs
- PropertyRef.cs
- ReferentialConstraint.cs
- assertwrapper.cs
- SafeRightsManagementEnvironmentHandle.cs
- SamlSecurityTokenAuthenticator.cs
- SystemUdpStatistics.cs
- EncoderParameter.cs
- XPathQilFactory.cs
- TextHidden.cs
- GenericAuthenticationEventArgs.cs
- SoapClientMessage.cs
- ViewValidator.cs
- WmfPlaceableFileHeader.cs
- Style.cs
- OuterGlowBitmapEffect.cs
- DesignTimeDataBinding.cs
- ZoneLinkButton.cs
- ToolStripStatusLabel.cs
- Cursor.cs
- _ConnectStream.cs
- ModuleConfigurationInfo.cs
- EventProxy.cs
- RuleAction.cs
- QuaternionConverter.cs
- UnsafeNativeMethods.cs
- WpfPayload.cs
- FastPropertyAccessor.cs
- FormCollection.cs
- Duration.cs
- TreeBuilder.cs
- ExtendedProperty.cs
- NamedPipeChannelListener.cs
- BaseComponentEditor.cs
- RequestSecurityTokenForGetBrowserToken.cs
- CompiledXpathExpr.cs
- xml.cs
- _HeaderInfoTable.cs
- JoinTreeSlot.cs
- OrderedDictionaryStateHelper.cs
- TransformPattern.cs
- EventLogPropertySelector.cs
- RtfFormatStack.cs
- CompositeActivityDesigner.cs
- LinearQuaternionKeyFrame.cs
- GlobalizationAssembly.cs
- _DomainName.cs
- CreateRefExpr.cs
- TableParaClient.cs
- WebPartEditorOkVerb.cs
- Cursor.cs
- ManagedWndProcTracker.cs
- DataTableClearEvent.cs
- ActivityDesigner.cs
- InputBuffer.cs
- ConfigurationSectionCollection.cs
- DPTypeDescriptorContext.cs
- ObjectSet.cs
- DesignerSerializationOptionsAttribute.cs
- ExpressionBindings.cs
- Nodes.cs
- ContentPlaceHolder.cs
- CounterSampleCalculator.cs
- FigureHelper.cs
- ConnectionStringsExpressionBuilder.cs
- QueryResult.cs
- SqlColumnizer.cs
- PanningMessageFilter.cs
- Rfc2898DeriveBytes.cs
- ConnectivityStatus.cs
- TryExpression.cs
- SettingsAttributeDictionary.cs
- TemplateInstanceAttribute.cs
- WebServiceClientProxyGenerator.cs
- TrackingMemoryStream.cs
- FlowDecisionLabelFeature.cs
- AnimatedTypeHelpers.cs
- FixedSOMContainer.cs
- SqlReorderer.cs
- DataGridViewRowPrePaintEventArgs.cs
- MetadataException.cs
- SamlAuthenticationStatement.cs
- ToolStripDropDownMenu.cs
- ConfigUtil.cs
- WebConfigurationHostFileChange.cs
- TextBox.cs
- LongCountAggregationOperator.cs
- ContextMenuStrip.cs
- SplitterEvent.cs
- CoTaskMemHandle.cs
- DebugController.cs
- Part.cs
- AttributeData.cs
- ContainerParaClient.cs
- DataPagerField.cs
- XmlDataSourceNodeDescriptor.cs
- EntityDataSourceUtil.cs
- DefaultValueAttribute.cs
- ExtensionSimplifierMarkupObject.cs
- MetafileHeader.cs