Skip to content

Commit 7ca56dc

Browse files
authored
Merge pull request #514 from hmacr/issue-502
Allow users to customize facet value sort behaviour
2 parents 6eb41e8 + facc65c commit 7ca56dc

File tree

2 files changed

+132
-14
lines changed

2 files changed

+132
-14
lines changed

.code-samples.meilisearch.yaml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,8 +581,12 @@ get_faceting_settings_1: |-
581581
.await
582582
.unwrap();
583583
update_faceting_settings_1: |-
584+
let mut facet_sort_setting = BTreeMap::new();
585+
facet_sort_setting.insert("*".to_string(), FacetSortValue::ALPHA);
586+
facet_sort_setting.insert("genres".to_string(), FacetSortValue::COUNT);
584587
let mut faceting = FacetingSettings {
585588
max_values_per_facet: 2,
589+
sort_facet_values_by: Some(facet_sort_setting),
586590
};
587591
588592
let task: TaskInfo = client
@@ -1265,8 +1269,11 @@ getting_started_sorting: |-
12651269
.await
12661270
.unwrap();
12671271
getting_started_faceting: |-
1272+
let mut facet_sort_setting = BTreeMap::new();
1273+
facet_sort_setting.insert("*".to_string(), FacetSortValue::COUNT);
12681274
let mut faceting = FacetingSettings {
12691275
max_values_per_facet: 2,
1276+
sort_facet_values_by: Some(facet_sort_setting),
12701277
};
12711278
12721279
let task: TaskInfo = client
@@ -1671,6 +1678,20 @@ facet_search_1: |-
16711678
.execute()
16721679
.await
16731680
.unwrap();
1681+
facet_search_2: |-
1682+
let mut facet_sort_setting = BTreeMap::new();
1683+
facet_sort_setting.insert("genres".to_string(), FacetSortValue::COUNT);
1684+
let faceting = FacetingSettings {
1685+
max_values_per_facet: 5,
1686+
sort_facet_values_by: Some(facet_sort_setting),
1687+
};
1688+
1689+
let client = client::new("http://localhost:7700", Some("apiKey"));
1690+
let res = client.index("books")
1691+
.set_faceting(&faceting)
1692+
.execute()
1693+
.await
1694+
.unwrap();
16741695
facet_search_3: |-
16751696
let res = client.index("books")
16761697
.facet_search("genres")
@@ -1766,4 +1787,4 @@ reset_localized_attribute_settings_1: |-
17661787
.index("books")
17671788
.reset_localized_attributes()
17681789
.await
1769-
.unwrap();
1790+
.unwrap();

src/settings.rs

Lines changed: 110 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
task_info::TaskInfo,
66
};
77
use 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")]
3543
pub 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

Comments
 (0)