Segments
Segments are named filters you can reuse across queries.
Segments are named filters you can apply in queries without repeating filter SQL everywhere.
Runnable Example (Executed in CI)
Doctest fixture (models/semantic_layer.yml)
models:
- name: orders
sql: |
select * from (values
(1, 120.00, 'completed'),
(2, 80.00, 'completed'),
(3, 50.00, 'pending'),
(4, 200.00, 'completed')
) as t(id, amount, status)
primary_key: id
dimensions:
- name: status
type: categorical
sql: status
metrics:
- name: revenue
agg: sum
sql: amount
segments:
- name: completed
sql: "{model}.status = 'completed'"
from pathlib import Path
from sidemantic import SemanticLayer
from sidemantic.loaders import load_from_directory
layer = SemanticLayer()
load_from_directory(layer, Path("./models"))
res = layer.query(metrics=["orders.revenue"], segments=["orders.completed"])
rows = res.fetchall()
print(f"{rows[0][0]:.2f}")
400.00
YAML
models:
- name: orders
segments:
- name: completed
sql: "{model}.status = 'completed'"
- name: high_value
sql: "{model}.amount >= 500"
Python
from sidemantic import Segment
completed = Segment(name="completed", sql="{model}.status = 'completed'")
Using Segments
Programmatic query:
result = layer.query(
metrics=["orders.revenue"],
dimensions=["orders.status"],
segments=["orders.completed"]
)
Gotchas
- Segments are filters; they don’t change grouping. Grouping is derived from dimensions.