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

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SwitchAttribute.cs
- PropertiesTab.cs
- MembershipValidatePasswordEventArgs.cs
- ObjectStateEntry.cs
- LabelLiteral.cs
- WebEvents.cs
- CrossSiteScriptingValidation.cs
- NaturalLanguageHyphenator.cs
- XamlReader.cs
- input.cs
- ScalarType.cs
- BuildProviderAppliesToAttribute.cs
- TypeValidationEventArgs.cs
- FactoryGenerator.cs
- StringAnimationBase.cs
- UnionCodeGroup.cs
- ImpersonateTokenRef.cs
- AtlasWeb.Designer.cs
- ProfileWorkflowElement.cs
- ChannelManagerService.cs
- OleDbStruct.cs
- SmiContext.cs
- WebBaseEventKeyComparer.cs
- SimplePropertyEntry.cs
- Filter.cs
- NetworkCredential.cs
- ResourceDictionary.cs
- ValidatorCompatibilityHelper.cs
- EdmComplexPropertyAttribute.cs
- ExpandCollapseProviderWrapper.cs
- StrongNameIdentityPermission.cs
- EpmCustomContentWriterNodeData.cs
- ZipIOExtraField.cs
- SoapSchemaMember.cs
- ConsoleTraceListener.cs
- X509ChainElement.cs
- _AutoWebProxyScriptHelper.cs
- TextViewSelectionProcessor.cs
- RbTree.cs
- dsa.cs
- DataGridViewComponentPropertyGridSite.cs
- sqlser.cs
- NavigationFailedEventArgs.cs
- SqlDataSourceCustomCommandEditor.cs
- DoubleKeyFrameCollection.cs
- ScalarConstant.cs
- PageTheme.cs
- TextTreeInsertElementUndoUnit.cs
- AdapterSwitches.cs
- ConfigurationManagerInternalFactory.cs
- ContextMenuStrip.cs
- SemanticAnalyzer.cs
- FileDialog_Vista_Interop.cs
- ImageIndexConverter.cs
- PackWebRequest.cs
- PeerObject.cs
- DockPanel.cs
- EditorPartChrome.cs
- TextElementCollection.cs
- SetterBase.cs
- ConfigurationValidatorAttribute.cs
- WebPartHeaderCloseVerb.cs
- ReferenceSchema.cs
- AtomicFile.cs
- Matrix3DStack.cs
- GlyphInfoList.cs
- AnnouncementEventArgs.cs
- WebException.cs
- ConnectionConsumerAttribute.cs
- LocalBuilder.cs
- AuthenticationConfig.cs
- RTTrackingProfile.cs
- messageonlyhwndwrapper.cs
- FormsIdentity.cs
- ProxyWebPartManagerDesigner.cs
- Wizard.cs
- ScalarConstant.cs
- MachineKeyConverter.cs
- XmlExpressionDumper.cs
- InstalledVoice.cs
- XmlCustomFormatter.cs
- DataProtection.cs
- WCFBuildProvider.cs
- MD5.cs
- XamlDesignerSerializationManager.cs
- __TransparentProxy.cs
- PersonalizationDictionary.cs
- NamedObject.cs
- WindowsIPAddress.cs
- UncommonField.cs
- DefaultCommandConverter.cs
- JoinCqlBlock.cs
- EmissiveMaterial.cs
- Comparer.cs
- RangeValidator.cs
- SevenBitStream.cs
- DataConnectionHelper.cs
- VectorConverter.cs
- SmtpNtlmAuthenticationModule.cs
- EdgeProfileValidation.cs