Skip to content

Commit 8686791

Browse files
BohuTANGCopilot
andauthored
refactor(optimizer): optimizer/operator (#17689)
* refactor(optimizer): operator * optimizer/join -> operator/join * optimizer/decorrelate -> operator/decorrelate * decorrelate_subquery -> SubqueryRewriter.rewrite * optimizer/aggregate/ -> operator/aggregate/ * opeartor/README.md * Update src/query/sql/src/planner/optimizer/operator/decorrelate/subquery_rewriter.rs Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]>
1 parent 6308c81 commit 8686791

25 files changed

+117
-70
lines changed

src/query/sql/src/planner/binder/bind_mutation/mutation_expression.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use crate::binder::InternalColumnBinding;
3636
use crate::binder::MutationStrategy;
3737
use crate::binder::MutationType;
3838
use crate::optimizer::ir::SExpr;
39-
use crate::optimizer::SubqueryRewriter;
39+
use crate::optimizer::operator::SubqueryRewriter;
4040
use crate::plans::BoundColumnRef;
4141
use crate::plans::Filter;
4242
use crate::plans::Join;

src/query/sql/src/planner/binder/bind_table_reference/bind_join.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ use crate::normalize_identifier;
3333
use crate::optimizer::ir::ColumnSet;
3434
use crate::optimizer::ir::RelExpr;
3535
use crate::optimizer::ir::SExpr;
36-
use crate::optimizer::FlattenInfo;
37-
use crate::optimizer::SubqueryRewriter;
36+
use crate::optimizer::operator::FlattenInfo;
37+
use crate::optimizer::operator::SubqueryRewriter;
3838
use crate::planner::binder::scalar::ScalarBinder;
3939
use crate::planner::binder::Binder;
4040
use crate::planner::semantic::NameResolutionContext;

src/query/sql/src/planner/optimizer/mod.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,12 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
mod aggregate;
1615
mod cascades;
1716
mod cost;
18-
mod decorrelate;
1917
mod distributed;
20-
mod filter;
2118
mod hyper_dp;
2219
pub mod ir;
23-
mod join;
20+
pub mod operator;
2421
#[allow(clippy::module_inception)]
2522
mod optimizer;
2623
pub mod rule;
@@ -30,11 +27,6 @@ mod util;
3027
mod dynamic_sample;
3128

