OSI Field Mapping

OSI Field Mapping: every semantic layer, one spec

A field-by-field reference of how MetricFlow, Cube, LookML, AtScale, Snowflake Semantic Views, GoodData, Power BI and Databricks Metric Views translate onto the Open Semantic Interchange schema — the vendor-neutral wire format for the modern semantic layer.

OSI v0.2.0.dev0·8 products·Apache 2.0
Layer 1

1 · Dataset Layer (tables & sources)

How each product names the physical table that backs a semantic object, and how OSI unifies those names under dataset.name + dataset.source.

osi-dataset-mapping.yamlyaml
OSI Field
dataset.name
MetricFlow
semantic_model.name
Cube
cubes[].name
AtScale (SML)
dimension / dataset file name
LookML
view: view_name
Snowflake Sem. View
TABLES (alias AS …)
GoodData
dataset.id
Power BI (TMDL)
table 'Name'
Databricks Metric View
CREATE METRIC VIEW name
OSI Field
dataset.source
MetricFlow
model's ref() or source YAML
Cube
cubes[].sql_table
AtScale (SML)
dataset.source
LookML
sql_table_name / derived_table
Snowflake Sem. View
TABLES (alias AS db.schema.table)
GoodData
connection + dataset mapping
Power BI (TMDL)
partition.source (M / SQL)
Databricks Metric View
source: catalog.schema.table
OSI Field
dataset.primary_key
MetricFlow
entities[] with type: primary
Cube
dimensions[] with primary_key: true
AtScale (SML)
level_attributes[].key_columns
LookML
dimension: + primary_key: yes
Snowflake Sem. View
PRIMARY KEY (col)
GoodData
implicit via attribute labels
Power BI (TMDL)
column.isKey: true
Databricks Metric View
declared on source table (not in metric view)
OSI Field
dataset.description
MetricFlow
semantic_model.description
Cube
in-code comment (no standard field)
AtScale (SML)
dataset description
LookML
view-level comment
Snowflake Sem. View
COMMENT = '…'
GoodData
dataset.description
Power BI (TMDL)
table.description
Databricks Metric View
COMMENT '…'

The name of a semantic object varies wildly across tools — cube, view, semantic_model, a raw SQL alias — but every product ultimately points at one physical table. OSI collapses that into two fields: dataset.name for the logical identifier your metrics reference, and dataset.source for the exact table binding downstream consumers hit.

Layer 2

2 · Dimensions Layer (fields & attributes)

Field-level metadata: names, expressions, labels, descriptions, and the two pieces most products lack — a time flag and an AI-context slot.

osi-dimensions-mapping.yamlyaml
OSI Field
fields[].name
MetricFlow
dimensions[].name
Cube
dimensions[].name
AtScale (SML)
dimension.unique_name
LookML
dimension: field_name
Snowflake Sem. View
DIMENSIONS (table.dim AS …)
GoodData
attribute.id + label.id
Power BI (TMDL)
column.name
Databricks Metric View
dimensions[].name
OSI Field
fields[].expression.dialects[]
MetricFlow
dimensions[].expr (single dialect)
Cube
dimensions[].sql (single dialect)
AtScale (SML)
level_attribute.column
LookML
dimension: { sql: ${TABLE}.col }
Snowflake Sem. View
DIMENSIONS (… AS sql_expr)
GoodData
label.source_column
Power BI (TMDL)
column.sourceColumn or DAX calc column
Databricks Metric View
dimensions[].expr (SQL)
OSI Field
fields[].dimension.is_time
MetricFlow
type: time + time_granularity
Cube
type: time
AtScale (SML)
type: TIME
LookML
dimension_group + timeframes
Snowflake Sem. View
no flag — SQL expression only
GoodData
no flag — attribute only
Power BI (TMDL)
dataType: dateTime + mark-as-date-table
Databricks Metric View
no flag — inferred from column type
OSI Field
fields[].label
MetricFlow
dimensions[].label
Cube
dimensions[].title
AtScale (SML)
level_attribute.label
LookML
dimension.label
Snowflake Sem. View
no dedicated field (use COMMENT)
GoodData
label.title
Power BI (TMDL)
column name doubles as label
Databricks Metric View
dimensions[].label
OSI Field
fields[].description
MetricFlow
dimensions[].description
Cube
dimensions[].description
AtScale (SML)
level_attribute.description
LookML
dimension.description
Snowflake Sem. View
COMMENT = '…'
GoodData
attribute.description
Power BI (TMDL)
column.description
Databricks Metric View
dimensions[].comment
OSI Field
fields[].ai_context
MetricFlow
Cube
AtScale (SML)
LookML
Snowflake Sem. View
WITH SYNONYMS = ('…')
GoodData
Power BI (TMDL)
column.synonyms (Q&A)
Databricks Metric View
Genie-space instructions (external)
OSI Field
fields[].custom_extensions
MetricFlow
dimensions[].type_params
Cube
dimensions[].meta
AtScale (SML)
dimension.type / format
LookML
tags / group_label
Snowflake Sem. View
WITH TAG (…)
GoodData
label.value_type
Power BI (TMDL)
annotations[]
Databricks Metric View
column tags on source table

