Skip to content

Commit 27180da

Browse files
cte logic, cleanup
1 parent a005129 commit 27180da

File tree

21 files changed

+133
-411
lines changed

21 files changed

+133
-411
lines changed

bigframes/core/compile/sqlglot/aggregate_compiler.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
ordered_unary_compiler,
2323
unary_compiler,
2424
)
25+
import bigframes.core.compile.sqlglot.expression_compiler as expression_compiler
2526
from bigframes.core.compile.sqlglot.expressions import typed_expr
26-
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
2727

2828

2929
def compile_aggregate(
@@ -35,7 +35,7 @@ def compile_aggregate(
3535
return nullary_compiler.compile(aggregate.op)
3636
if isinstance(aggregate, agg_expressions.UnaryAggregation):
3737
column = typed_expr.TypedExpr(
38-
scalar_compiler.scalar_op_compiler.compile_expression(aggregate.arg),
38+
expression_compiler.expression_compiler.compile_expression(aggregate.arg),
3939
aggregate.arg.output_type,
4040
)
4141
if not aggregate.op.order_independent:
@@ -46,11 +46,11 @@ def compile_aggregate(
4646
return unary_compiler.compile(aggregate.op, column)
4747
elif isinstance(aggregate, agg_expressions.BinaryAggregation):
4848
left = typed_expr.TypedExpr(
49-
scalar_compiler.scalar_op_compiler.compile_expression(aggregate.left),
49+
expression_compiler.expression_compiler.compile_expression(aggregate.left),
5050
aggregate.left.output_type,
5151
)
5252
right = typed_expr.TypedExpr(
53-
scalar_compiler.scalar_op_compiler.compile_expression(aggregate.right),
53+
expression_compiler.expression_compiler.compile_expression(aggregate.right),
5454
aggregate.right.output_type,
5555
)
5656
return binary_compiler.compile(aggregate.op, left, right)
@@ -66,7 +66,7 @@ def compile_analytic(
6666
return nullary_compiler.compile(aggregate.op, window)
6767
if isinstance(aggregate, agg_expressions.UnaryAggregation):
6868
column = typed_expr.TypedExpr(
69-
scalar_compiler.scalar_op_compiler.compile_expression(aggregate.arg),
69+
expression_compiler.expression_compiler.compile_expression(aggregate.arg),
7070
aggregate.arg.output_type,
7171
)
7272
return unary_compiler.compile(aggregate.op, column, window)

bigframes/core/compile/sqlglot/aggregations/windows.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import bigframes_vendored.sqlglot.expressions as sge
1919

2020
from bigframes.core import utils, window_spec
21-
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
21+
import bigframes.core.compile.sqlglot.expression_compiler as expression_compiler
2222
import bigframes.core.expression as ex
2323
import bigframes.core.ordering as ordering_spec
2424
import bigframes.dtypes as dtypes
@@ -116,7 +116,7 @@ def get_window_order_by(
116116

117117
order_by = []
118118
for ordering_spec_item in ordering:
119-
expr = scalar_compiler.scalar_op_compiler.compile_expression(
119+
expr = expression_compiler.expression_compiler.compile_expression(
120120
ordering_spec_item.scalar_expression
121121
)
122122
desc = not ordering_spec_item.direction.is_ascending
@@ -191,7 +191,7 @@ def _get_window_bounds(
191191

192192

193193
def _compile_group_by_key(key: ex.Expression) -> sge.Expression:
194-
expr = scalar_compiler.scalar_op_compiler.compile_expression(key)
194+
expr = expression_compiler.expression_compiler.compile_expression(key)
195195
# The group_by keys has been rewritten by bind_schema_to_node
196196
assert isinstance(key, ex.ResolvedDerefOp)
197197

bigframes/core/compile/sqlglot/compiler.py

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
from bigframes.core.compile import configs
3232
import bigframes.core.compile.sqlglot.aggregate_compiler as aggregate_compiler
3333
from bigframes.core.compile.sqlglot.aggregations import windows
34+
import bigframes.core.compile.sqlglot.expression_compiler as expression_compiler
3435
from bigframes.core.compile.sqlglot.expressions import typed_expr
35-
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
3636
import bigframes.core.compile.sqlglot.sqlglot_ir as ir
3737
from bigframes.core.logging import data_types as data_type_logger
3838
import bigframes.core.ordering as bf_ordering
@@ -143,38 +143,32 @@ def _compile_node(
143143
@_compile_node.register
144144
def compile_sql_select(node: sql_nodes.SqlSelectNode, child: ir.SQLGlotIR):
145145
sqlglot_ir = child
146-
if node.sorting is not None:
147-
ordering_cols = tuple(
148-
sge.Ordered(
149-
this=scalar_compiler.scalar_op_compiler.compile_expression(
150-
ordering.scalar_expression
151-
),
152-
desc=ordering.direction.is_ascending is False,
153-
nulls_first=ordering.na_last is False,
154-
)
155-
for ordering in node.sorting
146+
ordering_cols = tuple(
147+
sge.Ordered(
148+
this=expression_compiler.expression_compiler.compile_expression(
149+
ordering.scalar_expression
150+
),
151+
desc=ordering.direction.is_ascending is False,
152+
nulls_first=ordering.na_last is False,
156153
)
157-
sqlglot_ir = sqlglot_ir.order_by(ordering_cols)
154+
for ordering in node.sorting
155+
)
158156

159157
projected_cols: tuple[tuple[str, sge.Expression], ...] = tuple(
160158
(
161159
cdef.id.sql,
162-
scalar_compiler.scalar_op_compiler.compile_expression(cdef.expression),
160+
expression_compiler.expression_compiler.compile_expression(cdef.expression),
163161
)
164162
for cdef in node.selections
165163
)
166164
sqlglot_ir = sqlglot_ir.select(projected_cols)
167165

168-
if len(node.predicates) > 0:
169-
sge_predicates = tuple(
170-
scalar_compiler.scalar_op_compiler.compile_expression(expression)
171-
for expression in node.predicates
172-
)
173-
sqlglot_ir = sqlglot_ir.filter(sge_predicates)
174-
if node.limit is not None:
175-
sqlglot_ir = sqlglot_ir.limit(node.limit)
166+
sge_predicates = tuple(
167+
expression_compiler.expression_compiler.compile_expression(expression)
168+
for expression in node.predicates
169+
)
176170

177-
return sqlglot_ir
171+
return child.select(projected_cols, sge_predicates, ordering_cols, node.limit)
178172

179173

180174
@_compile_node.register
@@ -210,11 +204,11 @@ def compile_join(
210204
conditions = tuple(
211205
(
212206
typed_expr.TypedExpr(
213-
scalar_compiler.scalar_op_compiler.compile_expression(left),
207+
expression_compiler.expression_compiler.compile_expression(left),
214208
left.output_type,
215209
),
216210
typed_expr.TypedExpr(
217-
scalar_compiler.scalar_op_compiler.compile_expression(right),
211+
expression_compiler.expression_compiler.compile_expression(right),
218212
right.output_type,
219213
),
220214
)
@@ -236,11 +230,11 @@ def compile_isin_join(
236230
right_field = node.right_child.fields[0]
237231
conditions = (
238232
typed_expr.TypedExpr(
239-
scalar_compiler.scalar_op_compiler.compile_expression(node.left_col),
233+
expression_compiler.expression_compiler.compile_expression(node.left_col),
240234
node.left_col.output_type,
241235
),
242236
typed_expr.TypedExpr(
243-
scalar_compiler.scalar_op_compiler.compile_expression(
237+
expression_compiler.expression_compiler.compile_expression(
244238
expression.DerefOp(right_field.id)
245239
),
246240
right_field.dtype,
@@ -303,7 +297,7 @@ def compile_aggregate(node: nodes.AggregateNode, child: ir.SQLGlotIR) -> ir.SQLG
303297
for agg, id in node.aggregations
304298
)
305299
by_cols: tuple[sge.Expression, ...] = tuple(
306-
scalar_compiler.scalar_op_compiler.compile_expression(by_col)
300+
expression_compiler.expression_compiler.compile_expression(by_col)
307301
for by_col in node.by_column_ids
308302
)
309303

bigframes/core/compile/sqlglot/expression_compiler.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2026 Google LLC
1+
# Copyright 2025 Google LLC
22
#
33
# Licensed under the Apache License, Version 2.0 (the "License");
44
# you may not use this file except in compliance with the License.
@@ -18,13 +18,14 @@
1818

1919
import bigframes_vendored.sqlglot.expressions as sge
2020

21+
import bigframes.core.agg_expressions as agg_exprs
2122
from bigframes.core.compile.sqlglot.expressions.typed_expr import TypedExpr
2223
import bigframes.core.compile.sqlglot.sqlglot_ir as ir
2324
import bigframes.core.expression as ex
2425
import bigframes.operations as ops
2526

2627

27-
class ScalarOpCompiler:
28+
class ExpressionCompiler:
2829
# Mapping of operation name to implemenations
2930
_registry: dict[
3031
str,
@@ -78,6 +79,15 @@ def _(self, expr: ex.DerefOp) -> sge.Expression:
7879
def _(self, expr: ex.ScalarConstantExpression) -> sge.Expression:
7980
return ir._literal(expr.value, expr.dtype)
8081

82+
@compile_expression.register
83+
def _(self, expr: agg_exprs.WindowExpression) -> sge.Expression:
84+
import bigframes.core.compile.sqlglot.aggregate_compiler as agg_compile
85+
86+
return agg_compile.compile_analytic(
87+
expr.analytic_expr,
88+
expr.window,
89+
)
90+
8191
@compile_expression.register
8292
def _(self, expr: ex.OpExpression) -> sge.Expression:
8393
# Non-recursively compiles the children scalar expressions.
@@ -218,4 +228,4 @@ def _add_parentheses(cls, expr: TypedExpr) -> TypedExpr:
218228

219229

220230
# Singleton compiler
221-
scalar_op_compiler = ScalarOpCompiler()
231+
expression_compiler = ExpressionCompiler()

bigframes/core/compile/sqlglot/expressions/ai_ops.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
import bigframes_vendored.sqlglot.expressions as sge
2020

2121
from bigframes import operations as ops
22-
from bigframes.core.compile.sqlglot import scalar_compiler
22+
from bigframes.core.compile.sqlglot import expression_compiler
2323
from bigframes.core.compile.sqlglot.expressions.typed_expr import TypedExpr
2424

25-
register_nary_op = scalar_compiler.scalar_op_compiler.register_nary_op
25+
register_nary_op = expression_compiler.expression_compiler.register_nary_op
2626

2727

2828
@register_nary_op(ops.AIGenerate, pass_op=True)

bigframes/core/compile/sqlglot/expressions/array_ops.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@
2020
import bigframes_vendored.sqlglot.expressions as sge
2121

2222
from bigframes import operations as ops
23+
import bigframes.core.compile.sqlglot.expression_compiler as expression_compiler
2324
from bigframes.core.compile.sqlglot.expressions.string_ops import (
2425
string_index,
2526
string_slice,
2627
)
2728
from bigframes.core.compile.sqlglot.expressions.typed_expr import TypedExpr
28-
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
2929
import bigframes.dtypes as dtypes
3030

31-
register_unary_op = scalar_compiler.scalar_op_compiler.register_unary_op
32-
register_nary_op = scalar_compiler.scalar_op_compiler.register_nary_op
31+
register_unary_op = expression_compiler.expression_compiler.register_unary_op
32+
register_nary_op = expression_compiler.expression_compiler.register_nary_op
3333

3434

3535
@register_unary_op(ops.ArrayIndexOp, pass_op=True)

bigframes/core/compile/sqlglot/expressions/blob_ops.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
import bigframes_vendored.sqlglot.expressions as sge
1818

1919
from bigframes import operations as ops
20+
import bigframes.core.compile.sqlglot.expression_compiler as expression_compiler
2021
from bigframes.core.compile.sqlglot.expressions.typed_expr import TypedExpr
21-
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
2222

23-
register_unary_op = scalar_compiler.scalar_op_compiler.register_unary_op
24-
register_binary_op = scalar_compiler.scalar_op_compiler.register_binary_op
23+
register_unary_op = expression_compiler.expression_compiler.register_unary_op
24+
register_binary_op = expression_compiler.expression_compiler.register_binary_op
2525

2626

2727
@register_unary_op(ops.obj_fetch_metadata_op)

bigframes/core/compile/sqlglot/expressions/bool_ops.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919
from bigframes import dtypes
2020
from bigframes import operations as ops
21+
import bigframes.core.compile.sqlglot.expression_compiler as expression_compiler
2122
from bigframes.core.compile.sqlglot.expressions.typed_expr import TypedExpr
22-
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
2323

24-
register_binary_op = scalar_compiler.scalar_op_compiler.register_binary_op
24+
register_binary_op = expression_compiler.expression_compiler.register_binary_op
2525

2626

2727
@register_binary_op(ops.and_op)

bigframes/core/compile/sqlglot/expressions/comparison_ops.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
from bigframes import dtypes
2424
from bigframes import operations as ops
2525
from bigframes.core.compile.sqlglot import sqlglot_ir
26+
import bigframes.core.compile.sqlglot.expression_compiler as expression_compiler
2627
from bigframes.core.compile.sqlglot.expressions.typed_expr import TypedExpr
27-
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
2828

29-
register_unary_op = scalar_compiler.scalar_op_compiler.register_unary_op
30-
register_binary_op = scalar_compiler.scalar_op_compiler.register_binary_op
29+
register_unary_op = expression_compiler.expression_compiler.register_unary_op
30+
register_binary_op = expression_compiler.expression_compiler.register_binary_op
3131

3232

3333
@register_unary_op(ops.IsInOp, pass_op=True)

bigframes/core/compile/sqlglot/expressions/date_ops.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
import bigframes_vendored.sqlglot.expressions as sge
1818

1919
from bigframes import operations as ops
20+
import bigframes.core.compile.sqlglot.expression_compiler as expression_compiler
2021
from bigframes.core.compile.sqlglot.expressions.typed_expr import TypedExpr
21-
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
2222

23-
register_unary_op = scalar_compiler.scalar_op_compiler.register_unary_op
23+
register_unary_op = expression_compiler.expression_compiler.register_unary_op
2424

2525

2626
@register_unary_op(ops.date_op)

0 commit comments

Comments
 (0)