Skip to main content

sonic/store/
operation.rs

1// Sonic
2//
3// Fast, lightweight and schema-less search backend
4// Copyright: 2019, Valerian Saliou <valerian@valeriansaliou.name>
5// Copyright: 2026, Rémi Bardon <remi@remibardon.name>
6// License: Mozilla Public License v2.0 (MPL v2.0)
7
8use crate::{Executor, Query};
9
10pub struct StoreOperationDispatch;
11
12impl StoreOperationDispatch {
13    pub fn dispatch(query: Query, executor: &Executor) -> Result<Option<String>, ()> {
14        // Dispatch de-constructed query to its target executor
15        match query {
16            Query::Search(store, query_id, lexer, limit, offset) => executor
17                .search(store, query_id, lexer, limit, offset)
18                .map(|results| {
19                    if results.is_empty() {
20                        None
21                    } else {
22                        Some(results.join(" "))
23                    }
24                }),
25            Query::Suggest(store, query_id, lexer, limit) => executor
26                .suggest(store, query_id, lexer, limit)
27                .map(|results| results.map(|results| results.join(" "))),
28            Query::List(store, query_id, limit, offset) => executor
29                .list(store, query_id, limit, offset)
30                .map(|results| results.join(" "))
31                .map(Some),
32            Query::Push(store, lexer) => executor.push(store, lexer).map(|_| None),
33            Query::Pop(store, lexer) => executor
34                .pop(store, lexer)
35                .map(|count| Some(count.to_string())),
36            Query::Count(store) => executor.count(store).map(|count| Some(count.to_string())),
37            Query::FlushC(store) => executor.flushc(store).map(|count| Some(count.to_string())),
38            Query::FlushB(store) => executor.flushb(store).map(|count| Some(count.to_string())),
39            Query::FlushO(store) => executor.flusho(store).map(|count| Some(count.to_string())),
40        }
41    }
42}