1pub mod engine;
20pub mod executor;
21pub mod m2_select_validator;
22pub mod parser;
23pub mod planner;
24pub mod prepared;
25pub mod result;
26pub mod writetime_ttl_validator;
27
28#[cfg(feature = "state_machine")]
30pub mod select_ast;
31#[cfg(feature = "state_machine")]
32pub mod select_executor;
33#[cfg(feature = "state_machine")]
34pub mod select_integration_tests;
35#[cfg(feature = "state_machine")]
36pub mod select_optimizer;
37#[cfg(feature = "state_machine")]
38pub mod select_parser;
39
40pub use engine::{
41 AnalyzeResult, CacheStats, ExplainResult, QueryCacheEntry, QueryEngine as AdvancedQueryEngine,
42 SchemaStatus,
43};
44pub use executor::{
45 QueryExecutor, QueryResult as ExecutorQueryResult, QueryRow as ExecutorQueryRow,
46};
47pub use m2_select_validator::{M2SelectValidator, SelectValidationResult, UnsupportedFeature};
48pub use parser::QueryParser;
49pub use planner::{ExecutionStep, IndexSelection, PlanType, QueryHints, QueryPlan, QueryPlanner};
50pub use prepared::{
51 ExecutionHints, ParameterMetadata, PreparedQuery, PreparedQueryBuilder, PreparedQueryStats,
52};
53pub use result::{
54 cql_type_to_data_type, ColumnInfo, PerformanceMetrics, QueryMetadata, QueryResult,
55 QueryResultIterator, QueryRow, RowMetadata, StreamingConfig,
56};
57pub use writetime_ttl_validator::{
58 descriptors_from_table_schema, validate_all_writetime_ttl_calls, validate_writetime_ttl_call,
59 ColumnDescriptor as WriteTimeTtlColumnDescriptor, WriteTimeTtlKind,
60};
61
62#[cfg(feature = "state_machine")]
68pub use select_ast::SelectStatement;
69#[cfg(feature = "state_machine")]
70pub use select_executor::{
71 build_row_from_scan, evaluate_leaf, evaluate_predicates, LeafOutcome, SelectExecutor,
72};
73#[cfg(feature = "state_machine")]
74pub use select_optimizer::{
75 OptimizedQueryPlan, SSTableFilterOp, SSTablePredicate, SelectOptimizer,
76};
77#[cfg(feature = "state_machine")]
78pub use select_parser::{parse_select, SelectParser};
79
80use std::collections::HashMap;
81use std::sync::Arc;
82
83use crate::{
84 memory::MemoryManager, schema::SchemaManager, storage::StorageEngine, Config, Result, TableId,
85 Value,
86};
87
88#[derive(Debug, Clone, Default)]
90pub struct QueryStats {
91 pub total_queries: u64,
93 pub error_queries: u64,
95 pub avg_execution_time_us: u64,
97 pub cache_hit_ratio: f64,
99 pub rows_affected: u64,
101}
102
103#[derive(Debug)]
108pub struct QueryEngine {
109 advanced_engine: AdvancedQueryEngine,
110}
111
112impl QueryEngine {
113 pub fn new(
115 storage: Arc<StorageEngine>,
116 schema: Arc<SchemaManager>,
117 memory: Arc<MemoryManager>,
118 config: &Config,
119 ) -> Result<Self> {
120 Ok(Self {
121 advanced_engine: AdvancedQueryEngine::new(storage, schema, memory, config)?,
122 })
123 }
124
125 pub async fn execute(&self, cql: &str) -> Result<QueryResult> {
127 self.advanced_engine.execute(cql).await
128 }
129
130 pub async fn prepare(&self, cql: &str) -> Result<Arc<PreparedQuery>> {
132 self.advanced_engine.prepare(cql).await
133 }
134
135 pub fn stats(&self) -> QueryStats {
137 self.advanced_engine.stats()
138 }
139
140 pub fn clear_cache(&self) {
142 self.advanced_engine.clear_prepared_cache();
143 }
144
145 pub async fn explain(&self, cql: &str) -> Result<ExplainResult> {
147 self.advanced_engine.explain(cql).await
148 }
149
150 pub async fn analyze(&self, cql: &str) -> Result<AnalyzeResult> {
152 self.advanced_engine.analyze(cql).await
153 }
154
155 #[cfg(feature = "state_machine")]
160 pub async fn execute_streaming(
161 &self,
162 cql: &str,
163 config: StreamingConfig,
164 ) -> Result<QueryResultIterator> {
165 self.advanced_engine.execute_streaming(cql, config).await
166 }
167
168 pub fn cache_stats(&self) -> CacheStats {
170 self.advanced_engine.cache_stats()
171 }
172
173 pub async fn has_schema_for_table(&self, table: &str) -> bool {
175 self.advanced_engine.has_schema_for_table(table).await
176 }
177
178 pub async fn schema_status(&self, table: &str) -> SchemaStatus {
180 self.advanced_engine.schema_status(table).await
181 }
182}
183
184#[derive(Debug, Clone, PartialEq)]
186pub enum QueryType {
187 Select,
189 Insert,
191 Update,
193 Delete,
195 CreateTable,
197 DropTable,
199 CreateIndex,
201 DropIndex,
203 Describe,
205 Use,
207}
208
209#[derive(Debug, Clone)]
211pub struct ParsedQuery {
212 pub query_type: QueryType,
214 pub table: Option<TableId>,
216 pub columns: Vec<String>,
218 pub where_clause: Option<WhereClause>,
220 pub values: Vec<Value>,
222 pub set_clause: HashMap<String, Value>,
224 pub order_by: Vec<OrderByClause>,
226 pub limit: Option<usize>,
228 pub cql: String,
230}
231
232#[derive(Debug, Clone)]
234pub struct WhereClause {
235 pub conditions: Vec<Condition>,
237}
238
239#[derive(Debug, Clone)]
241pub struct Condition {
242 pub column: String,
244 pub operator: ComparisonOperator,
246 pub value: Value,
248}
249
250#[derive(Debug, Clone, PartialEq)]
252pub enum ComparisonOperator {
253 Equal,
255 NotEqual,
257 LessThan,
259 LessThanOrEqual,
261 GreaterThan,
263 GreaterThanOrEqual,
265 In,
267 NotIn,
269 Like,
271 NotLike,
273}
274
275#[derive(Debug, Clone)]
277pub struct OrderByClause {
278 pub column: String,
280 pub direction: SortDirection,
282}
283
284#[derive(Debug, Clone, PartialEq)]
286pub enum SortDirection {
287 Asc,
289 Desc,
291}
292
293#[cfg(all(test, feature = "state_machine"))]
294mod tests {
295 use super::*;
296 use crate::platform::Platform;
297 use tempfile::TempDir;
298
299 #[tokio::test]
300 async fn test_query_engine_creation() {
301 let temp_dir = TempDir::new().unwrap();
302 let config = Config::default();
303 let platform = Arc::new(Platform::new(&config).await.unwrap());
304
305 let storage = Arc::new(
306 StorageEngine::open(
307 temp_dir.path(),
308 &config,
309 platform,
310 #[cfg(feature = "state_machine")]
311 None,
312 )
313 .await
314 .unwrap(),
315 );
316 let schema = Arc::new(SchemaManager::new(temp_dir.path()).await.unwrap());
317 let memory = Arc::new(MemoryManager::new(&config).unwrap());
318
319 let query_engine = QueryEngine::new(storage, schema, memory, &config).unwrap();
320
321 assert_eq!(query_engine.stats().total_queries, 0);
322 }
323}