1313# limitations under the License.
1414from __future__ import annotations
1515
16- import functools
17- import typing
18-
1916import sqlglot .expressions as sge
2017
21- from bigframes .core import expression , window_spec
18+ from bigframes .core import expression
19+ from bigframes .core .compile .sqlglot .aggregations import (
20+ binary_compiler ,
21+ nullary_compiler ,
22+ ordered_unary_compiler ,
23+ unary_compiler ,
24+ )
2225from bigframes .core .compile .sqlglot .expressions import typed_expr
2326import bigframes .core .compile .sqlglot .scalar_compiler as scalar_compiler
24- import bigframes .core .compile .sqlglot .sqlglot_ir as ir
25- import bigframes .operations as ops
2627
2728
2829def compile_aggregate (
@@ -31,16 +32,18 @@ def compile_aggregate(
3132) -> sge .Expression :
3233 """Compiles BigFrames aggregation expression into SQLGlot expression."""
3334 if isinstance (aggregate , expression .NullaryAggregation ):
34- return compile_nullary_agg (aggregate .op )
35+ return nullary_compiler . compile (aggregate .op )
3536 if isinstance (aggregate , expression .UnaryAggregation ):
3637 column = typed_expr .TypedExpr (
3738 scalar_compiler .compile_scalar_expression (aggregate .arg ),
3839 aggregate .arg .output_type ,
3940 )
4041 if not aggregate .op .order_independent :
41- return compile_ordered_unary_agg (aggregate .op , column , order_by = order_by )
42+ return ordered_unary_compiler .compile (
43+ aggregate .op , column , order_by = order_by
44+ )
4245 else :
43- return compile_unary_agg (aggregate .op , column )
46+ return unary_compiler . compile (aggregate .op , column )
4447 elif isinstance (aggregate , expression .BinaryAggregation ):
4548 left = typed_expr .TypedExpr (
4649 scalar_compiler .compile_scalar_expression (aggregate .left ),
@@ -50,63 +53,6 @@ def compile_aggregate(
5053 scalar_compiler .compile_scalar_expression (aggregate .right ),
5154 aggregate .right .output_type ,
5255 )
53- return compile_binary_agg (aggregate .op , left , right )
56+ return binary_compiler . compile (aggregate .op , left , right )
5457 else :
5558 raise ValueError (f"Unexpected aggregation: { aggregate } " )
56-
57-
58- @functools .singledispatch
59- def compile_nullary_agg (
60- op : ops .aggregations .WindowOp ,
61- window : typing .Optional [window_spec .WindowSpec ] = None ,
62- ) -> sge .Expression :
63- raise ValueError (f"Can't compile unrecognized operation: { op } " )
64-
65-
66- @functools .singledispatch
67- def compile_binary_agg (
68- op : ops .aggregations .WindowOp ,
69- left : typed_expr .TypedExpr ,
70- right : typed_expr .TypedExpr ,
71- window : typing .Optional [window_spec .WindowSpec ] = None ,
72- ) -> sge .Expression :
73- raise ValueError (f"Can't compile unrecognized operation: { op } " )
74-
75-
76- @functools .singledispatch
77- def compile_unary_agg (
78- op : ops .aggregations .WindowOp ,
79- column : typed_expr .TypedExpr ,
80- window : typing .Optional [window_spec .WindowSpec ] = None ,
81- ) -> sge .Expression :
82- raise ValueError (f"Can't compile unrecognized operation: { op } " )
83-
84-
85- @functools .singledispatch
86- def compile_ordered_unary_agg (
87- op : ops .aggregations .WindowOp ,
88- column : typed_expr .TypedExpr ,
89- window : typing .Optional [window_spec .WindowSpec ] = None ,
90- order_by : typing .Sequence [sge .Expression ] = [],
91- ) -> sge .Expression :
92- raise ValueError (f"Can't compile unrecognized operation: { op } " )
93-
94-
95- @compile_unary_agg .register
96- def _ (
97- op : ops .aggregations .SumOp ,
98- column : typed_expr .TypedExpr ,
99- window : typing .Optional [window_spec .WindowSpec ] = None ,
100- ) -> sge .Expression :
101- # Will be null if all inputs are null. Pandas defaults to zero sum though.
102- expr = _apply_window_if_present (sge .func ("SUM" , column .expr ), window )
103- return sge .func ("IFNULL" , expr , ir ._literal (0 , column .dtype ))
104-
105-
106- def _apply_window_if_present (
107- value : sge .Expression ,
108- window : typing .Optional [window_spec .WindowSpec ] = None ,
109- ) -> sge .Expression :
110- if window is not None :
111- raise NotImplementedError ("Can't apply window to the expression." )
112- return value
0 commit comments