@@ -99,9 +99,46 @@ impl ExecutionPlan for FtsExec {
99
99
100
100
fn with_new_children (
101
101
self : Arc < Self > ,
102
- _children : Vec < Arc < dyn ExecutionPlan > > ,
102
+ mut children : Vec < Arc < dyn ExecutionPlan > > ,
103
103
) -> DataFusionResult < Arc < dyn ExecutionPlan > > {
104
- todo ! ( )
104
+ let plan = match children. len ( ) {
105
+ 0 => Self {
106
+ dataset : self . dataset . clone ( ) ,
107
+ indices : self . indices . clone ( ) ,
108
+ query : self . query . clone ( ) ,
109
+ prefilter_source : PreFilterSource :: None ,
110
+ properties : self . properties . clone ( ) ,
111
+ } ,
112
+ 1 => {
113
+ let src = children. pop ( ) . unwrap ( ) ;
114
+ let prefilter_source = match & self . prefilter_source {
115
+ PreFilterSource :: FilteredRowIds ( _) => {
116
+ PreFilterSource :: FilteredRowIds ( src. clone ( ) )
117
+ }
118
+ PreFilterSource :: ScalarIndexQuery ( _) => {
119
+ PreFilterSource :: ScalarIndexQuery ( src. clone ( ) )
120
+ }
121
+ PreFilterSource :: None => {
122
+ return Err ( DataFusionError :: Internal (
123
+ "Unexpected prefilter source" . to_string ( ) ,
124
+ ) ) ;
125
+ }
126
+ } ;
127
+ Self {
128
+ dataset : self . dataset . clone ( ) ,
129
+ indices : self . indices . clone ( ) ,
130
+ query : self . query . clone ( ) ,
131
+ prefilter_source,
132
+ properties : self . properties . clone ( ) ,
133
+ }
134
+ }
135
+ _ => {
136
+ return Err ( DataFusionError :: Internal (
137
+ "Unexpected number of children" . to_string ( ) ,
138
+ ) ) ;
139
+ }
140
+ } ;
141
+ Ok ( Arc :: new ( plan) )
105
142
}
106
143
107
144
#[ instrument( name = "fts_exec" , level = "debug" , skip_all) ]
@@ -194,8 +231,8 @@ impl ExecutionPlan for FtsExec {
194
231
#[ derive( Debug ) ]
195
232
pub struct FlatFtsExec {
196
233
dataset : Arc < Dataset > ,
197
- // column -> ( indices, unindexed input stream)
198
- column_inputs : HashMap < String , ( Vec < Index > , Arc < dyn ExecutionPlan > ) > ,
234
+ // ( column, indices, unindexed input stream)
235
+ column_inputs : Vec < ( String , Vec < Index > , Arc < dyn ExecutionPlan > ) > ,
199
236
query : FullTextSearchQuery ,
200
237
properties : PlanProperties ,
201
238
}
@@ -213,7 +250,7 @@ impl DisplayAs for FlatFtsExec {
213
250
impl FlatFtsExec {
214
251
pub fn new (
215
252
dataset : Arc < Dataset > ,
216
- column_inputs : HashMap < String , ( Vec < Index > , Arc < dyn ExecutionPlan > ) > ,
253
+ column_inputs : Vec < ( String , Vec < Index > , Arc < dyn ExecutionPlan > ) > ,
217
254
query : FullTextSearchQuery ,
218
255
) -> Self {
219
256
let properties = PlanProperties :: new (
@@ -246,16 +283,33 @@ impl ExecutionPlan for FlatFtsExec {
246
283
247
284
fn children ( & self ) -> Vec < & Arc < dyn ExecutionPlan > > {
248
285
self . column_inputs
249
- . values ( )
250
- . map ( |( _, input) | input)
286
+ . iter ( )
287
+ . map ( |( _, _ , input) | input)
251
288
. collect ( )
252
289
}
253
290
254
291
fn with_new_children (
255
292
self : Arc < Self > ,
256
- _children : Vec < Arc < dyn ExecutionPlan > > ,
293
+ children : Vec < Arc < dyn ExecutionPlan > > ,
257
294
) -> DataFusionResult < Arc < dyn ExecutionPlan > > {
258
- todo ! ( )
295
+ if self . column_inputs . len ( ) != children. len ( ) {
296
+ return Err ( DataFusionError :: Internal (
297
+ "Unexpected number of children" . to_string ( ) ,
298
+ ) ) ;
299
+ }
300
+
301
+ let column_inputs = self
302
+ . column_inputs
303
+ . iter ( )
304
+ . zip ( children)
305
+ . map ( |( ( column, indices, _) , input) | ( column. clone ( ) , indices. clone ( ) , input) )
306
+ . collect ( ) ;
307
+ Ok ( Arc :: new ( Self {
308
+ dataset : self . dataset . clone ( ) ,
309
+ column_inputs,
310
+ query : self . query . clone ( ) ,
311
+ properties : self . properties . clone ( ) ,
312
+ } ) )
259
313
}
260
314
261
315
#[ instrument( name = "flat_fts_exec" , level = "debug" , skip_all) ]
@@ -269,7 +323,7 @@ impl ExecutionPlan for FlatFtsExec {
269
323
let column_inputs = self . column_inputs . clone ( ) ;
270
324
271
325
let stream = stream:: iter ( column_inputs)
272
- . map ( move |( column, ( indices, input) ) | {
326
+ . map ( move |( column, indices, input) | {
273
327
let index_meta = indices[ 0 ] . clone ( ) ;
274
328
let uuid = index_meta. uuid . to_string ( ) ;
275
329
let query = query. clone ( ) ;
0 commit comments