Skip to main content

reddb_server/storage/query/
mod.rs

1//! Query Engine for RedDB
2//!
3//! Provides query execution, filtering, sorting, and similarity search
4//! capabilities for the RedDB storage engine.
5//!
6//! # Components
7//!
8//! - **filter**: Filter predicates (Eq, Lt, Gt, Between, Like, etc.)
9//! - **sort**: Sorting and ordering operations
10//! - **executor**: Query plan execution
11//! - **similarity**: Vector similarity search integration
12//! - **modes**: Multi-mode query parsing (SQL, Gremlin, Cypher, SPARQL, Natural Language)
13//!
14//! # Multi-Mode Parsing
15//!
16//! The query engine supports multiple query languages with automatic mode detection:
17//!
18//! ```ignore
19//! use reddb::storage::query::modes::{parse_multi, detect_mode, QueryMode};
20//!
21//! // Gremlin
22//! let gremlin = parse_multi("g.V().hasLabel('host').out('connects')").unwrap();
23//!
24//! // SPARQL
25//! let sparql = parse_multi("SELECT ?host WHERE { ?host :hasIP ?ip }").unwrap();
26//!
27//! // Natural language
28//! let natural = parse_multi("find all hosts with ssh open").unwrap();
29//! ```
30//!
31//! # Example
32//!
33//! ```ignore
34//! use reddb::storage::query::{Query, Filter, OrderBy, Direction};
35//!
36//! let query = Query::select("users")
37//!     .filter(Filter::eq("status", "active"))
38//!     .filter(Filter::gt("age", 18))
39//!     .order_by("created_at", Direction::Desc)
40//!     .limit(10);
41//!
42//! let results = executor.execute(&query)?;
43//! ```
44
45pub mod analyze_cmd;
46pub mod analyzer;
47pub mod ast;
48pub mod batch;
49pub mod binary;
50pub mod engine;
51pub mod evaluator;
52pub mod executor;
53pub mod executors;
54pub mod expr_typing;
55pub mod filter;
56pub mod filter_compiled;
57pub mod filter_optimizer;
58pub mod lexer;
59pub mod modes;
60pub mod optimizer;
61pub mod parser;
62pub mod planner;
63pub mod rag;
64pub mod renderer;
65pub mod similarity;
66pub mod sort;
67pub mod sql;
68pub mod sql_lowering;
69pub mod step;
70#[cfg(test)]
71pub(crate) mod test_support;
72pub mod unified;
73pub mod user_params;
74pub(crate) mod value_compare;
75
76// Re-export common types
77pub use crate::storage::schema::{SqlTypeName, TypeModifier};
78pub use analyzer::{
79    analyze_create_table, resolve_declared_data_type, resolve_sql_type_name, AnalysisError,
80    AnalyzedColumnDef, AnalyzedCreateTableQuery,
81};
82pub use ast::{
83    AlterOperation, AlterQueueQuery, AlterTableQuery, AlterUserAttribute, AlterUserStmt, CompareOp,
84    CreateColumnDef, CreateQueueQuery, CreateTableQuery, DEFAULT_QUEUE_IN_FLIGHT_CAP_PER_GROUP,
85    DEFAULT_QUEUE_LOCK_DEADLINE_MS, DEFAULT_QUEUE_MAX_ATTEMPTS, CreateTimeSeriesQuery, CreateTreeQuery,
86    CreateVectorQuery, CteDefinition, CteQueryBuilder, DeleteQuery, DropCollectionQuery,
87    DropDocumentQuery, DropGraphQuery, DropKvQuery, DropQueueQuery, DropTableQuery,
88    DropTimeSeriesQuery, DropTreeQuery, DropVectorQuery, EdgeDirection, EdgePattern, FieldRef,
89    Filter as AstFilter, GrantObject, GrantObjectKind, GrantPrincipalRef, GrantStmt, GraphCommand,
90    GraphPattern, GraphQuery, InsertEntityType, InsertQuery, JoinCondition, JoinQuery, JoinType,
91    NodePattern, NodeSelector, OrderByClause, PathQuery, PolicyPrincipalRef, PolicyResourceRef,
92    PolicyUserRef, Projection, QueryExpr, QueryWithCte, RevokeStmt, SearchCommand, SelectItem,
93    TableQuery, TreeCommand, TreeNodeSpec, TreePosition, UpdateQuery, WithClause,
94};
95pub use engine::{
96    Binding, BindingBuilder, BindingIterator, Op, OpBGP, OpDisjunction, OpDistinct, OpExtend,
97    OpFilter, OpGroup, OpJoin, OpLeftJoin, OpMinus, OpNull, OpOrder, OpProject, OpReduced,
98    OpSequence, OpSlice, OpTable, OpTransform, OpTriple, OpUnion, OpVisitor, Pattern, QueryEngine,
99    QueryEngineFactory, QueryEngineRegistry, QueryIter, QueryIterBase, QueryIterFilter,
100    QueryIterJoin, QueryIterProject, QueryIterSlice, QueryIterSort, QueryIterUnion, TransformCopy,
101    TransformPushFilter, Triple, Var,
102};
103pub use executor::{QueryExecutor, QueryPlan, QueryResult};
104pub use executors::{
105    CteContext, CteExecutor, CteStats, ExecuteResult, GremlinExecutor, MultiModeExecutor,
106    NaturalExecutor, SparqlExecutor,
107};
108pub use filter::{Filter, FilterOp, Predicate};
109pub use lexer::{Lexer, LexerError, Position, Spanned, Token};
110pub use optimizer::{
111    ColumnStats, FilterRanker, RankedFilter, RankingConfig, StatsCollector, TableStats,
112};
113pub use parser::{parse, ParseError, Parser};
114pub use planner::{
115    CacheStats, CachedPlan, CardinalityEstimate, CostEstimator, OptimizationPass, PlanCache,
116    PlanCost, QueryOptimizer, QueryPlan as PlannerQueryPlan, QueryPlanner, QueryRewriter,
117    RewriteContext, RewriteRule,
118};
119pub use rag::{
120    ChunkSource, ContextChunk, EntityType, MultiSourceRetriever, QueryAnalysis, QueryIntent,
121    RagConfig, RagEngine, RetrievalContext, RetrievalStrategy, SimilarEntity,
122};
123pub use similarity::{SimilarityQuery, SimilarityResult};
124pub use sort::{Direction, NullsOrder, OrderBy, QueryLimits, SortKey};
125pub use sql::{parse_frontend, FrontendStatement, SqlCommand, SqlStatement};
126pub use step::{
127    AggregateStep, BarrierStep, BasicTraversal, BranchStep, ChooseStep, CollectingBarrierStep,
128    DedupStep, Direction as TraversalDirection, EdgeSourceStep, EdgeStep, ExecutionMode,
129    FilterStep, FlatMapStep, FoldStep, GroupStep, HasStep, IdStep, LimitStep, LoopState, MapStep,
130    OptionalStep, OrderStep, Path, PathStep, Predicate as StepPredicate, ProjectStep, PropertyStep,
131    RangeStep, ReducingBarrierStep, RepeatStep, SelectStep, SideEffectStep, SourceStep, Step,
132    StepPosition, StepResult, StoreStep, Traversal, TraversalParent, Traverser, TraverserGenerator,
133    TraverserRequirement, TraverserValue, UnionStep, ValueMapStep, VertexSourceStep, VertexStep,
134    WhereStep,
135};
136pub use unified::{
137    ExecutionError, GraphPath, MatchedEdge, MatchedNode, QueryStats, UnifiedExecutor,
138    UnifiedRecord, UnifiedResult,
139};
140
141/// Returns true when the table source should be interpreted as the universal entity
142/// space (table, document, graph, vector mixed mode).
143pub fn is_universal_entity_source(table: &str) -> bool {
144    table.eq_ignore_ascii_case("any")
145        || table.eq_ignore_ascii_case("_any")
146        || table.eq_ignore_ascii_case("all")
147        || table.eq_ignore_ascii_case("entity")
148        || table.eq_ignore_ascii_case("universal")
149        || table.eq_ignore_ascii_case("mixed")
150        || table == "*"
151}