@@ -27,7 +27,9 @@ use crate::{Expr, GetFieldAccess};
27
27
use datafusion_common:: tree_node:: {
28
28
Transformed , TransformedIterator , TreeNode , TreeNodeRecursion ,
29
29
} ;
30
- use datafusion_common:: { handle_visit_recursion, internal_err, Result } ;
30
+ use datafusion_common:: {
31
+ handle_visit_recursion, internal_err, map_until_stop_and_collect, Result ,
32
+ } ;
31
33
32
34
impl TreeNode for Expr {
33
35
fn apply_children < F : FnMut ( & Self ) -> Result < TreeNodeRecursion > > (
@@ -167,58 +169,55 @@ impl TreeNode for Expr {
167
169
Expr :: InSubquery ( InSubquery :: new ( be, subquery, negated) )
168
170
} ) ,
169
171
Expr :: BinaryExpr ( BinaryExpr { left, op, right } ) => {
170
- transform_box ( left, & mut f) ?
171
- . update_data ( |new_left| ( new_left, right) )
172
- . try_transform_node ( |( new_left, right) | {
173
- Ok ( transform_box ( right, & mut f) ?
174
- . update_data ( |new_right| ( new_left, new_right) ) )
175
- } ) ?
176
- . update_data ( |( new_left, new_right) | {
177
- Expr :: BinaryExpr ( BinaryExpr :: new ( new_left, op, new_right) )
178
- } )
172
+ map_until_stop_and_collect ! (
173
+ transform_box( left, & mut f) ,
174
+ right,
175
+ transform_box( right, & mut f)
176
+ ) ?
177
+ . update_data ( |( new_left, new_right) | {
178
+ Expr :: BinaryExpr ( BinaryExpr :: new ( new_left, op, new_right) )
179
+ } )
179
180
}
180
181
Expr :: Like ( Like {
181
182
negated,
182
183
expr,
183
184
pattern,
184
185
escape_char,
185
186
case_insensitive,
186
- } ) => transform_box ( expr, & mut f) ?
187
- . update_data ( |new_expr| ( new_expr, pattern) )
188
- . try_transform_node ( |( new_expr, pattern) | {
189
- Ok ( transform_box ( pattern, & mut f) ?
190
- . update_data ( |new_pattern| ( new_expr, new_pattern) ) )
191
- } ) ?
192
- . update_data ( |( new_expr, new_pattern) | {
193
- Expr :: Like ( Like :: new (
194
- negated,
195
- new_expr,
196
- new_pattern,
197
- escape_char,
198
- case_insensitive,
199
- ) )
200
- } ) ,
187
+ } ) => map_until_stop_and_collect ! (
188
+ transform_box( expr, & mut f) ,
189
+ pattern,
190
+ transform_box( pattern, & mut f)
191
+ ) ?
192
+ . update_data ( |( new_expr, new_pattern) | {
193
+ Expr :: Like ( Like :: new (
194
+ negated,
195
+ new_expr,
196
+ new_pattern,
197
+ escape_char,
198
+ case_insensitive,
199
+ ) )
200
+ } ) ,
201
201
Expr :: SimilarTo ( Like {
202
202
negated,
203
203
expr,
204
204
pattern,
205
205
escape_char,
206
206
case_insensitive,
207
- } ) => transform_box ( expr, & mut f) ?
208
- . update_data ( |new_expr| ( new_expr, pattern) )
209
- . try_transform_node ( |( new_expr, pattern) | {
210
- Ok ( transform_box ( pattern, & mut f) ?
211
- . update_data ( |new_pattern| ( new_expr, new_pattern) ) )
212
- } ) ?
213
- . update_data ( |( new_expr, new_pattern) | {
214
- Expr :: SimilarTo ( Like :: new (
215
- negated,
216
- new_expr,
217
- new_pattern,
218
- escape_char,
219
- case_insensitive,
220
- ) )
221
- } ) ,
207
+ } ) => map_until_stop_and_collect ! (
208
+ transform_box( expr, & mut f) ,
209
+ pattern,
210
+ transform_box( pattern, & mut f)
211
+ ) ?
212
+ . update_data ( |( new_expr, new_pattern) | {
213
+ Expr :: SimilarTo ( Like :: new (
214
+ negated,
215
+ new_expr,
216
+ new_pattern,
217
+ escape_char,
218
+ case_insensitive,
219
+ ) )
220
+ } ) ,
222
221
Expr :: Not ( expr) => transform_box ( expr, & mut f) ?. update_data ( Expr :: Not ) ,
223
222
Expr :: IsNotNull ( expr) => {
224
223
transform_box ( expr, & mut f) ?. update_data ( Expr :: IsNotNull )
@@ -248,48 +247,38 @@ impl TreeNode for Expr {
248
247
negated,
249
248
low,
250
249
high,
251
- } ) => transform_box ( expr, & mut f) ?
252
- . update_data ( |new_expr| ( new_expr, low, high) )
253
- . try_transform_node ( |( new_expr, low, high) | {
254
- Ok ( transform_box ( low, & mut f) ?
255
- . update_data ( |new_low| ( new_expr, new_low, high) ) )
256
- } ) ?
257
- . try_transform_node ( |( new_expr, new_low, high) | {
258
- Ok ( transform_box ( high, & mut f) ?
259
- . update_data ( |new_high| ( new_expr, new_low, new_high) ) )
260
- } ) ?
261
- . update_data ( |( new_expr, new_low, new_high) | {
262
- Expr :: Between ( Between :: new ( new_expr, negated, new_low, new_high) )
263
- } ) ,
250
+ } ) => map_until_stop_and_collect ! (
251
+ transform_box( expr, & mut f) ,
252
+ low,
253
+ transform_box( low, & mut f) ,
254
+ high,
255
+ transform_box( high, & mut f)
256
+ ) ?
257
+ . update_data ( |( new_expr, new_low, new_high) | {
258
+ Expr :: Between ( Between :: new ( new_expr, negated, new_low, new_high) )
259
+ } ) ,
264
260
Expr :: Case ( Case {
265
261
expr,
266
262
when_then_expr,
267
263
else_expr,
268
- } ) => transform_option_box ( expr, & mut f) ?
269
- . update_data ( |new_expr| ( new_expr, when_then_expr, else_expr) )
270
- . try_transform_node ( |( new_expr, when_then_expr, else_expr) | {
271
- Ok ( when_then_expr
272
- . into_iter ( )
273
- . map_until_stop_and_collect ( |( when, then) | {
274
- transform_box ( when, & mut f) ?
275
- . update_data ( |new_when| ( new_when, then) )
276
- . try_transform_node ( |( new_when, then) | {
277
- Ok ( transform_box ( then, & mut f) ?
278
- . update_data ( |new_then| ( new_when, new_then) ) )
279
- } )
280
- } ) ?
281
- . update_data ( |new_when_then_expr| {
282
- ( new_expr, new_when_then_expr, else_expr)
283
- } ) )
284
- } ) ?
285
- . try_transform_node ( |( new_expr, new_when_then_expr, else_expr) | {
286
- Ok ( transform_option_box ( else_expr, & mut f) ?. update_data (
287
- |new_else_expr| ( new_expr, new_when_then_expr, new_else_expr) ,
288
- ) )
289
- } ) ?
290
- . update_data ( |( new_expr, new_when_then_expr, new_else_expr) | {
291
- Expr :: Case ( Case :: new ( new_expr, new_when_then_expr, new_else_expr) )
292
- } ) ,
264
+ } ) => map_until_stop_and_collect ! (
265
+ transform_option_box( expr, & mut f) ,
266
+ when_then_expr,
267
+ when_then_expr
268
+ . into_iter( )
269
+ . map_until_stop_and_collect( |( when, then) | {
270
+ map_until_stop_and_collect!(
271
+ transform_box( when, & mut f) ,
272
+ then,
273
+ transform_box( then, & mut f)
274
+ )
275
+ } ) ,
276
+ else_expr,
277
+ transform_option_box( else_expr, & mut f)
278
+ ) ?
279
+ . update_data ( |( new_expr, new_when_then_expr, new_else_expr) | {
280
+ Expr :: Case ( Case :: new ( new_expr, new_when_then_expr, new_else_expr) )
281
+ } ) ,
293
282
Expr :: Cast ( Cast { expr, data_type } ) => transform_box ( expr, & mut f) ?
294
283
. update_data ( |be| Expr :: Cast ( Cast :: new ( be, data_type) ) ) ,
295
284
Expr :: TryCast ( TryCast { expr, data_type } ) => transform_box ( expr, & mut f) ?
@@ -320,48 +309,39 @@ impl TreeNode for Expr {
320
309
order_by,
321
310
window_frame,
322
311
null_treatment,
323
- } ) => transform_vec ( args, & mut f) ?
324
- . update_data ( |new_args| ( new_args, partition_by, order_by) )
325
- . try_transform_node ( |( new_args, partition_by, order_by) | {
326
- Ok ( transform_vec ( partition_by, & mut f) ?. update_data (
327
- |new_partition_by| ( new_args, new_partition_by, order_by) ,
328
- ) )
329
- } ) ?
330
- . try_transform_node ( |( new_args, new_partition_by, order_by) | {
331
- Ok (
332
- transform_vec ( order_by, & mut f) ?. update_data ( |new_order_by| {
333
- ( new_args, new_partition_by, new_order_by)
334
- } ) ,
335
- )
336
- } ) ?
337
- . update_data ( |( new_args, new_partition_by, new_order_by) | {
338
- Expr :: WindowFunction ( WindowFunction :: new (
339
- fun,
340
- new_args,
341
- new_partition_by,
342
- new_order_by,
343
- window_frame,
344
- null_treatment,
345
- ) )
346
- } ) ,
312
+ } ) => map_until_stop_and_collect ! (
313
+ transform_vec( args, & mut f) ,
314
+ partition_by,
315
+ transform_vec( partition_by, & mut f) ,
316
+ order_by,
317
+ transform_vec( order_by, & mut f)
318
+ ) ?
319
+ . update_data ( |( new_args, new_partition_by, new_order_by) | {
320
+ Expr :: WindowFunction ( WindowFunction :: new (
321
+ fun,
322
+ new_args,
323
+ new_partition_by,
324
+ new_order_by,
325
+ window_frame,
326
+ null_treatment,
327
+ ) )
328
+ } ) ,
347
329
Expr :: AggregateFunction ( AggregateFunction {
348
330
args,
349
331
func_def,
350
332
distinct,
351
333
filter,
352
334
order_by,
353
335
null_treatment,
354
- } ) => transform_vec ( args, & mut f) ?
355
- . update_data ( |new_args| ( new_args, filter, order_by) )
356
- . try_transform_node ( |( new_args, filter, order_by) | {
357
- Ok ( transform_option_box ( filter, & mut f) ?
358
- . update_data ( |new_filter| ( new_args, new_filter, order_by) ) )
359
- } ) ?
360
- . try_transform_node ( |( new_args, new_filter, order_by) | {
361
- Ok ( transform_option_vec ( order_by, & mut f) ?
362
- . update_data ( |new_order_by| ( new_args, new_filter, new_order_by) ) )
363
- } ) ?
364
- . map_data ( |( new_args, new_filter, new_order_by) | match func_def {
336
+ } ) => map_until_stop_and_collect ! (
337
+ transform_vec( args, & mut f) ,
338
+ filter,
339
+ transform_option_box( filter, & mut f) ,
340
+ order_by,
341
+ transform_option_vec( order_by, & mut f)
342
+ ) ?
343
+ . map_data (
344
+ |( new_args, new_filter, new_order_by) | match func_def {
365
345
AggregateFunctionDefinition :: BuiltIn ( fun) => {
366
346
Ok ( Expr :: AggregateFunction ( AggregateFunction :: new (
367
347
fun,
@@ -385,7 +365,8 @@ impl TreeNode for Expr {
385
365
AggregateFunctionDefinition :: Name ( _) => {
386
366
internal_err ! ( "Function `Expr` with name should be resolved." )
387
367
}
388
- } ) ?,
368
+ } ,
369
+ ) ?,
389
370
Expr :: GroupingSet ( grouping_set) => match grouping_set {
390
371
GroupingSet :: Rollup ( exprs) => transform_vec ( exprs, & mut f) ?
391
372
. update_data ( |ve| Expr :: GroupingSet ( GroupingSet :: Rollup ( ve) ) ) ,
@@ -402,15 +383,14 @@ impl TreeNode for Expr {
402
383
expr,
403
384
list,
404
385
negated,
405
- } ) => transform_box ( expr, & mut f) ?
406
- . update_data ( |new_expr| ( new_expr, list) )
407
- . try_transform_node ( |( new_expr, list) | {
408
- Ok ( transform_vec ( list, & mut f) ?
409
- . update_data ( |new_list| ( new_expr, new_list) ) )
410
- } ) ?
411
- . update_data ( |( new_expr, new_list) | {
412
- Expr :: InList ( InList :: new ( new_expr, new_list, negated) )
413
- } ) ,
386
+ } ) => map_until_stop_and_collect ! (
387
+ transform_box( expr, & mut f) ,
388
+ list,
389
+ transform_vec( list, & mut f)
390
+ ) ?
391
+ . update_data ( |( new_expr, new_list) | {
392
+ Expr :: InList ( InList :: new ( new_expr, new_list, negated) )
393
+ } ) ,
414
394
Expr :: GetIndexedField ( GetIndexedField { expr, field } ) => {
415
395
transform_box ( expr, & mut f) ?. update_data ( |be| {
416
396
Expr :: GetIndexedField ( GetIndexedField :: new ( be, field) )
0 commit comments