Sidequery

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.