179 words
1 minutes
Search and Sorting
Search and Sorting
pola provides a powerful search system with fuzzy matching and sorting capabilities.
Search: search_skins()
Uses fuzzy_matcher::skim::SkimMatcherV2
for fuzzy matching:
fn search_skins(
skins: &[Skin],
_name_map: &HashMap<String, usize>,
query: &str,
favorites: &HashSet<String>,
) -> Vec<Skin> {
let matcher = fuzzy_matcher::skim::SkimMatcherV2::default();
let mut scored_skins: Vec<(i64, &Skin)> = skins.iter().filter_map(|skin| {
let mut score = 0;
let mut matched = false;
for term in &terms {
if term.contains("fav") && favorites.contains(&skin.name) { score += 1000; matched = true; }
if let Some(s) = matcher.fuzzy_match(&skin.name_lower, term) { score += s; matched = true; }
// ... (event, rarity, tags, year)
}
if matched { Some((score, skin)) } else { None }
}).collect();
scored_skins.sort_by(|a, b| b.0.cmp(&a.0));
scored_skins.into_iter().map(|(_, s)| s.clone()).collect()
}
Features
- Filters: Supports
field:value
syntax (e.g.,rarity:pink
). OR just directly saying the rarity/tag/name! - Regex: Allows regex patterns with
/pattern/
. - Fuzzy Matching: Scores matches based on name, event, rarity, etc.
Sorting: sort_results()
Sorts results based on sort_field
and sort_descending
:
fn sort_results(&mut self) {
match self.sort_field {
SortField::Name => {
if self.sort_descending {
self.results.sort_by(|a, b| b.name_lower.cmp(&a.name_lower));
} else {
self.results.sort_by(|a, b| a.name_lower.cmp(&b.name_lower));
}
},
// ... (Rarity, Event)
}
}
NOTEClicking table headers toggles sorting direction via
toggle_sort()
.
Search and Sorting
https://sethispr.github.io/posts/searchsorting/