@@ -22,7 +22,6 @@ use common_expression::types::nullable::NullableDomain;
22
22
use common_expression:: types:: number:: NumberScalar ;
23
23
use common_expression:: types:: number:: SimpleDomain ;
24
24
use common_expression:: types:: number:: UInt64Type ;
25
- use common_expression:: types:: AnyType ;
26
25
use common_expression:: types:: ArgType ;
27
26
use common_expression:: types:: ArrayType ;
28
27
use common_expression:: types:: BooleanType ;
@@ -47,7 +46,6 @@ use common_expression::with_number_mapped_type;
47
46
use common_expression:: Column ;
48
47
use common_expression:: ColumnBuilder ;
49
48
use common_expression:: Domain ;
50
- use common_expression:: EvalContext ;
51
49
use common_expression:: Function ;
52
50
use common_expression:: FunctionDomain ;
53
51
use common_expression:: FunctionProperty ;
@@ -644,68 +642,61 @@ fn register_array_aggr(registry: &mut FunctionRegistry) {
644
642
Some ( return_type)
645
643
}
646
644
647
- fn eval_array_aggr (
648
- name : & str ,
649
- args : & [ ValueRef < AnyType > ] ,
650
- ctx : & mut EvalContext ,
651
- ) -> Value < AnyType > {
652
- match & args[ 0 ] {
653
- ValueRef :: Scalar ( scalar) => match scalar {
654
- ScalarRef :: EmptyArray | ScalarRef :: Null => {
655
- if name == "count" {
656
- Value :: Scalar ( Scalar :: Number ( NumberScalar :: UInt64 ( 0 ) ) )
657
- } else {
658
- Value :: Scalar ( Scalar :: Null )
659
- }
660
- }
661
- ScalarRef :: Array ( col) => {
662
- let len = col. len ( ) ;
663
- match eval_aggr ( name, vec ! [ ] , & [ col. clone ( ) ] , len) {
664
- Ok ( ( res_col, _) ) => {
665
- let val = unsafe { res_col. index_unchecked ( 0 ) } ;
666
- Value :: Scalar ( val. to_owned ( ) )
667
- }
668
- Err ( err) => {
669
- ctx. set_error ( 0 , err. to_string ( ) ) ;
670
- Value :: Scalar ( Scalar :: Null )
671
- }
672
- }
673
- }
674
- _ => unreachable ! ( ) ,
675
- } ,
676
- ValueRef :: Column ( column) => {
677
- let return_type = eval_aggr_return_type ( name, & [ column. data_type ( ) ] ) . unwrap ( ) ;
678
- let mut builder = ColumnBuilder :: with_capacity ( & return_type, column. len ( ) ) ;
679
- for arr in column. iter ( ) {
680
- let array_column = arr. as_array ( ) . unwrap ( ) ;
681
- let len = array_column. len ( ) ;
682
- match eval_aggr ( name, vec ! [ ] , & [ array_column. clone ( ) ] , len) {
683
- Ok ( ( col, _) ) => {
684
- let val = unsafe { col. index_unchecked ( 0 ) } ;
685
- builder. push ( val)
686
- }
687
- Err ( err) => {
688
- ctx. set_error ( builder. len ( ) , err. to_string ( ) ) ;
689
- }
690
- }
691
- }
692
- Value :: Column ( builder. build ( ) )
693
- }
694
- }
695
- }
696
-
697
- for ( func_name, name) in ARRAY_AGGREGATE_FUNCTIONS {
698
- registry. register_function_factory ( func_name, |_, args_type| {
645
+ for ( fn_name, name) in ARRAY_AGGREGATE_FUNCTIONS {
646
+ registry. register_function_factory ( fn_name, |_, args_type| {
699
647
let return_type = eval_aggr_return_type ( name, args_type) ?;
700
648
Some ( Arc :: new ( Function {
701
649
signature : FunctionSignature {
702
- name : func_name . to_string ( ) ,
650
+ name : fn_name . to_string ( ) ,
703
651
args_type : vec ! [ args_type[ 0 ] . clone( ) ] ,
704
652
return_type,
705
653
property : FunctionProperty :: default ( ) ,
706
654
} ,
707
655
calc_domain : Box :: new ( move |_| FunctionDomain :: MayThrow ) ,
708
- eval : Box :: new ( |args, ctx| eval_array_aggr ( name, args, ctx) ) ,
656
+ eval : Box :: new ( |args, ctx| match & args[ 0 ] {
657
+ ValueRef :: Scalar ( scalar) => match scalar {
658
+ ScalarRef :: EmptyArray | ScalarRef :: Null => {
659
+ if name == "count" {
660
+ Value :: Scalar ( Scalar :: Number ( NumberScalar :: UInt64 ( 0 ) ) )
661
+ } else {
662
+ Value :: Scalar ( Scalar :: Null )
663
+ }
664
+ }
665
+ ScalarRef :: Array ( col) => {
666
+ let len = col. len ( ) ;
667
+ match eval_aggr ( name, vec ! [ ] , & [ col. clone ( ) ] , len) {
668
+ Ok ( ( res_col, _) ) => {
669
+ let val = unsafe { res_col. index_unchecked ( 0 ) } ;
670
+ Value :: Scalar ( val. to_owned ( ) )
671
+ }
672
+ Err ( err) => {
673
+ ctx. set_error ( 0 , err. to_string ( ) ) ;
674
+ Value :: Scalar ( Scalar :: Null )
675
+ }
676
+ }
677
+ }
678
+ _ => unreachable ! ( ) ,
679
+ } ,
680
+ ValueRef :: Column ( column) => {
681
+ let return_type =
682
+ eval_aggr_return_type ( name, & [ column. data_type ( ) ] ) . unwrap ( ) ;
683
+ let mut builder = ColumnBuilder :: with_capacity ( & return_type, column. len ( ) ) ;
684
+ for arr in column. iter ( ) {
685
+ let array_column = arr. as_array ( ) . unwrap ( ) ;
686
+ let len = array_column. len ( ) ;
687
+ match eval_aggr ( name, vec ! [ ] , & [ array_column. clone ( ) ] , len) {
688
+ Ok ( ( col, _) ) => {
689
+ let val = unsafe { col. index_unchecked ( 0 ) } ;
690
+ builder. push ( val)
691
+ }
692
+ Err ( err) => {
693
+ ctx. set_error ( builder. len ( ) , err. to_string ( ) ) ;
694
+ }
695
+ }
696
+ }
697
+ Value :: Column ( builder. build ( ) )
698
+ }
699
+ } ) ,
709
700
} ) )
710
701
} ) ;
711
702
}
0 commit comments