Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Query / PlanCompiler / ProviderCommandInfoUtils.cs / 2 / ProviderCommandInfoUtils.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; //using System.Diagnostics; // Please use PlanCompiler.Assert instead of Debug.Assert in this class... using System.Data.Common.CommandTrees; using System.Data.Common; using md = System.Data.Metadata.Edm; using System.Data.Query.InternalTrees; using System.Data.Query.PlanCompiler; namespace System.Data.Query.PlanCompiler { ////// Helper class for creating a ProviderCommandInfo given an Iqt Node. /// internal static class ProviderCommandInfoUtils { #region Public Methods ////// Creates a ProviderCommandInfo for the given node. /// This method should be called when the keys, foreign keys and sort keys are known ahead of time. /// Typically it is used when the original command is factored into multiple commands. /// /// The owning command, used for creating VarVecs, etc /// The root of the sub-command for which a ProviderCommandInfo should be generated /// A list of ProviderCommandInfos that were created for the child sub-commands. ///The resulting ProviderCommandInfo internal static ProviderCommandInfo Create( Command command, Node node, Listchildren) { PhysicalProjectOp projectOp = node.Op as PhysicalProjectOp; PlanCompiler.Assert(projectOp != null, "Expected root Op to be a physical Project"); // build up the CQT DbCommandTree ctree = CTreeGenerator.Generate(command, node); DbQueryCommandTree cqtree = ctree as DbQueryCommandTree; PlanCompiler.Assert(cqtree != null, "null query command tree"); // Get the rowtype for the result cqt md.CollectionType collType = TypeHelpers.GetEdmType (cqtree.Query.ResultType); PlanCompiler.Assert(md.TypeSemantics.IsRowType(collType.TypeUsage), "command rowtype is not a record"); // Build up a mapping from Vars to the corresponding output property/column Dictionary outputVarMap = BuildOutputVarMap(projectOp, collType.TypeUsage); return new ProviderCommandInfo(ctree, children); } /// /// Creates a ProviderCommandInfo for the given node. /// This method should be called when the keys and the sort keys are not known ahead of time. /// Typically it is used when there is only one command, that is no query factoring is done. /// This method also has the option of pulling up keys and sort information. /// /// The owning command, used for creating VarVecs, etc /// The root of the sub-command for which a ProviderCommandInfo should be generated ///The resulting ProviderCommandInfo internal static ProviderCommandInfo Create( Command command, Node node) { return Create( command, node, new List() //children ); } #endregion #region Private Methods /// /// Build up a mapping from Vars to the corresponding property of the output row type /// /// the physical projectOp /// output type ///a map from Vars to the output type member private static Dictionary BuildOutputVarMap(PhysicalProjectOp projectOp, md.TypeUsage outputType) { Dictionary outputVarMap = new Dictionary(); PlanCompiler.Assert(md.TypeSemantics.IsRowType(outputType), "PhysicalProjectOp result type is not a RowType?"); IEnumeratorpropertyEnumerator = TypeHelpers.GetEdmType (outputType).Properties.GetEnumerator(); IEnumerator varEnumerator = projectOp.Outputs.GetEnumerator(); while (true) { bool foundProp = propertyEnumerator.MoveNext(); bool foundVar = varEnumerator.MoveNext(); if (foundProp != foundVar) { throw EntityUtil.InternalError(EntityUtil.InternalErrorCode.ColumnCountMismatch, 1); } if (!foundProp) { break; } outputVarMap[varEnumerator.Current] = propertyEnumerator.Current; } return outputVarMap; } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; //using System.Diagnostics; // Please use PlanCompiler.Assert instead of Debug.Assert in this class... using System.Data.Common.CommandTrees; using System.Data.Common; using md = System.Data.Metadata.Edm; using System.Data.Query.InternalTrees; using System.Data.Query.PlanCompiler; namespace System.Data.Query.PlanCompiler { ////// Helper class for creating a ProviderCommandInfo given an Iqt Node. /// internal static class ProviderCommandInfoUtils { #region Public Methods ////// Creates a ProviderCommandInfo for the given node. /// This method should be called when the keys, foreign keys and sort keys are known ahead of time. /// Typically it is used when the original command is factored into multiple commands. /// /// The owning command, used for creating VarVecs, etc /// The root of the sub-command for which a ProviderCommandInfo should be generated /// A list of ProviderCommandInfos that were created for the child sub-commands. ///The resulting ProviderCommandInfo internal static ProviderCommandInfo Create( Command command, Node node, Listchildren) { PhysicalProjectOp projectOp = node.Op as PhysicalProjectOp; PlanCompiler.Assert(projectOp != null, "Expected root Op to be a physical Project"); // build up the CQT DbCommandTree ctree = CTreeGenerator.Generate(command, node); DbQueryCommandTree cqtree = ctree as DbQueryCommandTree; PlanCompiler.Assert(cqtree != null, "null query command tree"); // Get the rowtype for the result cqt md.CollectionType collType = TypeHelpers.GetEdmType (cqtree.Query.ResultType); PlanCompiler.Assert(md.TypeSemantics.IsRowType(collType.TypeUsage), "command rowtype is not a record"); // Build up a mapping from Vars to the corresponding output property/column Dictionary outputVarMap = BuildOutputVarMap(projectOp, collType.TypeUsage); return new ProviderCommandInfo(ctree, children); } /// /// Creates a ProviderCommandInfo for the given node. /// This method should be called when the keys and the sort keys are not known ahead of time. /// Typically it is used when there is only one command, that is no query factoring is done. /// This method also has the option of pulling up keys and sort information. /// /// The owning command, used for creating VarVecs, etc /// The root of the sub-command for which a ProviderCommandInfo should be generated ///The resulting ProviderCommandInfo internal static ProviderCommandInfo Create( Command command, Node node) { return Create( command, node, new List() //children ); } #endregion #region Private Methods /// /// Build up a mapping from Vars to the corresponding property of the output row type /// /// the physical projectOp /// output type ///a map from Vars to the output type member private static Dictionary BuildOutputVarMap(PhysicalProjectOp projectOp, md.TypeUsage outputType) { Dictionary outputVarMap = new Dictionary(); PlanCompiler.Assert(md.TypeSemantics.IsRowType(outputType), "PhysicalProjectOp result type is not a RowType?"); IEnumeratorpropertyEnumerator = TypeHelpers.GetEdmType (outputType).Properties.GetEnumerator(); IEnumerator varEnumerator = projectOp.Outputs.GetEnumerator(); while (true) { bool foundProp = propertyEnumerator.MoveNext(); bool foundVar = varEnumerator.MoveNext(); if (foundProp != foundVar) { throw EntityUtil.InternalError(EntityUtil.InternalErrorCode.ColumnCountMismatch, 1); } if (!foundProp) { break; } outputVarMap[varEnumerator.Current] = propertyEnumerator.Current; } return outputVarMap; } #endregion } } // 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
- Constants.cs
- xamlnodes.cs
- TypeAccessException.cs
- FolderLevelBuildProviderAppliesToAttribute.cs
- MouseActionConverter.cs
- HexParser.cs
- XamlClipboardData.cs
- EntityDataSourceContextCreatedEventArgs.cs
- ToolStripDropDownMenu.cs
- TraceProvider.cs
- SendingRequestEventArgs.cs
- ValidatingReaderNodeData.cs
- FixUpCollection.cs
- ErrorsHelper.cs
- TripleDESCryptoServiceProvider.cs
- SqlErrorCollection.cs
- SqlCrossApplyToCrossJoin.cs
- AutomationPropertyInfo.cs
- StatusBarItem.cs
- FindCriteria11.cs
- PageOrientation.cs
- DetailsViewInsertEventArgs.cs
- ServiceReference.cs
- Misc.cs
- EdmFunctions.cs
- ValidationErrorCollection.cs
- CompModSwitches.cs
- EntityDataSourceState.cs
- OdbcUtils.cs
- OutputBuffer.cs
- UnmanagedHandle.cs
- _Win32.cs
- XmlSortKey.cs
- AssemblyHash.cs
- Camera.cs
- InkCollectionBehavior.cs
- GPPOINT.cs
- SourceElementsCollection.cs
- StopStoryboard.cs
- TypeCodeDomSerializer.cs
- WebServiceParameterData.cs
- SafeViewOfFileHandle.cs
- ActionNotSupportedException.cs
- WebPartConnectionsEventArgs.cs
- Ops.cs
- GlyphRunDrawing.cs
- XmlSchemaParticle.cs
- TrustManager.cs
- ParallelTimeline.cs
- IssuanceLicense.cs
- MessageRpc.cs
- DomainUpDown.cs
- _UriSyntax.cs
- ColorConvertedBitmap.cs
- BaseTreeIterator.cs
- FlowDocumentView.cs
- TextTreeUndoUnit.cs
- ToolStripPanelDesigner.cs
- Transactions.cs
- Int32KeyFrameCollection.cs
- HttpRawResponse.cs
- LocationSectionRecord.cs
- SerializationFieldInfo.cs
- PatternMatcher.cs
- SqlNotificationRequest.cs
- XmlILAnnotation.cs
- TableCellCollection.cs
- SettingsPropertyValueCollection.cs
- IPCCacheManager.cs
- TextSpanModifier.cs
- EventMetadata.cs
- CodeLabeledStatement.cs
- MiniLockedBorderGlyph.cs
- XmlKeywords.cs
- DataPagerFieldItem.cs
- ResourceWriter.cs
- SortAction.cs
- TranslateTransform.cs
- VScrollProperties.cs
- AccessorTable.cs
- BooleanSwitch.cs
- HtmlToClrEventProxy.cs
- AutomationPattern.cs
- SiteIdentityPermission.cs
- FieldDescriptor.cs
- Rectangle.cs
- D3DImage.cs
- DocumentXmlWriter.cs
- PointAnimationBase.cs
- RuntimeArgumentHandle.cs
- XmlDocument.cs
- RowType.cs
- ADConnectionHelper.cs
- DashStyle.cs
- AttachedPropertyBrowsableForChildrenAttribute.cs
- CountdownEvent.cs
- ModelVisual3D.cs
- RelatedView.cs
- RolePrincipal.cs
- ExceptionCollection.cs