CONNECTING TO DATA
- Data Sources
RESOURCES FOR AI AGENTS
REFERENCES
Examples
View complete examples of Buster semantic layer definitions
These examples demonstrate complete semantic layer definitions for common business scenarios.
E-Commerce Example
This example shows a semantic layer for an e-commerce application with orders, customers, products, and order items.
models:
- name: orders
description: Customer orders
dimensions:
- name: id
description: Order ID
type: string
- name: order_date
description: Date the order was placed
type: date
searchable: true
- name: status
description: Order status
options: ["pending", "shipped", "delivered", "cancelled"]
measures:
- name: amount
description: Order amount in USD
type: number
- name: tax
description: Tax amount in USD
type: number
metrics:
- name: total_revenue
expr: "SUM(amount)"
description: Total revenue from orders
- name: average_order_value
expr: "AVG(amount)"
description: Average order value
- name: order_count
expr: "COUNT(*)"
description: Number of orders
filters:
- name: completed_orders
expr: "status IN ('shipped', 'delivered')"
description: Orders that have been shipped or delivered
- name: recent_orders
expr: "order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL {{days}} DAY)"
description: Orders from the last N days
args:
- name: days
type: integer
description: Number of days to look back
entities:
- name: customers
primary_key: id
foreign_key: customer_id
cardinality: many-to-one
description: Customer who placed the order
- name: order_items
primary_key: id
foreign_key: order_id
cardinality: one-to-many
description: Items included in this order
- name: customers
description: Customer accounts
dimensions:
- name: id
description: Customer ID
type: string
- name: name
description: Customer name
searchable: true
- name: email
description: Customer email address
searchable: true
- name: sign_up_date
description: Date customer signed up
type: date
measures:
- name: lifetime_value
description: Customer lifetime value in USD
type: number
metrics:
- name: customer_count
expr: "COUNT(*)"
description: Number of customers
- name: average_lifetime_value
expr: "AVG(lifetime_value)"
description: Average lifetime value of customers
entities:
- name: orders
primary_key: customer_id
foreign_key: id
cardinality: one-to-many
description: Orders placed by this customer
- name: products
description: Products available for sale
dimensions:
- name: id
description: Product ID
type: string
- name: name
description: Product name
searchable: true
- name: category
description: Product category
options: ["electronics", "clothing", "home", "books"]
measures:
- name: price
description: Product price in USD
type: number
- name: cost
description: Product cost in USD
type: number
metrics:
- name: product_count
expr: "COUNT(*)"
description: Number of products
- name: average_price
expr: "AVG(price)"
description: Average product price
- name: margin
expr: "SUM(price - cost) / SUM(price)"
description: Average product margin
entities:
- name: order_items
primary_key: product_id
foreign_key: id
cardinality: one-to-many
description: Order items containing this product
- name: order_items
description: Individual items within orders
dimensions:
- name: id
description: Order item ID
type: string
measures:
- name: quantity
description: Number of items ordered
type: integer
- name: unit_price
description: Price per unit in USD
type: number
metrics:
- name: total_items
expr: "SUM(quantity)"
description: Total number of items sold
- name: average_quantity
expr: "AVG(quantity)"
description: Average quantity per order item
entities:
- name: orders
primary_key: id
foreign_key: order_id
cardinality: many-to-one
description: Order containing this item
- name: products
primary_key: id
foreign_key: product_id
cardinality: many-to-one
description: Product in this order item
SaaS Application Example
This example shows a semantic layer for a SaaS application with subscriptions, users, and usage data.
models:
- name: subscriptions
description: Customer subscriptions
dimensions:
- name: id
description: Subscription ID
type: string
- name: start_date
description: Date subscription started
type: date
- name: end_date
description: Date subscription ended (null if active)
type: date
- name: plan
description: Subscription plan
options: ["free", "basic", "pro", "enterprise"]
- name: billing_interval
description: Billing frequency
options: ["monthly", "annual"]
measures:
- name: monthly_amount
description: Monthly subscription amount in USD
type: number
metrics:
- name: mrr
expr: "SUM(monthly_amount)"
description: Monthly recurring revenue
- name: active_subscriptions
expr: "COUNT(CASE WHEN end_date IS NULL THEN 1 END)"
description: Number of active subscriptions
- name: churn_rate
expr: "COUNT(CASE WHEN end_date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) AND CURRENT_DATE() THEN 1 END) / NULLIF(COUNT(CASE WHEN end_date IS NULL OR end_date > DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) THEN 1 END), 0)"
description: 30-day subscription churn rate
filters:
- name: active
expr: "end_date IS NULL"
description: Active subscriptions
- name: plan_tier
expr: "plan = {{plan}}"
description: Subscriptions on a specific plan
args:
- name: plan
type: string
description: Subscription plan
entities:
- name: users
primary_key: id
foreign_key: user_id
cardinality: many-to-one
description: User who owns this subscription
- name: users
description: Application users
dimensions:
- name: id
description: User ID
type: string
- name: email
description: User email
searchable: true
- name: signup_date
description: Date user signed up
type: date
- name: last_login
description: Date of last login
type: timestamp
metrics:
- name: user_count
expr: "COUNT(*)"
description: Number of users
- name: active_users
expr: "COUNT(CASE WHEN last_login >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) THEN 1 END)"
description: Users active in the last 30 days
entities:
- name: subscriptions
primary_key: user_id
foreign_key: id
cardinality: one-to-many
description: Subscriptions owned by this user
- name: usage_events
primary_key: user_id
foreign_key: id
cardinality: one-to-many
description: Usage events by this user
- name: usage_events
description: User activity and usage data
dimensions:
- name: id
description: Event ID
type: string
- name: event_time
description: Time the event occurred
type: timestamp
- name: event_type
description: Type of event
options: ["login", "feature_used", "export", "api_call"]
- name: feature
description: Feature that was used (for feature_used events)
type: string
measures:
- name: duration
description: Duration of the event in seconds
type: number
metrics:
- name: event_count
expr: "COUNT(*)"
description: Number of events
- name: average_duration
expr: "AVG(duration)"
description: Average event duration
- name: feature_usage
expr: "COUNT(CASE WHEN event_type = 'feature_used' AND feature = {{feature_name}} THEN 1 END)"
description: Usage count for a specific feature
args:
- name: feature_name
type: string
description: Name of the feature
entities:
- name: users
primary_key: id
foreign_key: user_id
cardinality: many-to-one
description: User who triggered this event
Best Practices
Model Granularity
Define models at an appropriate level of granularity - neither too detailed nor too abstract.
Complete Relationships
Ensure all important relationships between models are defined.
Descriptive Metadata
Add comprehensive descriptions to help Buster understand your data model.
Business Metrics
Define business-relevant metrics rather than just exposing raw database fields.
Next Steps
Now that you’ve seen complete examples of semantic layer definitions, you can:
Was this page helpful?