Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Query / PlanCompiler / ColumnMapTranslator.cs / 1305376 / ColumnMapTranslator.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Globalization; using System.Data.Query.InternalTrees; using System.Data.Query.PlanCompiler; using System.Linq; //using System.Diagnostics; // Please use PlanCompiler.Assert instead of Debug.Assert in this class... namespace System.Data.Query.PlanCompiler { ////// Delegate pattern that the ColumnMapTranslator uses to find its replacement /// columnMaps. Given a columnMap, return it's replacement. /// /// ///internal delegate ColumnMap ColumnMapTranslatorTranslationDelegate(ColumnMap columnMap); /// /// ColumnMapTranslator visits the ColumnMap hiearchy and runs the translation delegate /// you specify; There are some static methods to perform common translations, but you /// can bring your own translation if you desire. /// /// This visitor only creates new ColumnMap objects when necessary; it attempts to /// replace-in-place, except when that is not possible because the field is not /// writable. /// /// NOTE: over time, we should be able to modify the ColumnMaps to have more writable /// fields; /// internal class ColumnMapTranslator : ColumnMapVisitorWithResults{ #region Constructors /// /// Singleton instance for the "public" methods to use; /// static private ColumnMapTranslator Instance = new ColumnMapTranslator(); ////// Constructor; no one should use this. /// private ColumnMapTranslator() { } #endregion #region Visitor Helpers ////// Returns the var to use in the copy, either the original or the /// replacement. Note that we will follow the chain of replacements, in /// case the replacement was also replaced. /// /// /// ///private static Var GetReplacementVar(Var originalVar, Dictionary replacementVarMap) { // SQLBUDT #478509: Follow the chain of mapped vars, don't // just stop at the first one Var replacementVar = originalVar; while (replacementVarMap.TryGetValue(replacementVar, out originalVar)) { if (originalVar == replacementVar) { break; } replacementVar = originalVar; } return replacementVar; } #endregion #region "Public" surface area /// /// Bring-Your-Own-Replacement-Delegate method. /// /// /// ///internal static ColumnMap Translate(ColumnMap columnMap, ColumnMapTranslatorTranslationDelegate translationDelegate) { return columnMap.Accept(ColumnMapTranslator.Instance, translationDelegate); } /// /// Replace VarRefColumnMaps with the specified ColumnMap replacement /// /// /// ///internal static ColumnMap Translate(ColumnMap columnMapToTranslate, Dictionary varToColumnMap) { ColumnMap result = Translate(columnMapToTranslate, delegate(ColumnMap columnMap) { VarRefColumnMap varRefColumnMap = columnMap as VarRefColumnMap; if (null != varRefColumnMap) { if (varToColumnMap.TryGetValue(varRefColumnMap.Var, out columnMap)) { // perform fixups; only allow name changes when the replacement isn't // already named (and the original is named...) if (!columnMap.IsNamed && varRefColumnMap.IsNamed) { columnMap.Name = varRefColumnMap.Name; } } else { columnMap = varRefColumnMap; } } return columnMap; } ); return result; } /// /// Replace VarRefColumnMaps with new VarRefColumnMaps with the specified Var /// /// /// ///internal static ColumnMap Translate(ColumnMap columnMapToTranslate, Dictionary varToVarMap) { ColumnMap result = Translate(columnMapToTranslate, delegate(ColumnMap columnMap) { VarRefColumnMap varRefColumnMap = columnMap as VarRefColumnMap; if (null != varRefColumnMap) { Var replacementVar = GetReplacementVar(varRefColumnMap.Var, varToVarMap); if (varRefColumnMap.Var != replacementVar) { columnMap = new VarRefColumnMap(varRefColumnMap.Type, varRefColumnMap.Name, replacementVar); } } return columnMap; } ); return result; } /// /// Replace VarRefColumnMaps with ScalarColumnMaps referring to the command and column /// /// /// ///internal static ColumnMap Translate(ColumnMap columnMapToTranslate, Dictionary> varToCommandColumnMap) { ColumnMap result = Translate(columnMapToTranslate, delegate(ColumnMap columnMap) { VarRefColumnMap varRefColumnMap = columnMap as VarRefColumnMap; if (null != varRefColumnMap) { KeyValuePair commandAndColumn; if (!varToCommandColumnMap.TryGetValue(varRefColumnMap.Var, out commandAndColumn)) { throw EntityUtil.InternalError(EntityUtil.InternalErrorCode.UnknownVar, 1, varRefColumnMap.Var.Id); // shouldn't have gotten here without having a resolveable var } columnMap = new ScalarColumnMap(varRefColumnMap.Type, varRefColumnMap.Name, commandAndColumn.Key, commandAndColumn.Value); } // While we're at it, we ensure that all columnMaps are named; we wait // until this point, because we don't want to assign names until after // we've gone through the transformations; if (!columnMap.IsNamed) { columnMap.Name = ColumnMap.DefaultColumnName; } return columnMap; } ); return result; } #endregion #region Visitor methods #region List handling /// /// List(ColumnMap) /// ////// /// private void VisitList (TResultType[] tList, ColumnMapTranslatorTranslationDelegate translationDelegate) where TResultType : ColumnMap { for (int i = 0; i < tList.Length; i++) { tList[i] = (TResultType)tList[i].Accept(this, translationDelegate); } } #endregion #region EntityIdentity handling /// /// DiscriminatedEntityIdentity /// /// /// ///protected override EntityIdentity VisitEntityIdentity(DiscriminatedEntityIdentity entityIdentity, ColumnMapTranslatorTranslationDelegate translationDelegate) { ColumnMap newEntitySetColumnMap = entityIdentity.EntitySetColumnMap.Accept(this, translationDelegate); VisitList(entityIdentity.Keys, translationDelegate); if (newEntitySetColumnMap != entityIdentity.EntitySetColumnMap) { entityIdentity = new DiscriminatedEntityIdentity((SimpleColumnMap)newEntitySetColumnMap, entityIdentity.EntitySetMap, entityIdentity.Keys); } return entityIdentity; } /// /// SimpleEntityIdentity /// /// /// ///protected override EntityIdentity VisitEntityIdentity(SimpleEntityIdentity entityIdentity, ColumnMapTranslatorTranslationDelegate translationDelegate) { VisitList(entityIdentity.Keys, translationDelegate); return entityIdentity; } #endregion /// /// ComplexTypeColumnMap /// /// /// ///internal override ColumnMap Visit(ComplexTypeColumnMap columnMap, ColumnMapTranslatorTranslationDelegate translationDelegate) { SimpleColumnMap newNullSentinel = columnMap.NullSentinel; if (null != newNullSentinel) { newNullSentinel = (SimpleColumnMap)translationDelegate(newNullSentinel); } VisitList(columnMap.Properties, translationDelegate); if (columnMap.NullSentinel != newNullSentinel) { columnMap = new ComplexTypeColumnMap(columnMap.Type, columnMap.Name, columnMap.Properties, newNullSentinel); } return translationDelegate(columnMap); } /// /// DiscriminatedCollectionColumnMap /// /// /// ///internal override ColumnMap Visit(DiscriminatedCollectionColumnMap columnMap, ColumnMapTranslatorTranslationDelegate translationDelegate) { ColumnMap newDiscriminator = columnMap.Discriminator.Accept(this, translationDelegate); VisitList(columnMap.ForeignKeys, translationDelegate); VisitList(columnMap.Keys, translationDelegate); ColumnMap newElement = columnMap.Element.Accept(this, translationDelegate); if (newDiscriminator != columnMap.Discriminator || newElement != columnMap.Element) { columnMap = new DiscriminatedCollectionColumnMap(columnMap.Type, columnMap.Name, newElement, columnMap.Keys, columnMap.ForeignKeys,(SimpleColumnMap)newDiscriminator, columnMap.DiscriminatorValue); } return translationDelegate(columnMap); } /// /// EntityColumnMap /// /// /// ///internal override ColumnMap Visit(EntityColumnMap columnMap, ColumnMapTranslatorTranslationDelegate translationDelegate) { EntityIdentity newEntityIdentity = VisitEntityIdentity(columnMap.EntityIdentity, translationDelegate); VisitList(columnMap.Properties, translationDelegate); if (newEntityIdentity != columnMap.EntityIdentity) { columnMap = new EntityColumnMap(columnMap.Type, columnMap.Name, columnMap.Properties, newEntityIdentity); } return translationDelegate(columnMap); } /// /// SimplePolymorphicColumnMap /// /// /// ///internal override ColumnMap Visit(SimplePolymorphicColumnMap columnMap, ColumnMapTranslatorTranslationDelegate translationDelegate) { ColumnMap newTypeDiscriminator = columnMap.TypeDiscriminator.Accept(this, translationDelegate); // NOTE: we're using Copy-On-Write logic to avoid allocation if we don't // need to change things. Dictionary
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PluralizationService.cs
- TemplateColumn.cs
- ThreadPool.cs
- OdbcPermission.cs
- DataListCommandEventArgs.cs
- LogLogRecordEnumerator.cs
- SchemaElementLookUpTableEnumerator.cs
- NotifyCollectionChangedEventArgs.cs
- DocComment.cs
- FontStretches.cs
- IEnumerable.cs
- ResourceContainer.cs
- Viewport2DVisual3D.cs
- SByteStorage.cs
- XamlToRtfWriter.cs
- WebPartConnectVerb.cs
- WindowsTokenRoleProvider.cs
- MatrixAnimationBase.cs
- DesignerActionService.cs
- GroupBox.cs
- InvalidateEvent.cs
- RelationshipFixer.cs
- KeyValuePairs.cs
- FileStream.cs
- CssStyleCollection.cs
- DisplayMemberTemplateSelector.cs
- FontStyle.cs
- MemberAccessException.cs
- ExtendLockCommand.cs
- WindowsSolidBrush.cs
- ApplicationContext.cs
- QilTernary.cs
- NameTable.cs
- XmlNodeChangedEventManager.cs
- XPathSingletonIterator.cs
- SafeLocalMemHandle.cs
- Matrix3DStack.cs
- DocumentPageView.cs
- TypedCompletedAsyncResult.cs
- PasswordRecoveryAutoFormat.cs
- TextRangeProviderWrapper.cs
- CopyAction.cs
- PrePostDescendentsWalker.cs
- DataBindEngine.cs
- PathFigure.cs
- CommentEmitter.cs
- DataSourceGroupCollection.cs
- CommonServiceBehaviorElement.cs
- DurationConverter.cs
- DataGridTableCollection.cs
- Attributes.cs
- SqlNotificationRequest.cs
- COM2FontConverter.cs
- oledbmetadatacollectionnames.cs
- RectAnimationClockResource.cs
- UpdatableGenericsFeature.cs
- UpDownBase.cs
- XmlStreamStore.cs
- Transform3DGroup.cs
- XmlValidatingReaderImpl.cs
- Win32.cs
- ObjectToModelValueConverter.cs
- AutomationEvent.cs
- ProviderUtil.cs
- WaveHeader.cs
- RootAction.cs
- UniqueIdentifierService.cs
- InstanceDataCollectionCollection.cs
- TransformValueSerializer.cs
- RemotingService.cs
- _CacheStreams.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- ParentQuery.cs
- SAPICategories.cs
- filewebresponse.cs
- ServiceNameElement.cs
- SqlDeflator.cs
- MemberInitExpression.cs
- StorageAssociationSetMapping.cs
- PeerToPeerException.cs
- LicenseProviderAttribute.cs
- MembershipAdapter.cs
- RoleService.cs
- PixelShader.cs
- WebConfigurationHostFileChange.cs
- ConfigurationElement.cs
- MetaModel.cs
- Rotation3DAnimation.cs
- RelationshipConverter.cs
- IsolatedStorageFileStream.cs
- ColumnMapCopier.cs
- DetailsViewUpdateEventArgs.cs
- StringAttributeCollection.cs
- FileVersionInfo.cs
- Graph.cs
- SiteMapSection.cs
- TemplateKeyConverter.cs
- AutomationPatternInfo.cs
- TailCallAnalyzer.cs
- WebPartHelpVerb.cs