1
1
use crate :: { errors:: Error , indexes:: Index } ;
2
2
use serde:: { de:: DeserializeOwned , Deserialize , Serialize , Serializer } ;
3
+ use serde:: ser:: { SerializeSeq } ;
3
4
use serde_json:: { Map , Value } ;
4
5
use std:: collections:: HashMap ;
5
6
@@ -9,6 +10,32 @@ pub struct MatchRange {
9
10
pub length : usize ,
10
11
}
11
12
13
+ #[ derive( Debug , Eq , PartialEq , Clone ) ]
14
+ pub enum Filter < ' a > {
15
+ String ( & ' a str ) ,
16
+ Array ( Vec < & ' a str > )
17
+ }
18
+
19
+ impl < ' a > Serialize for Filter < ' a > {
20
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
21
+ where
22
+ S : Serializer
23
+ {
24
+ match self {
25
+ Filter :: String ( s) => serializer. serialize_str ( s) ,
26
+ Filter :: Array ( s) => {
27
+ let mut seq = serializer. serialize_seq ( Some ( s. len ( ) ) ) ?;
28
+
29
+ for item in s {
30
+ seq. serialize_element ( item) ?;
31
+ }
32
+
33
+ seq. end ( )
34
+ } ,
35
+ }
36
+ }
37
+ }
38
+
12
39
#[ derive( Debug , Clone , Serialize ) ]
13
40
pub enum MatchingStrategies {
14
41
#[ serde( rename = "all" ) ]
@@ -182,7 +209,7 @@ pub struct SearchQuery<'a> {
182
209
/// Filter applied to documents.
183
210
/// Read the [dedicated guide](https://docs.meilisearch.com/reference/features/filtering.html) to learn the syntax.
184
211
#[ serde( skip_serializing_if = "Option::is_none" ) ]
185
- pub filter : Option < & ' a str > ,
212
+ pub filter : Option < Filter < ' a > > ,
186
213
/// Facets for which to retrieve the matching count.
187
214
///
188
215
/// Can be set to a [wildcard value](enum.Selectors.html#variant.All) that will select all existing attributes.
@@ -284,7 +311,11 @@ impl<'a> SearchQuery<'a> {
284
311
self
285
312
}
286
313
pub fn with_filter < ' b > ( & ' b mut self , filter : & ' a str ) -> & ' b mut SearchQuery < ' a > {
287
- self . filter = Some ( filter) ;
314
+ self . filter = Some ( Filter :: String ( filter) ) ;
315
+ self
316
+ }
317
+ pub fn with_array_filter < ' b > ( & ' b mut self , filter : Vec < & ' a str > ) -> & ' b mut SearchQuery < ' a > {
318
+ self . filter = Some ( Filter :: Array ( filter) ) ;
288
319
self
289
320
}
290
321
pub fn with_facets < ' b > (
@@ -499,6 +530,21 @@ mod tests {
499
530
Ok ( ( ) )
500
531
}
501
532
533
+ #[ meilisearch_test]
534
+ async fn test_query_filter_with_array ( client : Client , index : Index ) -> Result < ( ) , Error > {
535
+ setup_test_index ( & client, & index) . await ?;
536
+
537
+ let results: SearchResults < Document > = index
538
+ . search ( )
539
+ . with_array_filter ( vec ! [ "value = \" The Social Network\" " , "value = \" The Social Network\" " ] )
540
+ . execute ( )
541
+ . await ?;
542
+ assert_eq ! ( results. hits. len( ) , 1 ) ;
543
+
544
+ Ok ( ( ) )
545
+ }
546
+
547
+
502
548
#[ meilisearch_test]
503
549
async fn test_query_facet_distribution ( client : Client , index : Index ) -> Result < ( ) , Error > {
504
550
setup_test_index ( & client, & index) . await ?;
0 commit comments