Skip to main content

regulus_db/query/
builder.rs

1use crate::storage::{MemoryEngine, Row, StorageEngine, RowId};
2use crate::types::{DbValue, DbResult};
3use crate::index::btree::BTreeIndex;
4use crate::index::manager::IndexMeta;
5use std::sync::{Arc, RwLock};
6
7/// 排序方向
8#[derive(Debug, Clone, Copy, PartialEq)]
9pub enum Order {
10    Asc,
11    Desc,
12}
13
14/// JOIN 类型
15#[derive(Debug, Clone, Copy, PartialEq)]
16pub enum JoinType {
17    Inner,   // INNER JOIN - 只返回匹配行
18    Left,    // LEFT JOIN - 返回左表所有行,右表无匹配则 NULL
19    Right,   // RIGHT JOIN - 返回右表所有行,左表无匹配则 NULL
20    Full,    // FULL OUTER JOIN - 返回左右表所有行,无匹配时双方填充 NULL
21}
22
23/// 连接条件
24#[derive(Debug, Clone)]
25pub struct JoinCondition {
26    pub join_type: JoinType,
27    pub right_table: String,
28    pub left_field: String,   // 格式:"table.column"
29    pub right_field: String,  // 格式:"table.column"
30}
31
32/// 过滤表达式 AST
33#[derive(Debug, Clone)]
34pub enum FilterExpr {
35    Eq { field: String, value: DbValue },
36    Ne { field: String, value: DbValue },
37    Lt { field: String, value: DbValue },
38    Le { field: String, value: DbValue },
39    Gt { field: String, value: DbValue },
40    Ge { field: String, value: DbValue },
41    In { field: String, values: Vec<DbValue> },
42    Contains { field: String, value: String },
43    IsNull { field: String },
44    IsNotNull { field: String },
45    And(Box<FilterExpr>, Box<FilterExpr>),
46    Or(Box<FilterExpr>, Box<FilterExpr>),
47    Not(Box<FilterExpr>),
48}
49
50/// 聚合函数类型
51#[derive(Debug, Clone, Copy, PartialEq)]
52pub enum AggregateFunction {
53    Count,
54    Sum,
55    Avg,
56    Max,
57    Min,
58}
59
60/// 聚合表达式
61#[derive(Debug, Clone)]
62pub struct AggregateExpr {
63    pub func: AggregateFunction,
64    pub column: Option<String>,  // COUNT(*) 为 None
65    pub alias: Option<String>,   // 可选的别名
66}
67
68/// HAVING 子句表达式(用于过滤分组)
69#[derive(Debug, Clone)]
70pub enum HavingExpr {
71    Eq { value: DbValue },
72    Ne { value: DbValue },
73    Lt { value: DbValue },
74    Le { value: DbValue },
75    Gt { value: DbValue },
76    Ge { value: DbValue },
77}
78
79/// 评估过滤表达式
80fn evaluate_filter(expr: &FilterExpr, row: &Row) -> bool {
81    match expr {
82        FilterExpr::Eq { field, value } => {
83            row.get(field).map(|v| v == value).unwrap_or(false)
84        }
85        FilterExpr::Ne { field, value } => {
86            row.get(field).map(|v| v != value).unwrap_or(true)
87        }
88        FilterExpr::Lt { field, value } => compare_field(row, field, value, |a, b| a < b),
89        FilterExpr::Le { field, value } => compare_field(row, field, value, |a, b| a <= b),
90        FilterExpr::Gt { field, value } => compare_field(row, field, value, |a, b| a > b),
91        FilterExpr::Ge { field, value } => compare_field(row, field, value, |a, b| a >= b),
92        FilterExpr::In { field, values } => {
93            row.get(field).map(|v| values.contains(v)).unwrap_or(false)
94        }
95        FilterExpr::Contains { field, value } => {
96            row.get(field)
97                .and_then(|v| v.as_text())
98                .map(|s| s.contains(value))
99                .unwrap_or(false)
100        }
101        FilterExpr::IsNull { field } => {
102            !row.contains_key(field)
103        }
104        FilterExpr::IsNotNull { field } => {
105            row.contains_key(field)
106        }
107        FilterExpr::And(left, right) => {
108            evaluate_filter(left, row) && evaluate_filter(right, row)
109        }
110        FilterExpr::Or(left, right) => {
111            evaluate_filter(left, row) || evaluate_filter(right, row)
112        }
113        FilterExpr::Not(inner) => {
114            !evaluate_filter(inner, row)
115        }
116    }
117}
118
119/// 比较字段值(支持数值比较)
120fn compare_field<F>(row: &Row, field: &str, value: &DbValue, cmp: F) -> bool
121where
122    F: Fn(f64, f64) -> bool,
123{
124    let row_val = match row.get(field) {
125        Some(v) => v,
126        None => return false,
127    };
128
129    let row_num = match row_val {
130        DbValue::Integer(i) => *i as f64,
131        DbValue::Real(r) => *r,
132        _ => return false,
133    };
134
135    let cmp_num = match value {
136        DbValue::Integer(i) => *i as f64,
137        DbValue::Real(r) => *r,
138        _ => return false,
139    };
140
141    cmp(row_num, cmp_num)
142}
143
144/// 查询构建器
145pub struct QueryBuilder {
146    table: String,
147    joins: Vec<JoinCondition>,           // 新增:JOIN 列表
148    selected_columns: Vec<String>,       // 新增:选择字段
149    filters: Vec<FilterExpr>,
150    order_by: Option<(String, Order)>,
151    limit: Option<usize>,
152    offset: Option<usize>,
153    engine: Arc<RwLock<MemoryEngine>>,
154    // 聚合函数相关
155    aggregate: Option<AggregateExpr>,    // 聚合函数
156    group_by: Vec<String>,               // GROUP BY 字段
157    having: Option<HavingExpr>,          // HAVING 子句
158    distinct: bool,                      // DISTINCT 去重标志
159}
160
161impl QueryBuilder {
162    pub fn new(table: String, engine: Arc<RwLock<MemoryEngine>>) -> Self {
163        QueryBuilder {
164            table,
165            joins: Vec::new(),
166            selected_columns: Vec::new(),
167            filters: Vec::new(),
168            order_by: None,
169            limit: None,
170            offset: None,
171            engine,
172            aggregate: None,
173            group_by: Vec::new(),
174            having: None,
175            distinct: false,
176        }
177    }
178
179    /// 查找最佳可用索引(优先等值条件,其次范围条件)
180    /// 返回:(索引列名,索引对象,构建的复合键值)
181    fn find_best_index<'a>(&'a self, engine: &'a MemoryEngine) -> Option<(&'a IndexMeta, &'a BTreeIndex, Vec<DbValue>)> {
182        // 收集所有等值条件
183        let eq_filters: Vec<&FilterExpr> = self.filters.iter().filter(|f| matches!(f, FilterExpr::Eq { .. })).collect();
184
185        // 收集所有范围条件
186        let range_filters: Vec<&FilterExpr> = self.filters.iter().filter(|f| {
187            matches!(f, FilterExpr::Gt { .. } | FilterExpr::Ge { .. } | FilterExpr::Lt { .. } | FilterExpr::Le { .. })
188        }).collect();
189
190        // 使用引擎的 find_best_index 方法查找最佳复合索引
191        if !eq_filters.is_empty() {
192            let eq_columns: Vec<&str> = eq_filters.iter().map(|f| {
193                if let FilterExpr::Eq { field, .. } = f {
194                    field.as_str()
195                } else {
196                    ""
197                }
198            }).collect();
199
200            if let Some((meta, index)) = engine.find_best_index(&self.table, &eq_columns) {
201                // 构建复合键值
202                let mut key_values = Vec::new();
203                for col in &meta.columns {
204                    let value = eq_filters.iter()
205                        .find_map(|f| {
206                            if let FilterExpr::Eq { field, value } = f {
207                                if field == col { Some(value) } else { None }
208                            } else { None }
209                        });
210                    if let Some(v) = value {
211                        key_values.push(v.clone());
212                    } else {
213                        // 对于前缀匹配,后续列不需要
214                        break;
215                    }
216                }
217                if !key_values.is_empty() {
218                    return Some((meta, index, key_values));
219                }
220            }
221        }
222
223        // 检查范围条件(暂时不处理,由单列索引方法处理)
224        if let Some(_filter) = range_filters.first() {
225            // 范围条件的索引查找在 find_best_single_index 中处理
226        }
227
228        None
229    }
230
231    /// 查找最佳单列索引(向后兼容)
232    fn find_best_single_index<'a>(&'a self, engine: &'a MemoryEngine) -> Option<(&'a String, &'a BTreeIndex)> {
233        // 优先查找等值条件的字段
234        for filter in &self.filters {
235            if let FilterExpr::Eq { field, .. } = filter {
236                if let Some(index) = engine.get_index(&self.table, field) {
237                    return Some((field, index));
238                }
239            }
240        }
241        // 其次查找范围条件的字段
242        for filter in &self.filters {
243            if let FilterExpr::Gt { field, .. }
244               | FilterExpr::Ge { field, .. }
245               | FilterExpr::Lt { field, .. }
246               | FilterExpr::Le { field, .. } = filter {
247                if let Some(index) = engine.get_index(&self.table, field) {
248                    return Some((field, index));
249                }
250            }
251        }
252        None
253    }
254
255    /// 使用索引执行查询(优化版本)
256    fn execute_with_index(&self, engine: &MemoryEngine, _field: &str, index: &BTreeIndex) -> DbResult<Vec<Row>> {
257        // 从索引中获取匹配的 row_id
258        let row_ids = self.get_matching_row_ids(index);
259
260        // 根据 row_ids 回表查询完整行数据
261        let mut results = Vec::new();
262        for row_id in row_ids {
263            if let Some(row) = engine.get(&self.table, row_id)? {
264                // 需要验证所有过滤条件(因为索引只针对一个字段)
265                if self.matches_all_filters(&row) {
266                    results.push(row.clone());
267                }
268            }
269        }
270
271        // 排序
272        if let Some((field, order)) = &self.order_by {
273            results.sort_by(|a, b| {
274                self.compare_rows(a, b, field, *order)
275            });
276        }
277
278        // 分页
279        let start = self.offset.unwrap_or(0);
280        let end = start + self.limit.unwrap_or(results.len());
281
282        Ok(results.into_iter().skip(start).take(end - start).collect())
283    }
284
285    /// 使用复合索引执行查询
286    fn execute_with_composite_index(&self, engine: &MemoryEngine, _meta: &IndexMeta, index: &BTreeIndex, key_values: &[DbValue]) -> DbResult<Vec<Row>> {
287        // 从复合索引中获取匹配的 row_id
288        let row_ids = index.search_composite(key_values);
289
290        // 根据 row_ids 回表查询完整行数据
291        let mut results = Vec::new();
292        for row_id in row_ids {
293            if let Some(row) = engine.get(&self.table, row_id)? {
294                // 验证所有过滤条件
295                if self.matches_all_filters(&row) {
296                    results.push(row.clone());
297                }
298            }
299        }
300
301        // 排序
302        if let Some((field, order)) = &self.order_by {
303            results.sort_by(|a, b| {
304                self.compare_rows(a, b, field, *order)
305            });
306        }
307
308        // 分页
309        let start = self.offset.unwrap_or(0);
310        let end = start + self.limit.unwrap_or(results.len());
311
312        Ok(results.into_iter().skip(start).take(end - start).collect())
313    }
314
315    /// 根据过滤条件从索引中获取匹配的 row_ids
316    fn get_matching_row_ids(&self, index: &BTreeIndex) -> Vec<RowId> {
317        let mut row_ids = Vec::new();
318
319        // 收集所有针对同一字段的等值和范围条件
320        let mut eq_value: Option<&DbValue> = None;
321        let mut gt_value: Option<&DbValue> = None;
322        let mut ge_value: Option<&DbValue> = None;
323        let mut lt_value: Option<&DbValue> = None;
324        let mut le_value: Option<&DbValue> = None;
325
326        for filter in &self.filters {
327            match filter {
328                FilterExpr::Eq { field, value } if eq_value.is_none() => {
329                    eq_value = Some(value);
330                }
331                FilterExpr::Gt { field: _, value } => {
332                    if gt_value.is_none() || value > gt_value.unwrap() {
333                        gt_value = Some(value);
334                    }
335                }
336                FilterExpr::Ge { field: _, value } => {
337                    if ge_value.is_none() || value > ge_value.unwrap() {
338                        ge_value = Some(value);
339                    }
340                }
341                FilterExpr::Lt { field: _, value } => {
342                    if lt_value.is_none() || value < lt_value.unwrap() {
343                        lt_value = Some(value);
344                    }
345                }
346                FilterExpr::Le { field: _, value } => {
347                    if le_value.is_none() || value < le_value.unwrap() {
348                        le_value = Some(value);
349                    }
350                }
351                _ => {}
352            }
353        }
354
355        // 如果有等值条件,直接使用 search
356        if let Some(eq) = eq_value {
357            row_ids.extend(index.search(eq));
358        } else {
359            // 计算范围 [range_start, range_end)
360            let range_start = gt_value.or(ge_value);
361            let range_end = lt_value.or(le_value);
362
363            if let Some(start) = range_start {
364                // 需要调整范围边界(gt 需要 +1,但这里简化处理)
365                if let Some(end) = range_end {
366                    row_ids.extend(index.range(start, end));
367                } else {
368                    row_ids.extend(index.range_from(start));
369                }
370            } else if let Some(_end) = range_end {
371                // 只有上界,从最小值开始
372                // 这里需要一个最小值,简化处理:使用 range_from 然后过滤
373                // 由于 DbValue 没有明确的最小值,我们直接扫描
374                // 这种情况较少,暂不优化
375            } else {
376                // 没有范围条件,返回所有
377                // 这不应该发生,因为调用者会先检查是否有可用索引
378            }
379        }
380
381        row_ids
382    }
383
384    /// 检查行是否匹配所有过滤条件
385    fn matches_all_filters(&self, row: &Row) -> bool {
386        self.filters.iter().all(|expr| evaluate_filter(expr, row))
387    }
388
389    /// 比较两行(用于排序)
390    fn compare_rows(&self, a: &Row, b: &Row, field: &str, order: Order) -> std::cmp::Ordering {
391        let a_val = a.get(field);
392        let b_val = b.get(field);
393
394        let cmp = match (a_val, b_val) {
395            (Some(DbValue::Integer(a)), Some(DbValue::Integer(b))) => a.partial_cmp(b),
396            (Some(DbValue::Real(a)), Some(DbValue::Real(b))) => a.partial_cmp(b),
397            (Some(DbValue::Integer(a)), Some(DbValue::Real(b))) => (*a as f64).partial_cmp(b),
398            (Some(DbValue::Real(a)), Some(DbValue::Integer(b))) => a.partial_cmp(&(*b as f64)),
399            (Some(DbValue::Text(a)), Some(DbValue::Text(b))) => Some(a.cmp(b)),
400            _ => Some(std::cmp::Ordering::Equal),
401        };
402
403        match order {
404            Order::Asc => cmp.unwrap_or(std::cmp::Ordering::Equal),
405            Order::Desc => cmp.unwrap_or(std::cmp::Ordering::Equal).reverse(),
406        }
407    }
408
409    // ==================== JOIN 相关辅助方法 ====================
410
411    /// 字段名前缀化:"name" -> "table.name"
412    fn prefix_row(&self, row: &Row, table: &str) -> Row {
413        row.iter()
414            .map(|(k, v)| (format!("{}.{}", table, k), v.clone()))
415            .collect::<Row>()
416    }
417
418    /// DISTINCT 去重:根据 selected_columns 对行进行去重
419    /// 如果 selected_columns 为空,则对所有列去重
420    fn deduplicate_rows(&self, rows: Vec<Row>) -> Vec<Row> {
421        use std::collections::HashSet;
422
423        // 确定用于去重的列索引
424        let dedup_column_indices: Option<Vec<usize>> = if self.selected_columns.is_empty() {
425            None // 使用所有列
426        } else {
427            // 获取第一行的列名用于映射
428            rows.first().map(|first_row| {
429                let all_columns: Vec<&String> = first_row.iter().map(|(k, _)| k).collect();
430                self.selected_columns.iter()
431                    .map(|sel| {
432                        // 尝试找到匹配的列索引
433                        all_columns.iter().position(|col| {
434                            col.as_str() == sel.as_str() ||
435                            col.ends_with(&format!(".{}", sel)) ||
436                            (sel.contains('.') && col.as_str() == sel.as_str())
437                        }).unwrap_or(0)
438                    })
439                    .collect()
440            })
441        };
442
443        let mut seen = HashSet::new();
444        let mut result = Vec::new();
445
446        for row in rows {
447            // 构建去重键
448            let key: Vec<&DbValue> = match &dedup_column_indices {
449                Some(indices) => {
450                    indices.iter()
451                        .filter_map(|&i| row.iter().nth(i).map(|(_, v)| v))
452                        .collect()
453                }
454                None => {
455                    row.iter().map(|(_, v)| v).collect()
456                }
457            };
458
459            // 使用序列化的键进行去重
460            let serialized_key: Vec<String> = key.iter()
461                .map(|v| format!("{:?}", v))
462                .collect();
463
464            if seen.insert(serialized_key) {
465                result.push(row);
466            }
467        }
468
469        result
470    }
471
472    /// 创建 NULL 行(用于 LEFT/RIGHT JOIN 无匹配时)
473    fn create_null_row(&self, engine: &MemoryEngine, table: &str) -> DbResult<Row> {
474        let schema = engine.get_schema(table)?;
475        let mut row = Row::new();
476        for column in &schema.columns {
477            row.insert(format!("{}.{}", table, column.name), DbValue::Null);
478        }
479        Ok(row)
480    }
481
482    /// 匹配 JOIN 条件
483    fn match_join_condition(&self, left: &Row, right: &Row, join: &JoinCondition) -> bool {
484        let left_val = left.get(&join.left_field);
485        let right_val = right.get(&join.right_field);
486        left_val == right_val
487    }
488
489    /// 从 qualified field name 提取列名
490    /// "table.column" -> "column"
491    /// "column" -> "column"
492    fn extract_column_name(field: &str) -> &str {
493        if let Some(pos) = field.rfind('.') {
494            &field[pos + 1..]
495        } else {
496            field
497        }
498    }
499
500    /// 优化 JOIN 顺序
501    /// 策略:选择最小的表作为驱动表,减少中间结果集
502    fn optimize_join_order(&self, engine: &MemoryEngine) -> DbResult<Vec<JoinCondition>> {
503        // 1. 收集所有涉及的表及其大小
504        let mut tables: Vec<(String, usize)> = Vec::new();
505
506        // 主表
507        let main_count = engine.get_row_count(&self.table)?;
508        tables.push((self.table.clone(), main_count));
509
510        // JOIN 表
511        for join in &self.joins {
512            if !tables.iter().any(|(name, _)| name == &join.right_table) {
513                let count = engine.get_row_count(&join.right_table)?;
514                tables.push((join.right_table.clone(), count));
515            }
516        }
517
518        // 2. 按表大小排序(从小到大)
519        tables.sort_by_key(|(_, count)| *count);
520
521        // 3. 找出最小的右表
522        let smallest_table = tables.first()
523            .map(|(name, _)| name.clone());
524
525        // 4. 重排 JOIN 顺序:将最小表对应的 JOIN 交换到前面
526        let mut optimized_joins = self.joins.clone();
527
528        if let Some(smallest) = smallest_table {
529            // 找到包含最小表的 JOIN
530            if let Some(min_idx) = optimized_joins.iter().position(|j| j.right_table == smallest) {
531                optimized_joins.swap(0, min_idx);
532            }
533        }
534
535        Ok(optimized_joins)
536    }
537
538    /// 执行 JOIN 查询(嵌套循环连接)
539    fn execute_join(&self, engine: &MemoryEngine) -> DbResult<Vec<Row>> {
540        if self.joins.is_empty() {
541            return self.execute_simple_scan(engine);
542        }
543
544        // 检查是否有 RIGHT JOIN 或 FULL OUTER JOIN
545        let has_right_join = self.joins.iter().any(|j| matches!(j.join_type, JoinType::Right));
546        let has_full_join = self.joins.iter().any(|j| matches!(j.join_type, JoinType::Full));
547
548        // 从第一个 JOIN 开始,逐步连接所有表
549        let mut results: Vec<Row> = Vec::new();
550
551        if has_right_join || has_full_join {
552            // RIGHT JOIN 和 FULL OUTER JOIN 需要特殊处理:以右表为驱动表
553            self.execute_right_or_full_join(engine, &mut results)?;
554        } else {
555            // 优化 JOIN 顺序:选择最小的表作为驱动表
556            let optimized_joins = self.optimize_join_order(engine)?;
557
558            // 扫描主表
559            let main_table_rows = engine.scan(&self.table)?;
560
561            for (_row_id, main_row) in main_table_rows {
562                let main_prefixed = self.prefix_row(&main_row, &self.table);
563
564                // 使用优化后的 JOIN 顺序
565                self.process_joins_with_order(engine, main_prefixed, 0, &mut results, &optimized_joins)?;
566            }
567        }
568
569        // 应用过滤条件
570        let mut filtered: Vec<Row> = results
571            .into_iter()
572            .filter(|row| self.filters.iter().all(|expr| evaluate_filter(expr, row)))
573            .collect();
574
575        // 应用字段选择(投影)
576        if !self.selected_columns.is_empty() {
577            filtered = filtered
578                .into_iter()
579                .map(|row| {
580                    let mut projected = Row::new();
581                    for col in &self.selected_columns {
582                        if let Some(value) = row.get(col) {
583                            projected.insert(col.clone(), value.clone());
584                        }
585                    }
586                    projected
587                })
588                .collect();
589        }
590
591        // 排序
592        if let Some((ref field, order)) = self.order_by {
593            filtered.sort_by(|a, b| self.compare_rows(a, b, field, order));
594        }
595
596        // 分页
597        let start = self.offset.unwrap_or(0);
598        let end = start + self.limit.unwrap_or(filtered.len());
599
600        Ok(filtered.into_iter().skip(start).take(end - start).collect())
601    }
602
603    /// 执行 RIGHT JOIN 或 FULL OUTER JOIN(以右表为驱动表)
604    fn execute_right_or_full_join(&self, engine: &MemoryEngine, results: &mut Vec<Row>) -> DbResult<()> {
605        // 找到第一个 RIGHT JOIN 或 FULL OUTER JOIN
606        let right_or_full_join_index = self.joins.iter().position(|j| {
607            matches!(j.join_type, JoinType::Right | JoinType::Full)
608        });
609
610        if let Some(join_idx) = right_or_full_join_index {
611            let join = &self.joins[join_idx];
612            let is_full = matches!(join.join_type, JoinType::Full);
613
614            // 扫描右表
615            let right_table_rows = engine.scan(&join.right_table)?;
616
617            // 扫描左表用于匹配
618            let left_table_rows = if join_idx == 0 {
619                engine.scan(&self.table)?
620            } else {
621                // 多表 JOIN 场景:左表是前面 JOIN 的结果
622                // 简化处理:先不支持复杂的链式 RIGHT/FULL JOIN
623                Vec::new()
624            };
625
626            // 跟踪已匹配的左表行(用于 FULL OUTER JOIN)
627            let mut matched_left_row_ids: std::collections::HashSet<RowId> = std::collections::HashSet::new();
628
629            // 处理右表的每一行
630            for (_right_id, right_row) in right_table_rows {
631                let right_prefixed = self.prefix_row(&right_row, &join.right_table);
632
633                // 为每个右表行查找左表匹配
634                let mut has_match = false;
635
636                for (left_id, left_row) in &left_table_rows {
637                    let left_prefixed = self.prefix_row(&left_row, &self.table);
638
639                    if self.match_join_condition(&left_prefixed, &right_prefixed, join) {
640                        has_match = true;
641                        matched_left_row_ids.insert(*left_id);
642                        let mut merged = left_prefixed.clone();
643                        merged.extend(right_prefixed.clone());
644
645                        // 处理后续 JOIN(如果有)
646                        self.process_joins_right_full(engine, merged, join_idx + 1, results, is_full)?;
647                    }
648                }
649
650                // 无匹配:左表为 NULL,右表保留
651                if !has_match {
652                    let null_row = self.create_null_row(engine, &self.table)?;
653                    let mut merged = null_row;
654                    merged.extend(right_prefixed);
655
656                    // 处理后续 JOIN
657                    self.process_joins_right_full(engine, merged, join_idx + 1, results, is_full)?;
658                }
659            }
660
661            // FULL OUTER JOIN:处理左表中未匹配的行
662            if is_full {
663                for (left_id, left_row) in &left_table_rows {
664                    if !matched_left_row_ids.contains(left_id) {
665                        let left_prefixed = self.prefix_row(&left_row, &self.table);
666                        let null_row = self.create_null_row(engine, &join.right_table)?;
667                        let mut merged = left_prefixed;
668                        merged.extend(null_row);
669
670                        // 处理后续 JOIN
671                        self.process_joins_right_full(engine, merged, join_idx + 1, results, is_full)?;
672                    }
673                }
674            }
675        }
676
677        Ok(())
678    }
679
680    /// 递归处理 JOIN 链(用于 RIGHT/FULL JOIN)
681    fn process_joins_right_full(
682        &self,
683        engine: &MemoryEngine,
684        current_row: Row,
685        join_index: usize,
686        results: &mut Vec<Row>,
687        is_full_context: bool,
688    ) -> DbResult<()> {
689        if join_index >= self.joins.len() {
690            results.push(current_row);
691            return Ok(());
692        }
693
694        let join = &self.joins[join_index];
695
696        // 如果是 FULL OUTER JOIN 上下文,且当前也是 FULL OUTER JOIN
697        if is_full_context && matches!(join.join_type, JoinType::Full) {
698            // 简化处理:将 FULL OUTER JOIN 视为 LEFT JOIN 处理后续
699            // 完整的实现需要更复杂的状态跟踪
700        }
701
702        // 尝试使用索引优化
703        let right_column = Self::extract_column_name(&join.right_field);
704        if let Some(index) = engine.get_index(&join.right_table, right_column) {
705            // 有索引,使用索引优化
706            self.process_join_with_index_impl(engine, current_row, join_index, results, join, right_column, index)
707        } else {
708            // 无索引,降级为全表扫描
709            self.process_join_scan_impl(engine, current_row, join_index, results, join)
710        }
711    }
712
713    /// 递归处理 JOIN 链(使用优化后的顺序)
714    fn process_joins_with_order(
715        &self,
716        engine: &MemoryEngine,
717        current_row: Row,
718        join_index: usize,
719        results: &mut Vec<Row>,
720        optimized_joins: &[JoinCondition],
721    ) -> DbResult<()> {
722        if join_index >= optimized_joins.len() {
723            // 所有 JOIN 处理完毕,添加结果
724            results.push(current_row);
725            return Ok(());
726        }
727
728        let join = &optimized_joins[join_index];
729
730        // RIGHT JOIN 需要特殊处理
731        if matches!(join.join_type, JoinType::Right) {
732            return self.process_joins_with_order(engine, current_row, join_index + 1, results, optimized_joins);
733        }
734
735        // 尝试使用索引优化
736        let right_column = Self::extract_column_name(&join.right_field);
737        if let Some(index) = engine.get_index(&join.right_table, right_column) {
738            self.process_join_with_index_impl_optimized(engine, current_row, join_index, results, join, right_column, index, optimized_joins)
739        } else {
740            self.process_join_scan_impl_optimized(engine, current_row, join_index, results, join, optimized_joins)
741        }
742    }
743
744    /// 使用全表扫描执行 JOIN(优化版本,支持自定义 JOIN 顺序)
745    fn process_join_scan_impl_optimized(
746        &self,
747        engine: &MemoryEngine,
748        current_row: Row,
749        join_index: usize,
750        results: &mut Vec<Row>,
751        join: &JoinCondition,
752        optimized_joins: &[JoinCondition],
753    ) -> DbResult<()> {
754        let right_rows = engine.scan(&join.right_table)?;
755
756        let mut has_match = false;
757
758        for (_right_id, right_row) in right_rows {
759            let right_prefixed = self.prefix_row(&right_row, &join.right_table);
760
761            // 检查 JOIN 条件
762            if self.match_join_condition(&current_row, &right_prefixed, join) {
763                has_match = true;
764                // 合并行
765                let mut merged = current_row.clone();
766                merged.extend(right_prefixed);
767
768                // 递归处理下一个 JOIN(使用优化后的顺序)
769                self.process_joins_with_order(engine, merged, join_index + 1, results, optimized_joins)?;
770            }
771        }
772
773        // 处理 LEFT JOIN 无匹配情况
774        if !has_match && matches!(join.join_type, JoinType::Left) {
775            let null_row = self.create_null_row(engine, &join.right_table)?;
776            let mut merged = current_row.clone();
777            merged.extend(null_row);
778
779            // 递归处理下一个 JOIN(使用优化后的顺序)
780            self.process_joins_with_order(engine, merged, join_index + 1, results, optimized_joins)?;
781        }
782
783        Ok(())
784    }
785
786    /// 使用索引执行 JOIN(优化版本,支持自定义 JOIN 顺序)
787    fn process_join_with_index_impl_optimized(
788        &self,
789        engine: &MemoryEngine,
790        current_row: Row,
791        join_index: usize,
792        results: &mut Vec<Row>,
793        join: &JoinCondition,
794        _right_column: &str,
795        index: &BTreeIndex,
796        optimized_joins: &[JoinCondition],
797    ) -> DbResult<()> {
798        // 从左表获取 JOIN 字段值
799        let join_value = match current_row.get(&join.left_field) {
800            Some(v) => v,
801            None => return Ok(()),  // 左表字段为 NULL,无法匹配
802        };
803
804        // 使用索引查找匹配的 RowId(O(log n))
805        let matching_row_ids = index.search(join_value);
806
807        let mut has_match = false;
808
809        for row_id in matching_row_ids {
810            has_match = true;
811            if let Some(right_row) = engine.get(&join.right_table, row_id)? {
812                let right_prefixed = self.prefix_row(&right_row, &join.right_table);
813                let mut merged = current_row.clone();
814                merged.extend(right_prefixed);
815
816                // 递归处理下一个 JOIN(使用优化后的顺序)
817                self.process_joins_with_order(engine, merged, join_index + 1, results, optimized_joins)?;
818            }
819        }
820
821        // LEFT JOIN 无匹配处理
822        if !has_match && matches!(join.join_type, JoinType::Left) {
823            let null_row = self.create_null_row(engine, &join.right_table)?;
824            let mut merged = current_row.clone();
825            merged.extend(null_row);
826
827            // 递归处理下一个 JOIN(使用优化后的顺序)
828            self.process_joins_with_order(engine, merged, join_index + 1, results, optimized_joins)?;
829        }
830
831        Ok(())
832    }
833
834    /// 递归处理 JOIN 链
835    fn process_joins(
836        &self,
837        engine: &MemoryEngine,
838        current_row: Row,
839        join_index: usize,
840        results: &mut Vec<Row>,
841    ) -> DbResult<()> {
842        if join_index >= self.joins.len() {
843            // 所有 JOIN 处理完毕,添加结果
844            results.push(current_row);
845            return Ok(());
846        }
847
848        let join = &self.joins[join_index];
849
850        // RIGHT JOIN 需要特殊处理(在 execute_right_join 中已处理)
851        // 这里处理 INNER JOIN 和 LEFT JOIN
852        if matches!(join.join_type, JoinType::Right) {
853            // RIGHT JOIN 已在 execute_right_join 中处理,这里只需要处理后续的非 RIGHT JOIN
854            // 递归处理下一个 JOIN
855            return self.process_joins(engine, current_row, join_index + 1, results);
856        }
857
858        // 尝试使用索引优化
859        let right_column = Self::extract_column_name(&join.right_field);
860        if let Some(index) = engine.get_index(&join.right_table, right_column) {
861            // 有索引,使用索引优化
862            self.process_join_with_index_impl(engine, current_row, join_index, results, join, right_column, index)
863        } else {
864            // 无索引,降级为全表扫描
865            self.process_join_scan_impl(engine, current_row, join_index, results, join)
866        }
867    }
868
869    /// 使用全表扫描执行 JOIN(降级方案)
870    fn process_join_scan_impl(
871        &self,
872        engine: &MemoryEngine,
873        current_row: Row,
874        join_index: usize,
875        results: &mut Vec<Row>,
876        join: &JoinCondition,
877    ) -> DbResult<()> {
878        let right_rows = engine.scan(&join.right_table)?;
879
880        let mut has_match = false;
881
882        for (_right_id, right_row) in right_rows {
883            let right_prefixed = self.prefix_row(&right_row, &join.right_table);
884
885            // 检查 JOIN 条件
886            if self.match_join_condition(&current_row, &right_prefixed, join) {
887                has_match = true;
888                // 合并行
889                let mut merged = current_row.clone();
890                merged.extend(right_prefixed);
891
892                // 递归处理下一个 JOIN
893                self.process_joins(engine, merged, join_index + 1, results)?;
894            }
895        }
896
897        // 处理 LEFT JOIN 无匹配情况
898        if !has_match && matches!(join.join_type, JoinType::Left) {
899            let null_row = self.create_null_row(engine, &join.right_table)?;
900            let mut merged = current_row.clone();
901            merged.extend(null_row);
902
903            // 递归处理下一个 JOIN
904            self.process_joins(engine, merged, join_index + 1, results)?;
905        }
906
907        Ok(())
908    }
909
910    /// 使用索引执行 JOIN(优化方案)
911    fn process_join_with_index_impl(
912        &self,
913        engine: &MemoryEngine,
914        current_row: Row,
915        join_index: usize,
916        results: &mut Vec<Row>,
917        join: &JoinCondition,
918        _right_column: &str,
919        index: &BTreeIndex,
920    ) -> DbResult<()> {
921        // 从左表获取 JOIN 字段值
922        let join_value = match current_row.get(&join.left_field) {
923            Some(v) => v,
924            None => return Ok(()),  // 左表字段为 NULL,无法匹配
925        };
926
927        // 使用索引查找匹配的 RowId(O(log n))
928        let matching_row_ids = index.search(join_value);
929
930        let mut has_match = false;
931
932        for row_id in matching_row_ids {
933            has_match = true;
934            if let Some(right_row) = engine.get(&join.right_table, row_id)? {
935                let right_prefixed = self.prefix_row(&right_row, &join.right_table);
936                let mut merged = current_row.clone();
937                for (k, v) in right_prefixed {
938                    merged.insert(k, v);
939                }
940
941                // 递归处理下一个 JOIN
942                self.process_joins(engine, merged, join_index + 1, results)?;
943            }
944        }
945
946        // LEFT JOIN 无匹配处理
947        if !has_match && matches!(join.join_type, JoinType::Left) {
948            let null_row = self.create_null_row(engine, &join.right_table)?;
949            let mut merged = current_row.clone();
950            for (k, v) in null_row {
951                merged.insert(k, v);
952            }
953
954            // 递归处理下一个 JOIN
955            self.process_joins(engine, merged, join_index + 1, results)?;
956        }
957
958        Ok(())
959    }
960
961    /// 简单全表扫描(无 JOIN 时)
962    fn execute_simple_scan(&self, engine: &MemoryEngine) -> DbResult<Vec<Row>> {
963        let rows = engine.scan(&self.table)?;
964
965        let mut filtered: Vec<Row> = rows
966            .into_iter()
967            .filter(|(_, row)| self.filters.iter().all(|expr| evaluate_filter(expr, row)))
968            .map(|(_, row)| row.clone())
969            .collect();
970
971        // 应用字段选择
972        if !self.selected_columns.is_empty() {
973            filtered = filtered
974                .into_iter()
975                .map(|row| {
976                    let mut projected = Row::new();
977                    for col in &self.selected_columns {
978                        if let Some(value) = row.get(col) {
979                            projected.insert(col.clone(), value.clone());
980                        }
981                    }
982                    projected
983                })
984                .collect();
985        }
986
987        // 排序
988        if let Some((ref field, order)) = self.order_by {
989            filtered.sort_by(|a, b| self.compare_rows(a, b, field, order));
990        }
991
992        // 分页
993        let start = self.offset.unwrap_or(0);
994        let end = start + self.limit.unwrap_or(filtered.len());
995
996        Ok(filtered.into_iter().skip(start).take(end - start).collect())
997    }
998
999    // 过滤条件
1000    pub fn eq(mut self, field: &str, value: DbValue) -> Self {
1001        self.filters.push(FilterExpr::Eq {
1002            field: field.to_string(),
1003            value,
1004        });
1005        self
1006    }
1007
1008    pub fn ne(mut self, field: &str, value: DbValue) -> Self {
1009        self.filters.push(FilterExpr::Ne {
1010            field: field.to_string(),
1011            value,
1012        });
1013        self
1014    }
1015
1016    pub fn lt(mut self, field: &str, value: DbValue) -> Self {
1017        self.filters.push(FilterExpr::Lt {
1018            field: field.to_string(),
1019            value,
1020        });
1021        self
1022    }
1023
1024    pub fn le(mut self, field: &str, value: DbValue) -> Self {
1025        self.filters.push(FilterExpr::Le {
1026            field: field.to_string(),
1027            value,
1028        });
1029        self
1030    }
1031
1032    pub fn gt(mut self, field: &str, value: DbValue) -> Self {
1033        self.filters.push(FilterExpr::Gt {
1034            field: field.to_string(),
1035            value,
1036        });
1037        self
1038    }
1039
1040    pub fn ge(mut self, field: &str, value: DbValue) -> Self {
1041        self.filters.push(FilterExpr::Ge {
1042            field: field.to_string(),
1043            value,
1044        });
1045        self
1046    }
1047
1048    pub fn in_list(mut self, field: &str, values: Vec<DbValue>) -> Self {
1049        self.filters.push(FilterExpr::In {
1050            field: field.to_string(),
1051            values,
1052        });
1053        self
1054    }
1055
1056    pub fn contains(mut self, field: &str, value: &str) -> Self {
1057        self.filters.push(FilterExpr::Contains {
1058            field: field.to_string(),
1059            value: value.to_string(),
1060        });
1061        self
1062    }
1063
1064    /// IS NULL 条件:查询字段为 NULL 的行
1065    pub fn is_null(mut self, field: &str) -> Self {
1066        self.filters.push(FilterExpr::IsNull {
1067            field: field.to_string(),
1068        });
1069        self
1070    }
1071
1072    /// IS NOT NULL 条件:查询字段不为 NULL 的行
1073    pub fn is_not_null(mut self, field: &str) -> Self {
1074        self.filters.push(FilterExpr::IsNotNull {
1075            field: field.to_string(),
1076        });
1077        self
1078    }
1079
1080    // 逻辑组合
1081    pub fn and(mut self, other: QueryBuilder) -> Self {
1082        // 合并另一个 QueryBuilder 的过滤条件
1083        for filter in other.filters {
1084            self.filters.push(filter);
1085        }
1086        self
1087    }
1088
1089    /// OR 条件:将两个过滤条件用 OR 连接
1090    ///
1091    /// # 示例
1092    ///
1093    /// 忽略编译的示例,完整代码请参见测试文件:
1094    /// ```rust,no_run
1095    /// # use regulus_db::{Database, DbValue, FilterExpr};
1096    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
1097    /// # let db = Database::new();
1098    /// // 查询 age > 18 OR status = 'vip' 的用户
1099    /// db.query("users")
1100    ///     .or(
1101    ///         FilterExpr::Gt { field: "age".to_string(), value: DbValue::integer(18) },
1102    ///         FilterExpr::Eq { field: "status".to_string(), value: DbValue::text("vip") }
1103    ///     )
1104    ///     .execute()?;
1105    /// # Ok(())
1106    /// # }
1107    /// ```
1108    pub fn or(mut self, left: FilterExpr, right: FilterExpr) -> Self {
1109        self.filters.push(FilterExpr::Or(Box::new(left), Box::new(right)));
1110        self
1111    }
1112
1113    /// NOT 条件:对一个过滤条件取反
1114    ///
1115    /// # 示例
1116    ///
1117    /// 简单条件 - 只对下一个条件生效:
1118    /// ```rust,no_run
1119    /// # use regulus_db::{Database, DbValue};
1120    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
1121    /// # let db = Database::new();
1122    /// // 查询 age != 18 的用户
1123    /// db.query("users")
1124    ///     .not()
1125    ///     .eq("age", DbValue::integer(18))
1126    ///     .execute()?;
1127    /// # Ok(())
1128    /// # }
1129    /// ```
1130    ///
1131    /// 复杂条件 - 使用 expr() 传入 FilterExpr:
1132    /// ```rust,no_run
1133    /// # use regulus_db::{Database, DbValue, FilterExpr};
1134    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
1135    /// # let db = Database::new();
1136    /// // 查询 NOT (age > 18 AND status = 'active')
1137    /// db.query("users")
1138    ///     .not()
1139    ///     .expr(FilterExpr::And(
1140    ///         Box::new(FilterExpr::Gt { field: "age".to_string(), value: DbValue::integer(18) }),
1141    ///         Box::new(FilterExpr::Eq { field: "status".to_string(), value: DbValue::text("active") })
1142    ///     ))
1143    ///     .execute()?;
1144    /// # Ok(())
1145    /// # }
1146    /// ```
1147    pub fn not(self) -> NotBuilder {
1148        NotBuilder { query: self }
1149    }
1150
1151    /// 添加任意过滤表达式
1152    ///
1153    /// # 示例
1154    ///
1155    /// 忽略编译的示例,完整代码请参见测试文件:
1156    /// ```rust,no_run
1157    /// # use regulus_db::{Database, DbValue, FilterExpr};
1158    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
1159    /// # let db = Database::new();
1160    /// // 添加 OR 条件
1161    /// db.query("users")
1162    ///     .where_expr(FilterExpr::Or(
1163    ///         Box::new(FilterExpr::Gt { field: "age".to_string(), value: DbValue::integer(18) }),
1164    ///         Box::new(FilterExpr::Eq { field: "status".to_string(), value: DbValue::text("vip") })
1165    ///     ))
1166    ///     .execute()?;
1167    /// # Ok(())
1168    /// # }
1169    /// ```
1170    pub fn where_expr(mut self, expr: FilterExpr) -> Self {
1171        self.filters.push(expr);
1172        self
1173    }
1174
1175    /// 构建 OR 条件(便捷方法)
1176    ///
1177    /// # 示例
1178    ///
1179    /// 忽略编译的示例,完整代码请参见测试文件:
1180    /// ```rust,no_run
1181    /// # use regulus_db::{Database, DbValue};
1182    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
1183    /// # let db = Database::new();
1184    /// // 查询 age > 18 OR age < 10 的用户
1185    /// db.query("users")
1186    ///     .or_simple(|q| q.gt("age", DbValue::integer(18)), |q| q.lt("age", DbValue::integer(10)))
1187    ///     .execute()?;
1188    /// # Ok(())
1189    /// # }
1190    /// ```
1191    pub fn or_simple<F1, F2>(self, left_builder: F1, right_builder: F2) -> Self
1192    where
1193        F1: FnOnce(QueryBuilder) -> QueryBuilder,
1194        F2: FnOnce(QueryBuilder) -> QueryBuilder,
1195    {
1196        // 构建左边的条件
1197        let left_qb = left_builder(QueryBuilder::new(self.table.clone(), Arc::clone(&self.engine)));
1198        // 构建右边的条件
1199        let right_qb = right_builder(QueryBuilder::new(self.table.clone(), Arc::clone(&self.engine)));
1200
1201        // 合并左右条件为 OR
1202        let left_filters: Vec<FilterExpr> = left_qb.filters;
1203        let right_filters: Vec<FilterExpr> = right_qb.filters;
1204
1205        // 将多个 filters 用 AND 连接
1206        let left_expr = left_filters.into_iter().reduce(|a, b| FilterExpr::And(Box::new(a), Box::new(b)));
1207        let right_expr = right_filters.into_iter().reduce(|a, b| FilterExpr::And(Box::new(a), Box::new(b)));
1208
1209        match (left_expr, right_expr) {
1210            (Some(left), Some(right)) => {
1211                let mut new_self = self;
1212                new_self.filters.push(FilterExpr::Or(Box::new(left), Box::new(right)));
1213                new_self
1214            }
1215            (Some(left), None) => {
1216                let mut new_self = self;
1217                new_self.filters.push(left);
1218                new_self
1219            }
1220            (None, Some(right)) => {
1221                let mut new_self = self;
1222                new_self.filters.push(right);
1223                new_self
1224            }
1225            (None, None) => self,
1226        }
1227    }
1228
1229    /// 构建 NOT 条件(便捷方法)
1230    ///
1231    /// # 示例
1232    ///
1233    /// 忽略编译的示例,完整代码请参见测试文件:
1234    /// ```rust,no_run
1235    /// # use regulus_db::{Database, DbValue};
1236    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
1237    /// # let db = Database::new();
1238    /// // 查询 status != 'deleted' 的用户
1239    /// db.query("users")
1240    ///     .not_simple(|q| q.eq("status", DbValue::text("deleted")))
1241    ///     .execute()?;
1242    /// # Ok(())
1243    /// # }
1244    /// ```
1245    pub fn not_simple<F>(self, builder: F) -> Self
1246    where
1247        F: FnOnce(QueryBuilder) -> QueryBuilder,
1248    {
1249        // 构建内部条件
1250        let inner_qb = builder(QueryBuilder::new(self.table.clone(), Arc::clone(&self.engine)));
1251        let inner_filters: Vec<FilterExpr> = inner_qb.filters;
1252
1253        // 将多个 filter 用 AND 连接
1254        let inner_expr = inner_filters.into_iter().reduce(|a, b| FilterExpr::And(Box::new(a), Box::new(b)));
1255
1256        match inner_expr {
1257            Some(expr) => {
1258                let mut new_self = self;
1259                new_self.filters.push(FilterExpr::Not(Box::new(expr)));
1260                new_self
1261            }
1262            None => self,
1263        }
1264    }
1265
1266    // 排序
1267    pub fn order_by(mut self, field: &str, order: Order) -> Self {
1268        self.order_by = Some((field.to_string(), order));
1269        self
1270    }
1271
1272    // 分页
1273    pub fn limit(mut self, limit: usize) -> Self {
1274        self.limit = Some(limit);
1275        self
1276    }
1277
1278    pub fn offset(mut self, offset: usize) -> Self {
1279        self.offset = Some(offset);
1280        self
1281    }
1282
1283    // JOIN 操作
1284    pub fn inner_join(mut self, right_table: &str, left_field: &str, right_field: &str) -> Self {
1285        self.joins.push(JoinCondition {
1286            join_type: JoinType::Inner,
1287            right_table: right_table.to_string(),
1288            left_field: left_field.to_string(),
1289            right_field: right_field.to_string(),
1290        });
1291        self
1292    }
1293
1294    pub fn left_join(mut self, right_table: &str, left_field: &str, right_field: &str) -> Self {
1295        self.joins.push(JoinCondition {
1296            join_type: JoinType::Left,
1297            right_table: right_table.to_string(),
1298            left_field: left_field.to_string(),
1299            right_field: right_field.to_string(),
1300        });
1301        self
1302    }
1303
1304    pub fn right_join(mut self, right_table: &str, left_field: &str, right_field: &str) -> Self {
1305        self.joins.push(JoinCondition {
1306            join_type: JoinType::Right,
1307            right_table: right_table.to_string(),
1308            left_field: left_field.to_string(),
1309            right_field: right_field.to_string(),
1310        });
1311        self
1312    }
1313
1314    pub fn full_join(mut self, right_table: &str, left_field: &str, right_field: &str) -> Self {
1315        self.joins.push(JoinCondition {
1316            join_type: JoinType::Full,
1317            right_table: right_table.to_string(),
1318            left_field: left_field.to_string(),
1319            right_field: right_field.to_string(),
1320        });
1321        self
1322    }
1323
1324    // 选择字段(支持 qualified names)
1325    pub fn select(mut self, columns: &[&str]) -> Self {
1326        self.selected_columns = columns.iter().map(|s| s.to_string()).collect();
1327        self
1328    }
1329
1330    // ==================== 聚合函数方法 ====================
1331
1332    /// COUNT(*) - 统计行数
1333    pub fn count(mut self) -> Self {
1334        self.aggregate = Some(AggregateExpr {
1335            func: AggregateFunction::Count,
1336            column: None,  // COUNT(*) 不需要列名
1337            alias: None,
1338        });
1339        self
1340    }
1341
1342    /// COUNT(column) - 统计非 NULL 行数
1343    pub fn count_column(mut self, column: &str) -> Self {
1344        self.aggregate = Some(AggregateExpr {
1345            func: AggregateFunction::Count,
1346            column: Some(column.to_string()),
1347            alias: None,
1348        });
1349        self
1350    }
1351
1352    /// SUM(column) - 求和
1353    pub fn sum(mut self, column: &str) -> Self {
1354        self.aggregate = Some(AggregateExpr {
1355            func: AggregateFunction::Sum,
1356            column: Some(column.to_string()),
1357            alias: None,
1358        });
1359        self
1360    }
1361
1362    /// AVG(column) - 平均值
1363    pub fn avg(mut self, column: &str) -> Self {
1364        self.aggregate = Some(AggregateExpr {
1365            func: AggregateFunction::Avg,
1366            column: Some(column.to_string()),
1367            alias: None,
1368        });
1369        self
1370    }
1371
1372    /// MAX(column) - 最大值
1373    pub fn max(mut self, column: &str) -> Self {
1374        self.aggregate = Some(AggregateExpr {
1375            func: AggregateFunction::Max,
1376            column: Some(column.to_string()),
1377            alias: None,
1378        });
1379        self
1380    }
1381
1382    /// MIN(column) - 最小值
1383    pub fn min(mut self, column: &str) -> Self {
1384        self.aggregate = Some(AggregateExpr {
1385            func: AggregateFunction::Min,
1386            column: Some(column.to_string()),
1387            alias: None,
1388        });
1389        self
1390    }
1391
1392    /// 设置聚合结果别名
1393    pub fn alias(mut self, name: &str) -> Self {
1394        if let Some(ref mut agg) = self.aggregate {
1395            agg.alias = Some(name.to_string());
1396        }
1397        self
1398    }
1399
1400    // ==================== DISTINCT ====================
1401
1402    /// SELECT DISTINCT - 去重查询
1403    ///
1404    /// # 示例
1405    /// ```rust,no_run
1406    /// # use regulus_db::{Database, DbValue};
1407    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
1408    /// # let db = Database::new();
1409    /// // 查询所有不同的部门
1410    /// db.query("employees")
1411    ///     .select(&["department"])
1412    ///     .distinct()
1413    ///     .execute()?;
1414    /// # Ok(())
1415    /// # }
1416    /// ```
1417    pub fn distinct(mut self) -> Self {
1418        self.distinct = true;
1419        self
1420    }
1421
1422    // ==================== GROUP BY 和 HAVING ====================
1423
1424    /// GROUP BY 子句
1425    pub fn group_by(mut self, columns: &[&str]) -> Self {
1426        self.group_by = columns.iter().map(|s| s.to_string()).collect();
1427        self
1428    }
1429
1430    /// HAVING 子句 - 等于
1431    pub fn having_eq(mut self, value: DbValue) -> Self {
1432        self.having = Some(HavingExpr::Eq { value });
1433        self
1434    }
1435
1436    /// HAVING 子句 - 不等于
1437    pub fn having_ne(mut self, value: DbValue) -> Self {
1438        self.having = Some(HavingExpr::Ne { value });
1439        self
1440    }
1441
1442    /// HAVING 子句 - 大于
1443    pub fn having_gt(mut self, value: DbValue) -> Self {
1444        self.having = Some(HavingExpr::Gt { value });
1445        self
1446    }
1447
1448    /// HAVING 子句 - 大于等于
1449    pub fn having_ge(mut self, value: DbValue) -> Self {
1450        self.having = Some(HavingExpr::Ge { value });
1451        self
1452    }
1453
1454    /// HAVING 子句 - 小于
1455    pub fn having_lt(mut self, value: DbValue) -> Self {
1456        self.having = Some(HavingExpr::Lt { value });
1457        self
1458    }
1459
1460    /// HAVING 子句 - 小于等于
1461    pub fn having_le(mut self, value: DbValue) -> Self {
1462        self.having = Some(HavingExpr::Le { value });
1463        self
1464    }
1465
1466    /// 执行查询
1467    pub fn execute(self) -> DbResult<Vec<Row>> {
1468        let engine = self.engine.read().unwrap();
1469
1470        // 检查是否有聚合函数
1471        if self.aggregate.is_some() || !self.group_by.is_empty() {
1472            return self.execute_aggregate(&engine);
1473        }
1474
1475        // 检查是否有 JOIN
1476        if !self.joins.is_empty() {
1477            return self.execute_join(&engine);
1478        }
1479
1480        // 尝试查找最佳复合索引
1481        if let Some((meta, index, key_values)) = self.find_best_index(&engine) {
1482            // 使用复合索引优化查询
1483            return self.execute_with_composite_index(&engine, meta, index, &key_values);
1484        }
1485
1486        // 尝试查找最佳单列索引(向后兼容)
1487        if let Some((field, index)) = self.find_best_single_index(&engine) {
1488            // 使用单列索引优化查询
1489            return self.execute_with_index(&engine, field, index);
1490        }
1491
1492        // 降级为全表扫描
1493        let rows = engine.scan(&self.table)?;
1494
1495        // 过滤
1496        let mut filtered: Vec<Row> = rows
1497            .into_iter()
1498            .filter(|(_, row)| {
1499                self.filters.iter().all(|expr| evaluate_filter(expr, row))
1500            })
1501            .map(|(_, row)| row.clone())
1502            .collect();
1503
1504        // DISTINCT 去重
1505        if self.distinct {
1506            filtered = self.deduplicate_rows(filtered);
1507        }
1508
1509        // 排序
1510        if let Some((ref field, order)) = self.order_by {
1511            filtered.sort_by(|a, b| {
1512                self.compare_rows(a, b, field, order)
1513            });
1514        }
1515
1516        // 分页
1517        let start = self.offset.unwrap_or(0);
1518        let end = start + self.limit.unwrap_or(filtered.len());
1519
1520        Ok(filtered.into_iter().skip(start).take(end - start).collect())
1521    }
1522
1523    /// 执行聚合查询
1524    fn execute_aggregate(&self, engine: &MemoryEngine) -> DbResult<Vec<Row>> {
1525        // 获取数据(考虑 JOIN 和过滤)
1526        let rows: Vec<Row> = if !self.joins.is_empty() {
1527            // 有 JOIN 时,先执行 JOIN
1528            let join_rows = self.execute_join(engine)?;
1529            // 应用过滤条件
1530            join_rows.into_iter()
1531                .filter(|row| self.filters.iter().all(|expr| evaluate_filter(expr, row)))
1532                .collect()
1533        } else {
1534            // 无 JOIN 时,直接扫描并过滤
1535            let scanned = engine.scan(&self.table)?;
1536            scanned.into_iter()
1537                .filter(|(_, row)| self.filters.iter().all(|expr| evaluate_filter(expr, row)))
1538                .map(|(_, row)| row.clone())
1539                .collect()
1540        };
1541
1542        // 处理 GROUP BY
1543        if !self.group_by.is_empty() {
1544            self.execute_grouped_aggregate(rows)
1545        } else {
1546            // 无 GROUP BY,全局聚合
1547            self.execute_simple_aggregate(rows)
1548        }
1549    }
1550
1551    /// 执行简单聚合(无 GROUP BY)
1552    fn execute_simple_aggregate(&self, rows: Vec<Row>) -> DbResult<Vec<Row>> {
1553        let agg = match &self.aggregate {
1554            Some(a) => a,
1555            None => {
1556                // 没有聚合函数,返回原始数据(不应该发生)
1557                return Ok(rows);
1558            }
1559        };
1560
1561        let result_value = match agg.func {
1562            AggregateFunction::Count => {
1563                let count = match &agg.column {
1564                    Some(col) => {
1565                        // COUNT(column) - 统计非 NULL 值
1566                        rows.iter()
1567                            .filter(|r| r.get(col).map(|v| !v.is_null()).unwrap_or(false))
1568                            .count() as i64
1569                    }
1570                    None => {
1571                        // COUNT(*) - 统计所有行
1572                        rows.len() as i64
1573                    }
1574                };
1575                DbValue::Integer(count)
1576            }
1577            AggregateFunction::Sum => {
1578                match &agg.column {
1579                    Some(col) => self.sum_column(&rows, col),
1580                    None => DbValue::Integer(0),
1581                }
1582            }
1583            AggregateFunction::Avg => {
1584                match &agg.column {
1585                    Some(col) => self.avg_column(&rows, col),
1586                    None => DbValue::Null,
1587                }
1588            }
1589            AggregateFunction::Max => {
1590                match &agg.column {
1591                    Some(col) => self.max_column(&rows, col),
1592                    None => DbValue::Null,
1593                }
1594            }
1595            AggregateFunction::Min => {
1596                match &agg.column {
1597                    Some(col) => self.min_column(&rows, col),
1598                    None => DbValue::Null,
1599                }
1600            }
1601        };
1602
1603        // 构建结果行
1604        let mut result_row = Row::new();
1605        let column_name = match &agg.alias {
1606            Some(alias) => alias.clone(),
1607            None => {
1608                let func_name = match agg.func {
1609                    AggregateFunction::Count => "COUNT",
1610                    AggregateFunction::Sum => "SUM",
1611                    AggregateFunction::Avg => "AVG",
1612                    AggregateFunction::Max => "MAX",
1613                    AggregateFunction::Min => "MIN",
1614                };
1615                match &agg.column {
1616                    Some(col) => format!("{}({})", func_name, col),
1617                    None => "COUNT(*)".to_string(),
1618                }
1619            }
1620        };
1621
1622        // 将 i64 转换为 DbValue
1623        let db_value = match result_value {
1624            DbValue::Integer(i) => DbValue::Integer(i),
1625            DbValue::Real(r) => DbValue::Real(r),
1626            DbValue::Null => DbValue::Null,
1627            _ => DbValue::Null,
1628        };
1629        result_row.insert(column_name, db_value);
1630
1631        Ok(vec![result_row])
1632    }
1633
1634    /// 执行分组聚合(有 GROUP BY)
1635    fn execute_grouped_aggregate(&self, rows: Vec<Row>) -> DbResult<Vec<Row>> {
1636        let agg = match &self.aggregate {
1637            Some(a) => a,
1638            None => {
1639                // 没有聚合函数,只返回 GROUP BY 列的不同组合
1640                return self.execute_group_by_only(rows);
1641            }
1642        };
1643
1644        // 按 GROUP BY 列分组
1645        use std::collections::HashMap;
1646        let mut groups: HashMap<Vec<DbValue>, Vec<Row>> = HashMap::new();
1647
1648        for row in rows {
1649            // 构建分组键
1650            let mut key = Vec::new();
1651            for col in &self.group_by {
1652                if let Some(val) = row.get(col) {
1653                    key.push(val.clone());
1654                } else {
1655                    key.push(DbValue::Null);
1656                }
1657            }
1658
1659            groups.entry(key).or_insert_with(Vec::new).push(row);
1660        }
1661
1662        // 对每组计算聚合函数
1663        let mut results = Vec::new();
1664        for (key, group_rows) in groups {
1665            // 计算聚合值
1666            let agg_value = match agg.func {
1667                AggregateFunction::Count => {
1668                    let count = match &agg.column {
1669                        Some(col) => {
1670                            group_rows.iter()
1671                                .filter(|r| r.get(col).map(|v| !v.is_null()).unwrap_or(false))
1672                                .count() as i64
1673                        }
1674                        None => group_rows.len() as i64,
1675                    };
1676                    DbValue::Integer(count)
1677                }
1678                AggregateFunction::Sum => {
1679                    match &agg.column {
1680                        Some(col) => self.sum_column(&group_rows, col),
1681                        None => DbValue::Integer(0),
1682                    }
1683                }
1684                AggregateFunction::Avg => {
1685                    match &agg.column {
1686                        Some(col) => self.avg_column(&group_rows, col),
1687                        None => DbValue::Null,
1688                    }
1689                }
1690                AggregateFunction::Max => {
1691                    match &agg.column {
1692                        Some(col) => self.max_column(&group_rows, col),
1693                        None => DbValue::Null,
1694                    }
1695                }
1696                AggregateFunction::Min => {
1697                    match &agg.column {
1698                        Some(col) => self.min_column(&group_rows, col),
1699                        None => DbValue::Null,
1700                    }
1701                }
1702            };
1703
1704            // 应用 HAVING 过滤
1705            if let Some(ref having) = self.having {
1706                if !self.evaluate_having(&agg_value, having) {
1707                    continue;
1708                }
1709            }
1710
1711            // 构建结果行
1712            let mut result_row = Row::new();
1713
1714            // 添加 GROUP BY 列
1715            for (i, col) in self.group_by.iter().enumerate() {
1716                result_row.insert(col.clone(), key[i].clone());
1717            }
1718
1719            // 添加聚合结果
1720            let column_name = match &agg.alias {
1721                Some(alias) => alias.clone(),
1722                None => {
1723                    let func_name = match agg.func {
1724                        AggregateFunction::Count => "COUNT",
1725                        AggregateFunction::Sum => "SUM",
1726                        AggregateFunction::Avg => "AVG",
1727                        AggregateFunction::Max => "MAX",
1728                        AggregateFunction::Min => "MIN",
1729                    };
1730                    match &agg.column {
1731                        Some(col) => format!("{}({})", func_name, col),
1732                        None => "COUNT(*)".to_string(),
1733                    }
1734                }
1735            };
1736
1737            let db_value = match agg_value {
1738                DbValue::Integer(i) => DbValue::Integer(i),
1739                DbValue::Real(r) => DbValue::Real(r),
1740                DbValue::Null => DbValue::Null,
1741                _ => DbValue::Null,
1742            };
1743            result_row.insert(column_name, db_value);
1744
1745            results.push(result_row);
1746        }
1747
1748        Ok(results)
1749    }
1750
1751    /// 仅执行 GROUP BY(没有聚合函数)
1752    fn execute_group_by_only(&self, rows: Vec<Row>) -> DbResult<Vec<Row>> {
1753        use std::collections::HashSet;
1754
1755        let mut seen: HashSet<Vec<DbValue>> = HashSet::new();
1756        let mut results = Vec::new();
1757
1758        for row in rows {
1759            let mut key = Vec::new();
1760            for col in &self.group_by {
1761                if let Some(val) = row.get(col) {
1762                    key.push(val.clone());
1763                } else {
1764                    key.push(DbValue::Null);
1765                }
1766            }
1767
1768            if !seen.contains(&key) {
1769                seen.insert(key.clone());
1770
1771                let mut result_row = Row::new();
1772                for (i, col) in self.group_by.iter().enumerate() {
1773                    result_row.insert(col.clone(), key[i].clone());
1774                }
1775                results.push(result_row);
1776            }
1777        }
1778
1779        Ok(results)
1780    }
1781
1782    /// 计算列的总和
1783    fn sum_column(&self, rows: &[Row], column: &str) -> DbValue {
1784        let mut sum: f64 = 0.0;
1785        let mut has_value = false;
1786
1787        for row in rows {
1788            if let Some(val) = row.get(column) {
1789                match val {
1790                    DbValue::Integer(i) => {
1791                        sum += *i as f64;
1792                        has_value = true;
1793                    }
1794                    DbValue::Real(r) => {
1795                        sum += *r;
1796                        has_value = true;
1797                    }
1798                    _ => {}
1799                }
1800            }
1801        }
1802
1803        if has_value {
1804            // 如果所有值都是整数,返回整数
1805            if rows.iter().filter_map(|r| r.get(column)).all(|v| matches!(v, DbValue::Integer(_))) {
1806                DbValue::Integer(sum as i64)
1807            } else {
1808                DbValue::Real(sum)
1809            }
1810        } else {
1811            DbValue::Null
1812        }
1813    }
1814
1815    /// 计算列的平均值
1816    fn avg_column(&self, rows: &[Row], column: &str) -> DbValue {
1817        let mut sum: f64 = 0.0;
1818        let mut count: i64 = 0;
1819
1820        for row in rows {
1821            if let Some(val) = row.get(column) {
1822                match val {
1823                    DbValue::Integer(i) => {
1824                        sum += *i as f64;
1825                        count += 1;
1826                    }
1827                    DbValue::Real(r) => {
1828                        sum += *r;
1829                        count += 1;
1830                    }
1831                    _ => {}
1832                }
1833            }
1834        }
1835
1836        if count > 0 {
1837            DbValue::Real(sum / count as f64)
1838        } else {
1839            DbValue::Null
1840        }
1841    }
1842
1843    /// 计算列的最大值
1844    fn max_column(&self, rows: &[Row], column: &str) -> DbValue {
1845        let mut max_val: Option<DbValue> = None;
1846
1847        for row in rows {
1848            if let Some(val) = row.get(column) {
1849                if !val.is_null() {
1850                    match &max_val {
1851                        None => max_val = Some(val.clone()),
1852                        Some(current) => {
1853                            if self.compare_values(val, current) > 0 {
1854                                max_val = Some(val.clone());
1855                            }
1856                        }
1857                    }
1858                }
1859            }
1860        }
1861
1862        max_val.unwrap_or(DbValue::Null)
1863    }
1864
1865    /// 计算列的最小值
1866    fn min_column(&self, rows: &[Row], column: &str) -> DbValue {
1867        let mut min_val: Option<DbValue> = None;
1868
1869        for row in rows {
1870            if let Some(val) = row.get(column) {
1871                if !val.is_null() {
1872                    match &min_val {
1873                        None => min_val = Some(val.clone()),
1874                        Some(current) => {
1875                            if self.compare_values(val, current) < 0 {
1876                                min_val = Some(val.clone());
1877                            }
1878                        }
1879                    }
1880                }
1881            }
1882        }
1883
1884        min_val.unwrap_or(DbValue::Null)
1885    }
1886
1887    /// 比较两个 DbValue
1888    fn compare_values(&self, a: &DbValue, b: &DbValue) -> i32 {
1889        match (a, b) {
1890            (DbValue::Integer(a), DbValue::Integer(b)) => a.cmp(b) as i32,
1891            (DbValue::Integer(a), DbValue::Real(b)) => (*a as f64).partial_cmp(b).map(|o| o as i32).unwrap_or(0),
1892            (DbValue::Real(a), DbValue::Integer(b)) => a.partial_cmp(&(*b as f64)).map(|o| o as i32).unwrap_or(0),
1893            (DbValue::Real(a), DbValue::Real(b)) => a.partial_cmp(b).map(|o| o as i32).unwrap_or(0),
1894            (DbValue::Text(a), DbValue::Text(b)) => a.cmp(b) as i32,
1895            _ => 0,
1896        }
1897    }
1898
1899    /// 评估 HAVING 子句
1900    fn evaluate_having(&self, agg_value: &DbValue, having: &HavingExpr) -> bool {
1901        match having {
1902            HavingExpr::Eq { value } => agg_value == value,
1903            HavingExpr::Ne { value } => agg_value != value,
1904            HavingExpr::Gt { value } => self.compare_values(agg_value, value) > 0,
1905            HavingExpr::Ge { value } => self.compare_values(agg_value, value) >= 0,
1906            HavingExpr::Lt { value } => self.compare_values(agg_value, value) < 0,
1907            HavingExpr::Le { value } => self.compare_values(agg_value, value) <= 0,
1908        }
1909    }
1910}
1911
1912/// 更新构建器
1913pub struct UpdateBuilder {
1914    table: String,
1915    filters: Vec<FilterExpr>,
1916    values: Vec<(String, DbValue)>,
1917    engine: Arc<RwLock<MemoryEngine>>,
1918}
1919
1920impl UpdateBuilder {
1921    pub fn new(table: String, engine: Arc<RwLock<MemoryEngine>>) -> Self {
1922        UpdateBuilder {
1923            table,
1924            filters: Vec::new(),
1925            values: Vec::new(),
1926            engine,
1927        }
1928    }
1929
1930    pub fn eq(mut self, field: &str, value: DbValue) -> Self {
1931        self.filters.push(FilterExpr::Eq {
1932            field: field.to_string(),
1933            value,
1934        });
1935        self
1936    }
1937
1938    pub fn lt(mut self, field: &str, value: DbValue) -> Self {
1939        self.filters.push(FilterExpr::Lt {
1940            field: field.to_string(),
1941            value,
1942        });
1943        self
1944    }
1945
1946    pub fn gt(mut self, field: &str, value: DbValue) -> Self {
1947        self.filters.push(FilterExpr::Gt {
1948            field: field.to_string(),
1949            value,
1950        });
1951        self
1952    }
1953
1954    pub fn set(mut self, field: &str, value: DbValue) -> Self {
1955        self.values.push((field.to_string(), value));
1956        self
1957    }
1958
1959    /// 执行更新,返回受影响的行数
1960    pub fn execute(self) -> DbResult<usize> {
1961        let mut engine = self.engine.write().unwrap();
1962        let rows = engine.scan(&self.table)?;
1963
1964        // 先收集需要更新的 row_id
1965        let mut to_update = Vec::new();
1966        for (row_id, row) in rows {
1967            let matches = self.filters.iter().all(|expr| evaluate_filter(expr, &row));
1968            if matches {
1969                to_update.push(row_id);
1970            }
1971        }
1972
1973        // 执行更新
1974        let mut count = 0;
1975        for row_id in to_update {
1976            let mut update_row: Row = self.values.iter().cloned().collect::<Row>();
1977            // 保留原有行的其他字段
1978            if let Some(existing) = engine.get(&self.table, row_id)? {
1979                for (key, value) in existing.iter() {
1980                    if !update_row.contains_key(key) {
1981                        update_row.insert(key.clone(), value.clone());
1982                    }
1983                }
1984            }
1985            engine.update(&self.table, row_id, update_row)?;
1986            count += 1;
1987        }
1988
1989        Ok(count)
1990    }
1991}
1992
1993/// 删除构建器
1994pub struct DeleteBuilder {
1995    table: String,
1996    filters: Vec<FilterExpr>,
1997    engine: Arc<RwLock<MemoryEngine>>,
1998}
1999
2000impl DeleteBuilder {
2001    pub fn new(table: String, engine: Arc<RwLock<MemoryEngine>>) -> Self {
2002        DeleteBuilder {
2003            table,
2004            filters: Vec::new(),
2005            engine,
2006        }
2007    }
2008
2009    pub fn eq(mut self, field: &str, value: DbValue) -> Self {
2010        self.filters.push(FilterExpr::Eq {
2011            field: field.to_string(),
2012            value,
2013        });
2014        self
2015    }
2016
2017    pub fn lt(mut self, field: &str, value: DbValue) -> Self {
2018        self.filters.push(FilterExpr::Lt {
2019            field: field.to_string(),
2020            value,
2021        });
2022        self
2023    }
2024
2025    pub fn gt(mut self, field: &str, value: DbValue) -> Self {
2026        self.filters.push(FilterExpr::Gt {
2027            field: field.to_string(),
2028            value,
2029        });
2030        self
2031    }
2032
2033    /// 执行删除,返回删除的行数
2034    pub fn execute(self) -> DbResult<usize> {
2035        let mut engine = self.engine.write().unwrap();
2036        let rows = engine.scan(&self.table)?;
2037
2038        // 先收集需要删除的 row_id
2039        let mut to_delete = Vec::new();
2040        for (row_id, row) in rows {
2041            let matches = self.filters.iter().all(|expr| evaluate_filter(expr, &row));
2042            if matches {
2043                to_delete.push(row_id);
2044            }
2045        }
2046
2047        // 执行删除
2048        let mut count = 0;
2049        for row_id in to_delete {
2050            engine.delete(&self.table, row_id)?;
2051            count += 1;
2052        }
2053
2054        Ok(count)
2055    }
2056}
2057
2058/// NOT 构建器 - 用于对单个过滤条件取反
2059///
2060/// 通过 `QueryBuilder::not()` 创建,提供所有过滤条件方法
2061/// 调用任意过滤方法会将生成的表达式用 `Not` 包裹后添加到查询中
2062pub struct NotBuilder {
2063    query: QueryBuilder,
2064}
2065
2066impl NotBuilder {
2067    /// 添加任意过滤表达式(复杂场景)
2068    ///
2069    /// # 示例
2070    /// ```rust,no_run
2071    /// # use regulus_db::{Database, DbValue, FilterExpr};
2072    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
2073    /// # let db = Database::new();
2074    /// // 查询 NOT (age > 18 AND status = 'active')
2075    /// db.query("users")
2076    ///     .not()
2077    ///     .expr(FilterExpr::And(
2078    ///         Box::new(FilterExpr::Gt { field: "age".to_string(), value: DbValue::integer(18) }),
2079    ///         Box::new(FilterExpr::Eq { field: "status".to_string(), value: DbValue::text("active") })
2080    ///     ))
2081    ///     .execute()?;
2082    /// # Ok(())
2083    /// # }
2084    /// ```
2085    pub fn expr(mut self, expr: FilterExpr) -> QueryBuilder {
2086        self.query.filters.push(FilterExpr::Not(Box::new(expr)));
2087        self.query
2088    }
2089
2090    /// EQ 取反:不等于 (!=)
2091    pub fn eq(self, field: &str, value: DbValue) -> QueryBuilder {
2092        self.expr(FilterExpr::Eq {
2093            field: field.to_string(),
2094            value,
2095        })
2096    }
2097
2098    /// NE 取反:等于 (=)
2099    pub fn ne(self, field: &str, value: DbValue) -> QueryBuilder {
2100        self.expr(FilterExpr::Ne {
2101            field: field.to_string(),
2102            value,
2103        })
2104    }
2105
2106    /// LT 取反:大于等于 (>=)
2107    pub fn lt(self, field: &str, value: DbValue) -> QueryBuilder {
2108        self.expr(FilterExpr::Lt {
2109            field: field.to_string(),
2110            value,
2111        })
2112    }
2113
2114    /// LE 取反:大于 (>)
2115    pub fn le(self, field: &str, value: DbValue) -> QueryBuilder {
2116        self.expr(FilterExpr::Le {
2117            field: field.to_string(),
2118            value,
2119        })
2120    }
2121
2122    /// GT 取反:小于等于 (<=)
2123    pub fn gt(self, field: &str, value: DbValue) -> QueryBuilder {
2124        self.expr(FilterExpr::Gt {
2125            field: field.to_string(),
2126            value,
2127        })
2128    }
2129
2130    /// GE 取反:小于 (<)
2131    pub fn ge(self, field: &str, value: DbValue) -> QueryBuilder {
2132        self.expr(FilterExpr::Ge {
2133            field: field.to_string(),
2134            value,
2135        })
2136    }
2137
2138    /// IN 取反:NOT IN
2139    pub fn in_list(self, field: &str, values: Vec<DbValue>) -> QueryBuilder {
2140        self.expr(FilterExpr::In {
2141            field: field.to_string(),
2142            values,
2143        })
2144    }
2145
2146    /// CONTAINS 取反:NOT LIKE
2147    pub fn contains(self, field: &str, value: &str) -> QueryBuilder {
2148        self.expr(FilterExpr::Contains {
2149            field: field.to_string(),
2150            value: value.to_string(),
2151        })
2152    }
2153
2154    /// IS NULL 取反:IS NOT NULL
2155    pub fn is_null(self, field: &str) -> QueryBuilder {
2156        self.expr(FilterExpr::IsNull {
2157            field: field.to_string(),
2158        })
2159    }
2160
2161    /// IS NOT NULL 取反:IS NULL
2162    pub fn is_not_null(self, field: &str) -> QueryBuilder {
2163        self.expr(FilterExpr::IsNotNull {
2164            field: field.to_string(),
2165        })
2166    }
2167}