Source code for helix_ir.transform.functions
"""Aggregation and scalar function helpers."""
from __future__ import annotations
from helix_ir.transform.expression import Expression, FunctionExpr, col
[docs]
def sum_(expr: Expression | str) -> FunctionExpr:
"""SUM aggregate."""
e = col(expr) if isinstance(expr, str) else expr
return FunctionExpr("SUM", [e])
[docs]
def avg_(expr: Expression | str) -> FunctionExpr:
"""AVG aggregate."""
e = col(expr) if isinstance(expr, str) else expr
return FunctionExpr("AVG", [e])
[docs]
def min_(expr: Expression | str) -> FunctionExpr:
"""MIN aggregate."""
e = col(expr) if isinstance(expr, str) else expr
return FunctionExpr("MIN", [e])
[docs]
def max_(expr: Expression | str) -> FunctionExpr:
"""MAX aggregate."""
e = col(expr) if isinstance(expr, str) else expr
return FunctionExpr("MAX", [e])
[docs]
def count_(expr: Expression | str = "*") -> FunctionExpr:
"""COUNT aggregate."""
if isinstance(expr, str):
if expr == "*":
from helix_ir.transform.expression import StarExpr
return FunctionExpr("COUNT", [StarExpr()])
e = col(expr)
else:
e = expr
return FunctionExpr("COUNT", [e])
[docs]
def count_distinct_(expr: Expression | str) -> FunctionExpr:
"""COUNT(DISTINCT ...) aggregate."""
e = col(expr) if isinstance(expr, str) else expr
return FunctionExpr("COUNT_DISTINCT", [e])
[docs]
def coalesce(*exprs: Expression | str) -> FunctionExpr:
"""COALESCE function."""
args = [col(e) if isinstance(e, str) else e for e in exprs]
return FunctionExpr("COALESCE", args)
def if_(condition: Expression, then: Expression, else_: Expression) -> FunctionExpr:
"""IIF/IF function."""
return FunctionExpr("IIF", [condition, then, else_])
[docs]
def date_trunc(unit: str, expr: Expression | str) -> FunctionExpr:
"""DATE_TRUNC function."""
from helix_ir.transform.expression import Literal
e = col(expr) if isinstance(expr, str) else expr
return FunctionExpr("DATE_TRUNC", [Literal(unit), e])
def to_date(expr: Expression | str) -> FunctionExpr:
"""CAST to DATE."""
e = col(expr) if isinstance(expr, str) else expr
from helix_ir.transform.expression import CastExpr
return CastExpr(e, "DATE") # type: ignore[return-value]
[docs]
def length(expr: Expression | str) -> FunctionExpr:
"""LENGTH/LEN string function."""
e = col(expr) if isinstance(expr, str) else expr
return FunctionExpr("LENGTH", [e])
[docs]
def concat(*exprs: Expression | str) -> FunctionExpr:
"""CONCAT function."""
args = [col(e) if isinstance(e, str) else e for e in exprs]
return FunctionExpr("CONCAT", args)