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// `data_cache` is a standalone result-caching layer: it is not yet wired into
173// the query builder (no `.cache()` on query operations) and its Redis backend
174// is not yet implemented (construction and all operations return an error).
175// The memory backend works and is tested; the allow stays until query-builder
176// integration lands.
177#[allow(dead_code, unused_imports)]
178pub mod data_cache;
179pub mod db_optimize;
180pub mod dialect;
181pub mod error;
182pub mod extension;
183pub mod filter;
184pub mod inputs;
185pub mod intern;
186pub mod introspection;
187pub mod json;
188pub mod lazy;
189pub mod logging;
190#[macro_use]
191pub mod macros;
192pub mod mem_optimize;
193pub mod memory;
194pub mod middleware;
195pub mod nested;
196pub mod operations;
197pub mod pagination;
198pub mod partition;
199pub mod pool;
200pub mod procedure;
201pub mod profiling;
202pub mod projection;
203pub mod query;
204pub mod raw;
205pub mod relations;
206pub mod replication;
207pub mod row;
208pub mod search;
209pub mod security;
210pub mod sequence;
211pub mod sql;
212pub mod static_filter;
213pub mod tenant;
214pub mod traits;
215pub mod transaction;
216pub mod trigger;
217pub mod typed_filter;
218pub mod types;
219pub mod upsert;
220pub mod window;
221pub mod zero_copy;
222
223/// Re-exported `base64` crate for use by generated code emitted by
224/// `prax-codegen`. The codegen path for `Bytes`-typed `@unique` columns
225/// uses this to encode binary values to a stable string representation;
226/// re-exporting here avoids requiring downstream users to add `base64`
227/// to their own `Cargo.toml`.
228#[doc(hidden)]
229pub use base64;
230pub use error::{ErrorCode, ErrorContext, QueryError, QueryResult, Suggestion};
231pub use extension::{Extension, ExtensionBuilder, Point, Polygon};
232pub use filter::{
233    AndFilterBuilder, FieldName, Filter, FilterValue, FluentFilterBuilder, LargeValueList,
234    OrFilterBuilder, ScalarFilter, SmallValueList, ToFilterValue, ValueList,
235};
236pub use json::{JsonAgg, JsonFilter, JsonIndex, JsonIndexBuilder, JsonOp, JsonPath, PathSegment};
237pub use nested::{NestedWrite, NestedWriteBuilder, NestedWriteOp, NestedWriteOperations};
238pub use operations::{
239    AggregateField,
240    AggregateOperation,
241    AggregateResult,
242    CountOperation,
243    CountSelectMode,
244    CreateManyOperation,
245    CreateOperation,
246    DeleteManyOperation,
247    DeleteOperation,
248    FindFirstOperation,
249    FindManyOperation,
250    FindUniqueOperation,
251    GroupByOperation,
252    GroupByResult,
253    HavingCondition,
254    HavingOp,
255    // View operations
256    MaterializedViewAccessor,
257    RefreshMaterializedViewOperation,
258    UpdateManyOperation,
259    UpdateOperation,
260    UpsertOperation,
261    ViewAccessor,
262    ViewCountOperation,
263    ViewFindFirstOperation,
264    ViewFindManyOperation,
265    ViewQueryBuilder,
266    having,
267};
268pub use pagination::{Cursor, CursorDirection, Pagination};
269pub use partition::{
270    HashPartitionDef, ListPartitionDef, Partition, PartitionBuilder, PartitionDef, PartitionType,
271    RangeBound, RangePartitionDef,
272};
273pub use procedure::{
274    Parameter, ParameterMode, ProcedureCall, ProcedureCallOperation, ProcedureEngine,
275    ProcedureResult,
276};
277pub use projection::ScalarProjection;
278pub use query::QueryBuilder;
279pub use raw::{RawExecuteOperation, RawQueryOperation, Sql};
280pub use relations::{
281    Include, IncludeSpec, RelationKind, RelationLoader, RelationMeta, RelationSpec, SelectSpec,
282};
283pub use search::{
284    FullTextIndex, FullTextIndexBuilder, FuzzyOptions, HighlightOptions, RankingOptions,
285    SearchLanguage, SearchMode, SearchQuery, SearchQueryBuilder, SearchSql,
286};
287pub use security::{
288    ConnectionProfile, ConnectionProfileBuilder, DataMask, Grant, GrantBuilder, GrantObject,
289    MaskFunction, PolicyCommand, Privilege, RlsPolicy, RlsPolicyBuilder, Role, RoleBuilder,
290    TenantPolicy, TenantSource,
291};
292pub use sequence::{OwnedBy, Sequence, SequenceBuilder};
293pub use traits::{
294    Executable, IntoFilter, MaterializedView, Model, ModelRelationLoader, ModelWithPk, QueryEngine,
295    View, ViewQueryEngine,
296};
297pub use transaction::{IsolationLevel, Transaction, TransactionConfig};
298pub use trigger::{
299    Trigger, TriggerAction, TriggerBuilder, TriggerCondition, TriggerEvent, TriggerLevel,
300    TriggerTiming, UpdateOf,
301};
302pub use types::{
303    NullsOrder, OrderBy, OrderByBuilder, OrderByField, Select, SortOrder, order_patterns,
304};
305pub use upsert::{
306    Assignment, AssignmentValue, ConflictAction, ConflictTarget, UpdateSpec, Upsert, UpsertBuilder,
307};
308pub use window::{
309    FrameBound, FrameClause, FrameExclude, FrameType, NamedWindow, NullsPosition, OrderSpec,
310    WindowFn, WindowFunction, WindowFunctionBuilder, WindowSpec,
311};
312
313// Re-export middleware types
314pub use middleware::{
315    LoggingMiddleware, MetricsMiddleware, Middleware, MiddlewareBuilder, MiddlewareChain,
316    MiddlewareStack, QueryContext, QueryMetadata, QueryMetrics, QueryType, RetryMiddleware,
317    TimingMiddleware,
318};
319
320// Re-export dialect types
321pub use dialect::{Mssql, Mysql, NotSql, Postgres, SqlDialect, Sqlite};
322
323// Re-export connection types
324pub use connection::{
325    ConnectionError, ConnectionOptions, ConnectionString, DatabaseConfig, Driver, EnvExpander,
326    MultiDatabaseConfig, PoolConfig, PoolOptions, SslConfig, SslMode,
327};
328pub use cte::{
329    Cte, CteBuilder, CycleClause, Materialized, SearchClause, SearchMethod, WithClause,
330    WithQueryBuilder,
331};
332
333// Re-export advanced query types
334pub use advanced::{
335    BulkOperation, DistinctOn, LateralJoin, LateralJoinBuilder, LateralJoinType, LockStrength,
336    LockWait, ReturnOperation, Returning, ReturningColumn, RowLock, RowLockBuilder, SampleMethod,
337    SampleSize, TableSample, TableSampleBuilder,
338};
339
340// Re-export data types
341pub use data::{
342    BatchCreate, ConnectData, CreateData, DataBuilder, FieldValue, IntoData, UpdateData,
343};
344
345// Re-export introspection types
346pub use introspection::{
347    CheckConstraint, ColumnInfo, DatabaseSchema, EnumInfo, ForeignKeyInfo, IndexColumn, IndexInfo,
348    NormalizedType, ReferentialAction, SequenceInfo, TableInfo, UniqueConstraint, ViewInfo,
349    generate_prax_schema, normalize_type,
350};
351
352// Re-export tenant types
353pub use tenant::{
354    DynamicResolver, IsolationStrategy, RowLevelConfig, SchemaConfig, StaticResolver, TenantConfig,
355    TenantConfigBuilder, TenantContext, TenantId, TenantInfo, TenantMiddleware, TenantResolver,
356};
357
358// Re-export intern types
359pub use intern::{clear_interned, fields, intern, intern_cow, interned_count};
360
361// Re-export pool types
362pub use pool::{FilterBuilder, FilterPool, IntoPooledValue, PooledFilter, PooledValue};
363
364// Re-export SQL builder types
365pub use sql::{
366    AdvancedQueryCapacity, CachedSql, DatabaseType, FastSqlBuilder, LazySql, QueryCapacity,
367    SqlBuilder, SqlTemplateCache as SqlCache, global_sql_cache, keywords, templates,
368};
369
370// Re-export optimized builder types
371pub use builder::{
372    BuilderPool,
373    ColumnList,
374    ColumnNameList,
375    CowColumnList,
376    CowIdentifier,
377    ExprList,
378    // Note: FrameBound and FrameType are also defined in window module
379    FrameBound as BuilderFrameBound,
380    FrameType as BuilderFrameType,
381    Identifier,
382    OptimizedWindowSpec,
383    OrderByList,
384    PartitionByList,
385    ReusableBuilder,
386    WindowFrame,
387};
388
389// Re-export database optimization types
390pub use db_optimize::{
391    BatchConfig, CachedStatement, IndexHint, IndexHintType, JoinHint, JoinMethod,
392    MongoPipelineBuilder, PipelineStage, PreparedStatementCache, PreparedStatementStats,
393    QueryHints, global_statement_cache,
394};
395
396// Re-export zero-copy types
397pub use zero_copy::{
398    CteRef, FrameBoundRef, FrameRef, FrameTypeRef, JsonPathRef, PathSegmentRef, WindowSpecRef,
399    WithClauseRef,
400};
401
402// Re-export cache types
403pub use cache::{
404    CacheStats, CachedQuery, ExecutionPlan, ExecutionPlanCache, PlanHint, QueryCache, QueryHash,
405    QueryKey, SqlTemplate, SqlTemplateCache, get_global_template, global_template_cache,
406    patterns as cache_patterns, precompute_query_hash, register_global_template,
407};
408
409// Re-export batch types
410pub use batch::{
411    Batch, BatchBuilder, BatchOperation, BatchResult, OperationResult, Pipeline, PipelineBuilder,
412    PipelineQuery, PipelineResult, QueryResult as PipelineQueryResult,
413};
414
415// Re-export row deserialization types
416pub use row::{FromColumn, FromRow, FromRowRef, RowData, RowError, RowRef, RowRefIter};
417
418// Re-export lazy loading types
419pub use lazy::{Lazy, LazyRelation, ManyToOneLoader, OneToManyLoader};
420
421// Re-export static filter utilities
422pub use static_filter::{
423    CompactValue, StaticFilter, and2, and3, and4, and5, contains, ends_with, eq,
424    fields as static_fields, gt, gte, in_list, is_not_null, is_null, lt, lte, ne, not, not_in_list,
425    or2, or3, or4, or5, starts_with,
426};
427
428// Re-export typed filter utilities
429pub use typed_filter::{
430    And, AndN, Contains, DirectSql, EndsWith, Eq, Gt, Gte, InI64, InI64Slice, InStr, InStrSlice,
431    IsNotNull, IsNull, LazyFilter, Lt, Lte, Maybe, Ne, Not as TypedNot, NotInI64Slice, Or, OrN,
432    StartsWith, TypedFilter, and_n, eq as typed_eq, gt as typed_gt, gte as typed_gte,
433    in_i64 as typed_in_i64, in_i64_slice, in_str as typed_in_str, in_str_slice,
434    is_not_null as typed_is_not_null, is_null as typed_is_null, lazy, lt as typed_lt,
435    lte as typed_lte, ne as typed_ne, not_in_i64_slice, or_n,
436};
437
438// Re-export memory optimization utilities
439pub use memory::{
440    BufferPool, CompactFilter, GLOBAL_BUFFER_POOL, GLOBAL_STRING_POOL, MemoryStats, PoolStats,
441    PooledBuffer, StringPool, get_buffer, intern as memory_intern,
442};
443
444// Re-export logging utilities
445pub use logging::{
446    get_log_format, get_log_level, init as init_logging, init_debug, init_with_level,
447    is_debug_enabled,
448};
449
450// Re-export replication types
451pub use replication::{
452    ConnectionRouter, HealthStatus, LagMeasurement, LagMonitor, ReadPreference, ReplicaConfig,
453    ReplicaHealth, ReplicaRole, ReplicaSetBuilder, ReplicaSetConfig,
454};
455
456// Re-export async optimization types
457pub use async_optimize::{
458    ConcurrencyConfig, ConcurrentExecutor, ExecutionStats, IntrospectionConfig,
459    IntrospectionResult, PipelineConfig, PipelineError, PipelineResult as AsyncPipelineResult,
460    QueryPipeline, TaskError, TaskResult,
461    concurrent::execute_batch as async_execute_batch,
462    concurrent::execute_chunked as async_execute_chunked,
463    introspect::{
464        BatchIntrospector, ColumnMetadata, ConcurrentIntrospector, ForeignKeyMetadata,
465        IndexMetadata, IntrospectionError, IntrospectionPhase, IntrospectorBuilder, TableMetadata,
466    },
467    pipeline::{BulkInsertPipeline, BulkUpdatePipeline, SimulatedExecutor},
468};
469
470// Re-export memory optimization types
471pub use mem_optimize::{
472    GlobalInterner, IdentifierCache, InternedStr, ScopedInterner,
473    arena::{ArenaScope, ArenaStats, QueryArena, ScopedFilter, ScopedQuery, ScopedValue},
474    interning::{get_interned, intern as global_intern, intern_component, intern_qualified},
475    lazy::{LazyColumn, LazyForeignKey, LazyIndex, LazySchema, LazySchemaStats, LazyTable},
476};
477
478// Re-export profiling types
479pub use profiling::{
480    AllocationRecord, AllocationStats, AllocationTracker, HeapProfiler, HeapReport, HeapStats,
481    LeakDetector, LeakReport, LeakSeverity, MemoryProfiler, MemoryReport, MemorySnapshot,
482    PotentialLeak, SnapshotDiff, TrackedAllocator, disable_profiling, enable_profiling,
483    is_profiling_enabled, with_profiling,
484};
485
486// Re-export smallvec for macros
487pub use smallvec;
488
489// Typed input shapes (phase 1 of the typed-query-traits work).
490pub use crate::capabilities::{
491    SupportsArrayOps, SupportsCaseInsensitiveMode, SupportsCorrelatedSubquery,
492    SupportsFullTextSearch, SupportsGeneratedColumns, SupportsJsonPath, SupportsNestedWrites,
493    SupportsRelationFilter, SupportsScalarSubqueryInSelect,
494};
495pub use crate::inputs::{
496    // Containers.
497    AggregateArgs,
498    // Traits.
499    AggregateInput,
500    // Update wrappers.
501    BigIntFieldUpdate,
502    // Scalar filters.
503    // NOTE: `ScalarFilter` (the trait) conflicts with `filter::ScalarFilter` already at crate
504    // root — re-exported as `InputScalarFilter` to disambiguate.
505    BigIntFilter,
506    BigIntNullableFieldUpdate,
507    BigIntNullableFilter,
508    BoolFieldUpdate,
509    BoolFilter,
510    BoolNullableFieldUpdate,
511    BoolNullableFilter,
512    BytesFieldUpdate,
513    BytesFilter,
514    BytesNullableFieldUpdate,
515    BytesNullableFilter,
516    CountArgs,
517    CountSelect,
518    CreateArgs,
519    CreateInput,
520    CreateManyArgs,
521    // Write payload (phase 5a).
522    CreatePayload,
523    DateFilter,
524    DateNullableFilter,
525    DateTimeFieldUpdate,
526    DateTimeFilter,
527    DateTimeNullableFieldUpdate,
528    DateTimeNullableFilter,
529    DecimalFieldUpdate,
530    DecimalFilter,
531    DecimalNullableFieldUpdate,
532    DecimalNullableFilter,
533    DeleteArgs,
534    DeleteManyArgs,
535    EnumFieldUpdate,
536    EnumFilter,
537    EnumNullableFieldUpdate,
538    EnumNullableFilter,
539    FindFirstArgs,
540    FindManyArgs,
541    FindUniqueArgs,
542    FloatFieldUpdate,
543    FloatFilter,
544    FloatNullableFieldUpdate,
545    FloatNullableFilter,
546    GroupByArgs,
547    GroupByInput,
548    IncludeInput,
549    IntFieldUpdate,
550    IntFilter,
551    IntNullableFieldUpdate,
552    IntNullableFilter,
553    JsonFieldUpdate,
554    // NOTE: `JsonFilter` and `JsonNullableFilter` conflict with `json::JsonFilter` already at
555    // crate root — re-exported as `InputJsonFilter` / `InputJsonNullableFilter`.
556    JsonFilter as InputJsonFilter,
557    JsonNullableFieldUpdate,
558    JsonNullableFilter as InputJsonNullableFilter,
559    // Relation filters + meta.
560    ListRelationFilter,
561    LowerRelationFilter,
562    OrderByInput,
563    PaginationInput,
564    QueryMode,
565    RelationFilterMeta,
566    ScalarFilter as InputScalarFilter,
567    SelectInput,
568    SingleRelationFilter,
569    StringFieldUpdate,
570    StringFilter,
571    StringNullableFieldUpdate,
572    StringNullableFilter,
573    TimeFilter,
574    TimeNullableFilter,
575    UpdateArgs,
576    UpdateInput,
577    UpdateManyArgs,
578    UpdatePayload,
579    UpsertArgs,
580    UuidFieldUpdate,
581    UuidFilter,
582    UuidNullableFieldUpdate,
583    UuidNullableFilter,
584    WhereInput,
585    WhereUniqueInput,
586    WriteOp,
587};
588
589/// Prelude module for convenient imports.
590pub mod prelude {
591    pub use crate::advanced::{LateralJoin, Returning, RowLock, TableSample};
592    pub use crate::cte::{Cte, CteBuilder, WithClause};
593    pub use crate::error::{QueryError, QueryResult};
594    pub use crate::extension::{Extension, Point, Polygon};
595    pub use crate::filter::{Filter, FilterValue, ScalarFilter};
596    pub use crate::introspection::{DatabaseSchema, TableInfo, generate_prax_schema};
597    pub use crate::json::{JsonFilter, JsonOp, JsonPath};
598    pub use crate::nested::{
599        NestedWrite, NestedWriteBuilder, NestedWriteOp, NestedWriteOperations,
600    };
601    pub use crate::operations::*;
602    pub use crate::pagination::{Cursor, CursorDirection, Pagination};
603    pub use crate::partition::{Partition, PartitionBuilder, PartitionType, RangeBound};
604    pub use crate::procedure::{
605        Parameter, ParameterMode, ProcedureCall, ProcedureEngine, ProcedureResult,
606    };
607    pub use crate::query::QueryBuilder;
608    pub use crate::raw::{RawExecuteOperation, RawQueryOperation, Sql};
609    pub use crate::raw_query;
610    pub use crate::relations::{Include, IncludeSpec, RelationSpec, SelectSpec};
611    pub use crate::replication::{ConnectionRouter, ReadPreference, ReplicaSetConfig};
612    pub use crate::search::{FullTextIndex, SearchMode, SearchQuery, SearchQueryBuilder};
613    pub use crate::security::{Grant, GrantBuilder, RlsPolicy, Role, RoleBuilder};
614    pub use crate::sequence::{Sequence, SequenceBuilder};
615    pub use crate::traits::{
616        Executable, IntoFilter, MaterializedView, Model, QueryEngine, View, ViewQueryEngine,
617    };
618    pub use crate::transaction::{IsolationLevel, Transaction, TransactionConfig};
619    pub use crate::trigger::{
620        Trigger, TriggerAction, TriggerBuilder, TriggerCondition, TriggerEvent, TriggerLevel,
621        TriggerTiming,
622    };
623    pub use crate::types::{OrderBy, Select, SortOrder};
624    pub use crate::upsert::{ConflictAction, ConflictTarget, Upsert, UpsertBuilder};
625    pub use crate::window::{WindowFn, WindowFunction, WindowSpec};
626
627    // Tenant types
628    pub use crate::tenant::{IsolationStrategy, TenantConfig, TenantContext, TenantMiddleware};
629
630    // Async optimization types
631    pub use crate::async_optimize::{
632        ConcurrencyConfig, ConcurrentExecutor, IntrospectionConfig, PipelineConfig, QueryPipeline,
633    };
634
635    // Memory optimization types
636    pub use crate::mem_optimize::{GlobalInterner, InternedStr, LazySchema, QueryArena};
637
638    // Profiling types
639    pub use crate::profiling::{
640        LeakDetector, MemoryProfiler, MemorySnapshot, enable_profiling, with_profiling,
641    };
642}