From 9760fbd88f75cdea6d46397d08c36854f836d798 Mon Sep 17 00:00:00 2001 From: OKAN TIKTAS Date: Mon, 26 Oct 2026 01:26:49 -0400 Subject: [PATCH 1/3] docs: use portable sql fields in canonical examples --- core-spec/expression_language.md | 8 +- core-spec/spec.md | 123 +++++----------- examples/flights.semantic_model.yaml | 204 +++++++-------------------- examples/flights.yaml | 204 +++++++-------------------- examples/tpcds_semantic_model.yaml | 163 ++++++--------------- 5 files changed, 179 insertions(+), 523 deletions(-) diff --git a/core-spec/expression_language.md b/core-spec/expression_language.md index a673fdcca..a99b41f58 100644 --- a/core-spec/expression_language.md +++ b/core-spec/expression_language.md @@ -709,11 +709,13 @@ The `dialect` field is a free-form string; the core specification does not enume ### Declaring Dialect-Specific Expressions -``` +Put the portable expression in `sql` and keep vendor-specific variants in +`dialects`: + +```yaml expression: + sql: DATE_TRUNC('month', order_date) dialects: - - dialect: ANSI_SQL - expression: DATE_TRUNC('month', order_date) - dialect: SNOWFLAKE expression: DATE_TRUNC('month', order_date) - dialect: BIGQUERY diff --git a/core-spec/spec.md b/core-spec/spec.md index 259adc436..5a87bc337 100644 --- a/core-spec/spec.md +++ b/core-spec/spec.md @@ -207,14 +207,10 @@ datasets: fields: - name: order_id expression: - dialects: - - dialect: ANSI_SQL - expression: order_id + sql: order_id - name: order_number expression: - dialects: - - dialect: ANSI_SQL - expression: order_number + sql: order_number custom_extensions: - vendor_name: DBT data: '{"materialized": "table"}' @@ -292,16 +288,14 @@ Within a dataset, field names and dataset-scoped metric names share one namespac ### Expression Object -The expression object supports multiple SQL dialects for cross-platform compatibility. Each field can define expressions in different dialects. +Use `sql` for the primary, portable expression. Optional vendor-specific variants +can be supplied in `dialects` (see the multi-dialect example below). **Structure:** ```yaml expression: sql: "customer_id" # Primary, portable OSSIE_SQL_2026 form - dialects: - - dialect: ANSI_SQL # Free-form string; OSSIE_SQL_2026 is the only dialect the spec defines - expression: "customer_id" # Scalar SQL expression ``` **Key Points:** @@ -327,9 +321,7 @@ expression: ```yaml - name: customer_id expression: - dialects: - - dialect: ANSI_SQL - expression: customer_id + sql: customer_id description: Customer identifier dimension: is_time: false @@ -340,9 +332,7 @@ expression: ```yaml - name: full_name expression: - dialects: - - dialect: ANSI_SQL - expression: first_name || ' ' || last_name + sql: first_name || ' ' || last_name description: Customer full name ai_context: synonyms: @@ -355,9 +345,7 @@ expression: ```yaml - name: order_date expression: - dialects: - - dialect: ANSI_SQL - expression: order_date + sql: order_date datatype: Date dimension: is_time: true @@ -373,9 +361,8 @@ expression: ```yaml - name: email_normalized expression: + sql: LOWER(email) dialects: - - dialect: ANSI_SQL - expression: LOWER(email) - dialect: SNOWFLAKE expression: LOWER(email)::VARCHAR - dialect: BIGQUERY @@ -436,14 +423,12 @@ Metric expressions refer to dataset fields. They cannot refer to columns of a da ### Expression Object -The expression object supports multiple dialects +Use `sql` for the primary, portable metric expression. Optional vendor-specific +variants can be supplied in `dialects`. ```yaml expression: sql: "SUM(order.sales) / COUNT(DISTINCT order.customer_id)" # Primary, portable OSSIE_SQL_2026 form - dialects: - - dialect: ANSI_SQL # Default - expression: "SUM(order.sales) / COUNT(DISTINCT order.customer_id)" ``` At least one of the top-level `sql` or `dialects` MUST be present; either MAY stand alone. When both a top-level `sql` and an `OSSIE_SQL_2026` entry in `dialects` are present, the top-level `sql` is authoritative. @@ -455,9 +440,7 @@ At least one of the top-level `sql` or `dialects` MUST be present; either MAY st ```yaml - name: total_revenue expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(orders.amount) + sql: SUM(orders.amount) description: Total revenue across all orders datatype: Decimal ai_context: @@ -471,9 +454,7 @@ At least one of the top-level `sql` or `dialects` MUST be present; either MAY st ```yaml - name: avg_orders expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(orders.amount) / COUNT(DISTINCT customers.id) + sql: SUM(orders.amount) / COUNT(DISTINCT customers.id) description: Average orders datatype: Decimal ai_context: @@ -512,31 +493,23 @@ datasets: fields: - name: order_id expression: - dialects: - - dialect: OSSIE_SQL_2026 - expression: order_id + sql: order_id description: Order identifier - name: net_amount expression: - dialects: - - dialect: OSSIE_SQL_2026 - expression: amount - discount + sql: amount - discount description: Order amount after discount metrics: - name: total_net_amount expression: - dialects: - - dialect: OSSIE_SQL_2026 - expression: SUM(net_amount) + sql: SUM(net_amount) description: Total order amount after discount datatype: Decimal - name: order_count expression: - dialects: - - dialect: OSSIE_SQL_2026 - expression: COUNT(order_id) + sql: COUNT(order_id) description: Number of orders datatype: Integer ``` @@ -552,17 +525,13 @@ datasets: fields: - name: net_amount expression: - dialects: - - dialect: OSSIE_SQL_2026 - expression: amount - discount + sql: amount - discount metrics: # INVALID (rule 1): references the customers dataset, so this metric is # model-scoped and belongs in the model-root metrics - name: revenue_per_customer expression: - dialects: - - dialect: OSSIE_SQL_2026 - expression: SUM(net_amount) / COUNT(DISTINCT customers.id) + sql: SUM(net_amount) / COUNT(DISTINCT customers.id) ``` --- @@ -636,24 +605,16 @@ datasets: fields: - name: order_id expression: - dialects: - - dialect: ANSI_SQL - expression: o_orderkey # source column + sql: o_orderkey # source column - name: customer_id expression: - dialects: - - dialect: ANSI_SQL - expression: o_custkey + sql: o_custkey - name: total_amount expression: - dialects: - - dialect: ANSI_SQL - expression: o_totalprice + sql: o_totalprice - name: total_usd expression: - dialects: - - dialect: ANSI_SQL - expression: total_cents / 100.0 + sql: total_cents / 100.0 relationships: - name: orders_to_customers @@ -665,9 +626,7 @@ relationships: metrics: - name: total_revenue expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(orders.total_usd) # field, not a source column + sql: SUM(orders.total_usd) # field, not a source column ``` In this model, these references are invalid: @@ -719,23 +678,17 @@ datasets: fields: - name: order_id expression: - dialects: - - dialect: ANSI_SQL - expression: order_id + sql: order_id description: Order identifier - name: customer_id expression: - dialects: - - dialect: ANSI_SQL - expression: customer_id + sql: customer_id description: Customer identifier - name: order_date expression: - dialects: - - dialect: ANSI_SQL - expression: order_date + sql: order_date datatype: Date dimension: is_time: true @@ -743,18 +696,14 @@ datasets: - name: amount expression: - dialects: - - dialect: ANSI_SQL - expression: amount + sql: amount description: Order amount # Dataset-scoped: resolves entirely within the orders dataset metrics: - name: total_amount expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(amount) + sql: SUM(amount) description: Total order amount datatype: Decimal @@ -765,25 +714,19 @@ datasets: fields: - name: id expression: - dialects: - - dialect: ANSI_SQL - expression: id + sql: id description: Customer identifier - name: email expression: - dialects: - - dialect: ANSI_SQL - expression: email + sql: email description: Customer email # Dataset-scoped: resolves entirely within the customers dataset metrics: - name: customer_count expression: - dialects: - - dialect: ANSI_SQL - expression: COUNT(DISTINCT id) + sql: COUNT(DISTINCT id) description: Total number of customers datatype: Integer ai_context: @@ -802,9 +745,7 @@ metrics: # Model-scoped: spans orders and customers via the relationship - name: revenue_per_customer expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(orders.amount) / COUNT(DISTINCT customers.id) + sql: SUM(orders.amount) / COUNT(DISTINCT customers.id) description: Average revenue per customer datatype: Decimal diff --git a/examples/flights.semantic_model.yaml b/examples/flights.semantic_model.yaml index eeadf0d12..c108ab158 100644 --- a/examples/flights.semantic_model.yaml +++ b/examples/flights.semantic_model.yaml @@ -23,245 +23,155 @@ datasets: fields: - name: airport_code expression: - dialects: - - dialect: ANSI_SQL - expression: airport_code + sql: airport_code - name: length expression: - dialects: - - dialect: ANSI_SQL - expression: length + sql: length - name: shape expression: - dialects: - - dialect: ANSI_SQL - expression: shape + sql: shape - name: designator expression: - dialects: - - dialect: ANSI_SQL - expression: designator + sql: designator - name: AIRCRAFT source: DATABASE.SCHEMA.AIRCRAFT description: "An airplane, helicopter, or other machine capable of flight" fields: - name: serial_nr expression: - dialects: - - dialect: ANSI_SQL - expression: serial_nr + sql: serial_nr - name: name expression: - dialects: - - dialect: ANSI_SQL - expression: name + sql: name - name: nr_seats expression: - dialects: - - dialect: ANSI_SQL - expression: nr_seats + sql: nr_seats - name: tail_nr expression: - dialects: - - dialect: ANSI_SQL - expression: tail_nr + sql: tail_nr - name: carrier_code expression: - dialects: - - dialect: ANSI_SQL - expression: carrier_code + sql: carrier_code - name: manufacturer expression: - dialects: - - dialect: ANSI_SQL - expression: manufacturer + sql: manufacturer - name: model expression: - dialects: - - dialect: ANSI_SQL - expression: model + sql: model - name: year expression: - dialects: - - dialect: ANSI_SQL - expression: year + sql: year - name: capacity expression: - dialects: - - dialect: ANSI_SQL - expression: capacity + sql: capacity - name: AIRPORT source: DATABASE.SCHEMA.AIRPORTS description: "An airport that is identified by an IATA code." fields: - name: state_code expression: - dialects: - - dialect: ANSI_SQL - expression: state_code + sql: state_code - name: market_nm expression: - dialects: - - dialect: ANSI_SQL - expression: market_nm + sql: market_nm - name: longitude expression: - dialects: - - dialect: ANSI_SQL - expression: longitude + sql: longitude - name: opened expression: - dialects: - - dialect: ANSI_SQL - expression: opened + sql: opened - name: state_nm expression: - dialects: - - dialect: ANSI_SQL - expression: state_nm + sql: state_nm - name: city_nm expression: - dialects: - - dialect: ANSI_SQL - expression: city_nm + sql: city_nm - name: name expression: - dialects: - - dialect: ANSI_SQL - expression: name + sql: name - name: code expression: - dialects: - - dialect: ANSI_SQL - expression: code + sql: code - name: latitude expression: - dialects: - - dialect: ANSI_SQL - expression: latitude + sql: latitude - name: FLIGHT source: DATABASE.SCHEMA.FLIGHTS description: "A commercial passenger flight." fields: - name: dep_delay expression: - dialects: - - dialect: ANSI_SQL - expression: dep_delay + sql: dep_delay - name: air_time expression: - dialects: - - dialect: ANSI_SQL - expression: air_time + sql: air_time - name: nr expression: - dialects: - - dialect: ANSI_SQL - expression: nr + sql: nr - name: carrier_code expression: - dialects: - - dialect: ANSI_SQL - expression: carrier_code + sql: carrier_code - name: duration expression: - dialects: - - dialect: ANSI_SQL - expression: duration + sql: duration - name: scheduled_departure expression: - dialects: - - dialect: ANSI_SQL - expression: scheduled_departure + sql: scheduled_departure - name: arr_delay expression: - dialects: - - dialect: ANSI_SQL - expression: arr_delay + sql: arr_delay - name: cancelled expression: - dialects: - - dialect: ANSI_SQL - expression: cancelled + sql: cancelled - name: cancel_code expression: - dialects: - - dialect: ANSI_SQL - expression: cancel_code + sql: cancel_code - name: distance expression: - dialects: - - dialect: ANSI_SQL - expression: distance + sql: distance - name: id expression: - dialects: - - dialect: ANSI_SQL - expression: id + sql: id - name: scheduled_arrival expression: - dialects: - - dialect: ANSI_SQL - expression: scheduled_arrival + sql: scheduled_arrival - name: wheels_on expression: - dialects: - - dialect: ANSI_SQL - expression: wheels_on + sql: wheels_on - name: date expression: - dialects: - - dialect: ANSI_SQL - expression: date + sql: date - name: wheels_off expression: - dialects: - - dialect: ANSI_SQL - expression: wheels_off + sql: wheels_off - name: scheduled_duration expression: - dialects: - - dialect: ANSI_SQL - expression: scheduled_duration + sql: scheduled_duration - name: tail_nr expression: - dialects: - - dialect: ANSI_SQL - expression: tail_nr + sql: tail_nr - name: departure expression: - dialects: - - dialect: ANSI_SQL - expression: departure + sql: departure - name: route_id expression: - dialects: - - dialect: ANSI_SQL - expression: route_id + sql: route_id - name: diverted expression: - dialects: - - dialect: ANSI_SQL - expression: diverted + sql: diverted - name: arrival expression: - dialects: - - dialect: ANSI_SQL - expression: arrival + sql: arrival - name: CARRIER source: DATABASE.SCHEMA.CARRIERS description: "An airline, such as Delta, United, or American." fields: - name: code expression: - dialects: - - dialect: ANSI_SQL - expression: code + sql: code - name: name expression: - dialects: - - dialect: ANSI_SQL - expression: name + sql: name - name: ROUTE source: DATABASE.SCHEMA.ROUTES description: "Represents the existence of one or more flights between a pair of departure @@ -269,31 +179,19 @@ datasets: fields: - name: orig_airport_code expression: - dialects: - - dialect: ANSI_SQL - expression: orig_airport_code + sql: orig_airport_code - name: dest_airport_code expression: - dialects: - - dialect: ANSI_SQL - expression: dest_airport_code + sql: dest_airport_code - name: distance expression: - dialects: - - dialect: ANSI_SQL - expression: distance + sql: distance - name: dist_grp expression: - dialects: - - dialect: ANSI_SQL - expression: dist_grp + sql: dist_grp - name: id expression: - dialects: - - dialect: ANSI_SQL - expression: id + sql: id - name: name expression: - dialects: - - dialect: ANSI_SQL - expression: name + sql: name diff --git a/examples/flights.yaml b/examples/flights.yaml index b3fb5a136..16d3c140d 100644 --- a/examples/flights.yaml +++ b/examples/flights.yaml @@ -548,245 +548,155 @@ ontology_mappings: fields: - name: airport_code expression: - dialects: - - dialect: ANSI_SQL - expression: airport_code + sql: airport_code - name: length expression: - dialects: - - dialect: ANSI_SQL - expression: length + sql: length - name: shape expression: - dialects: - - dialect: ANSI_SQL - expression: shape + sql: shape - name: designator expression: - dialects: - - dialect: ANSI_SQL - expression: designator + sql: designator - name: AIRCRAFT source: DATABASE.SCHEMA.AIRCRAFT description: "An airplane, helicopter, or other machine capable of flight" fields: - name: serial_nr expression: - dialects: - - dialect: ANSI_SQL - expression: serial_nr + sql: serial_nr - name: name expression: - dialects: - - dialect: ANSI_SQL - expression: name + sql: name - name: nr_seats expression: - dialects: - - dialect: ANSI_SQL - expression: nr_seats + sql: nr_seats - name: tail_nr expression: - dialects: - - dialect: ANSI_SQL - expression: tail_nr + sql: tail_nr - name: carrier_code expression: - dialects: - - dialect: ANSI_SQL - expression: carrier_code + sql: carrier_code - name: manufacturer expression: - dialects: - - dialect: ANSI_SQL - expression: manufacturer + sql: manufacturer - name: model expression: - dialects: - - dialect: ANSI_SQL - expression: model + sql: model - name: year expression: - dialects: - - dialect: ANSI_SQL - expression: year + sql: year - name: capacity expression: - dialects: - - dialect: ANSI_SQL - expression: capacity + sql: capacity - name: AIRPORT source: DATABASE.SCHEMA.AIRPORTS description: "An airport that is identified by an IATA code." fields: - name: state_code expression: - dialects: - - dialect: ANSI_SQL - expression: state_code + sql: state_code - name: market_nm expression: - dialects: - - dialect: ANSI_SQL - expression: market_nm + sql: market_nm - name: longitude expression: - dialects: - - dialect: ANSI_SQL - expression: longitude + sql: longitude - name: opened expression: - dialects: - - dialect: ANSI_SQL - expression: opened + sql: opened - name: state_nm expression: - dialects: - - dialect: ANSI_SQL - expression: state_nm + sql: state_nm - name: city_nm expression: - dialects: - - dialect: ANSI_SQL - expression: city_nm + sql: city_nm - name: name expression: - dialects: - - dialect: ANSI_SQL - expression: name + sql: name - name: code expression: - dialects: - - dialect: ANSI_SQL - expression: code + sql: code - name: latitude expression: - dialects: - - dialect: ANSI_SQL - expression: latitude + sql: latitude - name: FLIGHT source: DATABASE.SCHEMA.FLIGHTS description: "A commercial passenger flight." fields: - name: dep_delay expression: - dialects: - - dialect: ANSI_SQL - expression: dep_delay + sql: dep_delay - name: air_time expression: - dialects: - - dialect: ANSI_SQL - expression: air_time + sql: air_time - name: nr expression: - dialects: - - dialect: ANSI_SQL - expression: nr + sql: nr - name: carrier_code expression: - dialects: - - dialect: ANSI_SQL - expression: carrier_code + sql: carrier_code - name: duration expression: - dialects: - - dialect: ANSI_SQL - expression: duration + sql: duration - name: scheduled_departure expression: - dialects: - - dialect: ANSI_SQL - expression: scheduled_departure + sql: scheduled_departure - name: arr_delay expression: - dialects: - - dialect: ANSI_SQL - expression: arr_delay + sql: arr_delay - name: cancelled expression: - dialects: - - dialect: ANSI_SQL - expression: cancelled + sql: cancelled - name: cancel_code expression: - dialects: - - dialect: ANSI_SQL - expression: cancel_code + sql: cancel_code - name: distance expression: - dialects: - - dialect: ANSI_SQL - expression: distance + sql: distance - name: id expression: - dialects: - - dialect: ANSI_SQL - expression: id + sql: id - name: scheduled_arrival expression: - dialects: - - dialect: ANSI_SQL - expression: scheduled_arrival + sql: scheduled_arrival - name: wheels_on expression: - dialects: - - dialect: ANSI_SQL - expression: wheels_on + sql: wheels_on - name: date expression: - dialects: - - dialect: ANSI_SQL - expression: date + sql: date - name: wheels_off expression: - dialects: - - dialect: ANSI_SQL - expression: wheels_off + sql: wheels_off - name: scheduled_duration expression: - dialects: - - dialect: ANSI_SQL - expression: scheduled_duration + sql: scheduled_duration - name: tail_nr expression: - dialects: - - dialect: ANSI_SQL - expression: tail_nr + sql: tail_nr - name: departure expression: - dialects: - - dialect: ANSI_SQL - expression: departure + sql: departure - name: route_id expression: - dialects: - - dialect: ANSI_SQL - expression: route_id + sql: route_id - name: diverted expression: - dialects: - - dialect: ANSI_SQL - expression: diverted + sql: diverted - name: arrival expression: - dialects: - - dialect: ANSI_SQL - expression: arrival + sql: arrival - name: CARRIER source: DATABASE.SCHEMA.CARRIERS description: "An airline, such as Delta, United, or American." fields: - name: code expression: - dialects: - - dialect: ANSI_SQL - expression: code + sql: code - name: name expression: - dialects: - - dialect: ANSI_SQL - expression: name + sql: name - name: ROUTE source: DATABASE.SCHEMA.ROUTES description: "Represents the existence of one or more flights between a pair of departure @@ -794,34 +704,22 @@ ontology_mappings: fields: - name: orig_airport_code expression: - dialects: - - dialect: ANSI_SQL - expression: orig_airport_code + sql: orig_airport_code - name: dest_airport_code expression: - dialects: - - dialect: ANSI_SQL - expression: dest_airport_code + sql: dest_airport_code - name: distance expression: - dialects: - - dialect: ANSI_SQL - expression: distance + sql: distance - name: dist_grp expression: - dialects: - - dialect: ANSI_SQL - expression: dist_grp + sql: dist_grp - name: id expression: - dialects: - - dialect: ANSI_SQL - expression: id + sql: id - name: name expression: - dialects: - - dialect: ANSI_SQL - expression: name + sql: name concept_mappings: - concept: Runway object_mappings: diff --git a/examples/tpcds_semantic_model.yaml b/examples/tpcds_semantic_model.yaml index 347a7e2a4..d0a0b587e 100644 --- a/examples/tpcds_semantic_model.yaml +++ b/examples/tpcds_semantic_model.yaml @@ -45,9 +45,7 @@ datasets: fields: - name: ss_sold_date_sk expression: - dialects: - - dialect: ANSI_SQL - expression: ss_sold_date_sk + sql: ss_sold_date_sk description: Foreign key to date dimension datatype: Integer dimension: @@ -59,9 +57,7 @@ datasets: - name: ss_item_sk expression: - dialects: - - dialect: ANSI_SQL - expression: ss_item_sk + sql: ss_item_sk description: Foreign key to item dimension datatype: Integer dimension: @@ -73,9 +69,7 @@ datasets: - name: ss_ticket_number expression: - dialects: - - dialect: ANSI_SQL - expression: ss_ticket_number + sql: ss_ticket_number description: Ticket number identifying the sales transaction datatype: Integer dimension: @@ -83,9 +77,7 @@ datasets: - name: ss_customer_sk expression: - dialects: - - dialect: ANSI_SQL - expression: ss_customer_sk + sql: ss_customer_sk description: Foreign key to customer dimension datatype: Integer dimension: @@ -97,9 +89,7 @@ datasets: - name: ss_store_sk expression: - dialects: - - dialect: ANSI_SQL - expression: ss_store_sk + sql: ss_store_sk description: Foreign key to store dimension datatype: Integer dimension: @@ -111,9 +101,7 @@ datasets: - name: ss_quantity expression: - dialects: - - dialect: ANSI_SQL - expression: ss_quantity + sql: ss_quantity description: Quantity of items sold datatype: Integer ai_context: @@ -123,9 +111,7 @@ datasets: - name: ss_sales_price expression: - dialects: - - dialect: ANSI_SQL - expression: ss_sales_price + sql: ss_sales_price description: Sales price per unit datatype: Decimal ai_context: @@ -135,9 +121,7 @@ datasets: - name: ss_ext_sales_price expression: - dialects: - - dialect: ANSI_SQL - expression: ss_ext_sales_price + sql: ss_ext_sales_price description: Extended sales price (quantity * price) datatype: Decimal ai_context: @@ -147,9 +131,7 @@ datasets: - name: ss_net_profit expression: - dialects: - - dialect: ANSI_SQL - expression: ss_net_profit + sql: ss_net_profit description: Net profit from the sale datatype: Decimal ai_context: @@ -163,9 +145,7 @@ datasets: metrics: - name: total_quantity expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(ss_quantity) + sql: SUM(ss_quantity) description: Total quantity sold across all store sales datatype: Integer @@ -185,9 +165,7 @@ datasets: fields: - name: d_date_sk expression: - dialects: - - dialect: ANSI_SQL - expression: d_date_sk + sql: d_date_sk description: Surrogate key for date datatype: Integer dimension: @@ -195,9 +173,7 @@ datasets: - name: d_date expression: - dialects: - - dialect: ANSI_SQL - expression: d_date + sql: d_date description: Actual date value datatype: Date dimension: {} @@ -208,9 +184,7 @@ datasets: - name: d_year expression: - dialects: - - dialect: ANSI_SQL - expression: d_year + sql: d_year description: Year datatype: Integer dimension: @@ -223,9 +197,7 @@ datasets: # Both datatype and is_time are independently optional. - name: d_quarter_name expression: - dialects: - - dialect: ANSI_SQL - expression: d_quarter_name + sql: d_quarter_name description: Quarter name (e.g., 2024Q1) dimension: is_time: true @@ -238,9 +210,7 @@ datasets: # Both datatype and is_time are independently optional. - name: d_moy expression: - dialects: - - dialect: ANSI_SQL - expression: d_moy + sql: d_moy description: Month of year (1-12) dimension: is_time: true @@ -265,9 +235,7 @@ datasets: fields: - name: c_customer_sk expression: - dialects: - - dialect: ANSI_SQL - expression: c_customer_sk + sql: c_customer_sk description: Surrogate key for customer datatype: Integer dimension: @@ -275,9 +243,7 @@ datasets: - name: c_customer_id expression: - dialects: - - dialect: ANSI_SQL - expression: c_customer_id + sql: c_customer_id description: Business key for customer datatype: String dimension: @@ -289,9 +255,7 @@ datasets: - name: c_first_name expression: - dialects: - - dialect: ANSI_SQL - expression: c_first_name + sql: c_first_name description: Customer first name datatype: String dimension: @@ -299,9 +263,7 @@ datasets: - name: c_last_name expression: - dialects: - - dialect: ANSI_SQL - expression: c_last_name + sql: c_last_name description: Customer last name datatype: String dimension: @@ -311,9 +273,6 @@ datasets: expression: # Primary, portable OSSIE_SQL_2026 form sql: c_first_name || ' ' || c_last_name - dialects: - - dialect: ANSI_SQL - expression: c_first_name || ' ' || c_last_name description: Customer full name (computed field) datatype: String dimension: @@ -325,9 +284,7 @@ datasets: - name: c_email_address expression: - dialects: - - dialect: ANSI_SQL - expression: c_email_address + sql: c_email_address description: Customer email address datatype: String dimension: @@ -353,9 +310,7 @@ datasets: fields: - name: i_item_sk expression: - dialects: - - dialect: ANSI_SQL - expression: i_item_sk + sql: i_item_sk description: Surrogate key for item datatype: Integer dimension: @@ -363,9 +318,7 @@ datasets: - name: i_item_id expression: - dialects: - - dialect: ANSI_SQL - expression: i_item_id + sql: i_item_id description: Business key for item datatype: String dimension: @@ -378,9 +331,7 @@ datasets: - name: i_item_desc expression: - dialects: - - dialect: ANSI_SQL - expression: i_item_desc + sql: i_item_desc description: Item description datatype: String dimension: @@ -392,9 +343,7 @@ datasets: - name: i_brand expression: - dialects: - - dialect: ANSI_SQL - expression: i_brand + sql: i_brand description: Brand name datatype: String dimension: @@ -406,9 +355,7 @@ datasets: - name: i_category expression: - dialects: - - dialect: ANSI_SQL - expression: i_category + sql: i_category description: Item category datatype: String dimension: @@ -420,9 +367,7 @@ datasets: - name: i_current_price expression: - dialects: - - dialect: ANSI_SQL - expression: i_current_price + sql: i_current_price description: Current price of the item datatype: Decimal dimension: @@ -448,9 +393,7 @@ datasets: fields: - name: s_store_sk expression: - dialects: - - dialect: ANSI_SQL - expression: s_store_sk + sql: s_store_sk description: Surrogate key for store datatype: Integer dimension: @@ -458,9 +401,7 @@ datasets: - name: s_store_id expression: - dialects: - - dialect: ANSI_SQL - expression: s_store_id + sql: s_store_id description: Business key for store datatype: String dimension: @@ -472,9 +413,7 @@ datasets: - name: s_store_name expression: - dialects: - - dialect: ANSI_SQL - expression: s_store_name + sql: s_store_name description: Store name datatype: String dimension: @@ -486,9 +425,7 @@ datasets: - name: s_city expression: - dialects: - - dialect: ANSI_SQL - expression: s_city + sql: s_city description: City where store is located datatype: String dimension: @@ -500,9 +437,7 @@ datasets: - name: s_state expression: - dialects: - - dialect: ANSI_SQL - expression: s_state + sql: s_state description: State where store is located datatype: String dimension: @@ -514,9 +449,7 @@ datasets: - name: s_number_employees expression: - dialects: - - dialect: ANSI_SQL - expression: s_number_employees + sql: s_number_employees description: Number of employees at the store datatype: Integer ai_context: @@ -570,9 +503,7 @@ relationships: metrics: - name: total_sales expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(store_sales.ss_ext_sales_price) + sql: SUM(store_sales.ss_ext_sales_price) description: Total sales revenue across all transactions datatype: Decimal ai_context: @@ -583,9 +514,7 @@ metrics: - name: total_profit expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(store_sales.ss_net_profit) + sql: SUM(store_sales.ss_net_profit) description: Total net profit from store sales datatype: Decimal ai_context: @@ -596,9 +525,7 @@ metrics: - name: customer_lifetime_value expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(store_sales.ss_ext_sales_price) / COUNT(DISTINCT customer.c_customer_sk) + sql: SUM(store_sales.ss_ext_sales_price) / COUNT(DISTINCT customer.c_customer_sk) description: Average lifetime sales value per customer datatype: Decimal ai_context: @@ -610,9 +537,7 @@ metrics: - name: sales_by_brand expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(store_sales.ss_ext_sales_price) + sql: SUM(store_sales.ss_ext_sales_price) description: Total sales by brand (requires grouping by item.i_brand) datatype: Decimal ai_context: @@ -623,9 +548,7 @@ metrics: - name: store_productivity expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(store_sales.ss_ext_sales_price) / NULLIF(SUM(store.s_number_employees), 0) + sql: SUM(store_sales.ss_ext_sales_price) / NULLIF(SUM(store.s_number_employees), 0) description: Sales per employee across stores datatype: Decimal ai_context: @@ -638,9 +561,7 @@ metrics: # grain named in the description is the GROUP BY the query is expected to supply. - name: cumulative_sales expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(SUM(store_sales.ss_ext_sales_price)) OVER (ORDER BY date_dim.d_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) + sql: SUM(SUM(store_sales.ss_ext_sales_price)) OVER (ORDER BY date_dim.d_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) description: Running total of sales revenue by date (requires grouping by date_dim.d_date) datatype: Decimal ai_context: @@ -651,9 +572,7 @@ metrics: - name: brand_rank_in_store expression: - dialects: - - dialect: ANSI_SQL - expression: RANK() OVER (PARTITION BY store.s_store_sk ORDER BY SUM(store_sales.ss_ext_sales_price) DESC) + sql: RANK() OVER (PARTITION BY store.s_store_sk ORDER BY SUM(store_sales.ss_ext_sales_price) DESC) description: Rank of each brand by sales within a store, 1 = highest (requires grouping by store.s_store_sk and item.i_brand) datatype: Integer ai_context: @@ -664,9 +583,7 @@ metrics: - name: monthly_sales_change expression: - dialects: - - dialect: ANSI_SQL - expression: SUM(store_sales.ss_ext_sales_price) - LAG(SUM(store_sales.ss_ext_sales_price), 1) OVER (ORDER BY date_dim.d_year, date_dim.d_moy) + sql: SUM(store_sales.ss_ext_sales_price) - LAG(SUM(store_sales.ss_ext_sales_price), 1) OVER (ORDER BY date_dim.d_year, date_dim.d_moy) description: Sales revenue change versus the previous month (requires grouping by date_dim.d_year and date_dim.d_moy) datatype: Decimal ai_context: From f46b75298411da78ab678bbce882beb9d9993fa5 Mon Sep 17 00:00:00 2001 From: OKAN TIKTAS Date: Mon, 26 Oct 2026 09:16:35 -0400 Subject: [PATCH 2/3] docs(examples): retain Snowflake dialect variant in flights --- examples/flights.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/flights.yaml b/examples/flights.yaml index 16d3c140d..6f9edb1e0 100644 --- a/examples/flights.yaml +++ b/examples/flights.yaml @@ -568,6 +568,9 @@ ontology_mappings: - name: name expression: sql: name + dialects: + - dialect: SNOWFLAKE + expression: name::VARCHAR - name: nr_seats expression: sql: nr_seats From 930aeaf18d8296ad1dd4671f0fd214dec91d33c0 Mon Sep 17 00:00:00 2001 From: OKAN TIKTAS Date: Mon, 26 Oct 2026 09:16:45 -0400 Subject: [PATCH 3/3] docs(spec): demonstrate portable and BigQuery metric expressions --- core-spec/spec.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core-spec/spec.md b/core-spec/spec.md index 5a87bc337..370948236 100644 --- a/core-spec/spec.md +++ b/core-spec/spec.md @@ -429,6 +429,9 @@ variants can be supplied in `dialects`. ```yaml expression: sql: "SUM(order.sales) / COUNT(DISTINCT order.customer_id)" # Primary, portable OSSIE_SQL_2026 form + dialects: + - dialect: BIGQUERY + expression: "SAFE_DIVIDE(SUM(order.sales), COUNT(DISTINCT order.customer_id))" ``` At least one of the top-level `sql` or `dialects` MUST be present; either MAY stand alone. When both a top-level `sql` and an `OSSIE_SQL_2026` entry in `dialects` are present, the top-level `sql` is authoritative.