OSI's fields[].expression.dialects[] is the one place multi-dialect SQL can live natively — MetricFlow, Cube and LookML each assume a single dialect. And fields[].dimension.is_time is the only cross-product flag any consumer can rely on for time dimensions: no more sniffing LookML's dimension_group, MetricFlow's type: time, and Snowflake's raw SQL to guess the same thing three different ways.

Layer 3

3 · Metrics Layer (measures & aggregations)

How each product describes aggregations, filters, and derived metrics — and how OSI pulls the aggregation out of the SQL string into a first-class field.

osi-metrics-mapping.yamlyaml
OSI Field
metrics[].name
MetricFlow
measures[].name
Cube
measures[].name
AtScale (SML)
metric.unique_name
LookML
measure: field_name
Snowflake Sem. View
METRICS (table.metric AS …)
GoodData
metric.id
Power BI (TMDL)
measure.name
Databricks Metric View
measures[].name
OSI Field
metrics[].aggregation
MetricFlow
measures[].agg (sum, count_distinct…)
Cube
measures[].type (sum, avg…)
AtScale (SML)
metric.aggregation_type
LookML
measure: { type: sum }
Snowflake Sem. View
inline in SQL (SUM(...))
GoodData
inline in MAQL
Power BI (TMDL)
inline in DAX (SUM(...))
Databricks Metric View
inline in SQL (SUM(...))
OSI Field
metrics[].expression
MetricFlow
measures[].expr
Cube
measures[].sql
AtScale (SML)
metric.expression
LookML
measure: { sql: ${TABLE}.col }
Snowflake Sem. View
METRICS (… AS sql_expr)
GoodData
metric.maql
Power BI (TMDL)
measure.expression (DAX)
Databricks Metric View
measures[].expr (SQL)
OSI Field
metrics[].description
MetricFlow
measures[].description
Cube
measures[].description
AtScale (SML)
metric.description
LookML
measure.description
Snowflake Sem. View
COMMENT = '…'
GoodData
metric.description
Power BI (TMDL)
measure.description
Databricks Metric View
measures[].comment
OSI Field
metrics[].filter
MetricFlow
measures[].filter
Cube
measures[].filters[]
AtScale (SML)
metric.filter
LookML
measure: { filters: [...] }
Snowflake Sem. View
inline in SQL WHERE
GoodData
MAQL WHERE clause
Power BI (TMDL)
DAX CALCULATE(..., filter)
Databricks Metric View
inline SQL WHERE in measure expr
OSI Field
metrics[].label
MetricFlow
measures[].label
Cube
measures[].title
AtScale (SML)
metric.label
LookML
measure.label
Snowflake Sem. View
GoodData
metric.title
Power BI (TMDL)
measure name doubles as label
Databricks Metric View
measures[].label
OSI Field
composite / derived
MetricFlow
metrics: block (ratio, derived)
Cube
measures[].sql referencing other measures
AtScale (SML)
metric referencing metric
LookML
type: number, sql: ${m1}/${m2}
Snowflake Sem. View
nested SQL only
GoodData
metric.maql referencing other metrics
Power BI (TMDL)
DAX measure referencing other measures
Databricks Metric View
MEASURE(name) reference in metric view
OSI Field
metrics[].ai_context
MetricFlow
Cube
AtScale (SML)
LookML
Snowflake Sem. View
WITH SYNONYMS = ('…')
GoodData
Power BI (TMDL)
measure.synonyms (Q&A)
Databricks Metric View
Genie certified instructions (external)

Snowflake Semantic Views and GoodData embed the aggregation inside the expression string (AS SUM(...), SELECT SUM({fact})). OSI moves it out to metrics[].aggregation so agents and BI tools can reason about the operation without parsing SQL. Derived metrics that reference other metrics are preserved verbatim through metrics[].expression.

Layer 4

4 · Relationships Layer (joins)

