public DimensionUsage(string relationshipType, DataModelingTable factTable, DataModelingTable dimensionTable)
 {
     if (factTable != null)
     {
         mCubeName     = factTable.Sandbox.ModelName;
         mDatabaseName = factTable.Sandbox.DatabaseName;
         mMeasureGroup = factTable.Name;
     }
     if (dimensionTable != null)
     {
         mCubeName      = dimensionTable.Sandbox.ModelName;
         mDatabaseName  = dimensionTable.Sandbox.DatabaseName;
         mDimensionName = dimensionTable.Name;
     }
     mRelationshipType = relationshipType;
 }
        private static List <DimensionUsage> RecurseTabularRelationships(DataModelingTable dimensionTable, DataModelingTable outerFactTable, bool bIsBusMatrix, List <Microsoft.AnalysisServices.BackEnd.Relationship> listRelationshipsTraversed, bool bManyToMany)
        {
            List <DimensionUsage> list = new List <DimensionUsage>();

            foreach (Microsoft.AnalysisServices.BackEnd.Relationship relOuter in dimensionTable.Sandbox.Relationships.RelationshipCollection)
            {
                if (listRelationshipsTraversed.Contains(relOuter))
                {
                    continue;                                                //don't double back on path
                }
                DataModelingColumn reportedDimensionColumn = null;
                DimensionUsage     usage           = null;
                bool   bThisRelationshipManyToMany = bManyToMany;
                string sRelationshipType           = "Active";
                if (!relOuter.Active)
                {
                    sRelationshipType = "Inactive";
                    if (bIsBusMatrix)
                    {
                        continue;               //don't show inactive relationships in bus matrix view
                    }
                }

                if (bThisRelationshipManyToMany)
                {
                    sRelationshipType = "Many to Many";
                }

                if (relOuter.ToColumn.Table.Name == dimensionTable.Name &&
                    relOuter.CrossFilterDirection == Microsoft.AnalysisServices.BackEnd.CrossFilterDirection.Both &&
                    relOuter.Active)
                {
                    sRelationshipType           = "Many to Many";
                    reportedDimensionColumn     = relOuter.FromColumn;
                    bThisRelationshipManyToMany = true;

                    usage              = new DimensionUsage(sRelationshipType, outerFactTable, reportedDimensionColumn.Table);
                    usage.Column1Name  = "Foreign Key Column";
                    usage.Column1Value = relOuter.ToColumn.Name;
                    usage.Column2Name  = "Primary Key Column";
                    usage.Column2Value = relOuter.FromColumn.Name;
                }
                else if (relOuter.FromColumn.Table.Name != dimensionTable.Name)
                {
                    continue; //find any relationships that start from the "dimensionTable" table
                }
                else
                {
                    reportedDimensionColumn = relOuter.ToColumn;

                    usage              = new DimensionUsage(sRelationshipType, outerFactTable, reportedDimensionColumn.Table);
                    usage.Column1Name  = "Foreign Key Column";
                    usage.Column1Value = relOuter.FromColumn.Name;
                    usage.Column2Name  = "Primary Key Column";
                    usage.Column2Value = relOuter.ToColumn.Name;
                }


                bool bFoundVisibleAttribute = false;
                foreach (DataModelingColumn col in reportedDimensionColumn.Table.Columns)
                {
                    if (!col.Table.IsPrivate && !col.IsPrivate && col.IsAttributeHierarchyQueriable)
                    {
                        bFoundVisibleAttribute = true;
                        break;
                    }
                }
                if (bFoundVisibleAttribute) //only if the To end has visible attributes should we show it as a dimension
                {
                    list.Add(usage);
                }

                if (bIsBusMatrix)
                {
                    List <Microsoft.AnalysisServices.BackEnd.Relationship> listLatestRelationshipsTraversed = new List <Microsoft.AnalysisServices.BackEnd.Relationship>();
                    listLatestRelationshipsTraversed.AddRange(listRelationshipsTraversed);
                    listLatestRelationshipsTraversed.Add(relOuter);

                    //recurse if it's the bus matrix view
                    list.AddRange(RecurseTabularRelationships(reportedDimensionColumn.Table, outerFactTable, bIsBusMatrix, listLatestRelationshipsTraversed, bThisRelationshipManyToMany));
                }
            }

            return(list);
        }