englefly commented on code in PR #27378: URL: https://github.com/apache/doris/pull/27378#discussion_r1406971747
########## fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java: ########## @@ -15,61 +15,65 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.processor.pre; +package org.apache.doris.nereids.rules.analysis; import org.apache.doris.analysis.SetVar; import org.apache.doris.analysis.StringLiteral; +import org.apache.doris.common.DdlException; +import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.StatementContext; import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.hint.Hint; import org.apache.doris.nereids.hint.LeadingHint; -import org.apache.doris.nereids.jobs.JobContext; +import org.apache.doris.nereids.hint.OrderedHint; import org.apache.doris.nereids.properties.SelectHint; import org.apache.doris.nereids.properties.SelectHintLeading; import org.apache.doris.nereids.properties.SelectHintSetVar; +import org.apache.doris.nereids.rules.Rule; +import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; import org.apache.doris.nereids.trees.plans.Plan; -import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalSelectHint; -import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.SessionVariable; import org.apache.doris.qe.VariableMgr; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import java.util.Map; import java.util.Map.Entry; import java.util.Optional; /** - * eliminate set var hint, and set var to session variables. + * eliminate logical select hint and set then to cascade context Review Comment: "then"->"them" ########## fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java: ########## @@ -15,61 +15,65 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.processor.pre; +package org.apache.doris.nereids.rules.analysis; import org.apache.doris.analysis.SetVar; import org.apache.doris.analysis.StringLiteral; +import org.apache.doris.common.DdlException; +import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.StatementContext; import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.hint.Hint; import org.apache.doris.nereids.hint.LeadingHint; -import org.apache.doris.nereids.jobs.JobContext; +import org.apache.doris.nereids.hint.OrderedHint; import org.apache.doris.nereids.properties.SelectHint; import org.apache.doris.nereids.properties.SelectHintLeading; import org.apache.doris.nereids.properties.SelectHintSetVar; +import org.apache.doris.nereids.rules.Rule; +import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; import org.apache.doris.nereids.trees.plans.Plan; -import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalSelectHint; -import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.SessionVariable; import org.apache.doris.qe.VariableMgr; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import java.util.Map; import java.util.Map.Entry; import java.util.Optional; /** - * eliminate set var hint, and set var to session variables. + * eliminate logical select hint and set then to cascade context */ -public class EliminateLogicalSelectHint extends PlanPreprocessor implements CustomRewriter { - private Logger logger = LoggerFactory.getLogger(getClass()); - - @Override - public Plan rewriteRoot(Plan plan, JobContext jobContext) { - return plan.accept(this, jobContext.getCascadesContext().getStatementContext()); - } - +public class EliminateLogicalSelectHint extends OneRewriteRuleFactory { @Override - public LogicalPlan visitLogicalSelectHint( - LogicalSelectHint<? extends Plan> selectHintPlan, - StatementContext context) { - for (Entry<String, SelectHint> hint : selectHintPlan.getHints().entrySet()) { - String hintName = hint.getKey(); - if (hintName.equalsIgnoreCase("SET_VAR")) { - setVar((SelectHintSetVar) hint.getValue(), context); - } else if (hintName.equalsIgnoreCase("ORDERED")) { - ConnectContext.get().getSessionVariable().setDisableJoinReorder(true); - } else if (hintName.equalsIgnoreCase("LEADING")) { - extractLeading((SelectHintLeading) hint.getValue(), context); - } else { - logger.warn("Can not process select hint '{}' and skip it", hint.getKey()); + public Rule build() { + return logicalSelectHint().thenApply(ctx -> { + LogicalSelectHint<Plan> selectHintPlan = ctx.root; + for (Entry<String, SelectHint> hint : selectHintPlan.getHints().entrySet()) { + String hintName = hint.getKey(); + if (hintName.equalsIgnoreCase("SET_VAR")) { + setVar((SelectHintSetVar) hint.getValue(), ctx.statementContext); + } else if (hintName.equalsIgnoreCase("ORDERED")) { + try { + ctx.cascadesContext.getConnectContext().getSessionVariable() + .disableNereidsJoinReorderOnce(); + } catch (DdlException e) { + throw new RuntimeException(e); + } + OrderedHint ordered = new OrderedHint("Ordered"); + ordered.setStatus(Hint.HintStatus.SUCCESS); + ctx.cascadesContext.getHintMap().put("Ordered", ordered); + ctx.statementContext.addHint(ordered); + } else if (hintName.equalsIgnoreCase("LEADING")) { + extractLeading((SelectHintLeading) hint.getValue(), ctx.cascadesContext, + ctx.statementContext, selectHintPlan.getHints()); + } else { + // logger.warn("Can not process select hint '{}' and skip it", hint.getKey()); Review Comment: it is better to open this comments -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org