2019-10-18 13:05:28 +02:00
|
|
|
use levenshtein_automata::{LevenshteinAutomatonBuilder as LevBuilder, DFA};
|
2019-10-02 17:34:32 +02:00
|
|
|
use once_cell::sync::OnceCell;
|
|
|
|
|
|
|
|
static LEVDIST0: OnceCell<LevBuilder> = OnceCell::new();
|
|
|
|
static LEVDIST1: OnceCell<LevBuilder> = OnceCell::new();
|
|
|
|
static LEVDIST2: OnceCell<LevBuilder> = OnceCell::new();
|
|
|
|
|
|
|
|
#[derive(Copy, Clone)]
|
|
|
|
enum PrefixSetting {
|
|
|
|
Prefix,
|
|
|
|
NoPrefix,
|
|
|
|
}
|
|
|
|
|
|
|
|
fn build_dfa_with_setting(query: &str, setting: PrefixSetting) -> DFA {
|
2019-10-18 13:05:28 +02:00
|
|
|
use PrefixSetting::{NoPrefix, Prefix};
|
2019-10-02 17:34:32 +02:00
|
|
|
|
|
|
|
match query.len() {
|
2019-10-18 13:05:28 +02:00
|
|
|
0..=4 => {
|
2019-10-17 18:03:11 +02:00
|
|
|
let builder = LEVDIST0.get_or_init(|| LevBuilder::new(0, true));
|
2019-10-02 17:34:32 +02:00
|
|
|
match setting {
|
2019-10-18 13:05:28 +02:00
|
|
|
Prefix => builder.build_prefix_dfa(query),
|
2019-10-02 17:34:32 +02:00
|
|
|
NoPrefix => builder.build_dfa(query),
|
|
|
|
}
|
2019-10-18 13:05:28 +02:00
|
|
|
}
|
|
|
|
5..=8 => {
|
2019-10-17 18:03:11 +02:00
|
|
|
let builder = LEVDIST1.get_or_init(|| LevBuilder::new(1, true));
|
2019-10-02 17:34:32 +02:00
|
|
|
match setting {
|
2019-10-18 13:05:28 +02:00
|
|
|
Prefix => builder.build_prefix_dfa(query),
|
2019-10-02 17:34:32 +02:00
|
|
|
NoPrefix => builder.build_dfa(query),
|
|
|
|
}
|
2019-10-18 13:05:28 +02:00
|
|
|
}
|
2019-10-02 17:34:32 +02:00
|
|
|
_ => {
|
2019-10-17 18:03:11 +02:00
|
|
|
let builder = LEVDIST2.get_or_init(|| LevBuilder::new(2, true));
|
2019-10-02 17:34:32 +02:00
|
|
|
match setting {
|
2019-10-18 13:05:28 +02:00
|
|
|
Prefix => builder.build_prefix_dfa(query),
|
2019-10-02 17:34:32 +02:00
|
|
|
NoPrefix => builder.build_dfa(query),
|
|
|
|
}
|
2019-10-18 13:05:28 +02:00
|
|
|
}
|
2019-10-02 17:34:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn build_prefix_dfa(query: &str) -> DFA {
|
|
|
|
build_dfa_with_setting(query, PrefixSetting::Prefix)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn build_dfa(query: &str) -> DFA {
|
|
|
|
build_dfa_with_setting(query, PrefixSetting::NoPrefix)
|
|
|
|
}
|