use std::sync::{Arc, Mutex};
use nodedb_sql::types_array::{
ArrayAttrAst, ArrayAttrType, ArrayDimAst, ArrayDimType, ArrayDomainBound,
};
use crate::PagedbStorageMem;
use crate::engine::array::engine::ArrayEngineState;
use crate::engine::columnar::ColumnarEngine;
use crate::engine::fts::FtsState;
use crate::engine::spatial::SpatialIndexManager;
use crate::engine::vector::VectorState;
use crate::query::engine::{LiteQueryEngine, LiteQueryEngineParams};
pub(super) async fn make_engine() -> LiteQueryEngine<PagedbStorageMem> {
let storage = Arc::new(
PagedbStorageMem::open_in_memory()
.await
.expect("in-memory pagedb"),
);
let crdt = Arc::new(Mutex::new(
crate::engine::crdt::CrdtEngine::new(1).expect("crdt"),
));
let governor = crate::query::engine::test_governor();
let strict = Arc::new(crate::engine::strict::StrictEngine::new(Arc::clone(
&storage,
)));
let columnar = Arc::new(ColumnarEngine::new(
Arc::clone(&storage),
crate::query::engine::test_scoped_memory(&governor, nodedb_mem::EngineId::Columnar),
));
let htap = Arc::new(crate::engine::htap::HtapBridge::new());
let timeseries = Arc::new(Mutex::new(
crate::engine::timeseries::engine::TimeseriesEngine::new(),
));
let vector_state = Arc::new(VectorState::new(
Arc::clone(&storage),
100,
crate::query::engine::test_scoped_memory(&governor, nodedb_mem::EngineId::Vector),
));
let array_state = Arc::new(tokio::sync::Mutex::new(
ArrayEngineState::open(&storage).await.expect("array"),
));
let fts_state = Arc::new(FtsState::new(Arc::clone(&governor)));
let spatial = Arc::new(Mutex::new(SpatialIndexManager::new(
crate::query::engine::test_scoped_memory(&governor, nodedb_mem::EngineId::Spatial),
)));
LiteQueryEngine::new(LiteQueryEngineParams {
crdt,
strict,
columnar,
htap,
storage,
timeseries,
vector_state,
array_state,
fts_state,
sparse_state: Arc::new(crate::engine::sparse_vector::SparseVectorState::new()),
spatial,
csr: Arc::new(Mutex::new(std::collections::HashMap::new())),
governor,
kv_local: crate::query::engine::test_kv_local(),
})
}
pub(super) fn dim1_ast() -> Vec<ArrayDimAst> {
vec![ArrayDimAst {
name: "x".to_string(),
dtype: ArrayDimType::Int64,
lo: ArrayDomainBound::Int64(0),
hi: ArrayDomainBound::Int64(15),
}]
}
pub(super) fn attr1_ast() -> Vec<ArrayAttrAst> {
vec![ArrayAttrAst {
name: "v".to_string(),
dtype: ArrayAttrType::Int64,
nullable: false,
}]
}