mod query_plan;
pub mod correlated_subquery_analyzer;
pub mod cte_hoister;
pub mod dependency_analyzer;
pub mod expression_lifter;
pub mod group_by_alias_expander;
pub mod having_alias_transformer;
pub mod ilike_to_like_transformer;
pub mod in_operator_lifter;
pub mod into_clause_remover;
pub mod order_by_alias_transformer;
pub mod pipeline;
pub mod pivot_expander;
pub mod qualify_to_where_transformer;
pub mod transformer_adapters;
pub mod where_alias_expander;
pub use query_plan::{
DependencyGraph, PlanMetadata, QueryAnalyzer, QueryPlan, WorkUnit, WorkUnitExpression,
WorkUnitType,
};
pub use correlated_subquery_analyzer::{
CorrelatedSubqueryAnalyzer, CorrelationAnalysis, SubqueryInfo, SubqueryLocation, SubqueryType,
};
pub use cte_hoister::CTEHoister;
pub use dependency_analyzer::{ScriptDependencyGraph, StatementNode};
pub use expression_lifter::{ExpressionLifter, LiftableExpression};
pub use group_by_alias_expander::GroupByAliasExpander;
pub use having_alias_transformer::HavingAliasTransformer;
pub use ilike_to_like_transformer::ILikeToLikeTransformer;
pub use in_operator_lifter::{InOperatorLifter, LiftedInExpression};
pub use into_clause_remover::IntoClauseRemover;
pub use order_by_alias_transformer::OrderByAliasTransformer;
pub use pivot_expander::PivotExpander;
pub use qualify_to_where_transformer::QualifyToWhereTransformer;
pub use where_alias_expander::WhereAliasExpander;
pub use pipeline::{
ASTTransformer, PipelineBuilder, PipelineConfig, PreprocessingPipeline, PreprocessingStats,
TransformStats,
};
pub use transformer_adapters::{
CTEHoisterTransformer, ExpressionLifterTransformer, InOperatorLifterTransformer,
};
#[derive(Clone, Debug)]
pub struct TransformerConfig {
pub enable_pivot_expander: bool,
pub enable_expression_lifter: bool,
pub enable_where_expansion: bool,
pub enable_group_by_expansion: bool,
pub enable_having_expansion: bool,
pub enable_order_by_expansion: bool,
pub enable_qualify_to_where: bool,
pub enable_ilike_to_like: bool,
pub enable_cte_hoister: bool,
pub enable_in_lifter: bool,
}
impl Default for TransformerConfig {
fn default() -> Self {
Self::all_enabled()
}
}
impl TransformerConfig {
pub fn all_enabled() -> Self {
Self {
enable_pivot_expander: true,
enable_expression_lifter: true,
enable_where_expansion: true,
enable_group_by_expansion: true,
enable_having_expansion: true,
enable_order_by_expansion: true,
enable_qualify_to_where: true,
enable_ilike_to_like: true,
enable_cte_hoister: true,
enable_in_lifter: true,
}
}
}
pub fn create_pipeline_with_config(
verbose: bool,
show_sql_transformations: bool,
transformer_config: TransformerConfig,
) -> PreprocessingPipeline {
let config = if verbose || show_sql_transformations {
PipelineConfig {
enabled: true,
verbose_logging: verbose,
collect_stats: true,
debug_ast_changes: false,
show_sql_transformations,
}
} else {
PipelineConfig::default()
};
let mut builder = PipelineBuilder::with_config(config);
if transformer_config.enable_pivot_expander {
builder = builder.with_transformer(Box::new(PivotExpander));
}
if transformer_config.enable_expression_lifter {
builder = builder.with_transformer(Box::new(ExpressionLifterTransformer::new()));
}
if transformer_config.enable_qualify_to_where {
builder = builder.with_transformer(Box::new(QualifyToWhereTransformer::new()));
}
if transformer_config.enable_ilike_to_like {
builder = builder.with_transformer(Box::new(ILikeToLikeTransformer::new()));
}
if transformer_config.enable_where_expansion {
builder = builder.with_transformer(Box::new(WhereAliasExpander::new()));
}
if transformer_config.enable_group_by_expansion {
builder = builder.with_transformer(Box::new(GroupByAliasExpander::new()));
}
if transformer_config.enable_having_expansion {
builder = builder.with_transformer(Box::new(HavingAliasTransformer::new()));
}
if transformer_config.enable_order_by_expansion {
builder = builder.with_transformer(Box::new(OrderByAliasTransformer::new()));
}
if transformer_config.enable_cte_hoister {
builder = builder.with_transformer(Box::new(CTEHoisterTransformer::new()));
}
if transformer_config.enable_in_lifter {
builder = builder.with_transformer(Box::new(InOperatorLifterTransformer::new()));
}
builder.build()
}
pub fn create_standard_pipeline(verbose: bool) -> PreprocessingPipeline {
let config = if verbose {
PipelineConfig {
enabled: true,
verbose_logging: true,
collect_stats: true,
debug_ast_changes: false,
show_sql_transformations: false,
}
} else {
PipelineConfig::default()
};
let mut builder = PipelineBuilder::with_config(config);
builder = builder
.with_transformer(Box::new(PivotExpander))
.with_transformer(Box::new(ExpressionLifterTransformer::new()))
.with_transformer(Box::new(ILikeToLikeTransformer::new()))
.with_transformer(Box::new(WhereAliasExpander::new()))
.with_transformer(Box::new(GroupByAliasExpander::new()))
.with_transformer(Box::new(HavingAliasTransformer::new()))
.with_transformer(Box::new(OrderByAliasTransformer::new()))
.with_transformer(Box::new(CTEHoisterTransformer::new()))
.with_transformer(Box::new(InOperatorLifterTransformer::new()));
builder.build()
}