3229
pub use cascades::CascadesOptimizer;
33-
pub use decorrelate::FlattenInfo;
34-
pub use decorrelate::SubqueryRewriter;
35-
pub use filter::DeduplicateJoinConditionOptimizer;
36-
pub use filter::InferFilterOptimizer;
37-
pub use filter::NormalizeDisjunctiveFilterOptimizer;
3830
pub use hyper_dp::DPhpy;
3931
pub use optimizer::optimize;
4032
pub use optimizer::optimize_query;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Operator-Specific Optimizations
2+
3+
This directory contains operator-specific optimization rules for the Databend query optimizer. Unlike the rule-based transformations in the `transforms/rule/` directory that focus on general transformation patterns, the optimizations here are specialized for specific logical operators.
4+
5+
## Directory Structure
6+
7+
The `operator/` directory is organized by operator type:
8+
9+
- **aggregate/**: Optimizations specific to aggregate operations
10+
- `normalize_aggregate.rs`: Normalizes aggregate expressions
11+
- `stats_aggregate.rs`: Optimizes aggregates based on statistics
12+
13+
- **decorrelate/**: Optimizations for handling correlated subqueries
14+
- Contains utilities for subquery rewriting and unnesting
15+
16+
- **filter/**: Optimizations for filter operations
17+
- Includes deduplication of join conditions
18+
- Inference of filter properties
19+
- Normalization of disjunctive filters
20+
- Pull-up filter optimizations
21+
22+
- **join/**: Optimizations specific to join operations
23+
- Includes transformations like converting single joins to inner joins
24+
25+
## Usage
26+
27+
These operator-specific optimizers are typically used in the query optimization pipeline to transform logical plans into more efficient forms. They focus on the semantics and properties of specific operators rather than general transformation patterns.

src/query/sql/src/planner/optimizer/aggregate/normalize_aggregate.rs renamed to src/query/sql/src/planner/optimizer/operator/aggregate/normalize_aggregate.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,9 @@ impl RuleNormalizeAggregateOptimizer {
171171
}
172172
}
173173
}
174+
175+
impl Default for RuleNormalizeAggregateOptimizer {
176+
fn default() -> Self {
177+
Self::new()
178+
}
179+
}

src/query/sql/src/planner/optimizer/decorrelate/decorrelate.rs renamed to src/query/sql/src/planner/optimizer/operator/decorrelate/decorrelate.rs

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use std::collections::HashSet;
1717
use std::sync::Arc;
1818

1919
use databend_common_ast::Span;
20-
use databend_common_catalog::table_context::TableContext;
2120
use databend_common_exception::ErrorCode;
2221
use databend_common_exception::Result;
2322
use databend_common_expression::type_check::common_super_type;
@@ -31,13 +30,13 @@ use databend_common_functions::BUILTIN_FUNCTIONS;
3130
use crate::binder::ColumnBindingBuilder;
3231
use crate::binder::JoinPredicate;
3332
use crate::binder::Visibility;
34-
use crate::optimizer::decorrelate::subquery_rewriter::FlattenInfo;
35-
use crate::optimizer::decorrelate::subquery_rewriter::SubqueryRewriter;
36-
use crate::optimizer::decorrelate::subquery_rewriter::UnnestResult;
3733
use crate::optimizer::ir::ColumnSet;
3834
use crate::optimizer::ir::Matcher;
3935
use crate::optimizer::ir::RelExpr;
4036
use crate::optimizer::ir::SExpr;
37+
use crate::optimizer::operator::FlattenInfo;
38+
use crate::optimizer::operator::SubqueryRewriter;
39+
use crate::optimizer::operator::UnnestResult;
4140
use crate::plans::BoundColumnRef;
4241
use crate::plans::CastExpr;
4342
use crate::plans::ComparisonOp;
@@ -53,27 +52,6 @@ use crate::plans::ScalarExpr;
5352
use crate::plans::SubqueryExpr;
5453
use crate::plans::SubqueryType;
5554
use crate::IndexType;
56-
use crate::MetadataRef;
57-
58-
/// Decorrelate subqueries inside `s_expr`.
59-
///
60-
/// We only need to process three kinds of join: Scalar Subquery, Any Subquery, and Exists Subquery.
61-
/// Other kinds of subqueries have be converted to one of the above subqueries in `type_check`.
62-
///
63-
/// It will rewrite `s_expr` to all kinds of join.
64-
/// Correlated scalar subquery -> Single join
65-
/// Any subquery -> Marker join
66-
/// Correlated exists subquery -> Marker join
67-
///
68-
/// More information can be found in the paper: Unnesting Arbitrary Queries
69-
pub fn decorrelate_subquery(
70-
ctx: Arc<dyn TableContext>,
71-
metadata: MetadataRef,
72-
s_expr: SExpr,
73-
) -> Result<SExpr> {
74-
let mut rewriter = SubqueryRewriter::new(ctx, metadata, None);
75-
rewriter.rewrite(&s_expr)
76-
}
7755

7856
impl SubqueryRewriter {
7957
// Try to decorrelate a `CrossApply` into `SemiJoin` or `AntiJoin`.

src/query/sql/src/planner/optimizer/decorrelate/flatten_plan.rs renamed to src/query/sql/src/planner/optimizer/operator/decorrelate/flatten_plan.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ use databend_common_expression::DataSchema;
2525

2626
use crate::binder::ColumnBindingBuilder;
2727
use crate::binder::Visibility;
28-
use crate::optimizer::decorrelate::subquery_rewriter::FlattenInfo;
2928
use crate::optimizer::ir::ColumnSet;
3029
use crate::optimizer::ir::RelExpr;
3130
use crate::optimizer::ir::SExpr;
32-
use crate::optimizer::SubqueryRewriter;
31+
use crate::optimizer::operator::FlattenInfo;
32+
use crate::optimizer::operator::SubqueryRewriter;
3333
use crate::plans::Aggregate;
3434
use crate::plans::AggregateFunction;
3535
use crate::plans::AggregateMode;

src/query/sql/src/planner/optimizer/decorrelate/flatten_scalar.rs renamed to src/query/sql/src/planner/optimizer/operator/decorrelate/flatten_scalar.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use databend_common_exception::Result;
1717

1818
use crate::binder::ColumnBindingBuilder;
1919
use crate::optimizer::ir::ColumnSet;
20-
use crate::optimizer::SubqueryRewriter;
20+
use crate::optimizer::operator::SubqueryRewriter;
2121
use crate::plans::AggregateFunction;
2222
use crate::plans::AggregateFunctionScalarSortDesc;
2323
use crate::plans::BoundColumnRef;

0 commit comments

Comments
 (0)