From a4c4e77cc0ae842e6a818904352fa544964f6f03 Mon Sep 17 00:00:00 2001 From: Chelsea Lin Date: Wed, 11 Feb 2026 23:14:08 +0000 Subject: [PATCH] refactor: migrate compile_random_sample for sqlglot --- bigframes/core/compile/sqlglot/compiler.py | 19 ++ bigframes/core/compile/sqlglot/sqlglot_ir.py | 41 +++++ .../test_compile_fromrange/out.sql | 165 ++++++++++++++++++ .../compile/sqlglot/test_compile_fromrange.py | 35 ++++ 4 files changed, 260 insertions(+) create mode 100644 tests/unit/core/compile/sqlglot/snapshots/test_compile_fromrange/test_compile_fromrange/out.sql create mode 100644 tests/unit/core/compile/sqlglot/test_compile_fromrange.py diff --git a/bigframes/core/compile/sqlglot/compiler.py b/bigframes/core/compile/sqlglot/compiler.py index d74c1b3869..6b90b94067 100644 --- a/bigframes/core/compile/sqlglot/compiler.py +++ b/bigframes/core/compile/sqlglot/compiler.py @@ -19,6 +19,7 @@ import bigframes_vendored.sqlglot.expressions as sge +from bigframes import dtypes from bigframes.core import ( expression, guid, @@ -277,6 +278,24 @@ def compile_explode(node: nodes.ExplodeNode, child: ir.SQLGlotIR) -> ir.SQLGlotI return child.explode(columns, offsets_col) +@_compile_node.register +def compile_fromrange( + node: nodes.FromRangeNode, start: ir.SQLGlotIR, end: ir.SQLGlotIR +) -> ir.SQLGlotIR: + start_col_id = node.start.fields[0].id + end_col_id = node.end.fields[0].id + + start_expr = expression_compiler.expression_compiler.compile_expression( + expression.DerefOp(start_col_id) + ) + end_expr = expression_compiler.expression_compiler.compile_expression( + expression.DerefOp(end_col_id) + ) + step_expr = ir._literal(node.step, dtypes.INT_DTYPE) + + return start.resample(end, node.output_id.sql, start_expr, end_expr, step_expr) + + @_compile_node.register def compile_random_sample( node: nodes.RandomSampleNode, child: ir.SQLGlotIR diff --git a/bigframes/core/compile/sqlglot/sqlglot_ir.py b/bigframes/core/compile/sqlglot/sqlglot_ir.py index efe5e09aff..3cedd04dc5 100644 --- a/bigframes/core/compile/sqlglot/sqlglot_ir.py +++ b/bigframes/core/compile/sqlglot/sqlglot_ir.py @@ -410,6 +410,47 @@ def aggregate( new_expr = new_expr.where(condition, append=False) return SQLGlotIR(expr=new_expr, uid_gen=self.uid_gen) + def resample( + self, + right: SQLGlotIR, + array_col_name: str, + start_expr: sge.Expression, + stop_expr: sge.Expression, + step_expr: sge.Expression, + ) -> SQLGlotIR: + # Get identifier for left and right by pushing them to CTEs + left_select, left_id = self._select_to_cte() + right_select, right_id = right._select_to_cte() + + # Extract all CTEs from the returned select expressions + _, left_ctes = _pop_query_ctes(left_select) + _, right_ctes = _pop_query_ctes(right_select) + merged_ctes = _merge_ctes(left_ctes, right_ctes) + + generate_array = sge.func("GENERATE_ARRAY", start_expr, stop_expr, step_expr) + + unnested_column_alias = sge.to_identifier( + next(self.uid_gen.get_uid_stream("bfcol_")), quoted=self.quoted + ) + unnest_expr = sge.Unnest( + expressions=[generate_array], + alias=sge.TableAlias(columns=[unnested_column_alias]), + ) + + final_col_id = sge.to_identifier(array_col_name, quoted=self.quoted) + + # Build final expression by joining everything directly in a single SELECT + new_expr = ( + sge.Select() + .select(unnested_column_alias.as_(final_col_id)) + .from_(sge.Table(this=left_id)) + .join(sge.Table(this=right_id), join_type="cross") + .join(unnest_expr, join_type="cross") + ) + new_expr = _set_query_ctes(new_expr, merged_ctes) + + return SQLGlotIR(expr=new_expr, uid_gen=self.uid_gen) + def insert( self, destination: bigquery.TableReference, diff --git a/tests/unit/core/compile/sqlglot/snapshots/test_compile_fromrange/test_compile_fromrange/out.sql b/tests/unit/core/compile/sqlglot/snapshots/test_compile_fromrange/test_compile_fromrange/out.sql new file mode 100644 index 0000000000..47455a292b --- /dev/null +++ b/tests/unit/core/compile/sqlglot/snapshots/test_compile_fromrange/test_compile_fromrange/out.sql @@ -0,0 +1,165 @@ +WITH `bfcte_6` AS ( + SELECT + * + FROM UNNEST(ARRAY>[STRUCT(CAST('2021-01-01T13:00:00' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:01' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:02' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:03' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:04' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:05' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:06' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:07' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:08' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:09' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:10' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:11' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:12' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:13' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:14' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:15' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:16' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:17' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:18' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:19' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:20' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:21' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:22' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:23' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:24' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:25' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:26' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:27' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:28' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:29' AS DATETIME))]) +), `bfcte_15` AS ( + SELECT + `bfcol_0` AS `bfcol_1` + FROM `bfcte_6` +), `bfcte_5` AS ( + SELECT + * + FROM UNNEST(ARRAY>[STRUCT(CAST('2021-01-01T13:00:00' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:01' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:02' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:03' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:04' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:05' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:06' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:07' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:08' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:09' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:10' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:11' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:12' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:13' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:14' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:15' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:16' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:17' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:18' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:19' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:20' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:21' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:22' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:23' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:24' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:25' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:26' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:27' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:28' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:29' AS DATETIME))]) +), `bfcte_10` AS ( + SELECT + MIN(`bfcol_2`) AS `bfcol_4` + FROM `bfcte_5` +), `bfcte_16` AS ( + SELECT + * + FROM `bfcte_10` +), `bfcte_19` AS ( + SELECT + * + FROM `bfcte_15` + CROSS JOIN `bfcte_16` +), `bfcte_21` AS ( + SELECT + `bfcol_1`, + `bfcol_4`, + CAST(FLOOR( + IEEE_DIVIDE( + UNIX_MICROS(CAST(`bfcol_1` AS TIMESTAMP)) - UNIX_MICROS(CAST(CAST(`bfcol_4` AS DATE) AS TIMESTAMP)), + 7000000 + ) + ) AS INT64) AS `bfcol_5` + FROM `bfcte_19` +), `bfcte_23` AS ( + SELECT + MIN(`bfcol_5`) AS `bfcol_7` + FROM `bfcte_21` +), `bfcte_24` AS ( + SELECT + * + FROM `bfcte_23` +), `bfcte_4` AS ( + SELECT + * + FROM UNNEST(ARRAY>[STRUCT(CAST('2021-01-01T13:00:00' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:01' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:02' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:03' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:04' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:05' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:06' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:07' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:08' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:09' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:10' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:11' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:12' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:13' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:14' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:15' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:16' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:17' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:18' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:19' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:20' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:21' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:22' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:23' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:24' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:25' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:26' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:27' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:28' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:29' AS DATETIME))]) +), `bfcte_13` AS ( + SELECT + `bfcol_8` AS `bfcol_9` + FROM `bfcte_4` +), `bfcte_3` AS ( + SELECT + * + FROM UNNEST(ARRAY>[STRUCT(0, CAST('2021-01-01T13:00:00' AS DATETIME), 0, 10), STRUCT(1, CAST('2021-01-01T13:00:01' AS DATETIME), 1, 11), STRUCT(2, CAST('2021-01-01T13:00:02' AS DATETIME), 2, 12), STRUCT(3, CAST('2021-01-01T13:00:03' AS DATETIME), 3, 13), STRUCT(4, CAST('2021-01-01T13:00:04' AS DATETIME), 4, 14), STRUCT(5, CAST('2021-01-01T13:00:05' AS DATETIME), 5, 15), STRUCT(6, CAST('2021-01-01T13:00:06' AS DATETIME), 6, 16), STRUCT(7, CAST('2021-01-01T13:00:07' AS DATETIME), 7, 17), STRUCT(8, CAST('2021-01-01T13:00:08' AS DATETIME), 8, 18), STRUCT(9, CAST('2021-01-01T13:00:09' AS DATETIME), 9, 19), STRUCT(10, CAST('2021-01-01T13:00:10' AS DATETIME), 10, 20), STRUCT(11, CAST('2021-01-01T13:00:11' AS DATETIME), 11, 21), STRUCT(12, CAST('2021-01-01T13:00:12' AS DATETIME), 12, 22), STRUCT(13, CAST('2021-01-01T13:00:13' AS DATETIME), 13, 23), STRUCT(14, CAST('2021-01-01T13:00:14' AS DATETIME), 14, 24), STRUCT(15, CAST('2021-01-01T13:00:15' AS DATETIME), 15, 25), STRUCT(16, CAST('2021-01-01T13:00:16' AS DATETIME), 16, 26), STRUCT(17, CAST('2021-01-01T13:00:17' AS DATETIME), 17, 27), STRUCT(18, CAST('2021-01-01T13:00:18' AS DATETIME), 18, 28), STRUCT(19, CAST('2021-01-01T13:00:19' AS DATETIME), 19, 29), STRUCT(20, CAST('2021-01-01T13:00:20' AS DATETIME), 20, 30), STRUCT(21, CAST('2021-01-01T13:00:21' AS DATETIME), 21, 31), STRUCT(22, CAST('2021-01-01T13:00:22' AS DATETIME), 22, 32), STRUCT(23, CAST('2021-01-01T13:00:23' AS DATETIME), 23, 33), STRUCT(24, CAST('2021-01-01T13:00:24' AS DATETIME), 24, 34), STRUCT(25, CAST('2021-01-01T13:00:25' AS DATETIME), 25, 35), STRUCT(26, CAST('2021-01-01T13:00:26' AS DATETIME), 26, 36), STRUCT(27, CAST('2021-01-01T13:00:27' AS DATETIME), 27, 37), STRUCT(28, CAST('2021-01-01T13:00:28' AS DATETIME), 28, 38), STRUCT(29, CAST('2021-01-01T13:00:29' AS DATETIME), 29, 39)]) +), `bfcte_9` AS ( + SELECT + MIN(`bfcol_11`) AS `bfcol_37` + FROM `bfcte_3` +), `bfcte_14` AS ( + SELECT + * + FROM `bfcte_9` +), `bfcte_18` AS ( + SELECT + * + FROM `bfcte_13` + CROSS JOIN `bfcte_14` +), `bfcte_20` AS ( + SELECT + `bfcol_9`, + `bfcol_37`, + CAST(FLOOR( + IEEE_DIVIDE( + UNIX_MICROS(CAST(`bfcol_9` AS TIMESTAMP)) - UNIX_MICROS(CAST(CAST(`bfcol_37` AS DATE) AS TIMESTAMP)), + 7000000 + ) + ) AS INT64) AS `bfcol_38` + FROM `bfcte_18` +), `bfcte_22` AS ( + SELECT + MAX(`bfcol_38`) AS `bfcol_40` + FROM `bfcte_20` +), `bfcte_25` AS ( + SELECT + * + FROM `bfcte_22` +), `bfcte_26` AS ( + SELECT + `bfcol_67` AS `bfcol_41` + FROM `bfcte_24` + CROSS JOIN `bfcte_25` + CROSS JOIN UNNEST(GENERATE_ARRAY(`bfcol_7`, `bfcol_40`, 1)) AS `bfcol_67` +), `bfcte_2` AS ( + SELECT + * + FROM UNNEST(ARRAY>[STRUCT(CAST('2021-01-01T13:00:00' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:01' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:02' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:03' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:04' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:05' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:06' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:07' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:08' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:09' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:10' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:11' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:12' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:13' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:14' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:15' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:16' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:17' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:18' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:19' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:20' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:21' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:22' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:23' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:24' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:25' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:26' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:27' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:28' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:29' AS DATETIME))]) +), `bfcte_8` AS ( + SELECT + MIN(`bfcol_42`) AS `bfcol_44` + FROM `bfcte_2` +), `bfcte_27` AS ( + SELECT + * + FROM `bfcte_8` +), `bfcte_28` AS ( + SELECT + * + FROM `bfcte_26` + CROSS JOIN `bfcte_27` +), `bfcte_1` AS ( + SELECT + * + FROM UNNEST(ARRAY>[STRUCT(CAST('2021-01-01T13:00:00' AS DATETIME), 0, 10), STRUCT(CAST('2021-01-01T13:00:01' AS DATETIME), 1, 11), STRUCT(CAST('2021-01-01T13:00:02' AS DATETIME), 2, 12), STRUCT(CAST('2021-01-01T13:00:03' AS DATETIME), 3, 13), STRUCT(CAST('2021-01-01T13:00:04' AS DATETIME), 4, 14), STRUCT(CAST('2021-01-01T13:00:05' AS DATETIME), 5, 15), STRUCT(CAST('2021-01-01T13:00:06' AS DATETIME), 6, 16), STRUCT(CAST('2021-01-01T13:00:07' AS DATETIME), 7, 17), STRUCT(CAST('2021-01-01T13:00:08' AS DATETIME), 8, 18), STRUCT(CAST('2021-01-01T13:00:09' AS DATETIME), 9, 19), STRUCT(CAST('2021-01-01T13:00:10' AS DATETIME), 10, 20), STRUCT(CAST('2021-01-01T13:00:11' AS DATETIME), 11, 21), STRUCT(CAST('2021-01-01T13:00:12' AS DATETIME), 12, 22), STRUCT(CAST('2021-01-01T13:00:13' AS DATETIME), 13, 23), STRUCT(CAST('2021-01-01T13:00:14' AS DATETIME), 14, 24), STRUCT(CAST('2021-01-01T13:00:15' AS DATETIME), 15, 25), STRUCT(CAST('2021-01-01T13:00:16' AS DATETIME), 16, 26), STRUCT(CAST('2021-01-01T13:00:17' AS DATETIME), 17, 27), STRUCT(CAST('2021-01-01T13:00:18' AS DATETIME), 18, 28), STRUCT(CAST('2021-01-01T13:00:19' AS DATETIME), 19, 29), STRUCT(CAST('2021-01-01T13:00:20' AS DATETIME), 20, 30), STRUCT(CAST('2021-01-01T13:00:21' AS DATETIME), 21, 31), STRUCT(CAST('2021-01-01T13:00:22' AS DATETIME), 22, 32), STRUCT(CAST('2021-01-01T13:00:23' AS DATETIME), 23, 33), STRUCT(CAST('2021-01-01T13:00:24' AS DATETIME), 24, 34), STRUCT(CAST('2021-01-01T13:00:25' AS DATETIME), 25, 35), STRUCT(CAST('2021-01-01T13:00:26' AS DATETIME), 26, 36), STRUCT(CAST('2021-01-01T13:00:27' AS DATETIME), 27, 37), STRUCT(CAST('2021-01-01T13:00:28' AS DATETIME), 28, 38), STRUCT(CAST('2021-01-01T13:00:29' AS DATETIME), 29, 39)]) +), `bfcte_11` AS ( + SELECT + `bfcol_45` AS `bfcol_48`, + `bfcol_46` AS `bfcol_49`, + `bfcol_47` AS `bfcol_50` + FROM `bfcte_1` +), `bfcte_0` AS ( + SELECT + * + FROM UNNEST(ARRAY>[STRUCT(CAST('2021-01-01T13:00:00' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:01' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:02' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:03' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:04' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:05' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:06' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:07' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:08' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:09' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:10' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:11' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:12' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:13' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:14' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:15' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:16' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:17' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:18' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:19' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:20' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:21' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:22' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:23' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:24' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:25' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:26' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:27' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:28' AS DATETIME)), STRUCT(CAST('2021-01-01T13:00:29' AS DATETIME))]) +), `bfcte_7` AS ( + SELECT + MIN(`bfcol_51`) AS `bfcol_53` + FROM `bfcte_0` +), `bfcte_12` AS ( + SELECT + * + FROM `bfcte_7` +), `bfcte_17` AS ( + SELECT + * + FROM `bfcte_11` + CROSS JOIN `bfcte_12` +), `bfcte_29` AS ( + SELECT + `bfcol_49` AS `bfcol_55`, + `bfcol_50` AS `bfcol_56`, + CAST(FLOOR( + IEEE_DIVIDE( + UNIX_MICROS(CAST(`bfcol_48` AS TIMESTAMP)) - UNIX_MICROS(CAST(CAST(`bfcol_53` AS DATE) AS TIMESTAMP)), + 7000000 + ) + ) AS INT64) AS `bfcol_57` + FROM `bfcte_17` +), `bfcte_30` AS ( + SELECT + * + FROM `bfcte_28` + LEFT JOIN `bfcte_29` + ON `bfcol_41` = `bfcol_57` +) +SELECT + CAST(TIMESTAMP_MICROS( + CAST(CAST(`bfcol_41` AS BIGNUMERIC) * 7000000 + CAST(UNIX_MICROS(CAST(CAST(`bfcol_44` AS DATE) AS TIMESTAMP)) AS BIGNUMERIC) AS INT64) + ) AS DATETIME) AS `bigframes_unnamed_index`, + `bfcol_55` AS `int64_col`, + `bfcol_56` AS `int64_too` +FROM `bfcte_30` +ORDER BY + `bfcol_41` ASC NULLS LAST \ No newline at end of file diff --git a/tests/unit/core/compile/sqlglot/test_compile_fromrange.py b/tests/unit/core/compile/sqlglot/test_compile_fromrange.py new file mode 100644 index 0000000000..ba2e207551 --- /dev/null +++ b/tests/unit/core/compile/sqlglot/test_compile_fromrange.py @@ -0,0 +1,35 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pandas as pd +import pytest + +import bigframes.pandas as bpd + +pytest.importorskip("pytest_snapshot") + + +def test_compile_fromrange(compiler_session, snapshot): + data = { + "timestamp_col": pd.date_range( + start="2021-01-01 13:00:00", periods=30, freq="1s" + ), + "int64_col": range(30), + "int64_too": range(10, 40), + } + df = bpd.DataFrame(data, session=compiler_session).set_index("timestamp_col") + sql, _, _ = df.resample(rule="7s")._block.to_sql_query( + include_index=True, enable_cache=False + ) + snapshot.assert_match(sql, "out.sql")