feat(dataflow): model production SQL flow patterns
This commit is contained in:
@@ -279,26 +279,43 @@ def _node_expressions(
|
||||
node: GraphNode,
|
||||
output_state: SchemaState,
|
||||
) -> tuple[IrExpression, ...]:
|
||||
if node.type == "calculate":
|
||||
sources = [
|
||||
str(item.get("expression") or "")
|
||||
for item in node.config.get("calculations", [])
|
||||
if isinstance(item, dict) and item.get("expression")
|
||||
]
|
||||
return tuple(
|
||||
item
|
||||
for source in sources
|
||||
if (item := _ir_expression(source, output_state)) is not None
|
||||
)
|
||||
source = node.config.get("expression")
|
||||
if node.type not in {"expression", "filter.expression"} or not source:
|
||||
return ()
|
||||
expression = _ir_expression(str(source), output_state)
|
||||
return (expression,) if expression is not None else ()
|
||||
|
||||
|
||||
def _ir_expression(
|
||||
source: str,
|
||||
output_state: SchemaState,
|
||||
) -> IrExpression | None:
|
||||
try:
|
||||
parsed = parse_expression(str(source))
|
||||
except ExpressionError:
|
||||
return ()
|
||||
return None
|
||||
inferred = infer_expression_type(parsed, output_state.types)
|
||||
return (
|
||||
IrExpression(
|
||||
source=parsed.source,
|
||||
columns=parsed.columns,
|
||||
result_type=_data_type(inferred),
|
||||
semantic_hash=_hash_payload(
|
||||
{
|
||||
"dialect": "duckdb",
|
||||
"source": parsed.sql(),
|
||||
"result_type": inferred,
|
||||
}
|
||||
),
|
||||
return IrExpression(
|
||||
source=parsed.source,
|
||||
columns=parsed.columns,
|
||||
result_type=_data_type(inferred),
|
||||
semantic_hash=_hash_payload(
|
||||
{
|
||||
"dialect": "duckdb",
|
||||
"source": parsed.sql(),
|
||||
"result_type": inferred,
|
||||
}
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user