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