ProviderCommandInfoUtils.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataEntity / System / Data / Query / PlanCompiler / ProviderCommandInfoUtils.cs / 1 / 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,
            List children)
        { 
            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?");

            IEnumerator propertyEnumerator = 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,
            List children)
        { 
            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?");

            IEnumerator propertyEnumerator = 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

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK