1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use std::rc::Rc;

use roogle_index::types as index;

use crate::approx::Approximate;
use crate::types::Query;

pub struct QueryExecutor {
    krate: String,
    index: index::Index,
}

impl QueryExecutor {
    pub fn new(krate: impl ToString, index: index::Index) -> Self {
        Self {
            krate: krate.to_string(),
            index,
        }
    }

    pub fn exec(&self, query: &Query) -> Vec<Rc<index::IndexItem>> {
        if let Some(krate) = self.index.crates.get(&self.krate) {
            let mut items_with_sims: Vec<_> = krate
                .items
                .iter()
                .map(|item| (item, query.approx(item)))
                .collect();
            items_with_sims.sort_by(|a, b| a.1.cmp(&b.1));

            items_with_sims
                .into_iter()
                .map(|(item, _)| item)
                .map(Rc::clone)
                .collect()
        } else {
            Vec::new()
        }
    }
}