pub mod annotate_types;
pub mod canonicalize;
pub mod eliminate_ctes;
pub mod eliminate_joins;
pub mod isolate_table_selects;
pub mod normalize;
pub mod normalize_identifiers;
pub mod optimize_joins;
pub mod optimizer;
pub mod pushdown_predicates;
pub mod pushdown_projections;
pub mod qualify_columns;
pub mod qualify_tables;
pub mod simplify;
pub mod subquery;
pub use annotate_types::{annotate_types, TypeAnnotator, TypeCoercionClass};
pub use canonicalize::canonicalize;
pub use eliminate_ctes::{eliminate_ctes, is_cte_referenced};
pub use eliminate_joins::eliminate_joins;
pub use isolate_table_selects::isolate_table_selects;
pub use normalize::{
normalization_distance, normalize, normalized, NormalizeError, DEFAULT_MAX_DISTANCE,
};
pub use normalize_identifiers::{
get_normalization_strategy, is_case_sensitive, normalize_identifier, normalize_identifiers,
NormalizationStrategy,
};
pub use optimize_joins::{is_reorderable, normalize_joins, optimize_joins, reorder_joins};
pub use optimizer::{
optimize, optimize_with_rules, quick_optimize, OptimizationRule, OptimizerConfig, DEFAULT_RULES,
};
pub use pushdown_predicates::{pushdown_predicates, replace_aliases};
pub use pushdown_projections::{default_selection, pushdown_projections};
pub use qualify_columns::{
qualify_columns, qualify_outputs, quote_identifiers, validate_qualify_columns,
QualifyColumnsError, QualifyColumnsOptions,
};
pub use qualify_tables::{qualify_tables, QualifyTablesOptions};
pub use simplify::{always_false, always_true, is_false, is_null, is_zero, simplify, Simplifier};
pub use subquery::{is_correlated, is_mergeable, merge_subqueries, unnest_subqueries};
pub(crate) fn qualify_schema_aware_expression(
expression: crate::expressions::Expression,
schema: &dyn crate::schema::Schema,
dialect: Option<crate::dialects::DialectType>,
) -> Result<crate::expressions::Expression, QualifyColumnsError> {
let effective_dialect = dialect.or_else(|| schema.dialect());
let mut table_options = QualifyTablesOptions::new()
.with_alias_unaliased_tables(false)
.with_alias_unaliased_subqueries(true)
.with_normalize_set_operation_subqueries(false);
let mut column_options = QualifyColumnsOptions::new().with_allow_partial(true);
if let Some(dialect) = effective_dialect {
table_options = table_options.with_dialect(dialect);
column_options = column_options.with_dialect(dialect);
}
let expression = qualify_tables(expression, &table_options);
qualify_columns(expression, schema, &column_options)
}