public void CreateTable()

in BismNormalizer/BismNormalizer/TabularCompare/MultidimensionalMetadata/TabularModel.cs [1091:1273]


        public void CreateTable(Table tableSource, ref string sourceObjectSubstituteId, ref bool useSubstituteId)
        {
            #region If blank db, need to create dsv/cube/mdx script

            if (_amoDatabase.Cubes.Count == 0)
            {
                string newDataSourceViewName = tableSource.TabularModel.AmoDatabase.DataSourceViews[0].Name;
                DataSet newDataSourceViewDataSet = new DataSet(newDataSourceViewName);
                DataSourceView newDatasourceView = _amoDatabase.DataSourceViews.AddNew(newDataSourceViewName, newDataSourceViewName);
                newDatasourceView.DataSourceID = tableSource.TabularModel.DataSources.FindById(tableSource.DataSourceID).SubstituteId;
                newDatasourceView.Schema = newDataSourceViewDataSet;

                Cube sandboxCube = _amoDatabase.Cubes.Add(tableSource.TabularModel.AmoDatabase.Cubes[0].Name, tableSource.TabularModel.AmoDatabase.Cubes[0].ID);
                sandboxCube.Source = new DataSourceViewBinding(newDatasourceView.ID);
                sandboxCube.StorageMode = StorageMode.InMemory;
                sandboxCube.Language = tableSource.TabularModel.AmoDatabase.Language;
                sandboxCube.Collation = tableSource.TabularModel.AmoDatabase.Collation;

                //Create initial MdxScript
                MdxScript mdxScript = sandboxCube.MdxScripts.Add(tableSource.TabularModel.AmoDatabase.Cubes[0].MdxScripts[0].Name, tableSource.TabularModel.AmoDatabase.Cubes[0].MdxScripts[0].ID);
                mdxScript.Commands.Add(new Microsoft.AnalysisServices.Command(tableSource.TabularModel.AmoDatabase.Cubes[0].MdxScripts[0].Commands[0].Text));
            }
            // check to add 2nd command here just in case get a cube with only the first default command populated
            if (_amoDatabase.Cubes[0].MdxScripts[0].Commands.Count == 1)
            {
                _amoDatabase.Cubes[0].MdxScripts[0].Commands.Add(new Microsoft.AnalysisServices.Command(""));  //blank 2nd command to hold measures
            }

            #endregion

            #region Need to check if there is an existing table with same ID (some clever clogs might have renamed the object in source and kept same ID).  If so, replace it with a new one and store it as substitute ID in source.

            if (_amoDatabase.Dimensions.Contains(tableSource.Id))
            {
                tableSource.SubstituteId = tableSource.Name + "_" + Convert.ToString(Guid.NewGuid());
                sourceObjectSubstituteId = tableSource.SubstituteId;
                useSubstituteId = true;
            }

            string substituteDataSourceId = tableSource.TabularModel.DataSources.FindById(tableSource.DataSourceID).SubstituteId;

            #endregion

            #region DSV Table

            if (tableSource.AmoTable != null)
            {
                //DataTable tableTarget = tableSource.AmoTable.Clone();
                DataTable tableTarget = tableSource.AmoTable.Copy();
                tableTarget.ExtendedProperties["DataSourceID"] = substituteDataSourceId;
                if (useSubstituteId) tableTarget.TableName = tableSource.SubstituteId;

                if (_amoDatabase.DataSourceViews[0].Schema.Tables.Contains(tableTarget.TableName))
                {
                    _amoDatabase.DataSourceViews[0].Schema.Tables.Remove(tableTarget.TableName);
                }

                _amoDatabase.DataSourceViews[0].Schema.Tables.Add(tableTarget);
            }
            #endregion

            #region Dimension / Relationships

            Dimension dimensionTarget = tableSource.AmoDimension.Clone();
            if (tableSource.AmoDimension.Source is DataSourceViewBinding)
            {
                dimensionTarget.Source = new DataSourceViewBinding(_amoDatabase.DataSourceViews[0].ID);
            }

            if (useSubstituteId)
            {
                dimensionTarget.ID = tableSource.SubstituteId;

                foreach (DimensionAttribute attribute in dimensionTarget.Attributes)
                {
                    foreach (DataItem keyColumn in attribute.KeyColumns)
                    {
                        if (keyColumn.Source is ColumnBinding && ((ColumnBinding)keyColumn.Source).TableID != tableSource.SubstituteId)
                        {
                            ((ColumnBinding)keyColumn.Source).TableID = tableSource.SubstituteId;
                        }
                    }
                    if (attribute.NameColumn.Source is ColumnBinding && ((ColumnBinding)attribute.NameColumn.Source).TableID != tableSource.SubstituteId)
                    {
                        ((ColumnBinding)attribute.NameColumn.Source).TableID = tableSource.SubstituteId;
                    }
                }
            }

            // clear all relationships inherited from source table; they will be added back later only if required
            dimensionTarget.Relationships.Clear();
            _amoDatabase.Dimensions.Add(dimensionTarget);
            if (useSubstituteId) _amoDatabase.Cubes[0].Dimensions.Add(tableSource.SubstituteId);

            if (!_amoDatabase.Cubes[0].Dimensions.Contains(tableSource.SubstituteId))
            {
                _amoDatabase.Cubes[0].Dimensions.Add(tableSource.SubstituteId);
            }

            if (tableSource.AmoCubeDimension != null && tableSource.AmoCubeDimension.Visible == false)
            {
                _amoDatabase.Cubes[0].Dimensions[tableSource.SubstituteId].Visible = false;
            }

            #endregion

            #region Measure Group

            MeasureGroup measureGroupTarget = tableSource.AmoMeasureGroup.Clone();

            if (useSubstituteId)
            {
                measureGroupTarget.ID = tableSource.SubstituteId;

                string measureGroupDimensionIdToRename = ""; //can't rename it while in MeasureGroupDimension (.Dimensions) collection
                foreach (MeasureGroupDimension measureGroupDimension in measureGroupTarget.Dimensions)
                {
                    if (measureGroupDimension is DegenerateMeasureGroupDimension)
                    {
                        measureGroupDimensionIdToRename = measureGroupDimension.CubeDimensionID;
                        break;
                    }
                }
                if (measureGroupDimensionIdToRename != "")
                {
                    DegenerateMeasureGroupDimension measureGroupDimensionClone = (DegenerateMeasureGroupDimension)measureGroupTarget.Dimensions[measureGroupDimensionIdToRename].Clone();
                    measureGroupDimensionClone.CubeDimensionID = tableSource.SubstituteId;
                    foreach (MeasureGroupAttribute attribute in measureGroupDimensionClone.Attributes)
                    {
                        foreach (DataItem keyColumn in attribute.KeyColumns)
                        {
                            if (keyColumn.Source is ColumnBinding && ((ColumnBinding)keyColumn.Source).TableID != tableSource.SubstituteId)
                            {
                                ((ColumnBinding)keyColumn.Source).TableID = tableSource.SubstituteId;
                            }
                        }
                    }

                    if (measureGroupTarget.Measures.Contains(measureGroupDimensionIdToRename))
                    {
                        Microsoft.AnalysisServices.Measure measureClone = measureGroupTarget.Measures[measureGroupDimensionIdToRename].Clone();
                        measureClone.ID = tableSource.SubstituteId;
                        if (measureClone.Source.Source is RowBinding && ((RowBinding)measureClone.Source.Source).TableID != tableSource.SubstituteId)
                        {
                            ((RowBinding)measureClone.Source.Source).TableID = tableSource.SubstituteId;
                        }

                        measureGroupTarget.Measures.Remove(measureGroupDimensionIdToRename);
                        measureGroupTarget.Measures.Add(measureClone);
                    }

                    measureGroupTarget.Dimensions.Remove(measureGroupDimensionIdToRename);
                    measureGroupTarget.Dimensions.Add(measureGroupDimensionClone);
                }
            }

            //Now make sure all partitions are hooked up
            List<string> partitionIdsToRename = new List<string>();
            foreach (Partition partition in measureGroupTarget.Partitions)
            {
                if (partition.Source is QueryBinding) partition.Source = new QueryBinding(substituteDataSourceId, ((QueryBinding)partition.Source).QueryDefinition);
                if (useSubstituteId && partition.ID == tableSource.Id) partitionIdsToRename.Add(partition.ID);
            }
            foreach (string partitionIdToRename in partitionIdsToRename)
            {
                Partition partition = measureGroupTarget.Partitions[partitionIdToRename];
                Partition partitionClone = partition.Clone();
                partitionClone.ID = tableSource.SubstituteId;
                measureGroupTarget.Partitions.Remove(partition.ID);
                measureGroupTarget.Partitions.Add(partitionClone);
            }

            //And finally add it to the target cube
            _amoDatabase.Cubes[0].MeasureGroups.Add(measureGroupTarget);

            #endregion

            #region Shell model

            _tables.Add(new Table(this, dimensionTarget));

            #endregion
        }