From 3e7879d4d3ae511ad24e25b044f488f19892a0bf Mon Sep 17 00:00:00 2001 From: jialuo Date: Tue, 4 Nov 2025 01:35:15 +0000 Subject: [PATCH 1/2] chore: Migrate arctan2_op operator to SQLGlot Migrated the arctan2_op operator to SQLGlot. --- .../compile/sqlglot/expressions/numeric_ops.py | 5 +++++ .../test_numeric_ops/test_arctan2/out.sql | 14 ++++++++++++++ .../sqlglot/expressions/test_numeric_ops.py | 7 +++++++ 3 files changed, 26 insertions(+) create mode 100644 tests/unit/core/compile/sqlglot/expressions/snapshots/test_numeric_ops/test_arctan2/out.sql diff --git a/bigframes/core/compile/sqlglot/expressions/numeric_ops.py b/bigframes/core/compile/sqlglot/expressions/numeric_ops.py index afc0d9d01c..a89627620f 100644 --- a/bigframes/core/compile/sqlglot/expressions/numeric_ops.py +++ b/bigframes/core/compile/sqlglot/expressions/numeric_ops.py @@ -77,6 +77,11 @@ def _(expr: TypedExpr) -> sge.Expression: return sge.func("ASINH", expr.expr) +@register_binary_op(ops.arctan2_op) +def _(left: TypedExpr, right: TypedExpr) -> sge.Expression: + return sge.func("ATAN2", left.expr, right.expr) + + @register_unary_op(ops.arctan_op) def _(expr: TypedExpr) -> sge.Expression: return sge.func("ATAN", expr.expr) diff --git a/tests/unit/core/compile/sqlglot/expressions/snapshots/test_numeric_ops/test_arctan2/out.sql b/tests/unit/core/compile/sqlglot/expressions/snapshots/test_numeric_ops/test_arctan2/out.sql new file mode 100644 index 0000000000..b69ad14927 --- /dev/null +++ b/tests/unit/core/compile/sqlglot/expressions/snapshots/test_numeric_ops/test_arctan2/out.sql @@ -0,0 +1,14 @@ +WITH `bfcte_0` AS ( + SELECT + `int64_col` AS `bfcol_0`, + `float64_col` AS `bfcol_1` + FROM `bigframes-dev`.`sqlglot_test`.`scalar_types` +), `bfcte_1` AS ( + SELECT + *, + ATAN2(`bfcol_0`, `bfcol_1`) AS `bfcol_2` + FROM `bfcte_0` +) +SELECT + `bfcol_2` AS `int64_col` +FROM `bfcte_1` \ No newline at end of file diff --git a/tests/unit/core/compile/sqlglot/expressions/test_numeric_ops.py b/tests/unit/core/compile/sqlglot/expressions/test_numeric_ops.py index c66fe15c16..35993b0964 100644 --- a/tests/unit/core/compile/sqlglot/expressions/test_numeric_ops.py +++ b/tests/unit/core/compile/sqlglot/expressions/test_numeric_ops.py @@ -55,6 +55,13 @@ def test_arcsinh(scalar_types_df: bpd.DataFrame, snapshot): snapshot.assert_match(sql, "out.sql") +def test_arctan2(scalar_types_df: bpd.DataFrame, snapshot): + bf_df = scalar_types_df[["int64_col", "float64_col"]] + sql = utils._apply_binary_op(bf_df, ops.arctan2_op, "int64_col", "float64_col") + + snapshot.assert_match(sql, "out.sql") + + def test_arctan(scalar_types_df: bpd.DataFrame, snapshot): col_name = "float64_col" bf_df = scalar_types_df[[col_name]] From 9f209a583fe8cdd3aca04bb64b94f6b66412b64a Mon Sep 17 00:00:00 2001 From: jialuo Date: Thu, 6 Nov 2025 19:23:37 +0000 Subject: [PATCH 2/2] support bool --- .../core/compile/sqlglot/expressions/numeric_ops.py | 4 +++- .../snapshots/test_numeric_ops/test_arctan2/out.sql | 11 +++++++---- .../compile/sqlglot/expressions/test_numeric_ops.py | 13 ++++++++++--- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/bigframes/core/compile/sqlglot/expressions/numeric_ops.py b/bigframes/core/compile/sqlglot/expressions/numeric_ops.py index a89627620f..b94ef6759d 100644 --- a/bigframes/core/compile/sqlglot/expressions/numeric_ops.py +++ b/bigframes/core/compile/sqlglot/expressions/numeric_ops.py @@ -79,7 +79,9 @@ def _(expr: TypedExpr) -> sge.Expression: @register_binary_op(ops.arctan2_op) def _(left: TypedExpr, right: TypedExpr) -> sge.Expression: - return sge.func("ATAN2", left.expr, right.expr) + left_expr = _coerce_bool_to_int(left) + right_expr = _coerce_bool_to_int(right) + return sge.func("ATAN2", left_expr, right_expr) @register_unary_op(ops.arctan_op) diff --git a/tests/unit/core/compile/sqlglot/expressions/snapshots/test_numeric_ops/test_arctan2/out.sql b/tests/unit/core/compile/sqlglot/expressions/snapshots/test_numeric_ops/test_arctan2/out.sql index b69ad14927..d131828a98 100644 --- a/tests/unit/core/compile/sqlglot/expressions/snapshots/test_numeric_ops/test_arctan2/out.sql +++ b/tests/unit/core/compile/sqlglot/expressions/snapshots/test_numeric_ops/test_arctan2/out.sql @@ -1,14 +1,17 @@ WITH `bfcte_0` AS ( SELECT - `int64_col` AS `bfcol_0`, - `float64_col` AS `bfcol_1` + `bool_col` AS `bfcol_0`, + `int64_col` AS `bfcol_1`, + `float64_col` AS `bfcol_2` FROM `bigframes-dev`.`sqlglot_test`.`scalar_types` ), `bfcte_1` AS ( SELECT *, - ATAN2(`bfcol_0`, `bfcol_1`) AS `bfcol_2` + ATAN2(`bfcol_1`, `bfcol_2`) AS `bfcol_6`, + ATAN2(CAST(`bfcol_0` AS INT64), `bfcol_2`) AS `bfcol_7` FROM `bfcte_0` ) SELECT - `bfcol_2` AS `int64_col` + `bfcol_6` AS `int64_col`, + `bfcol_7` AS `bool_col` FROM `bfcte_1` \ No newline at end of file diff --git a/tests/unit/core/compile/sqlglot/expressions/test_numeric_ops.py b/tests/unit/core/compile/sqlglot/expressions/test_numeric_ops.py index 35993b0964..266ad1c938 100644 --- a/tests/unit/core/compile/sqlglot/expressions/test_numeric_ops.py +++ b/tests/unit/core/compile/sqlglot/expressions/test_numeric_ops.py @@ -56,9 +56,16 @@ def test_arcsinh(scalar_types_df: bpd.DataFrame, snapshot): def test_arctan2(scalar_types_df: bpd.DataFrame, snapshot): - bf_df = scalar_types_df[["int64_col", "float64_col"]] - sql = utils._apply_binary_op(bf_df, ops.arctan2_op, "int64_col", "float64_col") - + bf_df = scalar_types_df[["int64_col", "float64_col", "bool_col"]] + + sql = utils._apply_ops_to_sql( + bf_df, + [ + ops.arctan2_op.as_expr("int64_col", "float64_col"), + ops.arctan2_op.as_expr("bool_col", "float64_col"), + ], + ["int64_col", "bool_col"], + ) snapshot.assert_match(sql, "out.sql")