Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Query / InternalTrees / ColumnMapCopier.cs / 2 / ColumnMapCopier.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....], [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Diagnostics;
using System.Data.Query.InternalTrees;
using System.Data.Query.PlanCompiler;
using System.Linq;
using System.Data.Mapping;
using System.Data.Metadata.Edm;
namespace System.Data.Query.InternalTrees
{
///
/// The ColumnMapCopier clones an entire ColumnMap hierarchy; this is different
/// than the ColumnMapTranslator, which only copies things that need to be copied.
///
/// Note that this is a stateless visitor; it uses the visitor's argument for its
/// state management.
///
/// The Visitor's argument is a VarMap; anytime a Var is found in the ColumnMap
/// hierarchy, it is replaced with the replacement from the VarMap.
///
/// Note also that previous implementations of this class attempted to avoid re-
/// processing ColumnMaps by caching the results for each input and returning it.
/// I wasn't convinced that we were buying much with all that caching, since the
/// only ColumnMaps that should be repeated in the hierarchy are simple ones; there
/// is about as much object creation either way. The only reason I see that we
/// want to cache these is if we really cared to have only one VarRefColumnMap
/// instance for a given Var and be able to use reference equality instead of
/// comparing the Vars themselves. I don't believe we're making that guarantee
/// anywhere else, so I've removed that for now because I don't want the added
/// complexity that the caching adds. If performance analysis indicates there is
/// a problem, we can considier addding the cache back in.
///
internal class ColumnMapCopier : ColumnMapVisitorWithResults
{
#region Constructors
///
/// Singleton instance for the "public" methods to use;
///
static private ColumnMapCopier Instance = new ColumnMapCopier();
///
/// Constructor; no one should use this.
///
private ColumnMapCopier()
{
}
#endregion
#region "Public" surface area
///
/// Return a copy of the column map, replacing all vars with the replacements
/// found in the replacementVarMap
///
///
///
///
internal static ColumnMap Copy(ColumnMap columnMap, VarMap replacementVarMap)
{
return columnMap.Accept(Instance, replacementVarMap);
}
#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, VarMap 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 Visitor Methods
#region List handling
///
/// Copies the List of ColumnMaps or SimpleColumnMaps
///
///
///
///
///
internal TListType[] VisitList(TListType[] tList, VarMap replacementVarMap)
where TListType : ColumnMap
{
TListType[] newTList = new TListType[tList.Length];
for(int i = 0; i < tList.Length; ++i) {
newTList[i] = (TListType)tList[i].Accept(this, replacementVarMap);
}
return newTList;
}
#endregion
#region EntityIdentity handling
///
/// Copies the DiscriminatedEntityIdentity
///
///
///
///
protected override EntityIdentity VisitEntityIdentity(DiscriminatedEntityIdentity entityIdentity, VarMap replacementVarMap)
{
SimpleColumnMap newEntitySetCol = (SimpleColumnMap)entityIdentity.EntitySetColumnMap.Accept(this, replacementVarMap);
SimpleColumnMap[] newKeys = VisitList(entityIdentity.Keys, replacementVarMap);
return new DiscriminatedEntityIdentity(newEntitySetCol, entityIdentity.EntitySetMap, newKeys);
}
///
/// Copies the SimpleEntityIdentity
///
///
///
///
protected override EntityIdentity VisitEntityIdentity(SimpleEntityIdentity entityIdentity, VarMap replacementVarMap)
{
SimpleColumnMap[] newKeys = VisitList(entityIdentity.Keys, replacementVarMap);
return new SimpleEntityIdentity(entityIdentity.EntitySet, newKeys);
}
#endregion
#region SortKey handling
///
/// Copy the SortKeyInfo
///
///
///
///
private SortKeyInfo VisitSortKey(SortKeyInfo sortKeyInfo, VarMap replacementVarMap)
{
SimpleColumnMap newSortKeyColumnMap = (SimpleColumnMap)sortKeyInfo.SortKeyColumn.Accept(this, replacementVarMap);
SortKeyInfo newSortKeyInfo = new SortKeyInfo(newSortKeyColumnMap, sortKeyInfo.AscendingSort, sortKeyInfo.Collation);
return newSortKeyInfo;
}
///
/// Copies a List(SortKeyInfo)
///
///
///
///
private SortKeyInfo[] VisitSortKey(SortKeyInfo[] sortKeyInfoList, VarMap replacementVarMap)
{
SortKeyInfo[] newList = new SortKeyInfo[sortKeyInfoList.Length];
for(int i = 0; i < sortKeyInfoList.Length; ++i)
{
newList[i] = VisitSortKey(sortKeyInfoList[i], replacementVarMap);
}
return newList;
}
#endregion
///
/// ComplexTypeColumnMap
///
///
///
///
internal override ColumnMap Visit(ComplexTypeColumnMap columnMap, VarMap replacementVarMap)
{
SimpleColumnMap newNullability = columnMap.NullSentinel;
if (null != newNullability)
{
newNullability = (SimpleColumnMap)newNullability.Accept(this, replacementVarMap);
}
ColumnMap[] fieldList = VisitList(columnMap.Properties, replacementVarMap);
return new ComplexTypeColumnMap(columnMap.Type, columnMap.Name, fieldList, newNullability);
}
///
/// DiscriminatedCollectionColumnMap
///
///
///
///
internal override ColumnMap Visit(DiscriminatedCollectionColumnMap columnMap, VarMap replacementVarMap)
{
ColumnMap newElementColumnMap = columnMap.Element.Accept(this, replacementVarMap);
SimpleColumnMap newDiscriminator = (SimpleColumnMap)columnMap.Discriminator.Accept(this, replacementVarMap);
SimpleColumnMap[] newKeys = VisitList(columnMap.Keys, replacementVarMap);
SimpleColumnMap[] newForeignKeys = VisitList(columnMap.ForeignKeys, replacementVarMap);
SortKeyInfo[] newSortKeys = VisitSortKey(columnMap.SortKeys, replacementVarMap);
return new DiscriminatedCollectionColumnMap(columnMap.Type, columnMap.Name, newElementColumnMap, newKeys, newForeignKeys, newSortKeys, newDiscriminator, columnMap.DiscriminatorValue);
}
///
/// EntityColumnMap
///
///
///
///
internal override ColumnMap Visit(EntityColumnMap columnMap, VarMap replacementVarMap)
{
EntityIdentity newEntityIdentity = VisitEntityIdentity(columnMap.EntityIdentity, replacementVarMap);
ColumnMap[] fieldList = VisitList(columnMap.Properties, replacementVarMap);
return new EntityColumnMap(columnMap.Type, columnMap.Name, fieldList, newEntityIdentity);
}
///
/// SimplePolymorphicColumnMap
///
///
///
///
internal override ColumnMap Visit(SimplePolymorphicColumnMap columnMap, VarMap replacementVarMap)
{
SimpleColumnMap newDiscriminator = (SimpleColumnMap)columnMap.TypeDiscriminator.Accept(this, replacementVarMap);
Dictionary
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MultiTrigger.cs
- SoapSchemaMember.cs
- StringFunctions.cs
- XPathNavigatorKeyComparer.cs
- ComPlusInstanceContextInitializer.cs
- SiteMapNodeCollection.cs
- DesignTimeValidationFeature.cs
- XmlSchemaRedefine.cs
- HttpRuntime.cs
- HandlerBase.cs
- PrintPageEvent.cs
- TreeWalkHelper.cs
- PersonalizationState.cs
- MultiTargetingUtil.cs
- PerformanceCounter.cs
- SystemIPGlobalProperties.cs
- SchemaTypeEmitter.cs
- WindowsListViewScroll.cs
- ChooseAction.cs
- XPathNodeIterator.cs
- DataListItemCollection.cs
- CodeSubDirectoriesCollection.cs
- AccessDataSource.cs
- Compiler.cs
- HttpRequest.cs
- ChannelFactoryRefCache.cs
- EntityDesignerBuildProvider.cs
- SkewTransform.cs
- EditorPartChrome.cs
- DataGridGeneralPage.cs
- SqlUDTStorage.cs
- MatrixAnimationUsingPath.cs
- SpecularMaterial.cs
- UnknownWrapper.cs
- HtmlFormParameterReader.cs
- ScriptingRoleServiceSection.cs
- HttpWriter.cs
- IgnoreDeviceFilterElementCollection.cs
- RegexCode.cs
- SerializationStore.cs
- CheckBox.cs
- NameValueFileSectionHandler.cs
- RichTextBoxAutomationPeer.cs
- MemberHolder.cs
- ExpressionVisitor.cs
- DataGridDesigner.cs
- InkCanvasAutomationPeer.cs
- XmlObjectSerializer.cs
- ContainerAction.cs
- DockPanel.cs
- SafeNativeMethods.cs
- tibetanshape.cs
- DesignerValidationSummaryAdapter.cs
- CqlErrorHelper.cs
- MachineKey.cs
- WorkflowMarkupSerializationProvider.cs
- WebEventCodes.cs
- ColorTranslator.cs
- NamedPermissionSet.cs
- CorruptStoreException.cs
- PageThemeBuildProvider.cs
- LayoutEngine.cs
- ConfigurationLoader.cs
- CacheDict.cs
- ObjectDataSource.cs
- HttpFileCollection.cs
- TcpConnectionPoolSettings.cs
- TextElement.cs
- EncryptedHeaderXml.cs
- JsonClassDataContract.cs
- ObjectMemberMapping.cs
- EventSource.cs
- ReadOnlyNameValueCollection.cs
- XmlTextReader.cs
- UnsafeCollabNativeMethods.cs
- WindowsAuthenticationEventArgs.cs
- sqlnorm.cs
- ListSortDescription.cs
- GroupQuery.cs
- securitycriticaldata.cs
- StrokeNodeEnumerator.cs
- AudioSignalProblemOccurredEventArgs.cs
- XamlPointCollectionSerializer.cs
- CompiledELinqQueryState.cs
- sapiproxy.cs
- KnowledgeBase.cs
- Membership.cs
- HttpContextServiceHost.cs
- Logging.cs
- ExpandSegmentCollection.cs
- NamedPermissionSet.cs
- IntSumAggregationOperator.cs
- Int32Storage.cs
- OracleConnection.cs
- WsdlBuildProvider.cs
- XmlTextReaderImpl.cs
- GlobalizationAssembly.cs
- MobileComponentEditorPage.cs
- SeverityFilter.cs
- EUCJPEncoding.cs