1- # Copyright 2025 Google LLC
1+ # Copyright 2026 Google LLC
22#
33# Licensed under the Apache License, Version 2.0 (the "License");
44# you may not use this file except in compliance with the License.
2727import bigframes .core .rewrite
2828
2929
30- def _limit (select : sql_nodes .SelectNode , limit : int ) -> sql_nodes .SelectNode :
30+ def _limit (select : sql_nodes .SqlSelectNode , limit : int ) -> sql_nodes .SqlSelectNode :
3131 new_limit = limit if select .limit is None else min ([select .limit , limit ])
3232 return dataclasses .replace (select , limit = new_limit )
3333
3434
3535def _try_sort (
36- select : sql_nodes .SelectNode , sort_by : Sequence [ordering .OrderingExpression ]
37- ) -> Optional [sql_nodes .SelectNode ]:
36+ select : sql_nodes .SqlSelectNode , sort_by : Sequence [ordering .OrderingExpression ]
37+ ) -> Optional [sql_nodes .SqlSelectNode ]:
3838 new_order_exprs = []
3939 for sort_expr in sort_by :
4040 new_expr = _try_bind (
@@ -50,8 +50,8 @@ def _try_sort(
5050
5151def _sort (
5252 node : nodes .BigFrameNode , sort_by : Sequence [ordering .OrderingExpression ]
53- ) -> sql_nodes .SelectNode :
54- if isinstance (node , sql_nodes .SelectNode ):
53+ ) -> sql_nodes .SqlSelectNode :
54+ if isinstance (node , sql_nodes .SqlSelectNode ):
5555 merged = _try_sort (node , sort_by )
5656 if merged :
5757 return merged
@@ -73,8 +73,8 @@ def _try_bind(
7373
7474
7575def _try_add_cdefs (
76- select : sql_nodes .SelectNode , cdefs : Sequence [nodes .ColumnDef ]
77- ) -> Optional [sql_nodes .SelectNode ]:
76+ select : sql_nodes .SqlSelectNode , cdefs : Sequence [nodes .ColumnDef ]
77+ ) -> Optional [sql_nodes .SqlSelectNode ]:
7878 # TODO: add up complexity measure while inlining refs
7979 new_defs = []
8080 for cdef in cdefs :
@@ -91,8 +91,8 @@ def _try_add_cdefs(
9191
9292def _add_cdefs (
9393 node : nodes .BigFrameNode , cdefs : Sequence [nodes .ColumnDef ]
94- ) -> sql_nodes .SelectNode :
95- if isinstance (node , sql_nodes .SelectNode ):
94+ ) -> sql_nodes .SqlSelectNode :
95+ if isinstance (node , sql_nodes .SqlSelectNode ):
9696 merged = _try_add_cdefs (node , cdefs )
9797 if merged :
9898 return merged
@@ -103,8 +103,8 @@ def _add_cdefs(
103103
104104
105105def _try_add_filter (
106- select : sql_nodes .SelectNode , predicates : Sequence [expression .Expression ]
107- ) -> Optional [sql_nodes .SelectNode ]:
106+ select : sql_nodes .SqlSelectNode , predicates : Sequence [expression .Expression ]
107+ ) -> Optional [sql_nodes .SqlSelectNode ]:
108108 # Constraint: filters can only be merged if they are scalar expression after binding
109109 new_predicates = []
110110 # bind variables, merge predicates
@@ -118,8 +118,8 @@ def _try_add_filter(
118118
119119def _add_filter (
120120 node : nodes .BigFrameNode , predicates : Sequence [expression .Expression ]
121- ) -> sql_nodes .SelectNode :
122- if isinstance (node , sql_nodes .SelectNode ):
121+ ) -> sql_nodes .SqlSelectNode :
122+ if isinstance (node , sql_nodes .SqlSelectNode ):
123123 result = _try_add_filter (node , predicates )
124124 if result :
125125 return result
@@ -128,8 +128,8 @@ def _add_filter(
128128 return new_node
129129
130130
131- def _create_noop_select (node : nodes .BigFrameNode ) -> sql_nodes .SelectNode :
132- return sql_nodes .SelectNode (
131+ def _create_noop_select (node : nodes .BigFrameNode ) -> sql_nodes .SqlSelectNode :
132+ return sql_nodes .SqlSelectNode (
133133 node ,
134134 selections = tuple (
135135 nodes .ColumnDef (expression .ResolvedDerefOp .from_field (field ), field .id )
@@ -139,7 +139,7 @@ def _create_noop_select(node: nodes.BigFrameNode) -> sql_nodes.SelectNode:
139139
140140
141141def _try_remap_select_cols (
142- select : sql_nodes .SelectNode , cols : Sequence [nodes .AliasedRef ]
142+ select : sql_nodes .SqlSelectNode , cols : Sequence [nodes .AliasedRef ]
143143):
144144 new_defs = []
145145 for aliased_ref in cols :
@@ -151,7 +151,7 @@ def _try_remap_select_cols(
151151
152152
153153def _remap_select_cols (node : nodes .BigFrameNode , cols : Sequence [nodes .AliasedRef ]):
154- if isinstance (node , sql_nodes .SelectNode ):
154+ if isinstance (node , sql_nodes .SqlSelectNode ):
155155 result = _try_remap_select_cols (node , cols )
156156 if result :
157157 return result
@@ -183,7 +183,14 @@ def _get_added_cdefs(node: Union[nodes.ProjectionNode, nodes.WindowOpNode]):
183183
184184def _as_sql_node (node : nodes .BigFrameNode ) -> nodes .BigFrameNode :
185185 # case one, can be converted to select
186- if isinstance (node , (nodes .ProjectionNode , nodes .WindowOpNode )):
186+ if isinstance (node , nodes .ReadTableNode ):
187+ leaf = sql_nodes .SqlDataSource (source = node .source )
188+ mappings = [
189+ nodes .AliasedRef (expression .deref (scan_item .source_id ), scan_item .id )
190+ for scan_item in node .scan_list .items
191+ ]
192+ return _remap_select_cols (leaf , mappings )
193+ elif isinstance (node , (nodes .ProjectionNode , nodes .WindowOpNode )):
187194 cdefs = _get_added_cdefs (node )
188195 return _add_cdefs (node .child , cdefs )
189196 elif isinstance (node , (nodes .SelectionNode )):
0 commit comments