Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Map / ViewGeneration / GeneratedView.cs / 1305376 / GeneratedView.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System.Data.Common.Utils; using System.Data.Common.CommandTrees; using System.Data.Common.EntitySql; using System.Text; using System.Collections.Generic; using System.Data.Mapping.ViewGeneration.Utils; using System.Diagnostics; using System.Data.Metadata.Edm; using System.Data.Common.CommandTrees.Internal; using System.Data.Query.InternalTrees; using System.Data.Query.PlanCompiler; namespace System.Data.Mapping.ViewGeneration { // Holds the view generated for a given OFTYPE(Extent, Type) combination internal class GeneratedView : InternalBase { // effects: Creates an object that stores a view, cqlString, for the combinationinternal GeneratedView(EntitySetBase extent, EdmType type, string cqlString, StorageMappingItemCollection mappingItemCollection, ConfigViewGenerator config) { m_extent = extent; m_type = type; m_cqlString = cqlString; m_config = config; m_mappingItemCollection = mappingItemCollection; if (m_config.IsViewTracing) { if (EqualityComparer .Default.Equals(type, extent.ElementType)) { Helpers.FormatTraceLine("CQL view for {0}", extent.Name); } else { Helpers.FormatTraceLine("CQL view for OFTYPE({0}, {1}.{2})", extent.Name, type.NamespaceName, type.Name); } Helpers.StringTraceLine(cqlString); } if (m_config.IsViewTracing) { ParseView(m_mappingItemCollection, false /*isUserSpecified*/); } } internal GeneratedView(EntitySetBase extent, EdmType type, DbQueryCommandTree commandTree, StorageMappingItemCollection mappingItemCollection, ConfigViewGenerator config) { m_extent = extent; m_type = type; m_cqlString = "Foreign Key Association Set View"; m_commandTree = commandTree; m_config = config; m_mappingItemCollection = mappingItemCollection; } #region Fields private EntitySetBase m_extent; private EdmType m_type; private string m_cqlString; private DbQueryCommandTree m_commandTree; //We cache CQTs for Update Views sicne that is the one update stack works of. private Node m_internalTreeNode; //we cache IQTs for Query Views since that is the one query stack works of. private ConfigViewGenerator m_config; private DiscriminatorMap m_discriminatorMap; private StorageMappingItemCollection m_mappingItemCollection; #endregion #region Properties internal EntitySetBase Extent { get { return m_extent; } } internal EdmType EntityType { get { return m_type; } } internal string CqlString { get { return m_cqlString; } } internal DiscriminatorMap DiscriminatorMap { get { return m_discriminatorMap; } } #endregion #region Methods /// /// Parses and validates a user-defined query mapping view. Outputs errors if any. /// internal IEnumerableParseUserSpecifiedView(StorageSetMapping setMapping, EntityTypeBase elementType, bool includeSubtypes) { m_commandTree = ParseView(m_mappingItemCollection, true); // Verify that all expressions appearing in the view are supported. foreach (var error in ViewValidator.ValidateQueryView(m_commandTree, setMapping, elementType, includeSubtypes)) { yield return error; } // Verify that the result type of the query view is assignable to the element type of the entityset CollectionType queryResultType = (m_commandTree.Query.ResultType.EdmType) as CollectionType; if ((queryResultType == null) || (!setMapping.Set.ElementType.IsAssignableFrom(queryResultType.TypeUsage.EdmType))) { EdmSchemaError error = new EdmSchemaError(System.Data.Entity.Strings.Mapping_Invalid_QueryView_Type_1(setMapping.Set.Name), (int)StorageMappingErrorCode.InvalidQueryViewResultType, EdmSchemaErrorSeverity.Error, setMapping.EntityContainerMapping.SourceLocation, setMapping.StartLineNumber, setMapping.StartLinePosition); yield return error; } } // effects: Given an extent and its corresponding view, invokes the // parser to check if the view definition is syntactically correct // Returns true iff the parsing succeeds private DbQueryCommandTree ParseView(StorageMappingItemCollection mappingItemCollection, bool isUserSpecified) { // We do not catch any internal exceptions any more m_config.StartSingleWatch(PerfType.ViewParsing); //If it is a user specified view, //allow all queries. Otherwise parse the view in a restricted mode. ParserOptions.CompilationMode compilationMode = ParserOptions.CompilationMode.RestrictedViewGenerationMode; if (isUserSpecified) { compilationMode = ParserOptions.CompilationMode.UserViewGenerationMode; } DbQueryCommandTree commandTree = (DbQueryCommandTree)ExternalCalls.CompileView(CqlString, mappingItemCollection, compilationMode); // For non user-specified views, perform simplification if (!isUserSpecified) { commandTree = ViewSimplifier.SimplifyView(m_extent, commandTree); } // See if the view matches the "discriminated" pattern (allows simplification of generated store commands) if (m_extent.BuiltInTypeKind == BuiltInTypeKind.EntitySet) { DiscriminatorMap discriminatorMap; if (DiscriminatorMap.TryCreateDiscriminatorMap((EntitySet)m_extent, commandTree.Query, out discriminatorMap)) { m_discriminatorMap = discriminatorMap; } } m_config.StopSingleWatch(PerfType.ViewParsing); return commandTree; } internal DbQueryCommandTree GetCommandTree(MetadataWorkspace workspace) { //Ask command trees only for C space entity sets Debug.Assert(m_extent.EntityContainer.DataSpace == DataSpace.SSpace, "CQT should be asked only for update view"); if (m_commandTree == null) { m_commandTree = ParseView((StorageMappingItemCollection)workspace.GetItemCollection(DataSpace.CSSpace), false); } return m_commandTree; } internal Node GetInternalTree(MetadataWorkspace workspace) { Debug.Assert(m_extent.EntityContainer.DataSpace == DataSpace.CSpace, "Internal Tree should be asked only for query view"); if (m_internalTreeNode == null) { DbQueryCommandTree tree = m_commandTree ?? ParseView((StorageMappingItemCollection)workspace.GetItemCollection(DataSpace.CSSpace), false); // Convert this into an ITree first Command itree = ITreeGenerator.Generate(tree, this.DiscriminatorMap); // Pull out the root physical project-op, and copy this itree into our own itree PlanCompiler.Assert(itree.Root.Op.OpType == OpType.PhysicalProject, "Expected a physical projectOp at the root of the tree - found " + itree.Root.Op.OpType); // #554756: VarVec enumerators are not cached on the shared Command instance. itree.DisableVarVecEnumCaching(); m_internalTreeNode = itree.Root.Child0; } return m_internalTreeNode; } #endregion #region String Methods internal override void ToCompactString(StringBuilder builder) { builder.Append("OFTYPE(") .Append(Extent.Name) .Append(", ") .Append(EntityType.Name) .Append(") = ") .Append(CqlString); } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System.Data.Common.Utils; using System.Data.Common.CommandTrees; using System.Data.Common.EntitySql; using System.Text; using System.Collections.Generic; using System.Data.Mapping.ViewGeneration.Utils; using System.Diagnostics; using System.Data.Metadata.Edm; using System.Data.Common.CommandTrees.Internal; using System.Data.Query.InternalTrees; using System.Data.Query.PlanCompiler; namespace System.Data.Mapping.ViewGeneration { // Holds the view generated for a given OFTYPE(Extent, Type) combination internal class GeneratedView : InternalBase { // effects: Creates an object that stores a view, cqlString, for the combinationinternal GeneratedView(EntitySetBase extent, EdmType type, string cqlString, StorageMappingItemCollection mappingItemCollection, ConfigViewGenerator config) { m_extent = extent; m_type = type; m_cqlString = cqlString; m_config = config; m_mappingItemCollection = mappingItemCollection; if (m_config.IsViewTracing) { if (EqualityComparer .Default.Equals(type, extent.ElementType)) { Helpers.FormatTraceLine("CQL view for {0}", extent.Name); } else { Helpers.FormatTraceLine("CQL view for OFTYPE({0}, {1}.{2})", extent.Name, type.NamespaceName, type.Name); } Helpers.StringTraceLine(cqlString); } if (m_config.IsViewTracing) { ParseView(m_mappingItemCollection, false /*isUserSpecified*/); } } internal GeneratedView(EntitySetBase extent, EdmType type, DbQueryCommandTree commandTree, StorageMappingItemCollection mappingItemCollection, ConfigViewGenerator config) { m_extent = extent; m_type = type; m_cqlString = "Foreign Key Association Set View"; m_commandTree = commandTree; m_config = config; m_mappingItemCollection = mappingItemCollection; } #region Fields private EntitySetBase m_extent; private EdmType m_type; private string m_cqlString; private DbQueryCommandTree m_commandTree; //We cache CQTs for Update Views sicne that is the one update stack works of. private Node m_internalTreeNode; //we cache IQTs for Query Views since that is the one query stack works of. private ConfigViewGenerator m_config; private DiscriminatorMap m_discriminatorMap; private StorageMappingItemCollection m_mappingItemCollection; #endregion #region Properties internal EntitySetBase Extent { get { return m_extent; } } internal EdmType EntityType { get { return m_type; } } internal string CqlString { get { return m_cqlString; } } internal DiscriminatorMap DiscriminatorMap { get { return m_discriminatorMap; } } #endregion #region Methods /// /// Parses and validates a user-defined query mapping view. Outputs errors if any. /// internal IEnumerableParseUserSpecifiedView(StorageSetMapping setMapping, EntityTypeBase elementType, bool includeSubtypes) { m_commandTree = ParseView(m_mappingItemCollection, true); // Verify that all expressions appearing in the view are supported. foreach (var error in ViewValidator.ValidateQueryView(m_commandTree, setMapping, elementType, includeSubtypes)) { yield return error; } // Verify that the result type of the query view is assignable to the element type of the entityset CollectionType queryResultType = (m_commandTree.Query.ResultType.EdmType) as CollectionType; if ((queryResultType == null) || (!setMapping.Set.ElementType.IsAssignableFrom(queryResultType.TypeUsage.EdmType))) { EdmSchemaError error = new EdmSchemaError(System.Data.Entity.Strings.Mapping_Invalid_QueryView_Type_1(setMapping.Set.Name), (int)StorageMappingErrorCode.InvalidQueryViewResultType, EdmSchemaErrorSeverity.Error, setMapping.EntityContainerMapping.SourceLocation, setMapping.StartLineNumber, setMapping.StartLinePosition); yield return error; } } // effects: Given an extent and its corresponding view, invokes the // parser to check if the view definition is syntactically correct // Returns true iff the parsing succeeds private DbQueryCommandTree ParseView(StorageMappingItemCollection mappingItemCollection, bool isUserSpecified) { // We do not catch any internal exceptions any more m_config.StartSingleWatch(PerfType.ViewParsing); //If it is a user specified view, //allow all queries. Otherwise parse the view in a restricted mode. ParserOptions.CompilationMode compilationMode = ParserOptions.CompilationMode.RestrictedViewGenerationMode; if (isUserSpecified) { compilationMode = ParserOptions.CompilationMode.UserViewGenerationMode; } DbQueryCommandTree commandTree = (DbQueryCommandTree)ExternalCalls.CompileView(CqlString, mappingItemCollection, compilationMode); // For non user-specified views, perform simplification if (!isUserSpecified) { commandTree = ViewSimplifier.SimplifyView(m_extent, commandTree); } // See if the view matches the "discriminated" pattern (allows simplification of generated store commands) if (m_extent.BuiltInTypeKind == BuiltInTypeKind.EntitySet) { DiscriminatorMap discriminatorMap; if (DiscriminatorMap.TryCreateDiscriminatorMap((EntitySet)m_extent, commandTree.Query, out discriminatorMap)) { m_discriminatorMap = discriminatorMap; } } m_config.StopSingleWatch(PerfType.ViewParsing); return commandTree; } internal DbQueryCommandTree GetCommandTree(MetadataWorkspace workspace) { //Ask command trees only for C space entity sets Debug.Assert(m_extent.EntityContainer.DataSpace == DataSpace.SSpace, "CQT should be asked only for update view"); if (m_commandTree == null) { m_commandTree = ParseView((StorageMappingItemCollection)workspace.GetItemCollection(DataSpace.CSSpace), false); } return m_commandTree; } internal Node GetInternalTree(MetadataWorkspace workspace) { Debug.Assert(m_extent.EntityContainer.DataSpace == DataSpace.CSpace, "Internal Tree should be asked only for query view"); if (m_internalTreeNode == null) { DbQueryCommandTree tree = m_commandTree ?? ParseView((StorageMappingItemCollection)workspace.GetItemCollection(DataSpace.CSSpace), false); // Convert this into an ITree first Command itree = ITreeGenerator.Generate(tree, this.DiscriminatorMap); // Pull out the root physical project-op, and copy this itree into our own itree PlanCompiler.Assert(itree.Root.Op.OpType == OpType.PhysicalProject, "Expected a physical projectOp at the root of the tree - found " + itree.Root.Op.OpType); // #554756: VarVec enumerators are not cached on the shared Command instance. itree.DisableVarVecEnumCaching(); m_internalTreeNode = itree.Root.Child0; } return m_internalTreeNode; } #endregion #region String Methods internal override void ToCompactString(StringBuilder builder) { builder.Append("OFTYPE(") .Append(Extent.Name) .Append(", ") .Append(EntityType.Name) .Append(") = ") .Append(CqlString); } #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
- KeyGesture.cs
- HttpCookieCollection.cs
- ReadOnlyDataSource.cs
- FixedTextContainer.cs
- CollectionBase.cs
- SecurityKeyIdentifier.cs
- InitializingNewItemEventArgs.cs
- MetadataUtil.cs
- CompilerGlobalScopeAttribute.cs
- RegexWorker.cs
- InstancePersistenceCommandException.cs
- C14NUtil.cs
- DbReferenceCollection.cs
- KeyBinding.cs
- _TransmitFileOverlappedAsyncResult.cs
- DefaultAuthorizationContext.cs
- FormsAuthenticationModule.cs
- CompiledQueryCacheEntry.cs
- ActiveDocumentEvent.cs
- PluggableProtocol.cs
- TransactionInformation.cs
- CodeTypeReference.cs
- SqlCommandBuilder.cs
- Speller.cs
- DisposableCollectionWrapper.cs
- Propagator.cs
- ActivationArguments.cs
- EditorZone.cs
- DataBoundLiteralControl.cs
- StreamedFramingRequestChannel.cs
- CultureInfoConverter.cs
- ElementProxy.cs
- DbConnectionPoolIdentity.cs
- KeysConverter.cs
- EncodingInfo.cs
- VirtualDirectoryMapping.cs
- RadialGradientBrush.cs
- Tile.cs
- MenuItemStyleCollection.cs
- LogStore.cs
- XmlReaderSettings.cs
- OptimizedTemplateContentHelper.cs
- Brush.cs
- ExceptionValidationRule.cs
- MSAAEventDispatcher.cs
- InstanceDataCollection.cs
- ServiceObjectContainer.cs
- ContentType.cs
- CodeChecksumPragma.cs
- SizeConverter.cs
- PreProcessInputEventArgs.cs
- ObjectStateFormatter.cs
- DrawListViewColumnHeaderEventArgs.cs
- basecomparevalidator.cs
- DataGridAutoFormatDialog.cs
- ProtectedProviderSettings.cs
- EtwTrackingBehavior.cs
- CodeGenerator.cs
- SafeNativeMethods.cs
- DurableEnlistmentState.cs
- RuleSettingsCollection.cs
- DeferrableContentConverter.cs
- VersionedStreamOwner.cs
- KnownTypeAttribute.cs
- DesignerAttributeInfo.cs
- SerializationInfo.cs
- RadioButtonPopupAdapter.cs
- EntityWrapper.cs
- DataViewListener.cs
- PrintingPermissionAttribute.cs
- SystemDropShadowChrome.cs
- ProfileProvider.cs
- FieldDescriptor.cs
- ColorIndependentAnimationStorage.cs
- ControlPaint.cs
- BamlVersionHeader.cs
- InputGestureCollection.cs
- FreeFormDragDropManager.cs
- FontWeightConverter.cs
- WebHeaderCollection.cs
- Assert.cs
- PageThemeBuildProvider.cs
- ChildTable.cs
- DurationConverter.cs
- _OSSOCK.cs
- OleDbEnumerator.cs
- TreeNodeStyleCollection.cs
- DictionaryBase.cs
- MsmqNonTransactedPoisonHandler.cs
- SqlProfileProvider.cs
- StrokeNodeData.cs
- SqlNodeTypeOperators.cs
- ActivityExecutorSurrogate.cs
- TraceHandlerErrorFormatter.cs
- isolationinterop.cs
- SurrogateSelector.cs
- sqlcontext.cs
- MdiWindowListItemConverter.cs
- ObjectNotFoundException.cs
- ObjectHelper.cs