feat(all): introduce disable typos

This commit is contained in:
ad hoc 2022-03-17 11:59:35 +01:00
parent 09734f0732
commit 981fba5b44
No known key found for this signature in database
GPG Key ID: 4F00A782990CC643
5 changed files with 395 additions and 221 deletions

567
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -161,6 +161,13 @@ make_setting_route!(
"displayedAttributes"
);
make_setting_route!(
"/typo",
meilisearch_lib::index::updates::TypoSettings,
typo,
"typo"
);
make_setting_route!(
"/searchable-attributes",
Vec<String>,
@ -246,7 +253,8 @@ generate_configure!(
distinct_attribute,
stop_words,
synonyms,
ranking_rules
ranking_rules,
typo
);
pub async fn update_all(

View File

@ -43,7 +43,7 @@ async fn get_settings() {
let (response, code) = index.settings().await;
assert_eq!(code, 200);
let settings = response.as_object().unwrap();
assert_eq!(settings.keys().len(), 8);
assert_eq!(settings.keys().len(), 9);
assert_eq!(settings["displayedAttributes"], json!(["*"]));
assert_eq!(settings["searchableAttributes"], json!(["*"]));
assert_eq!(settings["filterableAttributes"], json!([]));

View File

@ -17,6 +17,7 @@ use crate::EnvSizer;
use super::error::IndexError;
use super::error::Result;
use super::updates::TypoSettings;
use super::{Checked, Settings};
pub type Document = Map<String, Value>;
@ -168,6 +169,10 @@ impl Index {
})
.collect();
let typo_tolerance = TypoSettings {
enabled: Setting::Set(self.authorize_typos(txn)?),
};
Ok(Settings {
displayed_attributes: match displayed_attributes {
Some(attrs) => Setting::Set(attrs),
@ -186,6 +191,7 @@ impl Index {
None => Setting::Reset,
},
synonyms: Setting::Set(synonyms),
typo: Setting::Set(typo_tolerance),
_kind: PhantomData,
})
}

View File

@ -37,6 +37,15 @@ pub struct Checked;
#[derive(Clone, Default, Debug, Serialize, Deserialize, PartialEq)]
pub struct Unchecked;
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
pub struct TypoSettings {
#[cfg_attr(test, proptest(strategy = "test::setting_strategy()"))]
#[serde(default, skip_serializing_if = "Setting::is_not_set")]
pub enabled: Setting<bool>,
}
/// Holds all the settings for an index. `T` can either be `Checked` if they represents settings
/// whose validity is guaranteed, or `Unchecked` if they need to be validated. In the later case, a
/// call to `check` will return a `Settings<Checked>` from a `Settings<Unchecked>`.
@ -80,6 +89,9 @@ pub struct Settings<T> {
#[serde(default, skip_serializing_if = "Setting::is_not_set")]
#[cfg_attr(test, proptest(strategy = "test::setting_strategy()"))]
pub distinct_attribute: Setting<String>,
#[serde(default, skip_serializing_if = "Setting::is_not_set")]
#[cfg_attr(test, proptest(strategy = "test::setting_strategy()"))]
pub typo: Setting<TypoSettings>,
#[serde(skip)]
pub _kind: PhantomData<T>,
@ -96,6 +108,7 @@ impl Settings<Checked> {
stop_words: Setting::Reset,
synonyms: Setting::Reset,
distinct_attribute: Setting::Reset,
typo: Setting::Reset,
_kind: PhantomData,
}
}
@ -110,6 +123,7 @@ impl Settings<Checked> {
stop_words,
synonyms,
distinct_attribute,
typo: typo_tolerance,
..
} = self;
@ -122,6 +136,7 @@ impl Settings<Checked> {
stop_words,
synonyms,
distinct_attribute,
typo: typo_tolerance,
_kind: PhantomData,
}
}
@ -160,6 +175,7 @@ impl Settings<Unchecked> {
stop_words: self.stop_words,
synonyms: self.synonyms,
distinct_attribute: self.distinct_attribute,
typo: self.typo,
_kind: PhantomData,
}
}
@ -334,6 +350,19 @@ pub fn apply_settings_to_builder(
Setting::Reset => builder.reset_distinct_field(),
Setting::NotSet => (),
}
match settings.typo {
Setting::Set(ref value) => match value.enabled {
Setting::Set(val) => builder.set_autorize_typos(val),
Setting::Reset => builder.reset_authorize_typos(),
Setting::NotSet => (),
},
Setting::Reset => {
// all typo settings need to be reset here.
builder.reset_authorize_typos();
}
Setting::NotSet => (),
}
}
#[cfg(test)]
@ -362,6 +391,7 @@ pub(crate) mod test {
stop_words: Setting::NotSet,
synonyms: Setting::NotSet,
distinct_attribute: Setting::NotSet,
typo: Setting::NotSet,
_kind: PhantomData::<Unchecked>,
};
@ -383,6 +413,7 @@ pub(crate) mod test {
stop_words: Setting::NotSet,
synonyms: Setting::NotSet,
distinct_attribute: Setting::NotSet,
typo: Setting::NotSet,
_kind: PhantomData::<Unchecked>,
};