1pub mod engine;
20pub mod executor;
21pub mod m2_select_validator;
22pub mod parser;
23pub mod planner;
24pub mod prepared;
25pub mod result;
26
27#[cfg(feature = "state_machine")]
29pub mod select_ast;
30#[cfg(feature = "state_machine")]
31pub mod select_executor;
32#[cfg(feature = "state_machine")]
33pub mod select_integration_tests;
34#[cfg(feature = "state_machine")]
35pub mod select_optimizer;
36#[cfg(feature = "state_machine")]
37pub mod select_parser;
38
39pub use engine::{
40 AnalyzeResult, CacheStats, ExplainResult, QueryCacheEntry, QueryEngine as AdvancedQueryEngine,
41 SchemaStatus,
42};
43pub use executor::{
44 QueryExecutor, QueryResult as ExecutorQueryResult, QueryRow as ExecutorQueryRow,
45};
46pub use m2_select_validator::{M2SelectValidator, SelectValidationResult, UnsupportedFeature};
47pub use parser::QueryParser;
48pub use planner::{ExecutionStep, IndexSelection, PlanType, QueryHints, QueryPlan, QueryPlanner};
49pub use prepared::{
50 ExecutionHints, ParameterMetadata, PreparedQuery, PreparedQueryBuilder, PreparedQueryStats,
51};
52pub use result::{
53 cql_type_to_data_type, ColumnInfo, PerformanceMetrics, QueryMetadata, QueryResult,
54 QueryResultIterator, QueryRow, RowMetadata, StreamingConfig,
55};
56
57#[cfg(feature = "state_machine")]
63pub use select_ast::SelectStatement;
64#[cfg(feature = "state_machine")]
65pub use select_executor::SelectExecutor;
66#[cfg(feature = "state_machine")]
67pub use select_optimizer::{OptimizedQueryPlan, SelectOptimizer};
68#[cfg(feature = "state_machine")]
69pub use select_parser::{parse_select, SelectParser};
70
71use std::collections::HashMap;
72use std::sync::Arc;
73
74use crate::{
75 memory::MemoryManager, schema::SchemaManager, storage::StorageEngine, Config, Result, TableId,
76 Value,
77};
78
79#[derive(Debug, Clone, Default)]
81pub struct QueryStats {
82 pub total_queries: u64,
84 pub error_queries: u64,
86 pub avg_execution_time_us: u64,
88 pub cache_hit_ratio: f64,
90 pub rows_affected: u64,
92}
93
94#[derive(Debug)]
99pub struct QueryEngine {
100 advanced_engine: AdvancedQueryEngine,
101}
102
103impl QueryEngine {
104 pub fn new(
106 storage: Arc<StorageEngine>,
107 schema: Arc<SchemaManager>,
108 memory: Arc<MemoryManager>,
109 config: &Config,
110 ) -> Result<Self> {
111 Ok(Self {
112 advanced_engine: AdvancedQueryEngine::new(storage, schema, memory, config)?,
113 })
114 }
115
116 pub async fn execute(&self, cql: &str) -> Result<QueryResult> {
118 self.advanced_engine.execute(cql).await
119 }
120
121 pub async fn prepare(&self, cql: &str) -> Result<Arc<PreparedQuery>> {
123 self.advanced_engine.prepare(cql).await
124 }
125
126 pub fn stats(&self) -> QueryStats {
128 self.advanced_engine.stats()
129 }
130
131 pub fn clear_cache(&self) {
133 self.advanced_engine.clear_prepared_cache();
134 }
135
136 pub async fn explain(&self, cql: &str) -> Result<ExplainResult> {
138 self.advanced_engine.explain(cql).await
139 }
140
141 pub async fn analyze(&self, cql: &str) -> Result<AnalyzeResult> {
143 self.advanced_engine.analyze(cql).await
144 }
145
146 #[cfg(feature = "state_machine")]
151 pub async fn execute_streaming(
152 &self,
153 cql: &str,
154 config: StreamingConfig,
155 ) -> Result<QueryResultIterator> {
156 self.advanced_engine.execute_streaming(cql, config).await
157 }
158
159 pub fn cache_stats(&self) -> CacheStats {
161 self.advanced_engine.cache_stats()
162 }
163
164 pub async fn has_schema_for_table(&self, table: &str) -> bool {
166 self.advanced_engine.has_schema_for_table(table).await
167 }
168
169 pub async fn schema_status(&self, table: &str) -> SchemaStatus {
171 self.advanced_engine.schema_status(table).await
172 }
173}
174
175#[derive(Debug, Clone, PartialEq)]
177pub enum QueryType {
178 Select,
180 Insert,
182 Update,
184 Delete,
186 CreateTable,
188 DropTable,
190 CreateIndex,
192 DropIndex,
194 Describe,
196 Use,
198}
199
200#[derive(Debug, Clone)]
202pub struct ParsedQuery {
203 pub query_type: QueryType,
205 pub table: Option<TableId>,
207 pub columns: Vec<String>,
209 pub where_clause: Option<WhereClause>,
211 pub values: Vec<Value>,
213 pub set_clause: HashMap<String, Value>,
215 pub order_by: Vec<OrderByClause>,
217 pub limit: Option<usize>,
219 pub cql: String,
221}
222
223#[derive(Debug, Clone)]
225pub struct WhereClause {
226 pub conditions: Vec<Condition>,
228}
229
230#[derive(Debug, Clone)]
232pub struct Condition {
233 pub column: String,
235 pub operator: ComparisonOperator,
237 pub value: Value,
239}
240
241#[derive(Debug, Clone, PartialEq)]
243pub enum ComparisonOperator {
244 Equal,
246 NotEqual,
248 LessThan,
250 LessThanOrEqual,
252 GreaterThan,
254 GreaterThanOrEqual,
256 In,
258 NotIn,
260 Like,
262 NotLike,
264}
265
266#[derive(Debug, Clone)]
268pub struct OrderByClause {
269 pub column: String,
271 pub direction: SortDirection,
273}
274
275#[derive(Debug, Clone, PartialEq)]
277pub enum SortDirection {
278 Asc,
280 Desc,
282}
283
284#[cfg(all(test, feature = "state_machine"))]
285mod tests {
286 use super::*;
287 use crate::platform::Platform;
288 use tempfile::TempDir;
289
290 #[tokio::test]
291 async fn test_query_engine_creation() {
292 let temp_dir = TempDir::new().unwrap();
293 let config = Config::default();
294 let platform = Arc::new(Platform::new(&config).await.unwrap());
295
296 let storage = Arc::new(
297 StorageEngine::open(
298 temp_dir.path(),
299 &config,
300 platform,
301 #[cfg(feature = "state_machine")]
302 None,
303 )
304 .await
305 .unwrap(),
306 );
307 let schema = Arc::new(SchemaManager::new(temp_dir.path()).await.unwrap());
308 let memory = Arc::new(MemoryManager::new(&config).unwrap());
309
310 let query_engine = QueryEngine::new(storage, schema, memory, &config).unwrap();
311
312 assert_eq!(query_engine.stats().total_queries, 0);
313 }
314}