1
+ use std:: sync:: Arc ;
2
+
1
3
use codspeed_criterion_compat:: { criterion_group, criterion_main, Bencher , Criterion } ;
2
4
3
- use datafusion:: arrow:: datatypes:: DataType ;
5
+ use datafusion:: arrow:: array:: { StringArray , StringViewArray } ;
6
+ use datafusion:: arrow:: datatypes:: { DataType , Field } ;
4
7
use datafusion:: logical_expr:: ColumnarValue ;
5
8
use datafusion:: { common:: ScalarValue , logical_expr:: ScalarFunctionArgs } ;
6
9
use datafusion_functions_json:: udfs:: { json_contains_udf, json_get_str_udf} ;
@@ -15,18 +18,27 @@ fn bench_json_contains(b: &mut Bencher) {
15
18
ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( "aa" . to_string( ) ) ) ) ,
16
19
] ;
17
20
21
+ let arg_fields = vec ! [
22
+ Arc :: new( Field :: new( "arg0" , DataType :: Utf8 , false ) ) ,
23
+ Arc :: new( Field :: new( "arg1" , DataType :: Utf8 , false ) ) ,
24
+ Arc :: new( Field :: new( "arg2" , DataType :: Utf8 , false ) ) ,
25
+ ] ;
26
+
27
+ let return_field = Arc :: new ( Field :: new ( "json_contains" , DataType :: Boolean , false ) ) ;
28
+
18
29
b. iter ( || {
19
30
json_contains
20
31
. invoke_with_args ( ScalarFunctionArgs {
21
32
args : args. clone ( ) ,
22
33
number_rows : 1 ,
23
- return_type : & DataType :: Boolean ,
34
+ arg_fields : arg_fields. clone ( ) ,
35
+ return_field : return_field. clone ( ) ,
24
36
} )
25
37
. unwrap ( )
26
38
} ) ;
27
39
}
28
40
29
- fn bench_json_get_str ( b : & mut Bencher ) {
41
+ fn bench_json_get_str_scalar ( b : & mut Bencher ) {
30
42
let json_get_str = json_get_str_udf ( ) ;
31
43
let args = & [
32
44
ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some (
@@ -36,20 +48,93 @@ fn bench_json_get_str(b: &mut Bencher) {
36
48
ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( "aa" . to_string ( ) ) ) ) ,
37
49
] ;
38
50
51
+ let arg_fields = vec ! [
52
+ Arc :: new( Field :: new( "arg0" , DataType :: Utf8 , false ) ) ,
53
+ Arc :: new( Field :: new( "arg1" , DataType :: Utf8 , false ) ) ,
54
+ Arc :: new( Field :: new( "arg2" , DataType :: Utf8 , false ) ) ,
55
+ ] ;
56
+
57
+ let return_field = Arc :: new ( Field :: new ( "json_get_str" , DataType :: Utf8 , false ) ) ;
58
+
39
59
b. iter ( || {
40
60
json_get_str
41
61
. invoke_with_args ( ScalarFunctionArgs {
42
62
args : args. to_vec ( ) ,
63
+ arg_fields : arg_fields. clone ( ) ,
43
64
number_rows : 1 ,
44
- return_type : & DataType :: Utf8 ,
65
+ return_field : return_field . clone ( ) ,
45
66
} )
46
- . unwrap ( )
67
+ . unwrap ( ) ;
68
+ } ) ;
69
+ }
70
+
71
+ fn bench_json_get_str_array ( b : & mut Bencher ) {
72
+ let json_get_str = json_get_str_udf ( ) ;
73
+ let args = & [
74
+ ColumnarValue :: Array ( Arc :: new ( StringArray :: from_iter_values ( vec ! [
75
+ r#"{"a": {"aa": "x", "ab": "y"}, "b": []}"# . to_string( ) ,
76
+ r#"{"a": {"aa": "x2", "ab": "y2"}, "b": []}"# . to_string( ) ,
77
+ ] ) ) ) ,
78
+ ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( "a" . to_string ( ) ) ) ) ,
79
+ ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( "aa" . to_string ( ) ) ) ) ,
80
+ ] ;
81
+
82
+ let arg_fields = vec ! [
83
+ Arc :: new( Field :: new( "arg0" , DataType :: Utf8 , false ) ) ,
84
+ Arc :: new( Field :: new( "arg1" , DataType :: Utf8 , false ) ) ,
85
+ Arc :: new( Field :: new( "arg2" , DataType :: Utf8 , false ) ) ,
86
+ ] ;
87
+
88
+ let return_field = Arc :: new ( Field :: new ( "json_get_str" , DataType :: Utf8 , false ) ) ;
89
+
90
+ b. iter ( || {
91
+ json_get_str
92
+ . invoke_with_args ( ScalarFunctionArgs {
93
+ args : args. to_vec ( ) ,
94
+ arg_fields : arg_fields. clone ( ) ,
95
+ number_rows : 1 ,
96
+ return_field : return_field. clone ( ) ,
97
+ } )
98
+ . unwrap ( ) ;
99
+ } ) ;
100
+ }
101
+
102
+ fn bench_json_get_str_view_array ( b : & mut Bencher ) {
103
+ let json_get_str = json_get_str_udf ( ) ;
104
+ let args = & [
105
+ ColumnarValue :: Array ( Arc :: new ( StringViewArray :: from_iter_values ( vec ! [
106
+ r#"{"a": {"aa": "x", "ab": "y"}, "b": []}"# . to_string( ) ,
107
+ r#"{"a": {"aa": "x2", "ab": "y2"}, "b": []}"# . to_string( ) ,
108
+ ] ) ) ) ,
109
+ ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( "a" . to_string ( ) ) ) ) ,
110
+ ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( "aa" . to_string ( ) ) ) ) ,
111
+ ] ;
112
+
113
+ let arg_fields = vec ! [
114
+ Arc :: new( Field :: new( "arg0" , DataType :: Utf8View , false ) ) ,
115
+ Arc :: new( Field :: new( "arg1" , DataType :: Utf8 , false ) ) ,
116
+ Arc :: new( Field :: new( "arg2" , DataType :: Utf8 , false ) ) ,
117
+ ] ;
118
+
119
+ let return_field = Arc :: new ( Field :: new ( "json_get_str" , DataType :: Utf8 , false ) ) ;
120
+
121
+ b. iter ( || {
122
+ json_get_str
123
+ . invoke_with_args ( ScalarFunctionArgs {
124
+ args : args. to_vec ( ) ,
125
+ arg_fields : arg_fields. clone ( ) ,
126
+ number_rows : 1 ,
127
+ return_field : return_field. clone ( ) ,
128
+ } )
129
+ . unwrap ( ) ;
47
130
} ) ;
48
131
}
49
132
50
133
fn criterion_benchmark ( c : & mut Criterion ) {
51
134
c. bench_function ( "json_contains" , bench_json_contains) ;
52
- c. bench_function ( "json_get_str" , bench_json_get_str) ;
135
+ c. bench_function ( "json_get_str_scalar" , bench_json_get_str_scalar) ;
136
+ c. bench_function ( "json_get_str_array" , bench_json_get_str_array) ;
137
+ c. bench_function ( "json_get_str_view_array" , bench_json_get_str_view_array) ;
53
138
}
54
139
55
140
criterion_group ! ( benches, criterion_benchmark) ;
0 commit comments