Where joins are declared and where they must be inferred. OSI hoists them into a first-class relationships[] block.

osi-relationships-mapping.yamlyaml
OSI Field
relationships[].name
MetricFlow
derived from entity.name
Cube
joins[].name
AtScale (SML)
dimension-to-fact binding (implicit)
LookML
join's view name
Snowflake Sem. View
RELATIONSHIPS (name AS …)
GoodData
dataset reference declaration
Power BI (TMDL)
relationship.name
Databricks Metric View
joins[].name
OSI Field
from_dataset / to_dataset
MetricFlow
model + entity.type: foreign
Cube
cube + joins[].name
AtScale (SML)
fact → dimension binding
LookML
current view + joined view
Snowflake Sem. View
table_a (col) REFERENCES table_b
GoodData
current + referenced dataset
Power BI (TMDL)
fromTable / toTable
Databricks Metric View
metric view + joins[].source
OSI Field
relationships[].foreign_key
MetricFlow
entities[].expr
Cube
joins[].sql
AtScale (SML)
FK column on fact dataset
LookML
join: { sql_on: ${a}.fk = ${b}.pk }
Snowflake Sem. View
FK column in REFERENCES
GoodData
reference key in dataset fields
Power BI (TMDL)
fromColumn / toColumn
Databricks Metric View
joins[].on (SQL predicate)
OSI Field
relationships[].cardinality
MetricFlow
inferred from entity type
Cube
joins[].relationship
AtScale (SML)
not declared
LookML
relationship: many_to_one
Snowflake Sem. View
not declared
GoodData
not declared
Power BI (TMDL)
cardinality: manyToOne
Databricks Metric View
not declared

This is the most inconsistent layer across the six products. MetricFlow and AtScale derive joins from entities / level bindings; Cube and LookML declare them inline; Snowflake and GoodData sit in between. OSI's relationships[] block gives every consumer the same four fields — name, from_dataset, to_dataset, foreign_key — plus explicit cardinality, which only Cube and LookML currently declare.

Layer 5

5 · Time Semantics Layer (granularity)

How each product marks a time dimension and expresses granularity. OSI's is_time + granularity is the smallest common denominator.

osi-time-mapping.yamlyaml
OSI Field
fields[].dimension.is_time
MetricFlow
type: time
Cube
type: time
AtScale (SML)
type: TIME
LookML
dimension_group: { type: time }
Snowflake Sem. View
no flag
GoodData
no flag
Power BI (TMDL)
dataType: dateTime + date table
Databricks Metric View
no flag (TIMESTAMP column type)
OSI Field
fields[].dimension.granularity
MetricFlow
time_granularity: day
Cube
dimensions[].granularity
AtScale (SML)
hierarchy levels[]
LookML
timeframes: [date, week, month]
Snowflake Sem. View
SQL only (DATE_TRUNC(...))
GoodData
MAQL date semantics only
Power BI (TMDL)
date-table hierarchy (Year / Qtr / Month / Day)
Databricks Metric View
SQL only (DATE_TRUNC(...))

LookML's dimension_group with timeframes is the most complete; Snowflake leaves time entirely to SQL. OSI collapses this into a single time field with is_time: true and a granularity value — downstream tools that want day / week / month / quarter / year can generate them from the base field plus granularity metadata, so nothing is lost and every consumer can test one flag.

Layer 6

