pub mod columnar;
pub mod document_schemaless;
pub mod document_strict;
pub mod kv;
pub mod spatial;
pub mod timeseries;
use crate::error::Result;
use crate::types::*;
pub struct InsertParams {
pub collection: String,
pub columns: Vec<String>,
pub rows: Vec<Vec<(String, SqlValue)>>,
pub column_defaults: Vec<(String, String)>,
}
pub struct ScanParams {
pub collection: String,
pub alias: Option<String>,
pub filters: Vec<Filter>,
pub projection: Vec<Projection>,
pub sort_keys: Vec<SortKey>,
pub limit: Option<usize>,
pub offset: usize,
pub distinct: bool,
pub window_functions: Vec<WindowSpec>,
}
pub struct PointGetParams {
pub collection: String,
pub alias: Option<String>,
pub key_column: String,
pub key_value: SqlValue,
}
pub struct UpdateParams {
pub collection: String,
pub assignments: Vec<(String, SqlExpr)>,
pub filters: Vec<Filter>,
pub target_keys: Vec<SqlValue>,
pub returning: bool,
}
pub struct DeleteParams {
pub collection: String,
pub filters: Vec<Filter>,
pub target_keys: Vec<SqlValue>,
}
pub struct UpsertParams {
pub collection: String,
pub columns: Vec<String>,
pub rows: Vec<Vec<(String, SqlValue)>>,
pub column_defaults: Vec<(String, String)>,
}
pub struct AggregateParams {
pub collection: String,
pub alias: Option<String>,
pub filters: Vec<Filter>,
pub group_by: Vec<SqlExpr>,
pub aggregates: Vec<AggregateExpr>,
pub having: Vec<Filter>,
pub limit: usize,
pub bucket_interval_ms: Option<i64>,
pub group_columns: Vec<String>,
pub has_auto_tier: bool,
}
pub trait EngineRules {
fn plan_insert(&self, params: InsertParams) -> Result<Vec<SqlPlan>>;
fn plan_upsert(&self, params: UpsertParams) -> Result<Vec<SqlPlan>>;
fn plan_scan(&self, params: ScanParams) -> Result<SqlPlan>;
fn plan_point_get(&self, params: PointGetParams) -> Result<SqlPlan>;
fn plan_update(&self, params: UpdateParams) -> Result<Vec<SqlPlan>>;
fn plan_delete(&self, params: DeleteParams) -> Result<Vec<SqlPlan>>;
fn plan_aggregate(&self, params: AggregateParams) -> Result<SqlPlan>;
}
pub fn resolve_engine_rules(engine: EngineType) -> &'static dyn EngineRules {
match engine {
EngineType::DocumentSchemaless => &document_schemaless::SchemalessRules,
EngineType::DocumentStrict => &document_strict::StrictRules,
EngineType::KeyValue => &kv::KvRules,
EngineType::Columnar => &columnar::ColumnarRules,
EngineType::Timeseries => ×eries::TimeseriesRules,
EngineType::Spatial => &spatial::SpatialRules,
}
}