11use crate :: plan:: {
22 AliasedExpr , Cte , Expr , Filter , From , MemberExpression , OrderBy , Schema , Select ,
3+ SingleAliasedSource , SingleSource ,
34} ;
5+
6+ use crate :: planner:: sql_evaluator:: sql_nodes:: SqlNodesFactory ;
7+ use crate :: planner:: sql_evaluator:: symbols:: MemberSymbol ;
48use crate :: planner:: { BaseMember , VisitorContext } ;
9+ use std:: collections:: HashMap ;
510use std:: rc:: Rc ;
611
712pub struct SelectBuilder {
@@ -11,16 +16,17 @@ pub struct SelectBuilder {
1116 group_by : Vec < Expr > ,
1217 having : Option < Filter > ,
1318 order_by : Vec < OrderBy > ,
14- context : Rc < VisitorContext > ,
19+ nodes_factory : SqlNodesFactory ,
1520 ctes : Vec < Rc < Cte > > ,
1621 is_distinct : bool ,
1722 limit : Option < usize > ,
1823 offset : Option < usize > ,
1924 input_schema : Rc < Schema > ,
25+ result_schema : Schema ,
2026}
2127
2228impl SelectBuilder {
23- pub fn new ( from : From , context : VisitorContext ) -> Self {
29+ pub fn new ( from : From , nodes_factory : SqlNodesFactory ) -> Self {
2430 let input_schema = from. schema . clone ( ) ;
2531 Self {
2632 projection_columns : vec ! [ ] ,
@@ -29,12 +35,13 @@ impl SelectBuilder {
2935 group_by : vec ! [ ] ,
3036 having : None ,
3137 order_by : vec ! [ ] ,
32- context : Rc :: new ( context ) ,
38+ nodes_factory ,
3339 ctes : vec ! [ ] ,
3440 is_distinct : false ,
3541 limit : None ,
3642 offset : None ,
3743 input_schema,
44+ result_schema : Schema :: empty ( ) ,
3845 }
3946 }
4047
@@ -54,6 +61,7 @@ impl SelectBuilder {
5461 expr,
5562 alias : alias. clone ( ) ,
5663 } ;
64+ self . resolve_render_reference_for_member ( & member. member_evaluator ( ) ) ;
5765
5866 self . projection_columns . push ( aliased_expr) ;
5967 }
@@ -85,19 +93,73 @@ impl SelectBuilder {
8593 pub fn set_offset ( & mut self , offset : Option < usize > ) {
8694 self . offset = offset;
8795 }
96+
8897 pub fn set_ctes ( & mut self , ctes : Vec < Rc < Cte > > ) {
8998 self . ctes = ctes;
9099 }
91100
92- pub fn build ( self ) -> Select {
101+ fn resolve_render_reference_for_member ( & mut self , member : & Rc < MemberSymbol > ) {
102+ let member_name = member. full_name ( ) ;
103+ if !self
104+ . nodes_factory
105+ . render_references ( )
106+ . contains_key ( & member_name)
107+ {
108+ if let Some ( reference) = self
109+ . input_schema
110+ . resolve_member_reference ( & member_name, & None )
111+ {
112+ self . nodes_factory
113+ . add_render_reference ( member_name, reference) ;
114+ } else {
115+ for dep in member. get_dependencies ( ) {
116+ self . resolve_render_reference_for_member ( & dep) ;
117+ }
118+ }
119+ }
120+ }
121+
122+ fn make_cube_references ( & self ) -> HashMap < String , String > {
123+ let mut refs = HashMap :: new ( ) ;
124+ match & self . from . source {
125+ crate :: plan:: FromSource :: Single ( source) => {
126+ self . add_cube_reference_if_needed ( source, & mut refs)
127+ }
128+ crate :: plan:: FromSource :: Join ( join) => {
129+ self . add_cube_reference_if_needed ( & join. root , & mut refs) ;
130+ for join_item in join. joins . iter ( ) {
131+ self . add_cube_reference_if_needed ( & join_item. from , & mut refs) ;
132+ }
133+ }
134+ crate :: plan:: FromSource :: Empty => { }
135+ }
136+ refs
137+ }
138+
139+ fn add_cube_reference_if_needed (
140+ & self ,
141+ source : & SingleAliasedSource ,
142+ refs : & mut HashMap < String , String > ,
143+ ) {
144+ match & source. source {
145+ SingleSource :: Cube ( cube) => {
146+ refs. insert ( cube. name ( ) . clone ( ) , source. alias . clone ( ) ) ;
147+ }
148+ _ => { }
149+ }
150+ }
151+
152+ pub fn build ( mut self ) -> Select {
153+ let cube_references = self . make_cube_references ( ) ;
154+ self . nodes_factory . set_cube_name_references ( cube_references) ;
93155 Select {
94156 projection_columns : self . projection_columns ,
95157 from : self . from ,
96158 filter : self . filter ,
97159 group_by : self . group_by ,
98160 having : self . having ,
99161 order_by : self . order_by ,
100- context : self . context . clone ( ) ,
162+ context : Rc :: new ( VisitorContext :: new ( & self . nodes_factory ) ) ,
101163 ctes : self . ctes ,
102164 is_distinct : self . is_distinct ,
103165 limit : self . limit ,
0 commit comments