Change the format of custom ranking rules when importing v1 dumps

This commit is contained in:
Kerollmops 2021-09-07 16:55:35 +02:00
parent 33514b28be
commit 331d28102f
No known key found for this signature in database
GPG Key ID: 92ADA4E935E71FA4

View File

@ -138,6 +138,20 @@ fn load_index(
Ok(()) Ok(())
} }
/// Parses the v1 version of the Asc ranking rules `asc(price)`and returns the field name.
fn asc_ranking_rule(text: &str) -> Option<&str> {
text.split_once("asc(")
.and_then(|(_, tail)| tail.rsplit_once(")"))
.map(|(field, _)| field)
}
/// Parses the v1 version of the Desc ranking rules `asc(price)`and returns the field name.
fn desc_ranking_rule(text: &str) -> Option<&str> {
text.split_once("desc(")
.and_then(|(_, tail)| tail.rsplit_once(")"))
.map(|(field, _)| field)
}
/// we need to **always** be able to convert the old settings to the settings currently being used /// we need to **always** be able to convert the old settings to the settings currently being used
impl From<Settings> for index_controller::Settings<Unchecked> { impl From<Settings> for index_controller::Settings<Unchecked> {
fn from(settings: Settings) -> Self { fn from(settings: Settings) -> Self {
@ -164,19 +178,21 @@ impl From<Settings> for index_controller::Settings<Unchecked> {
None => Setting::NotSet None => Setting::NotSet
}, },
sortable_attributes: Setting::NotSet, sortable_attributes: Setting::NotSet,
// we need to convert the old `Vec<String>` into a `BTreeSet<String>`
ranking_rules: match settings.ranking_rules { ranking_rules: match settings.ranking_rules {
Some(Some(ranking_rules)) => Setting::Set(ranking_rules.into_iter().filter(|criterion| { Some(Some(ranking_rules)) => Setting::Set(ranking_rules.into_iter().filter_map(|criterion| {
match criterion.as_str() { match criterion.as_str() {
"words" | "typo" | "proximity" | "attribute" | "exactness" => true, "words" | "typo" | "proximity" | "attribute" | "exactness" => Some(criterion),
s if s.starts_with("asc") || s.starts_with("desc") => true, s if s.starts_with("asc") => asc_ranking_rule(s).map(|f| format!("{}:asc", f)),
s if s.starts_with("desc") => desc_ranking_rule(s).map(|f| format!("{}:desc", f)),
"wordsPosition" => { "wordsPosition" => {
warn!("The criteria `attribute` and `wordsPosition` have been merged into a single criterion `attribute` so `wordsPositon` will be ignored"); warn!("The criteria `attribute` and `wordsPosition` have been merged \
false into a single criterion `attribute` so `wordsPositon` will be \
ignored");
None
} }
s => { s => {
error!("Unknown criterion found in the dump: `{}`, it will be ignored", s); error!("Unknown criterion found in the dump: `{}`, it will be ignored", s);
false None
} }
} }
}).collect()), }).collect()),