pub mod engine;
pub mod executor;
pub mod m2_select_validator;
pub mod parser;
pub mod planner;
pub mod prepared;
pub mod result;
#[cfg(feature = "state_machine")]
pub mod select_ast;
#[cfg(feature = "state_machine")]
pub mod select_executor;
#[cfg(feature = "state_machine")]
pub mod select_integration_tests;
#[cfg(feature = "state_machine")]
pub mod select_optimizer;
#[cfg(feature = "state_machine")]
pub mod select_parser;
pub use engine::{
AnalyzeResult, CacheStats, ExplainResult, QueryCacheEntry, QueryEngine as AdvancedQueryEngine,
SchemaStatus,
};
pub use executor::{
QueryExecutor, QueryResult as ExecutorQueryResult, QueryRow as ExecutorQueryRow,
};
pub use m2_select_validator::{M2SelectValidator, SelectValidationResult, UnsupportedFeature};
pub use parser::QueryParser;
pub use planner::{ExecutionStep, IndexSelection, PlanType, QueryHints, QueryPlan, QueryPlanner};
pub use prepared::{
ExecutionHints, ParameterMetadata, PreparedQuery, PreparedQueryBuilder, PreparedQueryStats,
};
pub use result::{
cql_type_to_data_type, ColumnInfo, PerformanceMetrics, QueryMetadata, QueryResult,
QueryResultIterator, QueryRow, RowMetadata, StreamingConfig,
};
#[cfg(feature = "state_machine")]
pub use select_ast::SelectStatement;
#[cfg(feature = "state_machine")]
pub use select_executor::SelectExecutor;
#[cfg(feature = "state_machine")]
pub use select_optimizer::{OptimizedQueryPlan, SelectOptimizer};
#[cfg(feature = "state_machine")]
pub use select_parser::{parse_select, SelectParser};
use std::collections::HashMap;
use std::sync::Arc;
use crate::{
memory::MemoryManager, schema::SchemaManager, storage::StorageEngine, Config, Result, TableId,
Value,
};
#[derive(Debug, Clone, Default)]
pub struct QueryStats {
pub total_queries: u64,
pub error_queries: u64,
pub avg_execution_time_us: u64,
pub cache_hit_ratio: f64,
pub rows_affected: u64,
}
#[derive(Debug)]
pub struct QueryEngine {
advanced_engine: AdvancedQueryEngine,
}
impl QueryEngine {
pub fn new(
storage: Arc<StorageEngine>,
schema: Arc<SchemaManager>,
memory: Arc<MemoryManager>,
config: &Config,
) -> Result<Self> {
Ok(Self {
advanced_engine: AdvancedQueryEngine::new(storage, schema, memory, config)?,
})
}
pub async fn execute(&self, cql: &str) -> Result<QueryResult> {
self.advanced_engine.execute(cql).await
}
pub async fn prepare(&self, cql: &str) -> Result<Arc<PreparedQuery>> {
self.advanced_engine.prepare(cql).await
}
pub fn stats(&self) -> QueryStats {
self.advanced_engine.stats()
}
pub fn clear_cache(&self) {
self.advanced_engine.clear_prepared_cache();
}
pub async fn explain(&self, cql: &str) -> Result<ExplainResult> {
self.advanced_engine.explain(cql).await
}
pub async fn analyze(&self, cql: &str) -> Result<AnalyzeResult> {
self.advanced_engine.analyze(cql).await
}
#[cfg(feature = "state_machine")]
pub async fn execute_streaming(
&self,
cql: &str,
config: StreamingConfig,
) -> Result<QueryResultIterator> {
self.advanced_engine.execute_streaming(cql, config).await
}
pub fn cache_stats(&self) -> CacheStats {
self.advanced_engine.cache_stats()
}
pub async fn has_schema_for_table(&self, table: &str) -> bool {
self.advanced_engine.has_schema_for_table(table).await
}
pub async fn schema_status(&self, table: &str) -> SchemaStatus {
self.advanced_engine.schema_status(table).await
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum QueryType {
Select,
Insert,
Update,
Delete,
CreateTable,
DropTable,
CreateIndex,
DropIndex,
Describe,
Use,
}
#[derive(Debug, Clone)]
pub struct ParsedQuery {
pub query_type: QueryType,
pub table: Option<TableId>,
pub columns: Vec<String>,
pub where_clause: Option<WhereClause>,
pub values: Vec<Value>,
pub set_clause: HashMap<String, Value>,
pub order_by: Vec<OrderByClause>,
pub limit: Option<usize>,
pub cql: String,
}
#[derive(Debug, Clone)]
pub struct WhereClause {
pub conditions: Vec<Condition>,
}
#[derive(Debug, Clone)]
pub struct Condition {
pub column: String,
pub operator: ComparisonOperator,
pub value: Value,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ComparisonOperator {
Equal,
NotEqual,
LessThan,
LessThanOrEqual,
GreaterThan,
GreaterThanOrEqual,
In,
NotIn,
Like,
NotLike,
}
#[derive(Debug, Clone)]
pub struct OrderByClause {
pub column: String,
pub direction: SortDirection,
}
#[derive(Debug, Clone, PartialEq)]
pub enum SortDirection {
Asc,
Desc,
}
#[cfg(all(test, feature = "state_machine"))]
mod tests {
use super::*;
use crate::platform::Platform;
use tempfile::TempDir;
#[tokio::test]
async fn test_query_engine_creation() {
let temp_dir = TempDir::new().unwrap();
let config = Config::default();
let platform = Arc::new(Platform::new(&config).await.unwrap());
let storage = Arc::new(
StorageEngine::open(
temp_dir.path(),
&config,
platform,
#[cfg(feature = "state_machine")]
None,
)
.await
.unwrap(),
);
let schema = Arc::new(SchemaManager::new(temp_dir.path()).await.unwrap());
let memory = Arc::new(MemoryManager::new(&config).unwrap());
let query_engine = QueryEngine::new(storage, schema, memory, &config).unwrap();
assert_eq!(query_engine.stats().total_queries, 0);
}
}