use std::any::Any;
use std::sync::Arc;
use anyhow::Result;
use lora_analyzer::Analyzer;
use lora_ast::Document;
use lora_compiler::{CompiledQuery, Compiler};
use lora_parser::parse_query;
use lora_store::{GraphStorage, GraphStorageMut};
use crate::database::Database;
impl<S> Database<S>
where
S: GraphStorage + GraphStorageMut + Any + Clone + Send + Sync + 'static,
{
pub(super) fn compile_document_against(
&self,
document: &Document,
store: &S,
) -> Result<CompiledQuery> {
let resolved = {
let mut analyzer = Analyzer::new(store);
analyzer.analyze(document)?
};
Ok(Compiler::compile(&resolved))
}
pub(crate) fn compile_query_cached(
&self,
query: &str,
store: &S,
) -> Result<Arc<CompiledQuery>> {
if let Some(plan) = self.plan_cache.get(query) {
return Ok(plan);
}
let document = parse_query(query)?;
let plan = Arc::new(self.compile_document_against(&document, store)?);
self.plan_cache.insert(query, plan.clone());
Ok(plan)
}
}