@@ -5,7 +5,7 @@ use crate::{
55 task_info:: TaskInfo ,
66} ;
77use serde:: { Deserialize , Serialize } ;
8- use std:: collections:: HashMap ;
8+ use std:: collections:: { BTreeMap , HashMap } ;
99
1010#[ derive( Serialize , Deserialize , Default , Debug , Clone , PartialEq , Eq , Copy ) ]
1111#[ serde( rename_all = "camelCase" ) ]
@@ -30,10 +30,21 @@ pub struct TypoToleranceSettings {
3030 pub min_word_size_for_typos : Option < MinWordSizeForTypos > ,
3131}
3232
33- #[ derive( Serialize , Deserialize , Default , Debug , Clone , Eq , PartialEq , Copy ) ]
33+ #[ derive( Debug , Deserialize , Clone , Eq , PartialEq , Serialize ) ]
34+ #[ serde( rename_all = "camelCase" ) ]
35+ pub enum FacetSortValue {
36+ Alpha ,
37+ Count ,
38+ }
39+
40+ #[ derive( Serialize , Deserialize , Default , Debug , Clone , Eq , PartialEq ) ]
3441#[ serde( rename_all = "camelCase" ) ]
3542pub struct FacetingSettings {
43+ /// Maximum number of facet values returned for each facet. Values are sorted in ascending lexicographical order
3644 pub max_values_per_facet : usize ,
45+ /// Customize facet order to sort by descending value count (count) or ascending alphanumeric order (alpha)
46+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
47+ pub sort_facet_values_by : Option < BTreeMap < String , FacetSortValue > > ,
3748}
3849
3950#[ derive( Serialize , Deserialize , Default , Debug , Clone , Eq , PartialEq ) ]
@@ -278,9 +289,32 @@ impl Settings {
278289 }
279290
280291 #[ must_use]
281- pub fn with_faceting ( self , faceting : & FacetingSettings ) -> Settings {
292+ pub fn with_faceting ( self , faceting : FacetingSettings ) -> Settings {
282293 Settings {
283- faceting : Some ( * faceting) ,
294+ faceting : Some ( faceting) ,
295+ ..self
296+ }
297+ }
298+
299+ #[ must_use]
300+ pub fn with_max_values_per_facet ( mut self , max_values_per_facet : usize ) -> Settings {
301+ let mut faceting = self . faceting . take ( ) . unwrap_or_default ( ) ;
302+ faceting. max_values_per_facet = max_values_per_facet;
303+ Settings {
304+ faceting : Some ( faceting) ,
305+ ..self
306+ }
307+ }
308+
309+ #[ must_use]
310+ pub fn with_sort_facet_values_by (
311+ mut self ,
312+ sort_facet_values_by : BTreeMap < String , FacetSortValue > ,
313+ ) -> Settings {
314+ let mut faceting = self . faceting . take ( ) . unwrap_or_default ( ) ;
315+ faceting. sort_facet_values_by = Some ( sort_facet_values_by) ;
316+ Settings {
317+ faceting : Some ( faceting) ,
284318 ..self
285319 }
286320 }
@@ -1397,6 +1431,7 @@ impl<Http: HttpClient> Index<Http> {
13971431 ///
13981432 /// let mut faceting = FacetingSettings {
13991433 /// max_values_per_facet: 12,
1434+ /// sort_facet_values_by: None,
14001435 /// };
14011436 ///
14021437 /// let task = index.set_faceting(&faceting).await.unwrap();
@@ -2314,54 +2349,132 @@ mod tests {
23142349
23152350 #[ meilisearch_test]
23162351 async fn test_set_faceting_settings ( client : Client , index : Index ) {
2317- let faceting = FacetingSettings {
2352+ let settings = Settings :: new ( ) . with_max_values_per_facet ( 5 ) ;
2353+
2354+ let task_info = index. set_settings ( & settings) . await . unwrap ( ) ;
2355+ client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
2356+
2357+ let res = index. get_faceting ( ) . await . unwrap ( ) ;
2358+
2359+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2360+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: Alpha ) ;
2361+ let expected_faceting = FacetingSettings {
23182362 max_values_per_facet : 5 ,
2363+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
23192364 } ;
2320- let settings = Settings :: new ( ) . with_faceting ( & faceting) ;
2365+
2366+ assert_eq ! ( expected_faceting, res) ;
2367+ }
2368+
2369+ #[ meilisearch_test]
2370+ async fn test_set_faceting_settings_with_sort_values ( client : Client , index : Index ) {
2371+ let mut req_facet_sort_setting = BTreeMap :: new ( ) ;
2372+ req_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: Count ) ;
2373+ let req_faceting = FacetingSettings {
2374+ max_values_per_facet : 5 ,
2375+ sort_facet_values_by : Some ( req_facet_sort_setting) ,
2376+ } ;
2377+ let settings = Settings :: new ( ) . with_faceting ( req_faceting. clone ( ) ) ;
23212378
23222379 let task_info = index. set_settings ( & settings) . await . unwrap ( ) ;
23232380 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
23242381
23252382 let res = index. get_faceting ( ) . await . unwrap ( ) ;
23262383
2327- assert_eq ! ( faceting, res) ;
2384+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2385+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: Alpha ) ;
2386+ expected_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: Count ) ;
2387+ let expected_faceting = FacetingSettings {
2388+ max_values_per_facet : req_faceting. max_values_per_facet ,
2389+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2390+ } ;
2391+
2392+ assert_eq ! ( expected_faceting, res) ;
23282393 }
23292394
23302395 #[ meilisearch_test]
23312396 async fn test_get_faceting ( index : Index ) {
2332- let faceting = FacetingSettings {
2397+ let req_faceting = FacetingSettings {
23332398 max_values_per_facet : 100 ,
2399+ sort_facet_values_by : None ,
23342400 } ;
23352401
23362402 let res = index. get_faceting ( ) . await . unwrap ( ) ;
23372403
2338- assert_eq ! ( faceting, res) ;
2404+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2405+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: Alpha ) ;
2406+ let expected_faceting = FacetingSettings {
2407+ max_values_per_facet : req_faceting. max_values_per_facet ,
2408+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2409+ } ;
2410+
2411+ assert_eq ! ( expected_faceting, res) ;
23392412 }
23402413
23412414 #[ meilisearch_test]
23422415 async fn test_set_faceting ( client : Client , index : Index ) {
2343- let faceting = FacetingSettings {
2416+ let req_faceting = FacetingSettings {
2417+ max_values_per_facet : 5 ,
2418+ sort_facet_values_by : None ,
2419+ } ;
2420+ let task_info = index. set_faceting ( & req_faceting) . await . unwrap ( ) ;
2421+ client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
2422+
2423+ let res = index. get_faceting ( ) . await . unwrap ( ) ;
2424+
2425+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2426+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: Alpha ) ;
2427+ let expected_faceting = FacetingSettings {
2428+ max_values_per_facet : req_faceting. max_values_per_facet ,
2429+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2430+ } ;
2431+
2432+ assert_eq ! ( expected_faceting, res) ;
2433+ }
2434+
2435+ #[ meilisearch_test]
2436+ async fn test_set_faceting_with_sort_values ( client : Client , index : Index ) {
2437+ let mut req_facet_sort_setting = BTreeMap :: new ( ) ;
2438+ req_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: Count ) ;
2439+ let req_faceting = FacetingSettings {
23442440 max_values_per_facet : 5 ,
2441+ sort_facet_values_by : Some ( req_facet_sort_setting) ,
23452442 } ;
2346- let task_info = index. set_faceting ( & faceting ) . await . unwrap ( ) ;
2443+ let task_info = index. set_faceting ( & req_faceting ) . await . unwrap ( ) ;
23472444 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
23482445
23492446 let res = index. get_faceting ( ) . await . unwrap ( ) ;
23502447
2351- assert_eq ! ( faceting, res) ;
2448+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2449+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: Alpha ) ;
2450+ expected_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: Count ) ;
2451+ let expected_faceting = FacetingSettings {
2452+ max_values_per_facet : req_faceting. max_values_per_facet ,
2453+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2454+ } ;
2455+
2456+ assert_eq ! ( expected_faceting, res) ;
23522457 }
23532458
23542459 #[ meilisearch_test]
23552460 async fn test_reset_faceting ( client : Client , index : Index ) {
23562461 let task_info = index. reset_faceting ( ) . await . unwrap ( ) ;
23572462 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
2358- let faceting = FacetingSettings {
2463+ let req_faceting = FacetingSettings {
23592464 max_values_per_facet : 100 ,
2465+ sort_facet_values_by : None ,
23602466 } ;
23612467
23622468 let res = index. get_faceting ( ) . await . unwrap ( ) ;
23632469
2364- assert_eq ! ( faceting, res) ;
2470+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2471+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: Alpha ) ;
2472+ let expected_faceting = FacetingSettings {
2473+ max_values_per_facet : req_faceting. max_values_per_facet ,
2474+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2475+ } ;
2476+
2477+ assert_eq ! ( expected_faceting, res) ;
23652478 }
23662479
23672480 #[ meilisearch_test]
0 commit comments