@@ -27,24 +27,27 @@ fn build_expression(expression: Expr, filter: serde_json::Value) -> SimpleExpr {
27
27
"$gte" => expression. gte ( Expr :: val ( serde_value_to_sea_query_value ( value) ) ) ,
28
28
"$lt" => expression. lt ( Expr :: val ( serde_value_to_sea_query_value ( value) ) ) ,
29
29
"$lte" => expression. lte ( Expr :: val ( serde_value_to_sea_query_value ( value) ) ) ,
30
- "$in" =>{
30
+ e @ "$in" | e @ "$nin " =>{
31
31
let value = value
32
32
. as_array ( )
33
33
. expect ( "Invalid metadata filter configuration" )
34
34
. iter ( )
35
- // .map(|value| handle_value(value))
36
- . map ( |value|Expr :: val ( serde_value_to_sea_query_value ( value) ) )
37
- . collect :: < Vec < _ > > ( ) ;
38
- expression. is_in ( value)
39
- }
40
- "$nin" =>{
41
- let value = value
42
- . as_array ( )
43
- . expect ( "Invalid metadata filter configuration" )
44
- . iter ( )
45
- . map ( |value|Expr :: val ( serde_value_to_sea_query_value ( value) ) )
35
+ . map ( |value|{
36
+ if value. is_string ( ) {
37
+ value. as_str ( ) . unwrap ( ) . to_owned ( )
38
+ } else {
39
+ value. to_string ( )
40
+ }
41
+ } )
46
42
. collect :: < Vec < _ > > ( ) ;
47
- expression. is_not_in ( value)
43
+ let value_expr =Expr :: cust_with_values ( "$1" , [ value] ) ;
44
+ let expr =
45
+ Expr :: cust_with_exprs ( "$1 && $2" , [ SimpleExpr :: from ( expression) , value_expr] ) ;
46
+ if e =="$in" {
47
+ expr
48
+ } else {
49
+ expr. not ( )
50
+ }
48
51
}
49
52
_ =>panic ! ( "Invalid metadata filter configuration" ) ,
50
53
} ;
@@ -115,6 +118,15 @@ fn build_recursive<'a>(
115
118
. contains ( Expr :: val ( serde_value_to_sea_query_value ( & json) ) ) ;
116
119
expression. not ( )
117
120
}
121
+ } else if operator =="$in" || operator =="$nin" {
122
+ let expression =Expr :: cust (
123
+ format ! (
124
+ r#"ARRAY(SELECT JSONB_ARRAY_ELEMENTS_TEXT(JSONB_PATH_QUERY_ARRAY("{table_name}"."{column_name}", '$.{}[*]')))"# ,
125
+ local_path. join( "." )
126
+ ) . as_str ( )
127
+ ) ;
128
+ let expression =Expr :: expr ( expression) ;
129
+ build_expression ( expression, value. clone ( ) )
118
130
} else {
119
131
let expression =Expr :: cust (
120
132
format ! (
@@ -256,7 +268,6 @@ mod tests {
256
268
} ) )
257
269
. build ( ) ?
258
270
. to_valid_sql_query ( ) ;
259
- println ! ( "{sql}" ) ;
260
271
assert_eq ! (
261
272
sql,
262
273
format!(
@@ -270,25 +281,25 @@ mod tests {
270
281
271
282
#[ test]
272
283
fn array_comparison_operators ( ) -> anyhow:: Result < ( ) > {
273
- let array_comparison_operators =vec ! [ "IN" , "NOT IN" ] ;
274
284
let array_comparison_operators_names =vec ! [ "$in" , "$nin" ] ;
275
- for ( operator, name) in array_comparison_operators
276
- . into_iter ( )
277
- . zip ( array_comparison_operators_names. into_iter ( ) )
278
- {
285
+ for namein array_comparison_operators_names{
279
286
let sql =construct_filter_builder_with_json ( json ! ( {
280
- "id" : { name: [ 1 ] } ,
281
- "id2" : { "id3" : { name: [ 1 ] } }
287
+ "id" : { name: [ "key_1" , "key_2" , 10 ] } ,
288
+ "id2" : { "id3" : { name: [ "key_1" , false ] } }
282
289
} ) )
283
290
. build ( ) ?
284
291
. to_valid_sql_query ( ) ;
285
- assert_eq ! (
286
- sql,
287
- format!(
288
- r##"SELECT "id" FROM "test_table" WHERE ("test_table"."metadata"#>'{{id}}') {} ('1') AND ("test_table"."metadata"#>'{{id2,id3}}') {} ('1')"## ,
289
- operator, operator
290
- )
291
- ) ;
292
+ if name =="$in" {
293
+ assert_eq ! (
294
+ sql,
295
+ r#"SELECT "id" FROM "test_table" WHERE (ARRAY(SELECT JSONB_ARRAY_ELEMENTS_TEXT(JSONB_PATH_QUERY_ARRAY("test_table"."metadata", '$.id[*]'))) && ARRAY ['key_1','key_2','10']) AND (ARRAY(SELECT JSONB_ARRAY_ELEMENTS_TEXT(JSONB_PATH_QUERY_ARRAY("test_table"."metadata", '$.id2.id3[*]'))) && ARRAY ['key_1','false'])"#
296
+ ) ;
297
+ } else {
298
+ assert_eq ! (
299
+ sql,
300
+ r#"SELECT "id" FROM "test_table" WHERE (NOT (ARRAY(SELECT JSONB_ARRAY_ELEMENTS_TEXT(JSONB_PATH_QUERY_ARRAY("test_table"."metadata", '$.id[*]'))) && ARRAY ['key_1','key_2','10'])) AND (NOT (ARRAY(SELECT JSONB_ARRAY_ELEMENTS_TEXT(JSONB_PATH_QUERY_ARRAY("test_table"."metadata", '$.id2.id3[*]'))) && ARRAY ['key_1','false']))"#
301
+ ) ;
302
+ }
292
303
}
293
304
Ok ( ( ) )
294
305
}