mod args;
mod ops;
mod query;
mod wire;
pub(crate) use args::{ComposeQuery, HybridArgs, KnnArgs, MatchArgs, Query, parse_groups_args};
pub(crate) use wire::{decode_value, decode_view_cursor, encode_value, hex};
use kevy_store::Store;
pub(crate) type Hydrated = Vec<Option<Vec<u8>>>;
pub(crate) const ST_OK: u8 = 0;
pub(crate) const ST_BUILDING: u8 = 1;
pub(crate) const ST_NOINDEX: u8 = 2;
pub(crate) const ST_BADARGS: u8 = 3;
pub(crate) const ST_OVERBUDGET: u8 = 4;
pub(crate) fn extension_op(store: &mut Store, argv: &[Vec<u8>]) -> Vec<u8> {
let verb = argv.first().map(Vec::as_slice).unwrap_or(b"");
if verb.eq_ignore_ascii_case(b"IDX.LIST") {
return query::op_list(store);
}
if argv.get(1).is_some_and(|a| a.eq_ignore_ascii_case(b"HYBRID")) {
return ops::op_hybrid(store, argv);
}
if argv.get(1).is_some_and(|a| a.eq_ignore_ascii_case(b"COMPOSE")) {
return ops::op_compose(store, argv);
}
if verb.eq_ignore_ascii_case(b"IDX.EXPLAIN") {
return query::op_explain(store, argv);
}
if argv.get(2).is_some_and(|a| a.eq_ignore_ascii_case(b"MATCH")) {
return ops::op_match(store, argv);
}
if argv.get(2).is_some_and(|a| a.eq_ignore_ascii_case(b"KNN")) {
return ops::op_knn(store, argv);
}
if argv.get(2).is_some_and(|a| a.eq_ignore_ascii_case(b"GROUP") || a.eq_ignore_ascii_case(b"GROUPS")) {
return ops::op_agg(store, argv);
}
if argv.first().is_some_and(|v| v.eq_ignore_ascii_case(b"AGG.FETCH")) {
return ops::op_agg_fetch(store, argv);
}
if argv
.first()
.is_some_and(|v| v.eq_ignore_ascii_case(b"IDX.REBUILD"))
{
return ops::op_rebuild(store, argv);
}
query::op_query(store, argv, verb)
}