Skip to content

Commit 36261f5

Browse files
authored
refactor: migrate compile_random_sample for sqlglot (#2454)
Fixes internal issue 427767336 🦕
1 parent 342fa72 commit 36261f5

File tree

4 files changed

+260
-0
lines changed

4 files changed

+260
-0
lines changed

bigframes/core/compile/sqlglot/compiler.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import bigframes_vendored.sqlglot.expressions as sge
2121

22+
from bigframes import dtypes
2223
from bigframes.core import (
2324
expression,
2425
guid,
@@ -277,6 +278,24 @@ def compile_explode(node: nodes.ExplodeNode, child: ir.SQLGlotIR) -> ir.SQLGlotI
277278
return child.explode(columns, offsets_col)
278279

279280

281+
@_compile_node.register
282+
def compile_fromrange(
283+
node: nodes.FromRangeNode, start: ir.SQLGlotIR, end: ir.SQLGlotIR
284+
) -> ir.SQLGlotIR:
285+
start_col_id = node.start.fields[0].id
286+
end_col_id = node.end.fields[0].id
287+
288+
start_expr = expression_compiler.expression_compiler.compile_expression(
289+
expression.DerefOp(start_col_id)
290+
)
291+
end_expr = expression_compiler.expression_compiler.compile_expression(
292+
expression.DerefOp(end_col_id)
293+
)
294+
step_expr = ir._literal(node.step, dtypes.INT_DTYPE)
295+
296+
return start.resample(end, node.output_id.sql, start_expr, end_expr, step_expr)
297+
298+
280299
@_compile_node.register
281300
def compile_random_sample(
282301
node: nodes.RandomSampleNode, child: ir.SQLGlotIR

bigframes/core/compile/sqlglot/sqlglot_ir.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,47 @@ def aggregate(
410410
new_expr = new_expr.where(condition, append=False)
411411
return SQLGlotIR(expr=new_expr, uid_gen=self.uid_gen)
412412

413+
def resample(
414+
self,
415+
right: SQLGlotIR,
416+
array_col_name: str,
417+
start_expr: sge.Expression,
418+
stop_expr: sge.Expression,
419+
step_expr: sge.Expression,
420+
) -> SQLGlotIR:
421+
# Get identifier for left and right by pushing them to CTEs
422+
left_select, left_id = self._select_to_cte()
423+
right_select, right_id = right._select_to_cte()
424+
425+
# Extract all CTEs from the returned select expressions
426+
_, left_ctes = _pop_query_ctes(left_select)
427+
_, right_ctes = _pop_query_ctes(right_select)
428+
merged_ctes = _merge_ctes(left_ctes, right_ctes)
429+
430+
generate_array = sge.func("GENERATE_ARRAY", start_expr, stop_expr, step_expr)
431+
432+
unnested_column_alias = sge.to_identifier(
433+
next(self.uid_gen.get_uid_stream("bfcol_")), quoted=self.quoted
434+
)
435+
unnest_expr = sge.Unnest(
436+
expressions=[generate_array],
437+
alias=sge.TableAlias(columns=[unnested_column_alias]),
438+
)
439+
440+
final_col_id = sge.to_identifier(array_col_name, quoted=self.quoted)
441+
442+
# Build final expression by joining everything directly in a single SELECT
443+
new_expr = (
444+
sge.Select()
445+
.select(unnested_column_alias.as_(final_col_id))
446+
.from_(sge.Table(this=left_id))
447+
.join(sge.Table(this=right_id), join_type="cross")
448+
.join(unnest_expr, join_type="cross")
449+
)
450+
new_expr = _set_query_ctes(new_expr, merged_ctes)
451+
452+
return SQLGlotIR(expr=new_expr, uid_gen=self.uid_gen)
453+
413454
def insert(
414455
self,
415456
destination: bigquery.TableReference,
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
WITH `bfcte_6` AS (
2+
SELECT
3+
*
4+
FROM UNNEST(ARRAY<STRUCT<`bfcol_0` DATETIME>>[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))])
5+
), `bfcte_15` AS (
6+
SELECT
7+
`bfcol_0` AS `bfcol_1`
8+
FROM `bfcte_6`
9+
), `bfcte_5` AS (
10+
SELECT
11+
*
12+
FROM UNNEST(ARRAY<STRUCT<`bfcol_2` DATETIME>>[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))])
13+
), `bfcte_10` AS (
14+
SELECT
15+
MIN(`bfcol_2`) AS `bfcol_4`
16+
FROM `bfcte_5`
17+
), `bfcte_16` AS (
18+
SELECT
19+
*
20+
FROM `bfcte_10`
21+
), `bfcte_19` AS (
22+
SELECT
23+
*
24+
FROM `bfcte_15`
25+
CROSS JOIN `bfcte_16`
26+
), `bfcte_21` AS (
27+
SELECT
28+
`bfcol_1`,
29+
`bfcol_4`,
30+
CAST(FLOOR(
31+
IEEE_DIVIDE(
32+
UNIX_MICROS(CAST(`bfcol_1` AS TIMESTAMP)) - UNIX_MICROS(CAST(CAST(`bfcol_4` AS DATE) AS TIMESTAMP)),
33+
7000000
34+
)
35+
) AS INT64) AS `bfcol_5`
36+
FROM `bfcte_19`
37+
), `bfcte_23` AS (
38+
SELECT
39+
MIN(`bfcol_5`) AS `bfcol_7`
40+
FROM `bfcte_21`
41+
), `bfcte_24` AS (
42+
SELECT
43+
*
44+
FROM `bfcte_23`
45+
), `bfcte_4` AS (
46+
SELECT
47+
*
48+
FROM UNNEST(ARRAY<STRUCT<`bfcol_8` DATETIME>>[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))])
49+
), `bfcte_13` AS (
50+
SELECT
51+
`bfcol_8` AS `bfcol_9`
52+
FROM `bfcte_4`
53+
), `bfcte_3` AS (
54+
SELECT
55+
*
56+
FROM UNNEST(ARRAY<STRUCT<`bfcol_10` INT64, `bfcol_11` DATETIME, `bfcol_12` INT64, `bfcol_13` INT64>>[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)])
57+
), `bfcte_9` AS (
58+
SELECT
59+
MIN(`bfcol_11`) AS `bfcol_37`
60+
FROM `bfcte_3`
61+
), `bfcte_14` AS (
62+
SELECT
63+
*
64+
FROM `bfcte_9`
65+
), `bfcte_18` AS (
66+
SELECT
67+
*
68+
FROM `bfcte_13`
69+
CROSS JOIN `bfcte_14`
70+
), `bfcte_20` AS (
71+
SELECT
72+
`bfcol_9`,
73+
`bfcol_37`,
74+
CAST(FLOOR(
75+
IEEE_DIVIDE(
76+
UNIX_MICROS(CAST(`bfcol_9` AS TIMESTAMP)) - UNIX_MICROS(CAST(CAST(`bfcol_37` AS DATE) AS TIMESTAMP)),
77+
7000000
78+
)
79+
) AS INT64) AS `bfcol_38`
80+
FROM `bfcte_18`
81+
), `bfcte_22` AS (
82+
SELECT
83+
MAX(`bfcol_38`) AS `bfcol_40`
84+
FROM `bfcte_20`
85+
), `bfcte_25` AS (
86+
SELECT
87+
*
88+
FROM `bfcte_22`
89+
), `bfcte_26` AS (
90+
SELECT
91+
`bfcol_67` AS `bfcol_41`
92+
FROM `bfcte_24`
93+
CROSS JOIN `bfcte_25`
94+
CROSS JOIN UNNEST(GENERATE_ARRAY(`bfcol_7`, `bfcol_40`, 1)) AS `bfcol_67`
95+
), `bfcte_2` AS (
96+
SELECT
97+
*
98+
FROM UNNEST(ARRAY<STRUCT<`bfcol_42` DATETIME>>[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))])
99+
), `bfcte_8` AS (
100+
SELECT
101+
MIN(`bfcol_42`) AS `bfcol_44`
102+
FROM `bfcte_2`
103+
), `bfcte_27` AS (
104+
SELECT
105+
*
106+
FROM `bfcte_8`
107+
), `bfcte_28` AS (
108+
SELECT
109+
*
110+
FROM `bfcte_26`
111+
CROSS JOIN `bfcte_27`
112+
), `bfcte_1` AS (
113+
SELECT
114+
*
115+
FROM UNNEST(ARRAY<STRUCT<`bfcol_45` DATETIME, `bfcol_46` INT64, `bfcol_47` INT64>>[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)])
116+
), `bfcte_11` AS (
117+
SELECT
118+
`bfcol_45` AS `bfcol_48`,
119+
`bfcol_46` AS `bfcol_49`,
120+
`bfcol_47` AS `bfcol_50`
121+
FROM `bfcte_1`
122+
), `bfcte_0` AS (
123+
SELECT
124+
*
125+
FROM UNNEST(ARRAY<STRUCT<`bfcol_51` DATETIME>>[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))])
126+
), `bfcte_7` AS (
127+
SELECT
128+
MIN(`bfcol_51`) AS `bfcol_53`
129+
FROM `bfcte_0`
130+
), `bfcte_12` AS (
131+
SELECT
132+
*
133+
FROM `bfcte_7`
134+
), `bfcte_17` AS (
135+
SELECT
136+
*
137+
FROM `bfcte_11`
138+
CROSS JOIN `bfcte_12`
139+
), `bfcte_29` AS (
140+
SELECT
141+
`bfcol_49` AS `bfcol_55`,
142+
`bfcol_50` AS `bfcol_56`,
143+
CAST(FLOOR(
144+
IEEE_DIVIDE(
145+
UNIX_MICROS(CAST(`bfcol_48` AS TIMESTAMP)) - UNIX_MICROS(CAST(CAST(`bfcol_53` AS DATE) AS TIMESTAMP)),
146+
7000000
147+
)
148+
) AS INT64) AS `bfcol_57`
149+
FROM `bfcte_17`
150+
), `bfcte_30` AS (
151+
SELECT
152+
*
153+
FROM `bfcte_28`
154+
LEFT JOIN `bfcte_29`
155+
ON `bfcol_41` = `bfcol_57`
156+
)
157+
SELECT
158+
CAST(TIMESTAMP_MICROS(
159+
CAST(CAST(`bfcol_41` AS BIGNUMERIC) * 7000000 + CAST(UNIX_MICROS(CAST(CAST(`bfcol_44` AS DATE) AS TIMESTAMP)) AS BIGNUMERIC) AS INT64)
160+
) AS DATETIME) AS `bigframes_unnamed_index`,
161+
`bfcol_55` AS `int64_col`,
162+
`bfcol_56` AS `int64_too`
163+
FROM `bfcte_30`
164+
ORDER BY
165+
`bfcol_41` ASC NULLS LAST
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Copyright 2025 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
import pandas as pd
16+
import pytest
17+
18+
import bigframes.pandas as bpd
19+
20+
pytest.importorskip("pytest_snapshot")
21+
22+
23+
def test_compile_fromrange(compiler_session, snapshot):
24+
data = {
25+
"timestamp_col": pd.date_range(
26+
start="2021-01-01 13:00:00", periods=30, freq="1s"
27+
),
28+
"int64_col": range(30),
29+
"int64_too": range(10, 40),
30+
}
31+
df = bpd.DataFrame(data, session=compiler_session).set_index("timestamp_col")
32+
sql, _, _ = df.resample(rule="7s")._block.to_sql_query(
33+
include_index=True, enable_cache=False
34+
)
35+
snapshot.assert_match(sql, "out.sql")

0 commit comments

Comments
 (0)