1
1
use super :: * ;
2
2
use cubenativeutils:: CubeError ;
3
+ use itertools:: Itertools ;
3
4
use std:: rc:: Rc ;
4
5
5
6
#[ derive( Clone ) ]
@@ -47,48 +48,29 @@ pub struct Query {
47
48
}
48
49
49
50
impl LogicalNode for Query {
50
- type InputsType = QueryInput ;
51
-
52
51
fn as_plan_node ( self : & Rc < Self > ) -> PlanNode {
53
52
PlanNode :: Query ( self . clone ( ) )
54
53
}
55
54
56
- fn inputs ( & self ) -> Self :: InputsType {
57
- let source = self . source . as_plan_node ( ) ;
58
- let multistage_members = self
59
- . multistage_members
60
- . iter ( )
61
- . map ( |member| member. as_plan_node ( ) )
62
- . collect ( ) ;
63
-
64
- QueryInput {
65
- source,
66
- multistage_members,
67
- }
55
+ fn inputs ( & self ) -> Vec < PlanNode > {
56
+ QueryInputPacker :: pack ( self )
68
57
}
69
58
70
- fn with_inputs ( self : Rc < Self > , inputs : Self :: InputsType ) -> Result < Rc < Self > , CubeError > {
71
- let QueryInput {
72
- source,
59
+ fn with_inputs ( self : Rc < Self > , inputs : Vec < PlanNode > ) -> Result < Rc < Self > , CubeError > {
60
+ let QueryInputUnPacker {
73
61
multistage_members,
74
- } = inputs;
75
-
76
- check_inputs_len (
77
- "multistage_members" ,
78
- & multistage_members,
79
- self . multistage_members . len ( ) ,
80
- self . node_name ( ) ,
81
- ) ?;
62
+ source,
63
+ } = QueryInputUnPacker :: new ( & self , & inputs) ?;
82
64
83
65
Ok ( Rc :: new ( Self {
84
66
multistage_members : multistage_members
85
67
. into_iter ( )
86
- . map ( |member| member. into_logical_node ( ) )
68
+ . map ( |member| member. clone ( ) . into_logical_node ( ) )
87
69
. collect :: < Result < Vec < _ > , _ > > ( ) ?,
88
70
schema : self . schema . clone ( ) ,
89
71
filter : self . filter . clone ( ) ,
90
72
modifers : self . modifers . clone ( ) ,
91
- source : self . source . with_plan_node ( source) ?,
73
+ source : self . source . with_plan_node ( source. clone ( ) ) ?,
92
74
} ) )
93
75
}
94
76
@@ -104,18 +86,38 @@ impl LogicalNode for Query {
104
86
}
105
87
}
106
88
107
- pub struct QueryInput {
108
- pub source : PlanNode ,
109
- pub multistage_members : Vec < PlanNode > ,
89
+ pub struct QueryInputPacker { }
90
+
91
+ impl QueryInputPacker {
92
+ pub fn pack ( query : & Query ) -> Vec < PlanNode > {
93
+ let mut result = vec ! [ ] ;
94
+ result. extend (
95
+ query
96
+ . multistage_members
97
+ . iter ( )
98
+ . map ( |member| member. as_plan_node ( ) ) ,
99
+ ) ;
100
+ result. push ( query. source . as_plan_node ( ) ) ;
101
+ result
102
+ }
103
+ }
104
+ pub struct QueryInputUnPacker < ' a > {
105
+ multistage_members : & ' a [ PlanNode ] ,
106
+ source : & ' a PlanNode ,
110
107
}
111
108
112
- impl NodeInputs for QueryInput {
113
- fn iter ( & self ) -> Box < dyn Iterator < Item = & PlanNode > + ' _ > {
114
- Box :: new ( std:: iter:: once ( & self . source ) . chain ( self . multistage_members . iter ( ) ) )
109
+ impl < ' a > QueryInputUnPacker < ' a > {
110
+ pub fn new ( query : & Query , inputs : & ' a Vec < PlanNode > ) -> Result < Self , CubeError > {
111
+ check_inputs_len ( & inputs, Self :: inputs_len ( query) , query. node_name ( ) ) ?;
112
+ let multistage_members = & inputs[ 0 ..query. multistage_members . len ( ) ] ;
113
+ let source = & inputs[ query. multistage_members . len ( ) ] ;
114
+ Ok ( Self {
115
+ multistage_members,
116
+ source,
117
+ } )
115
118
}
116
-
117
- fn iter_mut ( & mut self ) -> Box < dyn Iterator < Item = & mut PlanNode > + ' _ > {
118
- Box :: new ( std:: iter:: once ( & mut self . source ) . chain ( self . multistage_members . iter_mut ( ) ) )
119
+ fn inputs_len ( query : & Query ) -> usize {
120
+ query. multistage_members . len ( ) + 1
119
121
}
120
122
}
121
123
0 commit comments