Skip to content

Commit 0562a37

Browse files
test: Add unit tests for SequentialUIDGenerator (#1813)
This commit introduces unit tests for the `get_uid_stream` method in the `SequentialUIDGenerator` class. Fixes internal issue 416487613 Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
1 parent f6265db commit 0562a37

File tree

4 files changed

+49
-6
lines changed

4 files changed

+49
-6
lines changed

bigframes/core/compile/sqlglot/compiler.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ def compile_readtable(self, node: nodes.ReadTableNode, *args):
167167
table.table_id,
168168
col_names=[col.source_id for col in node.scan_list.items],
169169
alias_names=[col.id.sql for col in node.scan_list.items],
170+
uid_gen=self.uid_gen,
170171
)
171172

172173
@_compile_node.register

bigframes/core/compile/sqlglot/sqlglot_ir.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ def from_table(
114114
table_id: str,
115115
col_names: typing.Sequence[str],
116116
alias_names: typing.Sequence[str],
117+
uid_gen: guid.SequentialUIDGenerator,
117118
) -> SQLGlotIR:
118119
selections = [
119120
sge.Alias(
@@ -128,7 +129,7 @@ def from_table(
128129
catalog=sg.to_identifier(project_id, quoted=cls.quoted),
129130
)
130131
select_expr = sge.Select().select(*selections).from_(table_expr)
131-
return cls(expr=select_expr)
132+
return cls(expr=select_expr, uid_gen=uid_gen)
132133

133134
@classmethod
134135
def from_query_string(
@@ -164,10 +165,10 @@ def select(
164165
squashed_selections = _squash_selections(self.expr.expressions, selections)
165166
if squashed_selections != []:
166167
new_expr = self.expr.select(*squashed_selections, append=False)
167-
return SQLGlotIR(expr=new_expr)
168+
return SQLGlotIR(expr=new_expr, uid_gen=self.uid_gen)
168169
else:
169170
new_expr = self._encapsulate_as_cte().select(*selections, append=False)
170-
return SQLGlotIR(expr=new_expr)
171+
return SQLGlotIR(expr=new_expr, uid_gen=self.uid_gen)
171172

172173
def project(
173174
self,
@@ -181,7 +182,7 @@ def project(
181182
for id, expr in projected_cols
182183
]
183184
new_expr = self._encapsulate_as_cte().select(*projected_cols_expr, append=False)
184-
return SQLGlotIR(expr=new_expr)
185+
return SQLGlotIR(expr=new_expr, uid_gen=self.uid_gen)
185186

186187
def insert(
187188
self,

tests/unit/core/compile/sqlglot/snapshots/test_compile_readtable/test_compile_readtable/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
WITH `bfcte_2` AS (
1+
WITH `bfcte_0` AS (
22
SELECT
33
`rowindex` AS `bfcol_0`,
44
`int64_col` AS `bfcol_1`,
@@ -13,4 +13,4 @@ SELECT
1313
`bfcol_2` AS `string_col`,
1414
`bfcol_3` AS `float64_col`,
1515
`bfcol_4` AS `bool_col`
16-
FROM `bfcte_2`
16+
FROM `bfcte_0`

tests/unit/core/test_guid.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import types
2+
import unittest
3+
4+
from bigframes.core.guid import SequentialUIDGenerator
5+
6+
7+
class TestSequentialUIDGenerator(unittest.TestCase):
8+
def test_get_uid_stream_returns_generator(self):
9+
generator = SequentialUIDGenerator()
10+
stream = generator.get_uid_stream("prefix")
11+
self.assertIsInstance(stream, types.GeneratorType)
12+
13+
def test_generator_yields_correct_uids(self):
14+
generator = SequentialUIDGenerator()
15+
stream = generator.get_uid_stream("prefix")
16+
self.assertEqual(next(stream), "prefix0")
17+
self.assertEqual(next(stream), "prefix1")
18+
self.assertEqual(next(stream), "prefix2")
19+
20+
def test_generator_yields_different_uids_for_different_prefixes(self):
21+
generator = SequentialUIDGenerator()
22+
stream_a = generator.get_uid_stream("prefixA")
23+
stream_b = generator.get_uid_stream("prefixB")
24+
self.assertEqual(next(stream_a), "prefixA0")
25+
self.assertEqual(next(stream_b), "prefixB0")
26+
self.assertEqual(next(stream_a), "prefixA1")
27+
self.assertEqual(next(stream_b), "prefixB1")
28+
29+
def test_multiple_calls_continue_generation(self):
30+
generator = SequentialUIDGenerator()
31+
stream1 = generator.get_uid_stream("prefix")
32+
self.assertEqual(next(stream1), "prefix0")
33+
self.assertEqual(next(stream1), "prefix1")
34+
35+
stream2 = generator.get_uid_stream("prefix")
36+
self.assertEqual(next(stream2), "prefix2")
37+
self.assertEqual(next(stream2), "prefix3")
38+
39+
40+
if __name__ == "__main__":
41+
unittest.main()

0 commit comments

Comments
 (0)