public void UpdatePerspective()

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);
            }
        }