Model Overview
The OpenBI model is a platform-agnostic representation of a Business Intelligence asset. Every entity maps cleanly to concepts that exist across all major BI platforms.
Entity diagram
classDiagram
class Asset {
+string? IdSite
+AssetInfo? Info
+Layout? Layout
+DataModel? DataModel
+List~RefreshTask~? RefreshTasks
+List~DataSourceConnection~? DataSourceConnections
+IEnumerable~Asset~ Dependencies
}
class AssetInfo {
+string Id
+string ExternalType
+string IdFolder
+string FolderName
+AssetType Type
+string Name
+string Description
+DateTime? LatestUpdate
+string? LatestUpdater
+ICollection~AdditionalMetadata~? AdditionalMetadata
}
class Layout {
+ICollection~Page~ Pages
+ICollection~AdditionalMetadata~? AdditionalMetadata
}
class Page {
+string Id
+string FriendlyName
+int Order
+decimal Width
+decimal Height
+bool IsEnabled
+ICollection~Visual~ Visuals
+ICollection~Filter~ PageLevelFilters
}
class Visual {
+string Id
+string FriendlyName
+VisualCategories Category
+string Type
+decimal X, Y, Z, Width, Height
+ICollection~VisualProjection~ VisualProjections
+ICollection~Filter~ VisualLevelFilters
+ICollection~Visual~? Children
}
class VisualProjection {
+string ProjectionName
+string? OpenBIProjectionName
+Expression? Expression
+bool IsActive
+bool IsDimension
+bool IsMeasure
+string? IdColumnReference
+int Order
}
class DataModel {
+ICollection~Table~ Tables
+ICollection~Relationship~ Relationships
}
class Table {
+string Id
+string? Type
+string Name
+Expression? Expression
+ICollection~Column~ Columns
}
class Column {
+string Id
+string Name
+ColumnDataType DataType
+Expression? Expression
+bool IsKey
+bool IsDimension
+bool IsMeasure
}
class Relationship {
+string IdColumnFrom
+string IdColumnTo
+RelationshipDirection Type
+Expression? Expression
}
class Filter {
+string? IdColumn
+FilterFunctionType Function
+List~string~ Values
+bool IsGroup
+List~Filter~? Children
+Expression? Expression
}
class RefreshTask {
+string Id
+List~RefreshTrigger~? Triggers
}
class DataSourceConnection {
+string? ExternalId
+string Name
+string Type
+Dictionary~string,string~? Parameters
}
Asset --> AssetInfo : Info
Asset --> Layout : Layout
Asset --> DataModel : DataModel
Asset --> RefreshTask : RefreshTasks
Asset --> DataSourceConnection : DataSourceConnections
Layout --> Page : Pages
Page --> Visual : Visuals
Page --> Filter : PageLevelFilters
Visual --> VisualProjection : VisualProjections
Visual --> Filter : VisualLevelFilters
Visual --> Visual : Children
DataModel --> Table : Tables
DataModel --> Relationship : Relationships
Table --> Column : Columns
RefreshTask --> RefreshTrigger : Triggers
Design principles
Platform-agnostic by design. The model never references a specific BI vendor. Platform-specific details live in AdditionalMetadata key-value pairs, not in typed fields.
Extension without modification. Every entity carries an ICollection<AdditionalMetadata>? AdditionalMetadata property. Converters use this to preserve vendor-specific attributes without changing the shared schema.
Dependency-aware. An Asset can declare Dependencies (other Asset objects it depends on, e.g. a Report depending on a SemanticModel). The MCP Server stages the full dependency graph in one transaction.
Two top-level sub-graphs. Every asset has at most two independent sub-graphs:
- Layout — the visual/UX layer: pages, visuals, projections, page-level and visual-level filters.
- DataModel — the semantic layer: tables, columns, relationships, expressions.
A Report asset typically has only a Layout; a DataModel/SemanticModel asset typically has only a DataModel. Some platforms bundle both in a single artifact.