#![allow(clippy::uninlined_format_args)] #![allow(clippy::implicit_hasher)]
mod aggregation;
#[cfg(test)]
mod component_scores_tests;
pub(crate) mod condition_tree;
mod distinct;
#[cfg(test)]
mod distinct_tests;
mod early_return;
mod execution_paths;
mod extraction;
#[cfg(test)]
mod extraction_tests;
mod hybrid_sparse;
#[cfg(test)]
mod hybrid_sparse_tests;
pub mod join;
#[cfg(test)]
mod join_tests;
#[cfg(test)]
mod let_execution_tests;
mod match_dispatch;
pub mod match_exec;
#[cfg(test)]
mod match_exec_tests;
pub mod match_metrics;
#[cfg(test)]
mod match_metrics_tests;
pub mod match_planner;
#[cfg(test)]
mod match_planner_tests;
mod metadata_query;
mod multi_vector;
#[cfg(test)]
mod multi_vector_tests;
mod options;
mod ordering;
#[cfg(test)]
mod ordering_tests;
pub mod parallel_traversal;
#[cfg(test)]
mod parallel_traversal_tests;
pub mod projection;
pub mod pushdown;
#[cfg(test)]
mod pushdown_tests;
mod query_pipeline;
pub mod score_fusion;
#[cfg(test)]
mod score_fusion_tests;
mod select_dispatch;
pub(crate) mod set_operations;
mod similarity_filter;
mod sparse_dispatch;
mod union_query;
mod validation;
pub(crate) mod vector_group_by;
mod where_eval;
#[cfg(test)]
mod with_options_tests;
#[allow(unused_imports)]
pub use ordering::compare_json_values;
#[allow(unused_imports)]
pub use join::{execute_join, JoinedResult};
pub(crate) use options::QuerySearchOptions;
pub(in crate::collection::search::query) use options::{
ExtractedComponents, QueryFinalizationContext, MAX_LIMIT,
};
use crate::collection::types::Collection;
use crate::error::Result;
use crate::point::SearchResult;
use std::collections::HashSet;
impl Collection {
pub fn execute_query(
&self,
query: &crate::velesql::Query,
params: &std::collections::HashMap<String, serde_json::Value>,
) -> Result<Vec<SearchResult>> {
let compound_limit = Some(u64::try_from(MAX_LIMIT).unwrap_or(u64::MAX));
let left_results = if query.compound.is_some() {
let mut left_query = query.clone();
left_query.select.limit = compound_limit;
left_query.select.offset = None; left_query.compound = None;
self.execute_query_with_client(&left_query, params, "default")?
} else {
return self.execute_query_with_client(query, params, "default");
};
if let Some(ref compound) = query.compound {
let mut accumulated = left_results;
for (operator, right_select) in &compound.operations {
let mut right_query = crate::velesql::Query::new_select(right_select.clone());
right_query.select.limit = compound_limit;
let right_results =
self.execute_query_with_client(&right_query, params, "default")?;
accumulated =
set_operations::apply_set_operation(accumulated, right_results, *operator);
}
if let Some(offset) = query.select.offset {
let skip = usize::try_from(offset).unwrap_or(usize::MAX);
accumulated = accumulated.into_iter().skip(skip).collect();
}
if let Some(limit) = query.select.limit {
accumulated.truncate(usize::try_from(limit).unwrap_or(usize::MAX));
}
return Ok(accumulated);
}
Ok(left_results)
}
pub fn execute_query_with_client(
&self,
query: &crate::velesql::Query,
params: &std::collections::HashMap<String, serde_json::Value>,
client_id: &str,
) -> Result<Vec<SearchResult>> {
let ctx = self.prepare_query_context(query, client_id)?;
if let Some(results) = self.try_dispatch_match(query, params, &ctx)? {
return Ok(results);
}
self.execute_select_pipeline(query, params, &ctx)
}
fn execute_select_pipeline(
&self,
query: &crate::velesql::Query,
params: &std::collections::HashMap<String, serde_json::Value>,
ctx: &crate::guardrails::QueryContext,
) -> Result<Vec<SearchResult>> {
let stmt = &query.select;
let (limit, fetch_limit) = Self::compute_fetch_limit(stmt);
let extracted = self.extract_query_components(stmt, params)?;
let is_vgb = vector_group_by::is_vector_group_by_query(stmt);
let effective_fetch_limit = if is_vgb { MAX_LIMIT } else { fetch_limit };
if let Some(results) = self.try_early_return_or_guard_let(
query,
stmt,
params,
&extracted,
effective_fetch_limit,
ctx,
)? {
return Ok(results);
}
let mut results =
self.dispatch_main_select(stmt, params, &extracted, effective_fetch_limit, ctx)?;
if is_vgb {
results = self.apply_vector_group_by(stmt, &results);
}
self.finalize_query_results(
&mut results,
&QueryFinalizationContext {
stmt,
params,
limit,
extracted: &extracted,
ctx,
let_bindings: &query.let_bindings,
},
)?;
Ok(results)
}
pub fn execute_query_str(
&self,
sql: &str,
params: &std::collections::HashMap<String, serde_json::Value>,
) -> Result<Vec<SearchResult>> {
let query = self
.query_cache
.parse(sql)
.map_err(|e| crate::error::Error::Query(e.to_string()))?;
self.execute_query(&query, params)
}
}