Skip to content

Commit 6997eb6

Browse files
committed
Allow users to customize facet value sort behaviour
1 parent 241e797 commit 6997eb6

File tree

2 files changed

+131
-13
lines changed

2 files changed

+131
-13
lines changed

.code-samples.meilisearch.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,8 +580,12 @@ get_faceting_settings_1: |-
580580
.await
581581
.unwrap();
582582
update_faceting_settings_1: |-
583+
let mut facet_sort_setting = BTreeMap::new();
584+
facet_sort_setting.insert("*".to_string(), FacetSortValue::ALPHA);
585+
facet_sort_setting.insert("genres".to_string(), FacetSortValue::COUNT);
583586
let mut faceting = FacetingSettings {
584587
max_values_per_facet: 2,
588+
sort_facet_values_by: Some(facet_sort_setting),
585589
};
586590
587591
let task: TaskInfo = client
@@ -1248,8 +1252,11 @@ getting_started_sorting: |-
12481252
.await
12491253
.unwrap();
12501254
getting_started_faceting: |-
1255+
let mut facet_sort_setting = BTreeMap::new();
1256+
facet_sort_setting.insert("*".to_string(), FacetSortValue::COUNT);
12511257
let mut faceting = FacetingSettings {
12521258
max_values_per_facet: 2,
1259+
sort_facet_values_by: Some(facet_sort_setting),
12531260
};
12541261
12551262
let task: TaskInfo = client
@@ -1656,3 +1663,17 @@ multi_search_1: |-
16561663
.execute::<MovieRatings>()
16571664
.await
16581665
.unwrap();
1666+
facet_search_2: |-
1667+
let mut facet_sort_setting = BTreeMap::new();
1668+
facet_sort_setting.insert("genres".to_string(), FacetSortValue::COUNT);
1669+
let faceting = FacetingSettings {
1670+
max_values_per_facet: 5,
1671+
sort_facet_values_by: Some(facet_sort_setting),
1672+
};
1673+
1674+
let client = client::new("http://localhost:7700", Some("apiKey"));
1675+
let res = client.index("books")
1676+
.set_faceting(&faceting)
1677+
.execute()
1678+
.await
1679+
.unwrap();

src/settings.rs

Lines changed: 110 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::{
33
Error, Index, TaskInfo,
44
};
55
use 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")]
3341
pub 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

Comments
 (0)