Skip to main content

prax_query/
lib.rs

1// QueryError carries diagnostic context (source location, parameter list,
2// vendor metadata) so the Result Err arm is intentionally large; boxing it
3// uniformly across the public API would be a breaking change for every caller.
4#![allow(clippy::result_large_err)]
5// Several builder types expose `new` constructors that return associated
6// builder structs rather than `Self`; this is intentional for the staged
7// builder pattern.
8#![allow(clippy::new_ret_no_self)]
9// Methods like `Filter::add`, `SqlBuilder::add` and `from_str` use vendor-named
10// methods that can collide with stdlib trait method names. They are not
11// intended as `std::ops::Add` / `FromStr` impls.
12#![allow(clippy::should_implement_trait)]
13#![allow(clippy::wrong_self_convention)]
14
15//! # prax-query
16//!
17//! Type-safe query builder for the Prax ORM.
18//!
19//! This crate provides the core query building functionality, including:
20//! - Fluent API for building queries (`find_many`, `find_unique`, `create`, `update`, `delete`)
21//! - Type-safe filtering with `where` clauses
22//! - Sorting and pagination
23//! - Relation loading (`include`, `select`)
24//! - Transaction support
25//! - Raw SQL escape hatch
26//! - Middleware system
27//! - Multi-tenant support
28//!
29//! ## Filters
30//!
31//! Build type-safe filters for queries:
32//!
33//! ```rust
34//! use prax_query::{Filter, FilterValue};
35//!
36//! // Equality filter
37//! let filter = Filter::Equals("email".into(), FilterValue::String("test@example.com".into()));
38//!
39//! // Greater than filter
40//! let filter = Filter::Gt("age".into(), FilterValue::Int(18));
41//!
42//! // Contains filter (for strings)
43//! let filter = Filter::Contains("name".into(), FilterValue::String("john".into()));
44//!
45//! // Combine filters with AND/OR
46//! let combined = Filter::and([
47//!     Filter::Equals("active".into(), FilterValue::Bool(true)),
48//!     Filter::Gt("age".into(), FilterValue::Int(18)),
49//! ]);
50//!
51//! let either = Filter::or([
52//!     Filter::Equals("role".into(), FilterValue::String("admin".into())),
53//!     Filter::Equals("role".into(), FilterValue::String("moderator".into())),
54//! ]);
55//! ```
56//!
57//! ## Filter Values
58//!
59//! Convert Rust types to filter values:
60//!
61//! ```rust
62//! use prax_query::FilterValue;
63//!
64//! // Integer values
65//! let val: FilterValue = 42.into();
66//! assert!(matches!(val, FilterValue::Int(42)));
67//!
68//! // String values
69//! let val: FilterValue = "hello".into();
70//! assert!(matches!(val, FilterValue::String(_)));
71//!
72//! // Boolean values
73//! let val: FilterValue = true.into();
74//! assert!(matches!(val, FilterValue::Bool(true)));
75//!
76//! // Float values
77//! let val: FilterValue = 3.14f64.into();
78//! assert!(matches!(val, FilterValue::Float(_)));
79//!
80//! // Null values
81//! let val = FilterValue::Null;
82//! ```
83//!
84//! ## Sorting
85//!
86//! Build sort specifications:
87//!
88//! ```rust
89//! use prax_query::{OrderBy, OrderByField, NullsOrder};
90//!
91//! // Ascending order
92//! let order = OrderByField::asc("created_at");
93//!
94//! // Descending order
95//! let order = OrderByField::desc("updated_at");
96//!
97//! // With NULLS FIRST/LAST
98//! let order = OrderByField::asc("name").nulls(NullsOrder::First);
99//! let order = OrderByField::desc("score").nulls(NullsOrder::Last);
100//!
101//! // Combine multiple orderings
102//! let orders = OrderBy::Field(OrderByField::asc("name"))
103//!     .then(OrderByField::desc("created_at"));
104//! ```
105//!
106//! ## Raw SQL
107//!
108//! Build raw SQL queries with parameter binding:
109//!
110//! ```rust
111//! use prax_query::Sql;
112//!
113//! // Simple query
114//! let sql = Sql::new("SELECT * FROM users");
115//! assert_eq!(sql.sql(), "SELECT * FROM users");
116//!
117//! // Query with parameter - bind appends placeholder
118//! let sql = Sql::new("SELECT * FROM users WHERE id = ")
119//!     .bind(42);
120//! assert_eq!(sql.params().len(), 1);
121//! ```
122//!
123//! ## Connection Strings
124//!
125//! Parse database connection strings:
126//!
127//! ```rust
128//! use prax_query::ConnectionString;
129//!
130//! // PostgreSQL
131//! let conn = ConnectionString::parse("postgres://user:pass@localhost:5432/mydb").unwrap();
132//! assert_eq!(conn.host(), Some("localhost"));
133//! assert_eq!(conn.port(), Some(5432));
134//! assert_eq!(conn.database(), Some("mydb"));
135//!
136//! // MySQL
137//! let conn = ConnectionString::parse("mysql://user:pass@localhost:3306/mydb").unwrap();
138//! ```
139//!
140//! ## Transaction Config
141//!
142//! Configure transaction behavior:
143//!
144//! ```rust
145//! use prax_query::IsolationLevel;
146//!
147//! let level = IsolationLevel::Serializable;
148//! assert_eq!(level.as_sql(), "SERIALIZABLE");
149//! ```
150//!
151//! ## Error Handling
152//!
153//! Work with query errors:
154//!
155//! ```rust
156//! use prax_query::{QueryError, ErrorCode};
157//!
158//! // Create errors
159//! let err = QueryError::not_found("User");
160//! assert_eq!(err.code, ErrorCode::RecordNotFound);
161//! ```
162
163pub mod advanced;
164pub mod async_optimize;
165pub mod batch;
166pub mod builder;
167pub mod cache;
168pub mod capabilities;
169pub mod connection;
170pub mod cte;
171pub mod data;
172#[allow(dead_code, unused_imports)]
173pub mod data_cache;
174pub mod db_optimize;
175pub mod dialect;
176pub mod error;
177pub mod extension;
178pub mod filter;
179pub mod inputs;
180pub mod intern;
181pub mod introspection;
182pub mod json;
183pub mod lazy;
184pub mod logging;
185#[macro_use]
186pub mod macros;
187pub mod mem_optimize;
188pub mod memory;
189pub mod middleware;
190pub mod nested;
191pub mod operations;
192pub mod pagination;
193pub mod partition;
194pub mod pool;
195pub mod procedure;
196pub mod profiling;
197pub mod projection;
198pub mod query;
199pub mod raw;
200pub mod relations;
201pub mod replication;
202pub mod row;
203pub mod search;
204pub mod security;
205pub mod sequence;
206pub mod sql;
207pub mod static_filter;
208pub mod tenant;
209pub mod traits;
210pub mod transaction;
211pub mod trigger;
212pub mod typed_filter;
213pub mod types;
214pub mod upsert;
215pub mod window;
216pub mod zero_copy;
217
218/// Re-exported `base64` crate for use by generated code emitted by
219/// `prax-codegen`. The codegen path for `Bytes`-typed `@unique` columns
220/// uses this to encode binary values to a stable string representation;
221/// re-exporting here avoids requiring downstream users to add `base64`
222/// to their own `Cargo.toml`.
223#[doc(hidden)]
224pub use base64;
225pub use error::{ErrorCode, ErrorContext, QueryError, QueryResult, Suggestion};
226pub use extension::{Extension, ExtensionBuilder, Point, Polygon};
227pub use filter::{
228    AndFilterBuilder, FieldName, Filter, FilterValue, FluentFilterBuilder, LargeValueList,
229    OrFilterBuilder, ScalarFilter, SmallValueList, ToFilterValue, ValueList,
230};
231pub use json::{JsonAgg, JsonFilter, JsonIndex, JsonIndexBuilder, JsonOp, JsonPath, PathSegment};
232pub use nested::{NestedWrite, NestedWriteBuilder, NestedWriteOp, NestedWriteOperations};
233pub use operations::{
234    AggregateField,
235    AggregateOperation,
236    AggregateResult,
237    CountOperation,
238    CountSelectMode,
239    CreateManyOperation,
240    CreateOperation,
241    DeleteManyOperation,
242    DeleteOperation,
243    FindFirstOperation,
244    FindManyOperation,
245    FindUniqueOperation,
246    GroupByOperation,
247    GroupByResult,
248    HavingCondition,
249    HavingOp,
250    // View operations
251    MaterializedViewAccessor,
252    RefreshMaterializedViewOperation,
253    UpdateManyOperation,
254    UpdateOperation,
255    UpsertOperation,
256    ViewAccessor,
257    ViewCountOperation,
258    ViewFindFirstOperation,
259    ViewFindManyOperation,
260    ViewQueryBuilder,
261    having,
262};
263pub use pagination::{Cursor, CursorDirection, Pagination};
264pub use partition::{
265    HashPartitionDef, ListPartitionDef, Partition, PartitionBuilder, PartitionDef, PartitionType,
266    RangeBound, RangePartitionDef,
267};
268pub use procedure::{
269    Parameter, ParameterMode, ProcedureCall, ProcedureCallOperation, ProcedureEngine,
270    ProcedureResult,
271};
272pub use projection::ScalarProjection;
273pub use query::QueryBuilder;
274pub use raw::{RawExecuteOperation, RawQueryOperation, Sql};
275pub use relations::{
276    Include, IncludeSpec, RelationKind, RelationLoader, RelationMeta, RelationSpec, SelectSpec,
277};
278pub use search::{
279    FullTextIndex, FullTextIndexBuilder, FuzzyOptions, HighlightOptions, RankingOptions,
280    SearchLanguage, SearchMode, SearchQuery, SearchQueryBuilder, SearchSql,
281};
282pub use security::{
283    ConnectionProfile, ConnectionProfileBuilder, DataMask, Grant, GrantBuilder, GrantObject,
284    MaskFunction, PolicyCommand, Privilege, RlsPolicy, RlsPolicyBuilder, Role, RoleBuilder,
285    TenantPolicy, TenantSource,
286};
287pub use sequence::{OwnedBy, Sequence, SequenceBuilder};
288pub use traits::{
289    Executable, IntoFilter, MaterializedView, Model, ModelRelationLoader, ModelWithPk, QueryEngine,
290    View, ViewQueryEngine,
291};
292pub use transaction::{IsolationLevel, Transaction, TransactionConfig};
293pub use trigger::{
294    Trigger, TriggerAction, TriggerBuilder, TriggerCondition, TriggerEvent, TriggerLevel,
295    TriggerTiming, UpdateOf,
296};
297pub use types::{
298    NullsOrder, OrderBy, OrderByBuilder, OrderByField, Select, SortOrder, order_patterns,
299};
300pub use upsert::{
301    Assignment, AssignmentValue, ConflictAction, ConflictTarget, UpdateSpec, Upsert, UpsertBuilder,
302};
303pub use window::{
304    FrameBound, FrameClause, FrameExclude, FrameType, NamedWindow, NullsPosition, OrderSpec,
305    WindowFn, WindowFunction, WindowFunctionBuilder, WindowSpec,
306};
307
308// Re-export middleware types
309pub use middleware::{
310    LoggingMiddleware, MetricsMiddleware, Middleware, MiddlewareBuilder, MiddlewareChain,
311    MiddlewareStack, QueryContext, QueryMetadata, QueryMetrics, QueryType, RetryMiddleware,
312    TimingMiddleware,
313};
314
315// Re-export dialect types
316pub use dialect::{Mssql, Mysql, NotSql, Postgres, SqlDialect, Sqlite};
317
318// Re-export connection types
319pub use connection::{
320    ConnectionError, ConnectionOptions, ConnectionString, DatabaseConfig, Driver, EnvExpander,
321    MultiDatabaseConfig, PoolConfig, PoolOptions, SslConfig, SslMode,
322};
323pub use cte::{
324    Cte, CteBuilder, CycleClause, Materialized, SearchClause, SearchMethod, WithClause,
325    WithQueryBuilder,
326};
327
328// Re-export advanced query types
329pub use advanced::{
330    BulkOperation, DistinctOn, LateralJoin, LateralJoinBuilder, LateralJoinType, LockStrength,
331    LockWait, ReturnOperation, Returning, ReturningColumn, RowLock, RowLockBuilder, SampleMethod,
332    SampleSize, TableSample, TableSampleBuilder,
333};
334
335// Re-export data types
336pub use data::{
337    BatchCreate, ConnectData, CreateData, DataBuilder, FieldValue, IntoData, UpdateData,
338};
339
340// Re-export introspection types
341pub use introspection::{
342    CheckConstraint, ColumnInfo, DatabaseSchema, EnumInfo, ForeignKeyInfo, IndexColumn, IndexInfo,
343    NormalizedType, ReferentialAction, SequenceInfo, TableInfo, UniqueConstraint, ViewInfo,
344    generate_prax_schema, normalize_type,
345};
346
347// Re-export tenant types
348pub use tenant::{
349    DynamicResolver, IsolationStrategy, RowLevelConfig, SchemaConfig, StaticResolver, TenantConfig,
350    TenantConfigBuilder, TenantContext, TenantId, TenantInfo, TenantMiddleware, TenantResolver,
351};
352
353// Re-export intern types
354pub use intern::{clear_interned, fields, intern, intern_cow, interned_count};
355
356// Re-export pool types
357pub use pool::{FilterBuilder, FilterPool, IntoPooledValue, PooledFilter, PooledValue};
358
359// Re-export SQL builder types
360pub use sql::{
361    AdvancedQueryCapacity, CachedSql, DatabaseType, FastSqlBuilder, LazySql, QueryCapacity,
362    SqlBuilder, SqlTemplateCache as SqlCache, global_sql_cache, keywords, templates,
363};
364
365// Re-export optimized builder types
366pub use builder::{
367    BuilderPool,
368    ColumnList,
369    ColumnNameList,
370    CowColumnList,
371    CowIdentifier,
372    ExprList,
373    // Note: FrameBound and FrameType are also defined in window module
374    FrameBound as BuilderFrameBound,
375    FrameType as BuilderFrameType,
376    Identifier,
377    OptimizedWindowSpec,
378    OrderByList,
379    PartitionByList,
380    ReusableBuilder,
381    WindowFrame,
382};
383
384// Re-export database optimization types
385pub use db_optimize::{
386    BatchConfig, CachedStatement, IndexHint, IndexHintType, JoinHint, JoinMethod,
387    MongoPipelineBuilder, PipelineStage, PreparedStatementCache, PreparedStatementStats,
388    QueryHints, global_statement_cache,
389};
390
391// Re-export zero-copy types
392pub use zero_copy::{
393    CteRef, FrameBoundRef, FrameRef, FrameTypeRef, JsonPathRef, PathSegmentRef, WindowSpecRef,
394    WithClauseRef,
395};
396
397// Re-export cache types
398pub use cache::{
399    CacheStats, CachedQuery, ExecutionPlan, ExecutionPlanCache, PlanHint, QueryCache, QueryHash,
400    QueryKey, SqlTemplate, SqlTemplateCache, get_global_template, global_template_cache,
401    patterns as cache_patterns, precompute_query_hash, register_global_template,
402};
403
404// Re-export batch types
405pub use batch::{
406    Batch, BatchBuilder, BatchOperation, BatchResult, OperationResult, Pipeline, PipelineBuilder,
407    PipelineQuery, PipelineResult, QueryResult as PipelineQueryResult,
408};
409
410// Re-export row deserialization types
411pub use row::{FromColumn, FromRow, FromRowRef, RowData, RowError, RowRef, RowRefIter};
412
413// Re-export lazy loading types
414pub use lazy::{Lazy, LazyRelation, ManyToOneLoader, OneToManyLoader};
415
416// Re-export static filter utilities
417pub use static_filter::{
418    CompactValue, StaticFilter, and2, and3, and4, and5, contains, ends_with, eq,
419    fields as static_fields, gt, gte, in_list, is_not_null, is_null, lt, lte, ne, not, not_in_list,
420    or2, or3, or4, or5, starts_with,
421};
422
423// Re-export typed filter utilities
424pub use typed_filter::{
425    And, AndN, Contains, DirectSql, EndsWith, Eq, Gt, Gte, InI64, InI64Slice, InStr, InStrSlice,
426    IsNotNull, IsNull, LazyFilter, Lt, Lte, Maybe, Ne, Not as TypedNot, NotInI64Slice, Or, OrN,
427    StartsWith, TypedFilter, and_n, eq as typed_eq, gt as typed_gt, gte as typed_gte,
428    in_i64 as typed_in_i64, in_i64_slice, in_str as typed_in_str, in_str_slice,
429    is_not_null as typed_is_not_null, is_null as typed_is_null, lazy, lt as typed_lt,
430    lte as typed_lte, ne as typed_ne, not_in_i64_slice, or_n,
431};
432
433// Re-export memory optimization utilities
434pub use memory::{
435    BufferPool, CompactFilter, GLOBAL_BUFFER_POOL, GLOBAL_STRING_POOL, MemoryStats, PoolStats,
436    PooledBuffer, StringPool, get_buffer, intern as memory_intern,
437};
438
439// Re-export logging utilities
440pub use logging::{
441    get_log_format, get_log_level, init as init_logging, init_debug, init_with_level,
442    is_debug_enabled,
443};
444
445// Re-export replication types
446pub use replication::{
447    ConnectionRouter, HealthStatus, LagMeasurement, LagMonitor, ReadPreference, ReplicaConfig,
448    ReplicaHealth, ReplicaRole, ReplicaSetBuilder, ReplicaSetConfig,
449};
450
451// Re-export async optimization types
452pub use async_optimize::{
453    ConcurrencyConfig, ConcurrentExecutor, ExecutionStats, IntrospectionConfig,
454    IntrospectionResult, PipelineConfig, PipelineError, PipelineResult as AsyncPipelineResult,
455    QueryPipeline, TaskError, TaskResult,
456    concurrent::execute_batch as async_execute_batch,
457    concurrent::execute_chunked as async_execute_chunked,
458    introspect::{
459        BatchIntrospector, ColumnMetadata, ConcurrentIntrospector, ForeignKeyMetadata,
460        IndexMetadata, IntrospectionError, IntrospectionPhase, IntrospectorBuilder, TableMetadata,
461    },
462    pipeline::{BulkInsertPipeline, BulkUpdatePipeline, SimulatedExecutor},
463};
464
465// Re-export memory optimization types
466pub use mem_optimize::{
467    GlobalInterner, IdentifierCache, InternedStr, ScopedInterner,
468    arena::{ArenaScope, ArenaStats, QueryArena, ScopedFilter, ScopedQuery, ScopedValue},
469    interning::{get_interned, intern as global_intern, intern_component, intern_qualified},
470    lazy::{LazyColumn, LazyForeignKey, LazyIndex, LazySchema, LazySchemaStats, LazyTable},
471};
472
473// Re-export profiling types
474pub use profiling::{
475    AllocationRecord, AllocationStats, AllocationTracker, HeapProfiler, HeapReport, HeapStats,
476    LeakDetector, LeakReport, LeakSeverity, MemoryProfiler, MemoryReport, MemorySnapshot,
477    PotentialLeak, SnapshotDiff, TrackedAllocator, disable_profiling, enable_profiling,
478    is_profiling_enabled, with_profiling,
479};
480
481// Re-export smallvec for macros
482pub use smallvec;
483
484// Typed input shapes (phase 1 of the typed-query-traits work).
485pub use crate::capabilities::{
486    SupportsArrayOps, SupportsCaseInsensitiveMode, SupportsCorrelatedSubquery,
487    SupportsFullTextSearch, SupportsGeneratedColumns, SupportsJsonPath, SupportsNestedWrites,
488    SupportsRelationFilter, SupportsScalarSubqueryInSelect,
489};
490pub use crate::inputs::{
491    // Containers.
492    AggregateArgs,
493    // Traits.
494    AggregateInput,
495    // Update wrappers.
496    BigIntFieldUpdate,
497    // Scalar filters.
498    // NOTE: `ScalarFilter` (the trait) conflicts with `filter::ScalarFilter` already at crate
499    // root — re-exported as `InputScalarFilter` to disambiguate.
500    BigIntFilter,
501    BigIntNullableFieldUpdate,
502    BigIntNullableFilter,
503    BoolFieldUpdate,
504    BoolFilter,
505    BoolNullableFieldUpdate,
506    BoolNullableFilter,
507    BytesFieldUpdate,
508    BytesFilter,
509    BytesNullableFieldUpdate,
510    BytesNullableFilter,
511    CountArgs,
512    CountSelect,
513    CreateArgs,
514    CreateInput,
515    CreateManyArgs,
516    // Write payload (phase 5a).
517    CreatePayload,
518    DateFilter,
519    DateNullableFilter,
520    DateTimeFieldUpdate,
521    DateTimeFilter,
522    DateTimeNullableFieldUpdate,
523    DateTimeNullableFilter,
524    DecimalFieldUpdate,
525    DecimalFilter,
526    DecimalNullableFieldUpdate,
527    DecimalNullableFilter,
528    DeleteArgs,
529    DeleteManyArgs,
530    EnumFieldUpdate,
531    EnumFilter,
532    EnumNullableFieldUpdate,
533    EnumNullableFilter,
534    FindFirstArgs,
535    FindManyArgs,
536    FindUniqueArgs,
537    FloatFieldUpdate,
538    FloatFilter,
539    FloatNullableFieldUpdate,
540    FloatNullableFilter,
541    GroupByArgs,
542    GroupByInput,
543    IncludeInput,
544    IntFieldUpdate,
545    IntFilter,
546    IntNullableFieldUpdate,
547    IntNullableFilter,
548    JsonFieldUpdate,
549    // NOTE: `JsonFilter` and `JsonNullableFilter` conflict with `json::JsonFilter` already at
550    // crate root — re-exported as `InputJsonFilter` / `InputJsonNullableFilter`.
551    JsonFilter as InputJsonFilter,
552    JsonNullableFieldUpdate,
553    JsonNullableFilter as InputJsonNullableFilter,
554    // Relation filters + meta.
555    ListRelationFilter,
556    LowerRelationFilter,
557    OrderByInput,
558    PaginationInput,
559    QueryMode,
560    RelationFilterMeta,
561    ScalarFilter as InputScalarFilter,
562    SelectInput,
563    SingleRelationFilter,
564    StringFieldUpdate,
565    StringFilter,
566    StringNullableFieldUpdate,
567    StringNullableFilter,
568    TimeFilter,
569    TimeNullableFilter,
570    UpdateArgs,
571    UpdateInput,
572    UpdateManyArgs,
573    UpdatePayload,
574    UpsertArgs,
575    UuidFieldUpdate,
576    UuidFilter,
577    UuidNullableFieldUpdate,
578    UuidNullableFilter,
579    WhereInput,
580    WhereUniqueInput,
581    WriteOp,
582};
583
584/// Prelude module for convenient imports.
585pub mod prelude {
586    pub use crate::advanced::{LateralJoin, Returning, RowLock, TableSample};
587    pub use crate::cte::{Cte, CteBuilder, WithClause};
588    pub use crate::error::{QueryError, QueryResult};
589    pub use crate::extension::{Extension, Point, Polygon};
590    pub use crate::filter::{Filter, FilterValue, ScalarFilter};
591    pub use crate::introspection::{DatabaseSchema, TableInfo, generate_prax_schema};
592    pub use crate::json::{JsonFilter, JsonOp, JsonPath};
593    pub use crate::nested::{
594        NestedWrite, NestedWriteBuilder, NestedWriteOp, NestedWriteOperations,
595    };
596    pub use crate::operations::*;
597    pub use crate::pagination::{Cursor, CursorDirection, Pagination};
598    pub use crate::partition::{Partition, PartitionBuilder, PartitionType, RangeBound};
599    pub use crate::procedure::{
600        Parameter, ParameterMode, ProcedureCall, ProcedureEngine, ProcedureResult,
601    };
602    pub use crate::query::QueryBuilder;
603    pub use crate::raw::{RawExecuteOperation, RawQueryOperation, Sql};
604    pub use crate::raw_query;
605    pub use crate::relations::{Include, IncludeSpec, RelationSpec, SelectSpec};
606    pub use crate::replication::{ConnectionRouter, ReadPreference, ReplicaSetConfig};
607    pub use crate::search::{FullTextIndex, SearchMode, SearchQuery, SearchQueryBuilder};
608    pub use crate::security::{Grant, GrantBuilder, RlsPolicy, Role, RoleBuilder};
609    pub use crate::sequence::{Sequence, SequenceBuilder};
610    pub use crate::traits::{
611        Executable, IntoFilter, MaterializedView, Model, QueryEngine, View, ViewQueryEngine,
612    };
613    pub use crate::transaction::{IsolationLevel, Transaction, TransactionConfig};
614    pub use crate::trigger::{
615        Trigger, TriggerAction, TriggerBuilder, TriggerCondition, TriggerEvent, TriggerLevel,
616        TriggerTiming,
617    };
618    pub use crate::types::{OrderBy, Select, SortOrder};
619    pub use crate::upsert::{ConflictAction, ConflictTarget, Upsert, UpsertBuilder};
620    pub use crate::window::{WindowFn, WindowFunction, WindowSpec};
621
622    // Tenant types
623    pub use crate::tenant::{IsolationStrategy, TenantConfig, TenantContext, TenantMiddleware};
624
625    // Async optimization types
626    pub use crate::async_optimize::{
627        ConcurrencyConfig, ConcurrentExecutor, IntrospectionConfig, PipelineConfig, QueryPipeline,
628    };
629
630    // Memory optimization types
631    pub use crate::mem_optimize::{GlobalInterner, InternedStr, LazySchema, QueryArena};
632
633    // Profiling types
634    pub use crate::profiling::{
635        LeakDetector, MemoryProfiler, MemorySnapshot, enable_profiling, with_profiling,
636    };
637}