mod aggregate_parser;
mod aggregate_projector;
pub mod aggregation;
pub mod cascade;
mod executor;
pub mod executor_adapter;
mod explain;
pub mod field_filter;
pub mod input_validator;
pub mod jsonb_strategy;
mod matcher;
pub mod mutation_result;
pub(crate) mod native_columns;
mod planner;
mod projection;
pub mod query_tracing;
pub mod relay;
pub mod sql_logger;
pub mod subscription;
pub mod tenant_enforcer;
pub mod window;
mod window_parser;
mod window_projector;
use std::sync::Arc;
pub use aggregate_parser::AggregateQueryParser;
pub use aggregate_projector::AggregationProjector;
pub use aggregation::{AggregationSqlGenerator, ParameterizedAggregationSql};
pub use executor::{
Executor,
pipeline::{extract_root_field_names, is_multi_root, multi_root_queries_total},
};
pub use executor_adapter::ExecutorAdapter;
pub use explain::{ExplainPlan, ExplainResult};
pub use field_filter::{FieldAccessResult, can_access_field, classify_field_access, filter_fields};
pub use jsonb_strategy::{JsonbOptimizationOptions, JsonbStrategy};
pub use matcher::{QueryMatch, QueryMatcher, suggest_similar};
pub use planner::{ExecutionPlan, QueryPlanner};
pub use projection::{
FieldMapping, ProjectionMapper, ResultProjector, build_field_mappings_from_type,
};
pub use query_tracing::{
QueryExecutionTrace, QueryPhaseSpan, QueryTraceBuilder, create_phase_span, create_query_span,
};
pub use sql_logger::{SqlOperation, SqlQueryLog, SqlQueryLogBuilder, create_sql_span};
pub use subscription::{
ActiveSubscription, DeliveryResult, KafkaAdapter, KafkaConfig, KafkaMessage, SubscriptionError,
SubscriptionEvent, SubscriptionId, SubscriptionManager, SubscriptionOperation,
SubscriptionPayload, TransportAdapter, TransportManager, WebhookAdapter, WebhookConfig,
WebhookPayload, extract_rls_conditions, protocol,
};
pub use tenant_enforcer::TenantEnforcer;
#[derive(Debug, Clone)]
pub struct BulkResult {
pub affected_rows: u64,
pub entities: Option<Vec<serde_json::Value>>,
}
pub use window::{WindowSql, WindowSqlGenerator};
pub use window_parser::WindowQueryParser;
pub use window_projector::WindowProjector;
use crate::security::{FieldFilter, FieldFilterConfig, QueryValidatorConfig, RLSPolicy};
pub struct RuntimeConfig {
pub cache_query_plans: bool,
pub max_query_depth: usize,
pub max_query_complexity: usize,
pub enable_tracing: bool,
pub field_filter: Option<FieldFilter>,
pub rls_policy: Option<Arc<dyn RLSPolicy>>,
pub query_timeout_ms: u64,
pub jsonb_optimization: JsonbOptimizationOptions,
pub query_validation: Option<QueryValidatorConfig>,
}
impl std::fmt::Debug for RuntimeConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RuntimeConfig")
.field("cache_query_plans", &self.cache_query_plans)
.field("max_query_depth", &self.max_query_depth)
.field("max_query_complexity", &self.max_query_complexity)
.field("enable_tracing", &self.enable_tracing)
.field("field_filter", &self.field_filter.is_some())
.field("rls_policy", &self.rls_policy.is_some())
.field("query_timeout_ms", &self.query_timeout_ms)
.field("jsonb_optimization", &self.jsonb_optimization)
.field("query_validation", &self.query_validation)
.finish()
}
}
impl Default for RuntimeConfig {
fn default() -> Self {
Self {
cache_query_plans: true,
max_query_depth: 10,
max_query_complexity: 1000,
enable_tracing: false,
field_filter: None,
rls_policy: None,
query_timeout_ms: 30_000, jsonb_optimization: JsonbOptimizationOptions::default(),
query_validation: None,
}
}
}
impl RuntimeConfig {
#[must_use]
pub fn with_field_filter(mut self, config: FieldFilterConfig) -> Self {
self.field_filter = Some(FieldFilter::new(config));
self
}
#[must_use]
pub fn with_rls_policy(mut self, policy: Arc<dyn RLSPolicy>) -> Self {
self.rls_policy = Some(policy);
self
}
}
#[derive(Debug, Clone)]
pub struct ExecutionContext {
query_id: String,
token: tokio_util::sync::CancellationToken,
}
impl ExecutionContext {
#[must_use]
pub fn new(query_id: String) -> Self {
Self {
query_id,
token: tokio_util::sync::CancellationToken::new(),
}
}
#[must_use]
pub fn query_id(&self) -> &str {
&self.query_id
}
#[must_use]
pub const fn cancellation_token(&self) -> &tokio_util::sync::CancellationToken {
&self.token
}
#[must_use]
pub fn is_cancelled(&self) -> bool {
self.token.is_cancelled()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = RuntimeConfig::default();
assert!(config.cache_query_plans);
assert_eq!(config.max_query_depth, 10);
assert_eq!(config.max_query_complexity, 1000);
assert!(!config.enable_tracing);
}
}