@@ -29,7 +29,7 @@ use crate::{
29
29
} ,
30
30
} ;
31
31
32
- use crate :: protobuf:: { proto_error, FromProtoError , ToProtoError } ;
32
+ use crate :: protobuf:: { proto_error, ToProtoError } ;
33
33
use arrow:: datatypes:: { DataType , Schema , SchemaRef } ;
34
34
#[ cfg( feature = "parquet" ) ]
35
35
use datafusion:: datasource:: file_format:: parquet:: ParquetFormat ;
@@ -66,11 +66,10 @@ use datafusion_expr::{
66
66
} ;
67
67
use datafusion_expr:: { AggregateUDF , Unnest } ;
68
68
69
+ use self :: to_proto:: { serialize_expr, serialize_exprs} ;
69
70
use prost:: bytes:: BufMut ;
70
71
use prost:: Message ;
71
72
72
- use self :: to_proto:: serialize_expr;
73
-
74
73
pub mod file_formats;
75
74
pub mod from_proto;
76
75
pub mod to_proto;
@@ -273,13 +272,7 @@ impl AsLogicalPlan for LogicalPlanNode {
273
272
values
274
273
. values_list
275
274
. chunks_exact ( n_cols)
276
- . map ( |r| {
277
- r. iter ( )
278
- . map ( |expr| {
279
- from_proto:: parse_expr ( expr, ctx, extension_codec)
280
- } )
281
- . collect :: < Result < Vec < _ > , FromProtoError > > ( )
282
- } )
275
+ . map ( |r| from_proto:: parse_exprs ( r, ctx, extension_codec) )
283
276
. collect :: < Result < Vec < _ > , _ > > ( )
284
277
. map_err ( |e| e. into ( ) )
285
278
} ?;
@@ -288,11 +281,8 @@ impl AsLogicalPlan for LogicalPlanNode {
288
281
LogicalPlanType :: Projection ( projection) => {
289
282
let input: LogicalPlan =
290
283
into_logical_plan ! ( projection. input, ctx, extension_codec) ?;
291
- let expr: Vec < Expr > = projection
292
- . expr
293
- . iter ( )
294
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
295
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
284
+ let expr: Vec < Expr > =
285
+ from_proto:: parse_exprs ( & projection. expr , ctx, extension_codec) ?;
296
286
297
287
let new_proj = project ( input, expr) ?;
298
288
match projection. optional_alias . as_ref ( ) {
@@ -324,26 +314,17 @@ impl AsLogicalPlan for LogicalPlanNode {
324
314
LogicalPlanType :: Window ( window) => {
325
315
let input: LogicalPlan =
326
316
into_logical_plan ! ( window. input, ctx, extension_codec) ?;
327
- let window_expr = window
328
- . window_expr
329
- . iter ( )
330
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
331
- . collect :: < Result < Vec < Expr > , _ > > ( ) ?;
317
+ let window_expr =
318
+ from_proto:: parse_exprs ( & window. window_expr , ctx, extension_codec) ?;
332
319
LogicalPlanBuilder :: from ( input) . window ( window_expr) ?. build ( )
333
320
}
334
321
LogicalPlanType :: Aggregate ( aggregate) => {
335
322
let input: LogicalPlan =
336
323
into_logical_plan ! ( aggregate. input, ctx, extension_codec) ?;
337
- let group_expr = aggregate
338
- . group_expr
339
- . iter ( )
340
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
341
- . collect :: < Result < Vec < Expr > , _ > > ( ) ?;
342
- let aggr_expr = aggregate
343
- . aggr_expr
344
- . iter ( )
345
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
346
- . collect :: < Result < Vec < Expr > , _ > > ( ) ?;
324
+ let group_expr =
325
+ from_proto:: parse_exprs ( & aggregate. group_expr , ctx, extension_codec) ?;
326
+ let aggr_expr =
327
+ from_proto:: parse_exprs ( & aggregate. aggr_expr , ctx, extension_codec) ?;
347
328
LogicalPlanBuilder :: from ( input)
348
329
. aggregate ( group_expr, aggr_expr) ?
349
330
. build ( )
@@ -361,20 +342,16 @@ impl AsLogicalPlan for LogicalPlanNode {
361
342
projection = Some ( column_indices) ;
362
343
}
363
344
364
- let filters = scan
365
- . filters
366
- . iter ( )
367
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
368
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
345
+ let filters =
346
+ from_proto:: parse_exprs ( & scan. filters , ctx, extension_codec) ?;
369
347
370
348
let mut all_sort_orders = vec ! [ ] ;
371
349
for order in & scan. file_sort_order {
372
- let file_sort_order = order
373
- . logical_expr_nodes
374
- . iter ( )
375
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
376
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
377
- all_sort_orders. push ( file_sort_order)
350
+ all_sort_orders. push ( from_proto:: parse_exprs (
351
+ & order. logical_expr_nodes ,
352
+ ctx,
353
+ extension_codec,
354
+ ) ?)
378
355
}
379
356
380
357
let file_format: Arc < dyn FileFormat > =
@@ -475,11 +452,8 @@ impl AsLogicalPlan for LogicalPlanNode {
475
452
projection = Some ( column_indices) ;
476
453
}
477
454
478
- let filters = scan
479
- . filters
480
- . iter ( )
481
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
482
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
455
+ let filters =
456
+ from_proto:: parse_exprs ( & scan. filters , ctx, extension_codec) ?;
483
457
484
458
let table_name =
485
459
from_table_reference ( scan. table_name . as_ref ( ) , "CustomScan" ) ?;
@@ -502,11 +476,8 @@ impl AsLogicalPlan for LogicalPlanNode {
502
476
LogicalPlanType :: Sort ( sort) => {
503
477
let input: LogicalPlan =
504
478
into_logical_plan ! ( sort. input, ctx, extension_codec) ?;
505
- let sort_expr: Vec < Expr > = sort
506
- . expr
507
- . iter ( )
508
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
509
- . collect :: < Result < Vec < Expr > , _ > > ( ) ?;
479
+ let sort_expr: Vec < Expr > =
480
+ from_proto:: parse_exprs ( & sort. expr , ctx, extension_codec) ?;
510
481
LogicalPlanBuilder :: from ( input) . sort ( sort_expr) ?. build ( )
511
482
}
512
483
LogicalPlanType :: Repartition ( repartition) => {
@@ -525,12 +496,7 @@ impl AsLogicalPlan for LogicalPlanNode {
525
496
hash_expr : pb_hash_expr,
526
497
partition_count,
527
498
} ) => Partitioning :: Hash (
528
- pb_hash_expr
529
- . iter ( )
530
- . map ( |expr| {
531
- from_proto:: parse_expr ( expr, ctx, extension_codec)
532
- } )
533
- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
499
+ from_proto:: parse_exprs ( pb_hash_expr, ctx, extension_codec) ?,
534
500
* partition_count as usize ,
535
501
) ,
536
502
PartitionMethod :: RoundRobin ( partition_count) => {
@@ -570,12 +536,11 @@ impl AsLogicalPlan for LogicalPlanNode {
570
536
571
537
let mut order_exprs = vec ! [ ] ;
572
538
for expr in & create_extern_table. order_exprs {
573
- let order_expr = expr
574
- . logical_expr_nodes
575
- . iter ( )
576
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
577
- . collect :: < Result < Vec < Expr > , _ > > ( ) ?;
578
- order_exprs. push ( order_expr)
539
+ order_exprs. push ( from_proto:: parse_exprs (
540
+ & expr. logical_expr_nodes ,
541
+ ctx,
542
+ extension_codec,
543
+ ) ?) ;
579
544
}
580
545
581
546
let mut column_defaults =
@@ -693,16 +658,10 @@ impl AsLogicalPlan for LogicalPlanNode {
693
658
LogicalPlanBuilder :: from ( input) . limit ( skip, fetch) ?. build ( )
694
659
}
695
660
LogicalPlanType :: Join ( join) => {
696
- let left_keys: Vec < Expr > = join
697
- . left_join_key
698
- . iter ( )
699
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
700
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
701
- let right_keys: Vec < Expr > = join
702
- . right_join_key
703
- . iter ( )
704
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
705
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
661
+ let left_keys: Vec < Expr > =
662
+ from_proto:: parse_exprs ( & join. left_join_key , ctx, extension_codec) ?;
663
+ let right_keys: Vec < Expr > =
664
+ from_proto:: parse_exprs ( & join. right_join_key , ctx, extension_codec) ?;
706
665
let join_type =
707
666
protobuf:: JoinType :: try_from ( join. join_type ) . map_err ( |_| {
708
667
proto_error ( format ! (
@@ -804,27 +763,20 @@ impl AsLogicalPlan for LogicalPlanNode {
804
763
LogicalPlanType :: DistinctOn ( distinct_on) => {
805
764
let input: LogicalPlan =
806
765
into_logical_plan ! ( distinct_on. input, ctx, extension_codec) ?;
807
- let on_expr = distinct_on
808
- . on_expr
809
- . iter ( )
810
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
811
- . collect :: < Result < Vec < Expr > , _ > > ( ) ?;
812
- let select_expr = distinct_on
813
- . select_expr
814
- . iter ( )
815
- . map ( |expr| from_proto:: parse_expr ( expr, ctx, extension_codec) )
816
- . collect :: < Result < Vec < Expr > , _ > > ( ) ?;
766
+ let on_expr =
767
+ from_proto:: parse_exprs ( & distinct_on. on_expr , ctx, extension_codec) ?;
768
+ let select_expr = from_proto:: parse_exprs (
769
+ & distinct_on. select_expr ,
770
+ ctx,
771
+ extension_codec,
772
+ ) ?;
817
773
let sort_expr = match distinct_on. sort_expr . len ( ) {
818
774
0 => None ,
819
- _ => Some (
820
- distinct_on
821
- . sort_expr
822
- . iter ( )
823
- . map ( |expr| {
824
- from_proto:: parse_expr ( expr, ctx, extension_codec)
825
- } )
826
- . collect :: < Result < Vec < Expr > , _ > > ( ) ?,
827
- ) ,
775
+ _ => Some ( from_proto:: parse_exprs (
776
+ & distinct_on. sort_expr ,
777
+ ctx,
778
+ extension_codec,
779
+ ) ?) ,
828
780
} ;
829
781
LogicalPlanBuilder :: from ( input)
830
782
. distinct_on ( on_expr, select_expr, sort_expr) ?
@@ -943,11 +895,8 @@ impl AsLogicalPlan for LogicalPlanNode {
943
895
} else {
944
896
values[ 0 ] . len ( )
945
897
} as u64 ;
946
- let values_list = values
947
- . iter ( )
948
- . flatten ( )
949
- . map ( |v| serialize_expr ( v, extension_codec) )
950
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
898
+ let values_list =
899
+ serialize_exprs ( values. iter ( ) . flatten ( ) , extension_codec) ?;
951
900
Ok ( protobuf:: LogicalPlanNode {
952
901
logical_plan_type : Some ( LogicalPlanType :: Values (
953
902
protobuf:: ValuesNode {
@@ -982,10 +931,8 @@ impl AsLogicalPlan for LogicalPlanNode {
982
931
} ;
983
932
let schema: protobuf:: Schema = schema. as_ref ( ) . try_into ( ) ?;
984
933
985
- let filters: Vec < protobuf:: LogicalExprNode > = filters
986
- . iter ( )
987
- . map ( |filter| serialize_expr ( filter, extension_codec) )
988
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
934
+ let filters: Vec < protobuf:: LogicalExprNode > =
935
+ serialize_exprs ( filters, extension_codec) ?;
989
936
990
937
if let Some ( listing_table) = source. downcast_ref :: < ListingTable > ( ) {
991
938
let any = listing_table. options ( ) . format . as_any ( ) ;
@@ -1037,10 +984,7 @@ impl AsLogicalPlan for LogicalPlanNode {
1037
984
let mut exprs_vec: Vec < LogicalExprNodeCollection > = vec ! [ ] ;
1038
985
for order in & options. file_sort_order {
1039
986
let expr_vec = LogicalExprNodeCollection {
1040
- logical_expr_nodes : order
1041
- . iter ( )
1042
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1043
- . collect :: < Result < Vec < _ > , ToProtoError > > ( ) ?,
987
+ logical_expr_nodes : serialize_exprs ( order, extension_codec) ?,
1044
988
} ;
1045
989
exprs_vec. push ( expr_vec) ;
1046
990
}
@@ -1118,10 +1062,7 @@ impl AsLogicalPlan for LogicalPlanNode {
1118
1062
extension_codec,
1119
1063
) ?,
1120
1064
) ) ,
1121
- expr : expr
1122
- . iter ( )
1123
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1124
- . collect :: < Result < Vec < _ > , ToProtoError > > ( ) ?,
1065
+ expr : serialize_exprs ( expr, extension_codec) ?,
1125
1066
optional_alias : None ,
1126
1067
} ,
1127
1068
) ) ) ,
@@ -1173,22 +1114,13 @@ impl AsLogicalPlan for LogicalPlanNode {
1173
1114
) ?;
1174
1115
let sort_expr = match sort_expr {
1175
1116
None => vec ! [ ] ,
1176
- Some ( sort_expr) => sort_expr
1177
- . iter ( )
1178
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1179
- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
1117
+ Some ( sort_expr) => serialize_exprs ( sort_expr, extension_codec) ?,
1180
1118
} ;
1181
1119
Ok ( protobuf:: LogicalPlanNode {
1182
1120
logical_plan_type : Some ( LogicalPlanType :: DistinctOn ( Box :: new (
1183
1121
protobuf:: DistinctOnNode {
1184
- on_expr : on_expr
1185
- . iter ( )
1186
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1187
- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
1188
- select_expr : select_expr
1189
- . iter ( )
1190
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1191
- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
1122
+ on_expr : serialize_exprs ( on_expr, extension_codec) ?,
1123
+ select_expr : serialize_exprs ( select_expr, extension_codec) ?,
1192
1124
sort_expr,
1193
1125
input : Some ( Box :: new ( input) ) ,
1194
1126
} ,
@@ -1207,10 +1139,7 @@ impl AsLogicalPlan for LogicalPlanNode {
1207
1139
logical_plan_type : Some ( LogicalPlanType :: Window ( Box :: new (
1208
1140
protobuf:: WindowNode {
1209
1141
input : Some ( Box :: new ( input) ) ,
1210
- window_expr : window_expr
1211
- . iter ( )
1212
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1213
- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
1142
+ window_expr : serialize_exprs ( window_expr, extension_codec) ?,
1214
1143
} ,
1215
1144
) ) ) ,
1216
1145
} )
@@ -1230,14 +1159,8 @@ impl AsLogicalPlan for LogicalPlanNode {
1230
1159
logical_plan_type : Some ( LogicalPlanType :: Aggregate ( Box :: new (
1231
1160
protobuf:: AggregateNode {
1232
1161
input : Some ( Box :: new ( input) ) ,
1233
- group_expr : group_expr
1234
- . iter ( )
1235
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1236
- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
1237
- aggr_expr : aggr_expr
1238
- . iter ( )
1239
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1240
- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
1162
+ group_expr : serialize_exprs ( group_expr, extension_codec) ?,
1163
+ aggr_expr : serialize_exprs ( aggr_expr, extension_codec) ?,
1241
1164
} ,
1242
1165
) ) ) ,
1243
1166
} )
@@ -1335,10 +1258,8 @@ impl AsLogicalPlan for LogicalPlanNode {
1335
1258
input. as_ref ( ) ,
1336
1259
extension_codec,
1337
1260
) ?;
1338
- let selection_expr: Vec < protobuf:: LogicalExprNode > = expr
1339
- . iter ( )
1340
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1341
- . collect :: < Result < Vec < _ > , ToProtoError > > ( ) ?;
1261
+ let selection_expr: Vec < protobuf:: LogicalExprNode > =
1262
+ serialize_exprs ( expr, extension_codec) ?;
1342
1263
Ok ( protobuf:: LogicalPlanNode {
1343
1264
logical_plan_type : Some ( LogicalPlanType :: Sort ( Box :: new (
1344
1265
protobuf:: SortNode {
@@ -1367,10 +1288,7 @@ impl AsLogicalPlan for LogicalPlanNode {
1367
1288
let pb_partition_method = match partitioning_scheme {
1368
1289
Partitioning :: Hash ( exprs, partition_count) => {
1369
1290
PartitionMethod :: Hash ( protobuf:: HashRepartition {
1370
- hash_expr : exprs
1371
- . iter ( )
1372
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1373
- . collect :: < Result < Vec < _ > , ToProtoError > > ( ) ?,
1291
+ hash_expr : serialize_exprs ( exprs, extension_codec) ?,
1374
1292
partition_count : * partition_count as u64 ,
1375
1293
} )
1376
1294
}
@@ -1419,10 +1337,7 @@ impl AsLogicalPlan for LogicalPlanNode {
1419
1337
let mut converted_order_exprs: Vec < LogicalExprNodeCollection > = vec ! [ ] ;
1420
1338
for order in order_exprs {
1421
1339
let temp = LogicalExprNodeCollection {
1422
- logical_expr_nodes : order
1423
- . iter ( )
1424
- . map ( |expr| serialize_expr ( expr, extension_codec) )
1425
- . collect :: < Result < Vec < _ > , ToProtoError > > ( ) ?,
1340
+ logical_expr_nodes : serialize_exprs ( order, extension_codec) ?,
1426
1341
} ;
1427
1342
converted_order_exprs. push ( temp) ;
1428
1343
}
0 commit comments