@@ -3,7 +3,7 @@ use crate::{
33 Error , Index , TaskInfo ,
44} ;
55use serde:: { Deserialize , Serialize } ;
6- use std:: collections:: HashMap ;
6+ use std:: collections:: { BTreeMap , HashMap } ;
77
88#[ derive( Serialize , Deserialize , Default , Debug , Clone , PartialEq , Eq , Copy ) ]
99#[ serde( rename_all = "camelCase" ) ]
@@ -28,10 +28,20 @@ pub struct TypoToleranceSettings {
2828 pub min_word_size_for_typos : Option < MinWordSizeForTypos > ,
2929}
3030
31- #[ derive( Serialize , Deserialize , Default , Debug , Clone , Eq , PartialEq , Copy ) ]
31+ #[ derive( Debug , Deserialize , Clone , Eq , PartialEq , Serialize ) ]
32+ pub enum FacetSortValue {
33+ #[ serde( rename = "alpha" ) ]
34+ ALPHA ,
35+ #[ serde( rename = "count" ) ]
36+ COUNT ,
37+ }
38+
39+ #[ derive( Serialize , Deserialize , Default , Debug , Clone , Eq , PartialEq ) ]
3240#[ serde( rename_all = "camelCase" ) ]
3341pub struct FacetingSettings {
3442 pub max_values_per_facet : usize ,
43+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
44+ pub sort_facet_values_by : Option < BTreeMap < String , FacetSortValue > > ,
3545}
3646
3747/// Struct reprensenting a set of settings.
@@ -238,8 +248,12 @@ impl Settings {
238248 }
239249
240250 pub fn with_faceting ( self , faceting : & FacetingSettings ) -> Settings {
251+ let faceting_clone = FacetingSettings {
252+ max_values_per_facet : faceting. max_values_per_facet ,
253+ sort_facet_values_by : faceting. sort_facet_values_by . clone ( ) ,
254+ } ;
241255 Settings {
242- faceting : Some ( * faceting ) ,
256+ faceting : Some ( faceting_clone ) ,
243257 ..self
244258 }
245259 }
@@ -1067,6 +1081,7 @@ impl Index {
10671081 ///
10681082 /// let mut faceting = FacetingSettings {
10691083 /// max_values_per_facet: 12,
1084+ /// sort_facet_values_by: None,
10701085 /// };
10711086 ///
10721087 /// let task = index.set_faceting(&faceting).await.unwrap();
@@ -1529,54 +1544,136 @@ mod tests {
15291544
15301545 #[ meilisearch_test]
15311546 async fn test_set_faceting_settings ( client : Client , index : Index ) {
1532- let faceting = FacetingSettings {
1547+ let req_faceting = FacetingSettings {
1548+ max_values_per_facet : 5 ,
1549+ sort_facet_values_by : None ,
1550+ } ;
1551+ let settings = Settings :: new ( ) . with_faceting ( & req_faceting) ;
1552+
1553+ let task_info = index. set_settings ( & settings) . await . unwrap ( ) ;
1554+ client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
1555+
1556+ let res = index. get_faceting ( ) . await . unwrap ( ) ;
1557+
1558+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
1559+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
1560+ let expected_faceting = FacetingSettings {
1561+ max_values_per_facet : req_faceting. max_values_per_facet ,
1562+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
1563+ } ;
1564+
1565+ assert_eq ! ( expected_faceting, res) ;
1566+ }
1567+
1568+ #[ meilisearch_test]
1569+ async fn test_set_faceting_settings_with_sort_values ( client : Client , index : Index ) {
1570+ let mut req_facet_sort_setting = BTreeMap :: new ( ) ;
1571+ req_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: COUNT ) ;
1572+ let req_faceting = FacetingSettings {
15331573 max_values_per_facet : 5 ,
1574+ sort_facet_values_by : Some ( req_facet_sort_setting) ,
15341575 } ;
1535- let settings = Settings :: new ( ) . with_faceting ( & faceting ) ;
1576+ let settings = Settings :: new ( ) . with_faceting ( & req_faceting ) ;
15361577
15371578 let task_info = index. set_settings ( & settings) . await . unwrap ( ) ;
15381579 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
15391580
15401581 let res = index. get_faceting ( ) . await . unwrap ( ) ;
15411582
1542- assert_eq ! ( faceting, res) ;
1583+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
1584+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
1585+ expected_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: COUNT ) ;
1586+ let expected_faceting = FacetingSettings {
1587+ max_values_per_facet : req_faceting. max_values_per_facet ,
1588+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
1589+ } ;
1590+
1591+ assert_eq ! ( expected_faceting, res) ;
15431592 }
15441593
15451594 #[ meilisearch_test]
15461595 async fn test_get_faceting ( index : Index ) {
1547- let faceting = FacetingSettings {
1596+ let req_faceting = FacetingSettings {
15481597 max_values_per_facet : 100 ,
1598+ sort_facet_values_by : None ,
15491599 } ;
15501600
15511601 let res = index. get_faceting ( ) . await . unwrap ( ) ;
15521602
1553- assert_eq ! ( faceting, res) ;
1603+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
1604+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
1605+ let expected_faceting = FacetingSettings {
1606+ max_values_per_facet : req_faceting. max_values_per_facet ,
1607+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
1608+ } ;
1609+
1610+ assert_eq ! ( expected_faceting, res) ;
15541611 }
15551612
15561613 #[ meilisearch_test]
15571614 async fn test_set_faceting ( client : Client , index : Index ) {
1558- let faceting = FacetingSettings {
1615+ let req_faceting = FacetingSettings {
1616+ max_values_per_facet : 5 ,
1617+ sort_facet_values_by : None ,
1618+ } ;
1619+ let task_info = index. set_faceting ( & req_faceting) . await . unwrap ( ) ;
1620+ client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
1621+
1622+ let res = index. get_faceting ( ) . await . unwrap ( ) ;
1623+
1624+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
1625+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
1626+ let expected_faceting = FacetingSettings {
1627+ max_values_per_facet : req_faceting. max_values_per_facet ,
1628+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
1629+ } ;
1630+
1631+ assert_eq ! ( expected_faceting, res) ;
1632+ }
1633+
1634+ #[ meilisearch_test]
1635+ async fn test_set_faceting_with_sort_values ( client : Client , index : Index ) {
1636+ let mut req_facet_sort_setting = BTreeMap :: new ( ) ;
1637+ req_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: COUNT ) ;
1638+ let req_faceting = FacetingSettings {
15591639 max_values_per_facet : 5 ,
1640+ sort_facet_values_by : Some ( req_facet_sort_setting) ,
15601641 } ;
1561- let task_info = index. set_faceting ( & faceting ) . await . unwrap ( ) ;
1642+ let task_info = index. set_faceting ( & req_faceting ) . await . unwrap ( ) ;
15621643 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
15631644
15641645 let res = index. get_faceting ( ) . await . unwrap ( ) ;
15651646
1566- assert_eq ! ( faceting, res) ;
1647+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
1648+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
1649+ expected_facet_sort_setting. insert ( "genres" . to_string ( ) , FacetSortValue :: COUNT ) ;
1650+ let expected_faceting = FacetingSettings {
1651+ max_values_per_facet : req_faceting. max_values_per_facet ,
1652+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
1653+ } ;
1654+
1655+ assert_eq ! ( expected_faceting, res) ;
15671656 }
15681657
15691658 #[ meilisearch_test]
15701659 async fn test_reset_faceting ( client : Client , index : Index ) {
15711660 let task_info = index. reset_faceting ( ) . await . unwrap ( ) ;
15721661 client. wait_for_task ( task_info, None , None ) . await . unwrap ( ) ;
1573- let faceting = FacetingSettings {
1662+ let req_faceting = FacetingSettings {
15741663 max_values_per_facet : 100 ,
1664+ sort_facet_values_by : None ,
15751665 } ;
15761666
15771667 let res = index. get_faceting ( ) . await . unwrap ( ) ;
15781668
1579- assert_eq ! ( faceting, res) ;
1669+ let mut expected_facet_sort_setting = BTreeMap :: new ( ) ;
1670+ expected_facet_sort_setting. insert ( "*" . to_string ( ) , FacetSortValue :: ALPHA ) ;
1671+ let expected_faceting = FacetingSettings {
1672+ max_values_per_facet : req_faceting. max_values_per_facet ,
1673+ sort_facet_values_by : Some ( expected_facet_sort_setting) ,
1674+ } ;
1675+
1676+ assert_eq ! ( expected_faceting, res) ;
15801677 }
15811678
15821679 #[ meilisearch_test]
0 commit comments