in BismNormalizer/BismNormalizer/TabularCompare/TabularMetadata/TabularModel.cs [1626:1839]
private void SyncCultures(Tom.Culture tomCultureSource, Tom.Culture tomCultureTarget)
{
foreach (ObjectTranslation translationSource in tomCultureSource.ObjectTranslations)
{
if (translationSource.Object is NamedMetadataObject)
{
NamedMetadataObject namedObjectSource = (NamedMetadataObject)translationSource.Object;
NamedMetadataObject namedObjectTarget = null;
//Find the object in the target model that this translation applies to
switch (namedObjectSource.ObjectType)
{
case ObjectType.Model:
//if (namedObjectSource.Name == tomCultureTarget.Model.Name)
//{
//Model name can legitimately have different names - and there can only be 1 model, so we are OK not doing check in if clause above.
namedObjectTarget = tomCultureTarget.Model;
//}
break;
case ObjectType.Table:
foreach (Tom.Table tomTableTarget in tomCultureTarget.Model.Tables)
{
if (namedObjectSource.Name == tomTableTarget.Name)
{
namedObjectTarget = tomTableTarget;
break;
}
}
break;
case ObjectType.Column:
Column columnSource = (Column)namedObjectSource;
foreach (Tom.Table tableTarget in tomCultureTarget.Model.Tables)
{
bool foundColumn = false;
if (columnSource.Table?.Name == tableTarget.Name)
{
foreach (Column columnTarget in tableTarget.Columns)
{
if (columnSource.Name == columnTarget.Name)
{
namedObjectTarget = columnTarget;
foundColumn = true;
break;
}
}
}
if (foundColumn) break;
}
break;
case ObjectType.Measure:
Tom.Measure tomMeasureSource = (Tom.Measure)namedObjectSource;
foreach (Tom.Table tomTableTarget in tomCultureTarget.Model.Tables)
{
bool foundMeasure = false;
if (tomMeasureSource.Table?.Name == tomTableTarget.Name)
{
foreach (Tom.Measure measureTarget in tomTableTarget.Measures)
{
if (tomMeasureSource.Name == measureTarget.Name)
{
namedObjectTarget = measureTarget;
foundMeasure = true;
break;
}
}
}
if (foundMeasure) break;
}
break;
case ObjectType.Hierarchy:
Hierarchy hierarchySource = (Hierarchy)namedObjectSource;
foreach (Tom.Table tomTableTarget in tomCultureTarget.Model.Tables)
{
bool foundHierarchy = false;
if (hierarchySource.Table?.Name == tomTableTarget.Name)
{
foreach (Hierarchy hierarchyTarget in tomTableTarget.Hierarchies)
{
if (hierarchySource.Name == hierarchyTarget.Name)
{
namedObjectTarget = hierarchyTarget;
foundHierarchy = true;
break;
}
}
}
if (foundHierarchy) break;
}
break;
case ObjectType.Level:
Level levelSource = (Level)namedObjectSource;
foreach (Tom.Table tomTableTarget in tomCultureTarget.Model.Tables)
{
bool foundLevel = false;
if (levelSource.Hierarchy?.Table?.Name == tomTableTarget.Name)
{
foreach (Hierarchy hierarchyTarget in tomTableTarget.Hierarchies)
{
if (levelSource.Hierarchy?.Name == hierarchyTarget.Name)
{
foreach (Level levelTarget in hierarchyTarget.Levels)
{
if (levelSource.Name == levelTarget.Name)
{
namedObjectTarget = levelTarget;
foundLevel = true;
break;
}
}
}
if (foundLevel) break;
}
if (foundLevel) break;
}
}
break;
case ObjectType.Perspective:
foreach (Tom.Perspective tomPerspectiveTarget in tomCultureTarget.Model.Perspectives)
{
if (namedObjectSource.Name == tomPerspectiveTarget.Name)
{
namedObjectTarget = tomPerspectiveTarget;
break;
}
}
break;
case ObjectType.Role:
foreach (ModelRole tomRoleTarget in tomCultureTarget.Model.Roles)
{
if (namedObjectSource.Name == tomRoleTarget.Name)
{
namedObjectTarget = tomRoleTarget;
break;
}
}
break;
case ObjectType.Expression:
foreach (NamedExpression tomExpressionTarget in tomCultureTarget.Model.Expressions)
{
if (namedObjectSource.Name == tomExpressionTarget.Name)
{
namedObjectTarget = tomExpressionTarget;
break;
}
}
break;
//case ObjectType.KPI: //KPIs dealt with by measures above
// break;
default:
break;
}
//If namedObjectTarget is null, the model object does not exist in target, so can ignore
if (namedObjectTarget != null)
{
//Does the translation already exist in cultureTarget?
ObjectTranslation translationTarget = null;
foreach (ObjectTranslation translation in tomCultureTarget.ObjectTranslations)
{
if (translation.Object is NamedMetadataObject &&
((NamedMetadataObject)translation.Object).Name == namedObjectSource.Name &&
translation.Object.ObjectType == namedObjectSource.ObjectType &&
(
//check columns are both in same table (could have columns with same name in different tables)
!(translation.Object.Parent.ObjectType == ObjectType.Table && namedObjectSource.Parent.ObjectType == ObjectType.Table) ||
(((NamedMetadataObject)translation.Parent).Name == ((NamedMetadataObject)namedObjectSource.Parent).Name) || //Is this line necessary? I don't think so.
(((NamedMetadataObject)translation.Object.Parent).Name == ((NamedMetadataObject)namedObjectSource.Parent).Name)
) &&
translation.Property == translationSource.Property
)
{
translationTarget = translation;
break;
}
}
if (translationTarget != null)
{ //Translation already exists in cultureTarget for this object, so just ensure values match
//Also decouple from object in model and reset coupling if removed
if (translationTarget.Object.IsRemoved)
{
ObjectTranslation translationTargetReplacement = new ObjectTranslation();
translationTargetReplacement.Object = namedObjectTarget;
translationTargetReplacement.Property = translationSource.Property;
translationTargetReplacement.Value = translationSource.Value;
tomCultureTarget.ObjectTranslations.Remove(translationTarget);
tomCultureTarget.ObjectTranslations.Add(translationTargetReplacement);
translationTarget = translationTargetReplacement;
}
//translationTarget.Object = namedObjectTarget;
translationTarget.Value = translationSource.Value;
}
else
{ //Translation does not exist in cultureTarget, so create it and add it to culture
translationTarget = new ObjectTranslation();
translationTarget.Object = namedObjectTarget;
translationTarget.Property = translationSource.Property;
translationTarget.Value = translationSource.Value;
tomCultureTarget.ObjectTranslations.Add(translationTarget);
}
}
}
}
if (tomCultureSource.LinguisticMetadata != null)
{
LinguisticMetadata linguisticMetadata = tomCultureSource.LinguisticMetadata.Clone();
tomCultureTarget.LinguisticMetadata = linguisticMetadata;
}
else
{
tomCultureTarget.LinguisticMetadata = null;
}
}