pub mod context;
pub mod error;
pub mod function_rename;
pub mod registry;
pub mod rule;
pub mod rules;
pub mod walker;
use context::{RewriteContext, RewriteStats};
use error::RewriteError;
use registry::RewriteRegistry;
use walker::ExpressionWalker;
use std::sync::OnceLock;
static GLOBAL_REGISTRY: OnceLock<RewriteRegistry> = OnceLock::new();
fn get_or_init_registry() -> &'static RewriteRegistry {
GLOBAL_REGISTRY.get_or_init(|| {
tracing::info!("Initializing query rewrite framework");
RewriteRegistry::with_builtin_rules()
})
}
fn log_rewrite_stats(stats: &RewriteStats) {
if stats.functions_visited > 0 {
tracing::info!(
"Rewrite pass complete: {} functions visited, {} rewritten, {} skipped",
stats.functions_visited,
stats.functions_rewritten,
stats.functions_skipped
);
if !stats.errors.is_empty() {
tracing::debug!("Rewrite errors: {:?}", stats.errors);
}
}
}
pub fn rewrite_query(
query: uni_cypher::ast::Query,
) -> Result<uni_cypher::ast::Query, RewriteError> {
let registry = get_or_init_registry();
let context = RewriteContext::default();
let mut walker = ExpressionWalker::new(registry, context);
let rewritten_query = walker.rewrite_query(query);
log_rewrite_stats(&walker.context().stats);
Ok(rewritten_query)
}