From 991f8953e3a31fc3497f7f4c78cf690b1a162da3 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Fri, 27 Jun 2025 18:28:36 +0000 Subject: [PATCH] feat(optimizer): stack-based filters walker --- dbcon/mysql/rulebased_optimizer.cpp | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp index 4af61396c..ee674cfba 100644 --- a/dbcon/mysql/rulebased_optimizer.cpp +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -18,6 +18,7 @@ #include "constantcolumn.h" #include "execplan/calpontselectexecutionplan.h" #include "execplan/simplecolumn.h" +#include "existsfilter.h" #include "logicoperator.h" #include "operator.h" #include "predicateoperator.h" @@ -95,6 +96,37 @@ bool Rule::walk(execplan::CalpontSelectExecutionPlan& csep) const rewrite |= walk(unionUnitLocal); } + if (csep.filters() != nullptr) + { + bool rewriteLocal = false; + std::vector stack; + stack.push_back(csep.filters()); + while (!stack.empty()) + { + execplan::ParseTree* node = stack.back(); + stack.pop_back(); + if (node == nullptr) + continue; + + auto* existsFilter = dynamic_cast(node->data()); + if (existsFilter) + { + if (matchRule(*existsFilter->sub())) + { + applyRule(*existsFilter->sub()); + rewriteLocal = true; + } + } + + if (node->right()) + stack.push_back(node->right()); + if (node->left()) + stack.push_back(node->left()); + } + if (rewriteLocal) + rewrite |= rewriteLocal; + } + if (matchRule(csep)) { applyRule(csep);