in BismNormalizer/BismNormalizer/TabularCompare/MultidimensionalMetadata/TabularModel.cs [1919:2100]
public void UpdatePerspective(Perspective perspectiveSource, Perspective perspectiveTarget)
{
if (_comparisonInfo.OptionsInfo.OptionMergePerspectives)
{
//Tables
foreach (PerspectiveDimension perspectiveDimensionSource in perspectiveSource.AmoPerspective.Dimensions)
{
PerspectiveDimension perspectiveDimensionTarget = null;
//is this table selected in the target perspective?
foreach (PerspectiveDimension perspectiveDimensionTarget2 in perspectiveTarget.AmoPerspective.Dimensions)
{
if (perspectiveDimensionTarget2.Dimension.Name == perspectiveDimensionSource.Dimension.Name)
{
perspectiveDimensionTarget = perspectiveDimensionTarget2;
break;
}
}
//If perspectiveDimensionTarget == null, then this table is not selected in the target perspective. But does it exist in the target db? if so, we should select it.
if (perspectiveDimensionTarget == null && _amoDatabase.Dimensions.ContainsName(perspectiveDimensionSource.Dimension.Name))
{
perspectiveDimensionTarget = perspectiveTarget.AmoPerspective.Dimensions.Add(_amoDatabase.Dimensions.FindByName(perspectiveDimensionSource.Dimension.Name).ID);
}
//if perspectiveDimensionTarget is still null here then we don't have a matching table in the target perspective at all, and we can move onto the next table
if (perspectiveDimensionTarget != null)
{
//Columns
foreach (PerspectiveAttribute perspectiveAttributeSource in perspectiveDimensionSource.Attributes)
{
PerspectiveAttribute perspectiveAttributeTarget = null;
foreach (PerspectiveAttribute perspectiveAttributeTarget2 in perspectiveDimensionTarget.Attributes)
{
if (perspectiveAttributeTarget2.Attribute.Name == perspectiveAttributeSource.Attribute.Name)
{
perspectiveAttributeTarget = perspectiveAttributeTarget2;
break;
}
}
if (perspectiveAttributeTarget == null)
{
//There is no selection in the target dim for this attribute. Is there an attribute in the target dim with the same name?
if (perspectiveDimensionTarget.Dimension.Attributes.ContainsName(perspectiveAttributeSource.Attribute.Name))
{
perspectiveAttributeTarget = perspectiveDimensionTarget.Attributes.Add(perspectiveDimensionTarget.Dimension.Attributes.FindByName(perspectiveAttributeSource.Attribute.Name).ID);
}
else break; //attribute doesn't exist in target dim, so move onto the next attribute
}
}
//Hierarchies
foreach (PerspectiveHierarchy perspectiveHierarchySource in perspectiveDimensionSource.Hierarchies)
{
PerspectiveHierarchy perspectiveHierarchyTarget = null;
foreach (PerspectiveHierarchy perspectiveHierarchyTarget2 in perspectiveDimensionTarget.Hierarchies)
{
if (perspectiveHierarchyTarget2.Hierarchy.Name == perspectiveHierarchySource.Hierarchy.Name)
{
perspectiveHierarchyTarget = perspectiveHierarchyTarget2;
break;
}
}
if (perspectiveHierarchyTarget == null)
{
//There is no selection in the target dim for this hierarchy. Is there a hierarchy in the target dim with the same name?
if (perspectiveDimensionTarget.Dimension.Hierarchies.ContainsName(perspectiveHierarchySource.Hierarchy.Name))
{
perspectiveHierarchyTarget = perspectiveDimensionTarget.Hierarchies.Add(perspectiveDimensionTarget.Dimension.Hierarchies.FindByName(perspectiveHierarchySource.Hierarchy.Name).ID);
}
else break; //hierarchy doesn't exist in target dim, so move onto the next hierarchy
}
}
}
}
//Measures
foreach (PerspectiveCalculation perspectiveCalculationSource in perspectiveSource.AmoPerspective.Calculations)
{
PerspectiveCalculation perspectiveCalculationTarget = null;
foreach (PerspectiveCalculation perspectiveCalculationTarget2 in perspectiveTarget.AmoPerspective.Calculations)
{
if (perspectiveCalculationTarget2.Name == perspectiveCalculationSource.Name)
{
perspectiveCalculationTarget = perspectiveCalculationTarget2;
break;
}
}
if (perspectiveCalculationTarget == null)
{
//There is no selection in the target db for this calculation. Is there a calculation in the target db with the same name?
if (perspectiveTarget.ParentTabularModel.Measures.ContainsName(perspectiveCalculationSource.Name.Replace("[Measures].[", "").Replace("]", "")))
{
perspectiveCalculationTarget = perspectiveTarget.AmoPerspective.Calculations.Add(perspectiveCalculationSource.Name);
}
}
}
//Kpis
foreach (PerspectiveKpi perspectiveKpiSource in perspectiveSource.AmoPerspective.Kpis)
{
PerspectiveKpi perspectiveKpiTarget = null;
foreach (PerspectiveKpi perspectiveKpiTarget2 in perspectiveTarget.AmoPerspective.Kpis)
{
if (perspectiveKpiTarget2.ToString() == perspectiveKpiSource.ToString())
{
perspectiveKpiTarget = perspectiveKpiTarget2;
break;
}
}
if (perspectiveKpiTarget == null)
{
//There is no selection in the target db for this Kpi. Is there a Kpi in the target db with the same name?
if (perspectiveTarget.ParentTabularModel.Kpis.ContainsName(perspectiveKpiSource.ToString()))
{
perspectiveKpiTarget = perspectiveTarget.AmoPerspective.Kpis.Add(perspectiveKpiSource.ToString());
}
}
}
//Actions
foreach (PerspectiveAction perspectiveActionSource in perspectiveSource.AmoPerspective.Actions)
{
if (perspectiveActionSource.ParentCube.Actions.Contains(perspectiveActionSource.ActionID)) //need this check or .Action returns error
{
PerspectiveAction perspectiveActionTarget = null;
foreach (PerspectiveAction perspectiveActionTarget2 in perspectiveTarget.AmoPerspective.Actions)
{
if (perspectiveActionTarget2.ParentCube.Actions.Contains(perspectiveActionTarget2.ActionID) && //need this check or .Action returns error
perspectiveActionTarget2.Action.Name == perspectiveActionSource.Action.Name)
{
perspectiveActionTarget = perspectiveActionTarget2;
break;
}
}
if (perspectiveActionTarget == null)
{
//There is no selection in the target db for this Action. Is there an action in the target db with the same name?
if (perspectiveTarget.ParentTabularModel.Actions.ContainsName(perspectiveActionSource.Action.Name))
{
perspectiveActionTarget = perspectiveTarget.AmoPerspective.Actions.Add(_amoDatabase.Cubes[0].Actions.FindByName(perspectiveActionSource.Action.Name).ID);
}
}
}
}
//Translations
foreach (Translation perspectiveTranslationSource in perspectiveSource.AmoPerspective.Translations)
{
if (perspectiveTarget.AmoPerspective.Translations.Contains(perspectiveTranslationSource.Language))
{
perspectiveTarget.AmoPerspective.Translations.FindByLanguage(perspectiveTranslationSource.Language).Caption = perspectiveTranslationSource.Caption;
}
else
{
Translation perspectiveTranslationTarget = perspectiveTranslationSource.Clone();
perspectiveTarget.AmoPerspective.Translations.Add(perspectiveTranslationTarget);
}
}
}
else
{
if (perspectiveSource.Id != perspectiveTarget.Id)
{
// If the names are the same, but the IDs are different, need to store the ID from the target in the source perspective so that when Create/Update subsequent tables (partitions, DSVs and special dimension properties), we know to substitute the Perspective ID
perspectiveSource.SubstituteId = perspectiveTarget.Id;
}
DeletePerspective(perspectiveTarget.Id);
CreatePerspective(perspectiveSource);
}
}