1414
1515from __future__ import annotations
1616
17- import abc
1817import dataclasses
1918import datetime
2019import functools
3938 to_wkt = dumps
4039
4140
42- class SelectableFragment (abc .ABC ):
43- """
44- Represent a grammar fragment that can be converted to a SELECT or FROM item.
45- """
46-
47- def as_select_all (self ) -> sge .Select :
48- ...
49-
50- def select (self , * items : sge .Expression ) -> sge .Select :
51- ...
52-
53- def as_from_item (self ) -> sge .FromItem :
54- ...
55-
56-
57- class SelectFragment (SelectableFragment ):
41+ class SelectFragment :
5842 def __init__ (self , select_expr : sge .Select ):
5943 self .select_expr = select_expr
6044
@@ -64,11 +48,11 @@ def as_select_all(self) -> sge.Select:
6448 def select (self , * items : sge .Expression ) -> sge .Select :
6549 return sge .Select ().select (* items ).from_ (self .select_expr .subquery ())
6650
67- def as_from_item (self ) -> sge .FromItem :
51+ def as_from_item (self ) -> sge .Expression :
6852 return self .select_expr .subquery ()
6953
7054
71- class TableFragment ( SelectableFragment ) :
55+ class TableFragment :
7256 def __init__ (self , table : sge .Table | sge .Unnest ):
7357 self .table = table
7458
@@ -78,11 +62,11 @@ def as_select_all(self) -> sge.Select:
7862 def select (self , * items : sge .Expression ) -> sge .Select :
7963 return sge .Select ().select (* items ).from_ (self .table )
8064
81- def as_from_item (self ) -> sge .FromItem :
65+ def as_from_item (self ) -> sge .Expression :
8266 return self .table
8367
8468
85- class DeferredSelectFragment ( SelectableFragment ) :
69+ class DeferredSelectFragment :
8670 def __init__ (self , select_supplier : typing .Callable [[sge .Select ], sge .Select ]):
8771 self .select_supplier = select_supplier
8872
@@ -92,23 +76,23 @@ def as_select_all(self) -> sge.Select:
9276 def select (self , * items : sge .Expression ) -> sge .Select :
9377 return self .select_supplier (sge .Select ().select (* items ))
9478
95- def as_from_item (self ) -> sge .FromItem :
79+ def as_from_item (self ) -> sge .Expression :
9680 return self .select_supplier (sge .Select ().select (sge .Star ())).subquery ()
9781
9882
83+ ExprT = SelectFragment | TableFragment | DeferredSelectFragment
84+
85+
9986@dataclasses .dataclass (frozen = True )
10087class SQLGlotIR :
10188 """Helper class to build SQLGlot Query and generate SQL string."""
10289
103- expr : SelectableFragment
90+ expr : ExprT
10491 """The SQLGlot expression representing the query."""
10592
10693 uid_gen : guid .SequentialUIDGenerator = guid .SequentialUIDGenerator ()
10794 """Generator for unique identifiers."""
10895
109- def __post_init__ (self ):
110- assert isinstance (self .expr , SelectableFragment )
111-
11296 @property
11397 def sql (self ) -> str :
11498 """Generate SQL string from the given expression."""
0 commit comments