1pub mod access_path;
20pub mod engine;
21pub mod executor;
22pub mod m2_select_validator;
23pub mod parser;
24pub mod planner;
25pub mod prepared;
26pub mod result;
27pub(crate) mod result_budget;
28pub mod writetime_ttl_validator;
29
30#[cfg(feature = "state_machine")]
32pub mod select_ast;
33#[cfg(feature = "state_machine")]
34pub mod select_executor;
35#[cfg(feature = "state_machine")]
36pub mod select_integration_tests;
37#[cfg(feature = "state_machine")]
38pub mod select_naming;
39#[cfg(feature = "state_machine")]
40pub mod select_optimizer;
41#[cfg(feature = "state_machine")]
42pub mod select_parser;
43
44pub use access_path::{AccessPath, FallbackReason};
45pub use engine::{
46 AnalyzeResult, CacheStats, ExplainResult, QueryCacheEntry, QueryEngine as AdvancedQueryEngine,
47 SchemaStatus,
48};
49pub use executor::{
50 QueryExecutor, QueryResult as ExecutorQueryResult, QueryRow as ExecutorQueryRow,
51};
52pub use m2_select_validator::{M2SelectValidator, SelectValidationResult, UnsupportedFeature};
53pub use parser::QueryParser;
54pub use planner::{ExecutionStep, IndexSelection, PlanType, QueryHints, QueryPlan, QueryPlanner};
55pub use prepared::{
56 ExecutionHints, ParameterMetadata, PreparedContext, PreparedQuery, PreparedQueryBuilder,
57 PreparedQueryStats,
58};
59pub use result::{
60 cql_type_to_data_type, ColumnInfo, PerformanceMetrics, QueryMetadata, QueryResult,
61 QueryResultIterator, QueryRow, RowMetadata, StreamingConfig,
62};
63pub use writetime_ttl_validator::{
64 descriptors_from_table_schema, validate_all_writetime_ttl_calls, validate_writetime_ttl_call,
65 ColumnDescriptor as WriteTimeTtlColumnDescriptor, WriteTimeTtlKind,
66};
67
68#[cfg(feature = "state_machine")]
74pub use select_ast::SelectStatement;
75#[cfg(feature = "state_machine")]
76pub use select_executor::{
77 build_row_from_scan, evaluate_leaf, evaluate_predicates, LeafOutcome, SelectExecutor,
78};
79#[cfg(feature = "state_machine")]
80pub use select_optimizer::{
81 OptimizedQueryPlan, SSTableFilterOp, SSTablePredicate, SelectOptimizer,
82};
83#[cfg(feature = "state_machine")]
84pub use select_parser::{parse_select, SelectParser};
85
86use std::collections::HashMap;
87use std::sync::Arc;
88
89use crate::{
90 memory::MemoryManager, schema::SchemaManager, storage::StorageEngine, Config, Result, TableId,
91 Value,
92};
93
94#[derive(Debug, Clone, Default)]
96pub struct QueryStats {
97 pub total_queries: u64,
99 pub error_queries: u64,
101 pub avg_execution_time_us: u64,
103 pub cache_hit_ratio: f64,
105 pub rows_affected: u64,
107}
108
109#[derive(Debug)]
114pub struct QueryEngine {
115 advanced_engine: AdvancedQueryEngine,
116}
117
118impl QueryEngine {
119 pub fn new(
121 storage: Arc<StorageEngine>,
122 schema: Arc<SchemaManager>,
123 memory: Arc<MemoryManager>,
124 config: &Config,
125 ) -> Result<Self> {
126 Ok(Self {
127 advanced_engine: AdvancedQueryEngine::new(storage, schema, memory, config)?,
128 })
129 }
130
131 pub async fn execute(&self, cql: &str) -> Result<QueryResult> {
133 self.advanced_engine.execute(cql).await
134 }
135
136 pub async fn execute_with_params(&self, cql: &str, params: &[Value]) -> Result<QueryResult> {
138 self.advanced_engine.execute_with_params(cql, params).await
139 }
140
141 pub async fn prepare(&self, cql: &str) -> Result<Arc<PreparedQuery>> {
143 self.advanced_engine.prepare(cql).await
144 }
145
146 pub fn stats(&self) -> QueryStats {
148 self.advanced_engine.stats()
149 }
150
151 pub fn clear_cache(&self) {
153 self.advanced_engine.clear_prepared_cache();
154 }
155
156 pub async fn explain(&self, cql: &str) -> Result<ExplainResult> {
158 self.advanced_engine.explain(cql).await
159 }
160
161 pub async fn analyze(&self, cql: &str) -> Result<AnalyzeResult> {
163 self.advanced_engine.analyze(cql).await
164 }
165
166 #[cfg(feature = "state_machine")]
171 pub async fn execute_streaming(
172 &self,
173 cql: &str,
174 config: StreamingConfig,
175 ) -> Result<QueryResultIterator> {
176 self.advanced_engine.execute_streaming(cql, config).await
177 }
178
179 pub fn cache_stats(&self) -> CacheStats {
181 self.advanced_engine.cache_stats()
182 }
183
184 pub async fn has_schema_for_table(&self, table: &str) -> bool {
186 self.advanced_engine.has_schema_for_table(table).await
187 }
188
189 pub async fn schema_status(&self, table: &str) -> SchemaStatus {
191 self.advanced_engine.schema_status(table).await
192 }
193}
194
195#[derive(Debug, Clone, PartialEq)]
197pub enum QueryType {
198 Select,
200 Insert,
202 Update,
204 Delete,
206 CreateTable,
208 DropTable,
210 CreateIndex,
212 DropIndex,
214 Describe,
216 Use,
218}
219
220#[derive(Debug, Clone)]
222pub struct ParsedQuery {
223 pub query_type: QueryType,
225 pub table: Option<TableId>,
227 pub columns: Vec<String>,
229 pub where_clause: Option<WhereClause>,
231 pub values: Vec<Value>,
233 pub set_clause: HashMap<String, Value>,
235 pub order_by: Vec<OrderByClause>,
237 pub limit: Option<usize>,
239 pub cql: String,
241}
242
243#[derive(Debug, Clone)]
245pub struct WhereClause {
246 pub conditions: Vec<Condition>,
248}
249
250#[derive(Debug, Clone)]
252pub struct Condition {
253 pub column: String,
255 pub operator: ComparisonOperator,
257 pub value: Value,
259}
260
261#[derive(Debug, Clone, PartialEq)]
263pub enum ComparisonOperator {
264 Equal,
266 NotEqual,
268 LessThan,
270 LessThanOrEqual,
272 GreaterThan,
274 GreaterThanOrEqual,
276 In,
278 NotIn,
280 Like,
282 NotLike,
284}
285
286#[derive(Debug, Clone)]
288pub struct OrderByClause {
289 pub column: String,
291 pub direction: SortDirection,
293}
294
295#[derive(Debug, Clone, PartialEq)]
297pub enum SortDirection {
298 Asc,
300 Desc,
302}
303
304#[cfg(all(test, feature = "state_machine"))]
305mod tests {
306 use super::*;
307 use crate::platform::Platform;
308 use tempfile::TempDir;
309
310 #[tokio::test]
311 async fn test_query_engine_creation() {
312 let temp_dir = TempDir::new().unwrap();
313 let config = Config::default();
314 let platform = Arc::new(Platform::new(&config).await.unwrap());
315
316 let storage = Arc::new(
317 StorageEngine::open(
318 temp_dir.path(),
319 &config,
320 platform,
321 #[cfg(feature = "state_machine")]
322 None,
323 )
324 .await
325 .unwrap(),
326 );
327 let schema = Arc::new(SchemaManager::new(temp_dir.path()).await.unwrap());
328 let memory = Arc::new(MemoryManager::new(&config).unwrap());
329
330 let query_engine = QueryEngine::new(storage, schema, memory, &config).unwrap();
331
332 assert_eq!(query_engine.stats().total_queries, 0);
333 }
334}