6 · AI Context Layer (OSI's differentiator)

The one layer where OSI leads the ecosystem. Only Snowflake Semantic Views has native equivalents today.

osi-ai-context-mapping.yamlyaml
OSI Field
fields[].ai_context
MetricFlow
Cube
AtScale (SML)
LookML
Snowflake Sem. View
WITH SYNONYMS = ('…')
GoodData
Power BI (TMDL)
column.synonyms (Q&A)
Databricks Metric View
OSI Field
metrics[].ai_context
MetricFlow
Cube
AtScale (SML)
LookML
Snowflake Sem. View
WITH SYNONYMS = ('…')
GoodData
Power BI (TMDL)
measure.synonyms (Q&A)
Databricks Metric View
OSI Field
AI instruction block
MetricFlow
Cube
external Cube AI API
AtScale (SML)
LookML
Snowflake Sem. View
AI_SQL_GENERATION '<instr>'
GoodData
Power BI (TMDL)
linguistic schema (.lsdl)
Databricks Metric View
Genie-space instructions
OSI Field
verified sample block
MetricFlow
Cube
AtScale (SML)
LookML
Snowflake Sem. View
AI_VERIFIED_QUERIES (…)
GoodData
Power BI (TMDL)
Q&A featured questions
Databricks Metric View
Genie certified example queries

This is the layer OSI was built for. Snowflake shipped WITH SYNONYMS, AI_SQL_GENERATION and AI_VERIFIED_QUERIES in 2026 — and no other mainstream semantic layer has an equivalent yet. OSI standardizes those hints into ai_context on every field and metric, so an agent reading OSI can find synonyms, natural-language names and verified sample queries the same way whether the source stack is Snowflake, Cube or a home-grown YAML store. When downstream tools adopt OSI, the AI-grounding metadata travels with the metric — instead of being locked inside one vendor's SQL dialect.

Use cases

What OSI enables for data teams

Four patterns teams unlock once their semantic layer speaks one vendor-neutral format — from the terminal to the chat interface.

One metric definition across every BI tool

OSI turns metrics[].aggregation, fields[] and relationships[] into a vendor-neutral contract. The same revenue or retention definition ships to Cube, Looker, Metabase and a Python notebook without silent drift. Validate conversions in the OSI Playground.

Ground AI agents in business semantics

Synonyms, natural-language labels and verified sample queries live in ai_context on every field and metric. Datus-Chat and the model layer read the same grounding, so "ARR" resolves to annual recurring revenue — not an airport code.

Move between semantic layers without rewriting

Author in MetricFlow, Cube or LookML, then export to OSI as the shared interchange. Data engineers keep their source-of-truth tool while downstream consumers read one consistent schema — generated and reviewed from the CLI.

Catch schema drift before dashboards break

Diff two OSI files to see exactly which dataset.source, relationships[] or metrics[].filter changed. Governance checks run against the spec from the CLI, not against vendor-specific YAML. See how this fits into Datus features.
FAQ

Frequently asked questions

LookML, Snowflake AI context, Cube joins, dimension_group timeframes, round-tripping and MAQL — how OSI handles each.

Can LookML metrics be represented in OSI?

Yes. Every LookML measure translates to an OSI metric: the type becomes aggregation, sql becomes expression, filters becomes filter. LookML's derived measures (type: number with references) map to OSI derived metrics that reference other metric names in the same file.

Does OSI support Snowflake Semantic Views' WITH SYNONYMS and AI_SQL_GENERATION?

Yes — this is the layer OSI standardizes most aggressively. WITH SYNONYMS on a dimension or metric maps directly to OSI's ai_context.synonyms; AI_SQL_GENERATION and AI_VERIFIED_QUERIES have first-class slots so agents from any vendor can read the same grounding hints.

How does OSI represent Cube's joins[] block?

Cube's joins[] entries become OSI relationships[] entries. joins[].sql becomes foreign_key, joins[].relationship (many_to_one / one_to_many) becomes cardinality, and the target cube becomes to_dataset. No inference required — the mapping is 1:1.

Is there anything in MetricFlow that OSI can't express today?

OSI v0.2 covers all core MetricFlow constructs — semantic_models, measures, dimensions, entities, top-level metrics — but a few advanced surfaces (saved queries, cumulative metrics with grain-to-date, some conversion metric options) are still evolving. The Datus Playground surfaces any dropped fields explicitly so nothing is lost silently.

Does OSI have an equivalent to LookML's dimension_group timeframes?

OSI collapses the LookML dimension_group into a single time field with is_time: true and a granularity value. Downstream tools that want all timeframes (date, week, month, quarter, year) generate them from the base field plus the granularity metadata, which keeps OSI vendor-neutral without losing information.

Can I round-trip: MetricFlow → OSI → LookML?

OSI is primarily an interchange and consumption format today. Forward conversion from MetricFlow or Cube into OSI is well supported (see the Datus Playground); back-conversion into LookML or MetricFlow-native YAML is on the community roadmap. In practice most teams treat OSI as the shared read layer and keep authoring in their source-of-truth tool.

Will OSI ever support GoodData MAQL expressions?

MAQL survives via metrics[].expression.dialects[]: the raw MAQL string is preserved under its own dialect, so a GoodData-aware consumer can still execute it while non-GoodData consumers fall back to the SQL dialect. This is the same mechanism OSI uses for any vendor-specific expression language.

When will the Datus Playground support conversion beyond MetricFlow?

MetricFlow → OSI shipped first because dbt semantic-layer YAML is the most common starting point. Cube and LookML converters are next on the roadmap; contributions are welcome — the Playground is Apache 2.0 and every converter is a pure browser-side function.

Try the OSI Playground.

Paste your MetricFlow YAML, get OSI back — validation, conversion and diff all run in your browser.