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
- sqlpipe.cs
- SafeFileMappingHandle.cs
- PersonalizationAdministration.cs
- HtmlCalendarAdapter.cs
- BufferModesCollection.cs
- DiscoveryClientDuplexChannel.cs
- ObfuscateAssemblyAttribute.cs
- HttpStaticObjectsCollectionWrapper.cs
- ImageButton.cs
- SpeechSeg.cs
- ToolbarAUtomationPeer.cs
- WebResourceAttribute.cs
- XPathCompileException.cs
- Token.cs
- future.cs
- DrawingDrawingContext.cs
- StylusLogic.cs
- SimpleApplicationHost.cs
- HtmlTableRow.cs
- CodeCompileUnit.cs
- GeometryGroup.cs
- RequestQueryParser.cs
- Content.cs
- Model3D.cs
- VariantWrapper.cs
- ISCIIEncoding.cs
- EventLevel.cs
- NumericUpDown.cs
- Image.cs
- DynamicUpdateCommand.cs
- DocumentApplication.cs
- Point4D.cs
- Translator.cs
- XsltQilFactory.cs
- InvocationExpression.cs
- HtmlShim.cs
- basemetadatamappingvisitor.cs
- Root.cs
- MeasurementDCInfo.cs
- FieldMetadata.cs
- SqlDataSourceView.cs
- ToggleButton.cs
- ApplicationFileParser.cs
- AddressAccessDeniedException.cs
- CultureInfo.cs
- Int64Animation.cs
- DataViewManager.cs
- SafeMemoryMappedFileHandle.cs
- TextEncodedRawTextWriter.cs
- WizardForm.cs
- SymLanguageVendor.cs
- Span.cs
- UrlAuthFailedErrorFormatter.cs
- WorkflowRuntimeService.cs
- TimeZoneInfo.cs
- Rectangle.cs
- Privilege.cs
- XmlDataProvider.cs
- DelayDesigner.cs
- ListControlBuilder.cs
- SoapAttributeOverrides.cs
- TransactionTraceIdentifier.cs
- MouseButtonEventArgs.cs
- Pair.cs
- ExtensionsSection.cs
- FilteredReadOnlyMetadataCollection.cs
- SystemResourceHost.cs
- SimpleBitVector32.cs
- DataGridViewColumnCollection.cs
- WebConfigurationFileMap.cs
- _KerberosClient.cs
- EventMappingSettings.cs
- ViewGenResults.cs
- OdbcRowUpdatingEvent.cs
- CheckBox.cs
- RemoteWebConfigurationHostServer.cs
- ClientClassGenerator.cs
- XmlSchemas.cs
- EntityDataSourceConfigureObjectContextPanel.cs
- ValidatorUtils.cs
- ProfileGroupSettingsCollection.cs
- JsonReaderDelegator.cs
- BulletDecorator.cs
- WebBrowser.cs
- TraceRecord.cs
- SqlConnectionFactory.cs
- Constraint.cs
- WorkflowQueue.cs
- BackgroundWorker.cs
- MappingMetadataHelper.cs
- TrackingExtract.cs
- RichListBox.cs
- FunctionImportElement.cs
- iisPickupDirectory.cs
- OdbcConnection.cs
- BackgroundWorker.cs
- WebPartConnectionCollection.cs
- WebPartCancelEventArgs.cs
- VerificationAttribute.cs
- IProvider.cs