11use criterion:: { black_box, criterion_group, criterion_main, BenchmarkId , Criterion , Throughput } ;
2- use nexum_core:: executor:: filter:: ExpressionEvaluator ;
3- use nexum_core:: sql:: types:: Value ;
42use sqlparser:: ast:: { Expr , Statement } ;
53use sqlparser:: dialect:: GenericDialect ;
64use sqlparser:: parser:: Parser ;
75
6+ use nexum_core:: executor:: filter:: ExpressionEvaluator ;
7+ use nexum_core:: sql:: types:: Value ;
8+
89fn create_test_row ( id : i64 , name : & str , age : i64 , salary : f64 , active : bool ) -> Vec < Value > {
910 vec ! [
1011 Value :: Integer ( id) ,
@@ -18,7 +19,7 @@ fn create_test_row(id: i64, name: &str, age: i64, salary: f64, active: bool) ->
1819fn parse_where_clause ( sql : & str ) -> Expr {
1920 let dialect = GenericDialect { } ;
2021 let ast = Parser :: parse_sql ( & dialect, & format ! ( "SELECT * FROM t WHERE {}" , sql) ) . unwrap ( ) ;
21-
22+
2223 if let Statement :: Query ( query) = & ast[ 0 ] {
2324 if let sqlparser:: ast:: SetExpr :: Select ( select) = & * query. body {
2425 if let Some ( where_expr) = & select. selection {
@@ -31,7 +32,7 @@ fn parse_where_clause(sql: &str) -> Expr {
3132
3233fn filter_simple_comparisons_benchmark ( c : & mut Criterion ) {
3334 let mut group = c. benchmark_group ( "filter_simple_comparisons" ) ;
34-
35+
3536 let column_names = vec ! [
3637 "id" . to_string( ) ,
3738 "name" . to_string( ) ,
@@ -40,7 +41,7 @@ fn filter_simple_comparisons_benchmark(c: &mut Criterion) {
4041 "active" . to_string( ) ,
4142 ] ;
4243 let evaluator = ExpressionEvaluator :: new ( column_names) ;
43-
44+
4445 let test_cases = vec ! [
4546 ( "integer_eq" , "id = 1000" , create_test_row( 1000 , "John" , 30 , 50000.0 , true ) ) ,
4647 ( "integer_gt" , "age > 25" , create_test_row( 1 , "Jane" , 30 , 60000.0 , true ) ) ,
@@ -49,23 +50,23 @@ fn filter_simple_comparisons_benchmark(c: &mut Criterion) {
4950 ( "text_eq" , "name = 'John'" , create_test_row( 4 , "John" , 28 , 52000.0 , true ) ) ,
5051 ( "boolean_eq" , "active = true" , create_test_row( 5 , "Mary" , 32 , 58000.0 , true ) ) ,
5152 ] ;
52-
53+
5354 for ( test_name, sql, row_data) in test_cases {
5455 let where_expr = parse_where_clause ( sql) ;
55-
56+
5657 group. bench_function ( test_name, |b| {
5758 b. iter ( || {
5859 black_box ( evaluator. evaluate ( & where_expr, & row_data) . unwrap ( ) ) ;
5960 } ) ;
6061 } ) ;
6162 }
62-
63+
6364 group. finish ( ) ;
6465}
6566
6667fn filter_complex_expressions_benchmark ( c : & mut Criterion ) {
6768 let mut group = c. benchmark_group ( "filter_complex_expressions" ) ;
68-
69+
6970 let column_names = vec ! [
7071 "id" . to_string( ) ,
7172 "name" . to_string( ) ,
@@ -74,7 +75,7 @@ fn filter_complex_expressions_benchmark(c: &mut Criterion) {
7475 "active" . to_string( ) ,
7576 ] ;
7677 let evaluator = ExpressionEvaluator :: new ( column_names) ;
77-
78+
7879 let test_cases = vec ! [
7980 (
8081 "and_condition" ,
@@ -102,26 +103,26 @@ fn filter_complex_expressions_benchmark(c: &mut Criterion) {
102103 create_test_row( 5 , "John" , 32 , 58000.0 , true ) ,
103104 ) ,
104105 ] ;
105-
106+
106107 for ( test_name, sql, row_data) in test_cases {
107108 let where_expr = parse_where_clause ( sql) ;
108-
109+
109110 group. bench_function ( test_name, |b| {
110111 b. iter ( || {
111112 black_box ( evaluator. evaluate ( & where_expr, & row_data) . unwrap ( ) ) ;
112113 } ) ;
113114 } ) ;
114115 }
115-
116+
116117 group. finish ( ) ;
117118}
118119
119120fn filter_like_patterns_benchmark ( c : & mut Criterion ) {
120121 let mut group = c. benchmark_group ( "filter_like_patterns" ) ;
121-
122+
122123 let column_names = vec ! [ "name" . to_string( ) , "email" . to_string( ) ] ;
123124 let evaluator = ExpressionEvaluator :: new ( column_names) ;
124-
125+
125126 let test_cases = vec ! [
126127 (
127128 "prefix_match" ,
@@ -149,39 +150,39 @@ fn filter_like_patterns_benchmark(c: &mut Criterion) {
149150 vec![ Value :: Text ( "Bob Wilson" . to_string( ) ) , Value :: Text ( "bob@company.com" . to_string( ) ) ] ,
150151 ) ,
151152 ] ;
152-
153+
153154 for ( test_name, sql, row_data) in test_cases {
154155 let where_expr = parse_where_clause ( sql) ;
155-
156+
156157 group. bench_function ( test_name, |b| {
157158 b. iter ( || {
158159 black_box ( evaluator. evaluate ( & where_expr, & row_data) . unwrap ( ) ) ;
159160 } ) ;
160161 } ) ;
161162 }
162-
163+
163164 group. finish ( ) ;
164165}
165166
166167fn filter_in_list_benchmark ( c : & mut Criterion ) {
167168 let mut group = c. benchmark_group ( "filter_in_list" ) ;
168-
169+
169170 let column_names = vec ! [ "id" . to_string( ) , "status" . to_string( ) ] ;
170171 let evaluator = ExpressionEvaluator :: new ( column_names) ;
171-
172+
172173 for list_size in [ 5 , 10 , 50 , 100 ] . iter ( ) {
173174 let mut id_list = Vec :: new ( ) ;
174175 for i in 0 ..* list_size {
175176 id_list. push ( i. to_string ( ) ) ;
176177 }
177178 let sql = format ! ( "id IN ({})" , id_list. join( ", " ) ) ;
178179 let where_expr = parse_where_clause ( & sql) ;
179-
180+
180181 let row_data = vec ! [
181182 Value :: Integer ( * list_size / 2 ) , // Should be found in the middle
182183 Value :: Text ( "active" . to_string( ) ) ,
183184 ] ;
184-
185+
185186 group. bench_with_input (
186187 BenchmarkId :: new ( "id_in_list" , list_size) ,
187188 & where_expr,
@@ -192,30 +193,30 @@ fn filter_in_list_benchmark(c: &mut Criterion) {
192193 } ,
193194 ) ;
194195 }
195-
196+
196197 // Test string IN lists
197198 let status_sql = "status IN ('active', 'pending', 'inactive', 'suspended', 'archived')" ;
198199 let status_expr = parse_where_clause ( status_sql) ;
199200 let status_row = vec ! [
200201 Value :: Integer ( 1 ) ,
201202 Value :: Text ( "active" . to_string( ) ) ,
202203 ] ;
203-
204+
204205 group. bench_function ( "string_in_list" , |b| {
205206 b. iter ( || {
206207 black_box ( evaluator. evaluate ( & status_expr, & status_row) . unwrap ( ) ) ;
207208 } ) ;
208209 } ) ;
209-
210+
210211 group. finish ( ) ;
211212}
212213
213214fn filter_between_benchmark ( c : & mut Criterion ) {
214215 let mut group = c. benchmark_group ( "filter_between" ) ;
215-
216+
216217 let column_names = vec ! [ "age" . to_string( ) , "salary" . to_string( ) , "score" . to_string( ) ] ;
217218 let evaluator = ExpressionEvaluator :: new ( column_names) ;
218-
219+
219220 let test_cases = vec ! [
220221 (
221222 "integer_between" ,
@@ -233,24 +234,24 @@ fn filter_between_benchmark(c: &mut Criterion) {
233234 vec![ Value :: Integer ( 28 ) , Value :: Float ( 52000.0 ) , Value :: Float ( 88.7 ) ] ,
234235 ) ,
235236 ] ;
236-
237+
237238 for ( test_name, sql, row_data) in test_cases {
238239 let where_expr = parse_where_clause ( sql) ;
239-
240+
240241 group. bench_function ( test_name, |b| {
241242 b. iter ( || {
242243 black_box ( evaluator. evaluate ( & where_expr, & row_data) . unwrap ( ) ) ;
243244 } ) ;
244245 } ) ;
245246 }
246-
247+
247248 group. finish ( ) ;
248249}
249250
250251fn filter_batch_evaluation_benchmark ( c : & mut Criterion ) {
251252 let mut group = c. benchmark_group ( "filter_batch_evaluation" ) ;
252253 group. sample_size ( 10 ) ; // Reduce sample size for large datasets
253-
254+
254255 let column_names = vec ! [
255256 "id" . to_string( ) ,
256257 "name" . to_string( ) ,
@@ -259,7 +260,7 @@ fn filter_batch_evaluation_benchmark(c: &mut Criterion) {
259260 "active" . to_string( ) ,
260261 ] ;
261262 let evaluator = ExpressionEvaluator :: new ( column_names) ;
262-
263+
263264 // Create test data (reduced from 10k to 5k)
264265 let mut test_rows = Vec :: new ( ) ;
265266 for i in 0 ..5000 {
@@ -271,19 +272,19 @@ fn filter_batch_evaluation_benchmark(c: &mut Criterion) {
271272 i % 2 == 0 ,
272273 ) ) ;
273274 }
274-
275+
275276 let filters = vec ! [
276277 ( "simple_filter" , "age > 30" ) ,
277278 ( "complex_filter" , "age > 25 AND salary > 50000.0 AND active = true" ) ,
278279 ( "like_filter" , "name LIKE 'User1%'" ) ,
279280 ( "range_filter" , "age BETWEEN 25 AND 45 AND salary BETWEEN 40000.0 AND 70000.0" ) ,
280281 ] ;
281-
282+
282283 for ( filter_name, sql) in filters {
283284 let where_expr = parse_where_clause ( sql) ;
284-
285+
285286 group. throughput ( Throughput :: Elements ( test_rows. len ( ) as u64 ) ) ;
286-
287+
287288 group. bench_with_input (
288289 BenchmarkId :: new ( "5k_rows" , filter_name) ,
289290 & where_expr,
@@ -300,7 +301,7 @@ fn filter_batch_evaluation_benchmark(c: &mut Criterion) {
300301 } ,
301302 ) ;
302303 }
303-
304+
304305 group. finish ( ) ;
305306}
306307
0 commit comments