@@ -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,20 @@ 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+ pub enum FacetSortValue {
35+ #[ serde( rename = "alpha" ) ]
36+ ALPHA ,
37+ #[ serde( rename = "count" ) ]
38+ COUNT ,
39+ }
40+
41+ #[ derive( Serialize , Deserialize , Default , Debug , Clone , Eq , PartialEq ) ]
3442#[ serde( rename_all = "camelCase" ) ]
3543pub struct FacetingSettings {
3644 pub max_values_per_facet : usize ,
45+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
46+ pub sort_facet_values_by : Option < BTreeMap < String , FacetSortValue > > ,
3747}
3848
3949#[ derive( Serialize , Deserialize , Default , Debug , Clone , Eq , PartialEq ) ]
@@ -279,8 +289,12 @@ impl Settings {
279289
280290 #[ must_use]
281291 pub fn with_faceting ( self , faceting : & FacetingSettings ) -> Settings {
292+ let faceting_clone = FacetingSettings {
293+ max_values_per_facet : faceting. max_values_per_facet ,
294+ sort_facet_values_by : faceting. sort_facet_values_by . clone ( ) ,
295+ } ;
282296 Settings {
283- faceting : Some ( * faceting ) ,
297+ faceting : Some ( faceting_clone ) ,
284298 ..self
285299 }
286300 }
@@ -1397,6 +1411,7 @@ impl<Http: HttpClient> Index<Http> {
13971411 ///
13981412 /// let mut faceting = FacetingSettings {
13991413 /// max_values_per_facet: 12,
1414+ /// sort_facet_values_by: None,
14001415 /// };
14011416 ///
14021417 /// let task = index.set_faceting(&faceting).await.unwrap();
@@ -2314,54 +2329,136 @@ mod tests {
23142329
23152330 #[ meilisearch_test]
23162331 async fn test_set_faceting_settings ( client : Client , index : Index ) {
2317- let faceting = FacetingSettings {
2332+ let req_faceting = FacetingSettings {
23182333 max_values_per_facet : 5 ,
2334+ sort_facet_values_by : None ,
23192335 } ;
2320- let settings = Settings :: new ( ) . with_faceting ( & faceting ) ;
2336+ let settings = Settings :: new ( ) . with_faceting ( & req_faceting ) ;
23212337
23222338 let task_info = index. set_settings ( & settings) . await . unwrap ( ) ;
23232339 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
23242340
23252341 let res = index. get_faceting ( ) . await . unwrap ( ) ;
23262342
2327- assert_eq ! ( faceting, res) ;
2343+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2344+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
2345+ let expected_faceting = FacetingSettings {
2346+ max_values_per_facet : req_faceting. max_values_per_facet ,
2347+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2348+ } ;
2349+
2350+ assert_eq ! ( expected_faceting, res) ;
2351+ }
2352+
2353+ #[ meilisearch_test]
2354+ async fn test_set_faceting_settings_with_sort_values ( client : Client , index : Index ) {
2355+ let mut req_facet_sort_setting = BTreeMap :: new ( ) ;
2356+ req_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: COUNT ) ;
2357+ let req_faceting = FacetingSettings {
2358+ max_values_per_facet : 5 ,
2359+ sort_facet_values_by : Some ( req_facet_sort_setting) ,
2360+ } ;
2361+ let settings = Settings :: new ( ) . with_faceting ( & req_faceting) ;
2362+
2363+ let task_info = index. set_settings ( & settings) . await . unwrap ( ) ;
2364+ client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
2365+
2366+ let res = index. get_faceting ( ) . await . unwrap ( ) ;
2367+
2368+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2369+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
2370+ expected_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: COUNT ) ;
2371+ let expected_faceting = FacetingSettings {
2372+ max_values_per_facet : req_faceting. max_values_per_facet ,
2373+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2374+ } ;
2375+
2376+ assert_eq ! ( expected_faceting, res) ;
23282377 }
23292378
23302379 #[ meilisearch_test]
23312380 async fn test_get_faceting ( index : Index ) {
2332- let faceting = FacetingSettings {
2381+ let req_faceting = FacetingSettings {
23332382 max_values_per_facet : 100 ,
2383+ sort_facet_values_by : None ,
23342384 } ;
23352385
23362386 let res = index. get_faceting ( ) . await . unwrap ( ) ;
23372387
2338- assert_eq ! ( faceting, res) ;
2388+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2389+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
2390+ let expected_faceting = FacetingSettings {
2391+ max_values_per_facet : req_faceting. max_values_per_facet ,
2392+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2393+ } ;
2394+
2395+ assert_eq ! ( expected_faceting, res) ;
23392396 }
23402397
23412398 #[ meilisearch_test]
23422399 async fn test_set_faceting ( client : Client , index : Index ) {
2343- let faceting = FacetingSettings {
2400+ let req_faceting = FacetingSettings {
2401+ max_values_per_facet : 5 ,
2402+ sort_facet_values_by : None ,
2403+ } ;
2404+ let task_info = index. set_faceting ( & req_faceting) . await . unwrap ( ) ;
2405+ client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
2406+
2407+ let res = index. get_faceting ( ) . await . unwrap ( ) ;
2408+
2409+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2410+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
2411+ let expected_faceting = FacetingSettings {
2412+ max_values_per_facet : req_faceting. max_values_per_facet ,
2413+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2414+ } ;
2415+
2416+ assert_eq ! ( expected_faceting, res) ;
2417+ }
2418+
2419+ #[ meilisearch_test]
2420+ async fn test_set_faceting_with_sort_values ( client : Client , index : Index ) {
2421+ let mut req_facet_sort_setting = BTreeMap :: new ( ) ;
2422+ req_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: COUNT ) ;
2423+ let req_faceting = FacetingSettings {
23442424 max_values_per_facet : 5 ,
2425+ sort_facet_values_by : Some ( req_facet_sort_setting) ,
23452426 } ;
2346- let task_info = index. set_faceting ( & faceting ) . await . unwrap ( ) ;
2427+ let task_info = index. set_faceting ( & req_faceting ) . await . unwrap ( ) ;
23472428 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
23482429
23492430 let res = index. get_faceting ( ) . await . unwrap ( ) ;
23502431
2351- assert_eq ! ( faceting, res) ;
2432+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2433+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
2434+ expected_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: COUNT ) ;
2435+ let expected_faceting = FacetingSettings {
2436+ max_values_per_facet : req_faceting. max_values_per_facet ,
2437+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2438+ } ;
2439+
2440+ assert_eq ! ( expected_faceting, res) ;
23522441 }
23532442
23542443 #[ meilisearch_test]
23552444 async fn test_reset_faceting ( client : Client , index : Index ) {
23562445 let task_info = index. reset_faceting ( ) . await . unwrap ( ) ;
23572446 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
2358- let faceting = FacetingSettings {
2447+ let req_faceting = FacetingSettings {
23592448 max_values_per_facet : 100 ,
2449+ sort_facet_values_by : None ,
23602450 } ;
23612451
23622452 let res = index. get_faceting ( ) . await . unwrap ( ) ;
23632453
2364- assert_eq ! ( faceting, res) ;
2454+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
2455+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
2456+ let expected_faceting = FacetingSettings {
2457+ max_values_per_facet : req_faceting. max_values_per_facet ,
2458+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
2459+ } ;
2460+
2461+ assert_eq ! ( expected_faceting, res) ;
23652462 }
23662463
23672464 #[ meilisearch_test]
0 commit comments