refactor composer to use sqlalchemy, avoid string concatenations and follow conventions
This commit is contained in:
38
api/composer/order.py
Normal file
38
api/composer/order.py
Normal file
@@ -0,0 +1,38 @@
|
||||
"""ORDER BY rendering.
|
||||
|
||||
A Pick orders by either the metric or a named dimension; both reference the
|
||||
SELECT-list *output alias* (the metric's name, or the dimension's output alias),
|
||||
not the underlying qualified column. Returns an `exp.Ordered` node.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlglot import exp
|
||||
|
||||
from api.composer.types import OrderBy, PickValidationError
|
||||
|
||||
|
||||
def _ordered(alias: str, direction: str) -> exp.Ordered:
|
||||
return exp.Ordered(this=exp.column(alias, quoted=True), desc=(direction == "desc"))
|
||||
|
||||
|
||||
def render_order_by(
|
||||
ob: OrderBy,
|
||||
metric_name: str,
|
||||
dim_select: dict[str, str],
|
||||
) -> exp.Ordered:
|
||||
"""`metric_name` is the metric SELECT alias; `dim_select` maps a dimension
|
||||
ref → its output alias."""
|
||||
if ob.by == "metric":
|
||||
return _ordered(metric_name, ob.direction)
|
||||
if ob.dimension not in dim_select:
|
||||
raise PickValidationError(
|
||||
f"order_by.dimension={ob.dimension!r} is not in group_by ({list(dim_select)})"
|
||||
)
|
||||
return _ordered(dim_select[ob.dimension], ob.direction)
|
||||
|
||||
|
||||
def default_order_by(metric_name: str) -> exp.Ordered:
|
||||
"""Sensible default when a grouped query gives no explicit order: largest
|
||||
metric value first."""
|
||||
return _ordered(metric_name, "desc")
|
||||
Reference in New Issue
Block a user