Skip to content

Commit 0249a0c

Browse files
authored
Merge branch 'main' into main_chelsealin_aggmean
2 parents b17effb + c4efa68 commit 0249a0c

File tree

44 files changed

+982
-590
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+982
-590
lines changed

bigframes/core/blocks.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,10 +1375,16 @@ def aggregate(
13751375
) -> typing.Tuple[Block, typing.Sequence[str]]:
13761376
"""
13771377
Apply aggregations to the block.
1378+
13781379
Arguments:
13791380
by_column_id: column id of the aggregation key, this is preserved through the transform and used as index.
13801381
aggregations: input_column_id, operation tuples
13811382
dropna: whether null keys should be dropped
1383+
1384+
Returns:
1385+
Tuple[Block, Sequence[str]]:
1386+
The first element is the grouped block. The second is the
1387+
column IDs corresponding to each applied aggregation.
13821388
"""
13831389
if column_labels is None:
13841390
column_labels = pd.Index(range(len(aggregations)))

bigframes/core/compile/sqlglot/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
from bigframes.core.compile.sqlglot.compiler import SQLGlotCompiler
1717
import bigframes.core.compile.sqlglot.expressions.array_ops # noqa: F401
18-
import bigframes.core.compile.sqlglot.expressions.binary_compiler # noqa: F401
1918
import bigframes.core.compile.sqlglot.expressions.blob_ops # noqa: F401
2019
import bigframes.core.compile.sqlglot.expressions.comparison_ops # noqa: F401
2120
import bigframes.core.compile.sqlglot.expressions.date_ops # noqa: F401

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

Lines changed: 0 additions & 241 deletions
This file was deleted.

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
2222

2323
register_unary_op = scalar_compiler.scalar_op_compiler.register_unary_op
24+
register_binary_op = scalar_compiler.scalar_op_compiler.register_binary_op
2425

2526

2627
@register_unary_op(ops.obj_fetch_metadata_op)
@@ -31,3 +32,8 @@ def _(expr: TypedExpr) -> sge.Expression:
3132
@register_unary_op(ops.ObjGetAccessUrl)
3233
def _(expr: TypedExpr) -> sge.Expression:
3334
return sge.func("OBJ.GET_ACCESS_URL", expr.expr)
35+
36+
37+
@register_binary_op(ops.obj_make_ref_op)
38+
def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
39+
return sge.func("OBJ.MAKE_REF", left.expr, right.expr)

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

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919
import pandas as pd
2020
import sqlglot.expressions as sge
2121

22+
from bigframes import dtypes
2223
from bigframes import operations as ops
2324
from bigframes.core.compile.sqlglot.expressions.typed_expr import TypedExpr
2425
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
25-
import bigframes.dtypes as dtypes
2626

2727
register_unary_op = scalar_compiler.scalar_op_compiler.register_unary_op
28+
register_binary_op = scalar_compiler.scalar_op_compiler.register_binary_op
2829

2930

3031
@register_unary_op(ops.IsInOp, pass_op=True)
@@ -53,7 +54,76 @@ def _(expr: TypedExpr, op: ops.IsInOp) -> sge.Expression:
5354
)
5455

5556

57+
@register_binary_op(ops.eq_op)
58+
def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
59+
left_expr = _coerce_bool_to_int(left)
60+
right_expr = _coerce_bool_to_int(right)
61+
return sge.EQ(this=left_expr, expression=right_expr)
62+
63+
64+
@register_binary_op(ops.eq_null_match_op)
65+
def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
66+
left_expr = left.expr
67+
if right.dtype != dtypes.BOOL_DTYPE:
68+
left_expr = _coerce_bool_to_int(left)
69+
70+
right_expr = right.expr
71+
if left.dtype != dtypes.BOOL_DTYPE:
72+
right_expr = _coerce_bool_to_int(right)
73+
74+
sentinel = sge.convert("$NULL_SENTINEL$")
75+
left_coalesce = sge.Coalesce(
76+
this=sge.Cast(this=left_expr, to="STRING"), expressions=[sentinel]
77+
)
78+
right_coalesce = sge.Coalesce(
79+
this=sge.Cast(this=right_expr, to="STRING"), expressions=[sentinel]
80+
)
81+
return sge.EQ(this=left_coalesce, expression=right_coalesce)
82+
83+
84+
@register_binary_op(ops.ge_op)
85+
def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
86+
left_expr = _coerce_bool_to_int(left)
87+
right_expr = _coerce_bool_to_int(right)
88+
return sge.GTE(this=left_expr, expression=right_expr)
89+
90+
91+
@register_binary_op(ops.gt_op)
92+
def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
93+
left_expr = _coerce_bool_to_int(left)
94+
right_expr = _coerce_bool_to_int(right)
95+
return sge.GT(this=left_expr, expression=right_expr)
96+
97+
98+
@register_binary_op(ops.lt_op)
99+
def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
100+
left_expr = _coerce_bool_to_int(left)
101+
right_expr = _coerce_bool_to_int(right)
102+
return sge.LT(this=left_expr, expression=right_expr)
103+
104+
105+
@register_binary_op(ops.le_op)
106+
def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
107+
left_expr = _coerce_bool_to_int(left)
108+
right_expr = _coerce_bool_to_int(right)
109+
return sge.LTE(this=left_expr, expression=right_expr)
110+
111+
112+
@register_binary_op(ops.ne_op)
113+
def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
114+
left_expr = _coerce_bool_to_int(left)
115+
right_expr = _coerce_bool_to_int(right)
116+
return sge.NEQ(this=left_expr, expression=right_expr)
117+
118+
56119
# Helpers
57120
def _is_null(value) -> bool:
58121
# float NaN/inf should be treated as distinct from 'true' null values
59122
return typing.cast(bool, pd.isna(value)) and not isinstance(value, float)
123+
124+
125+
def _coerce_bool_to_int(typed_expr: TypedExpr) -> sge.Expression:
126+
"""Coerce boolean expression to integer."""
127+
if typed_expr.dtype == dtypes.BOOL_DTYPE:
128+
return sge.Cast(this=typed_expr.expr, to="INT64")
129+
return typed_expr.expr

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import bigframes.core.compile.sqlglot.scalar_compiler as scalar_compiler
2222

2323
register_unary_op = scalar_compiler.scalar_op_compiler.register_unary_op
24+
register_binary_op = scalar_compiler.scalar_op_compiler.register_binary_op
2425

2526

2627
@register_unary_op(ops.JSONExtract, pass_op=True)
@@ -66,3 +67,8 @@ def _(expr: TypedExpr) -> sge.Expression:
6667
@register_unary_op(ops.ToJSONString)
6768
def _(expr: TypedExpr) -> sge.Expression:
6869
return sge.func("TO_JSON_STRING", expr.expr)
70+
71+
72+
@register_binary_op(ops.JSONSet, pass_op=True)
73+
def _(left: TypedExpr, right: TypedExpr, op) -> sge.Expression:
74+
return sge.func("JSON_SET", left.expr, sge.convert(op.json_path), right.expr)

0 commit comments

Comments
 (0)