From 9c0eb8f7438411f349681bcecb5619ed4c8078b8 Mon Sep 17 00:00:00 2001 From: Xu Yihao Date: Thu, 17 Oct 2024 21:53:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E5=88=99=E7=BB=84=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/confWriter/action.yml | 12 ++--- conf/config.properties | 7 +-- .../optimizer/rules/ColumnPruningRule.java | 6 ++- .../rules/FilterConstantFoldingRule.java | 2 +- .../FilterPushDownAddSchemaPrefixRule.java | 1 + .../rules/FilterPushDownGroupByRule.java | 1 + .../FilterPushDownPathUnionJoinRule.java | 1 + .../FilterPushDownProjectReorderSortRule.java | 1 + .../rules/FilterPushDownRenameRule.java | 5 +- .../rules/FilterPushDownSelectRule.java | 5 +- .../rules/FilterPushDownSetOpRule.java | 1 + .../rules/FilterPushDownTransformRule.java | 1 + .../FilterPushIntoJoinConditionRule.java | 1 + .../rules/FilterPushOutJoinConditionRule.java | 5 +- .../rules/FragmentPruningByPatternRule.java | 2 +- .../rules/FunctionDistinctEliminateRule.java | 5 +- .../rules/InExistsDistinctEliminateRule.java | 2 +- .../RowTransformConstantFoldingRule.java | 5 +- .../iginx/logical/optimizer/rules/Rule.java | 28 ++++++++++ .../optimizer/rules/RuleCollection.java | 53 ++++++++++++------- .../iginx/iginx_pyclient/thrift/__init__.py | 18 ------- .../iginx_pyclient/thrift/rpc/IService.py | 18 ------- .../iginx_pyclient/thrift/rpc/__init__.py | 18 ------- .../iginx_pyclient/thrift/rpc/constants.py | 18 ------- .../iginx/iginx_pyclient/thrift/rpc/ttypes.py | 18 ------- .../integration/func/sql/SQLSessionIT.java | 26 ++++----- 26 files changed, 112 insertions(+), 148 deletions(-) diff --git a/.github/actions/confWriter/action.yml b/.github/actions/confWriter/action.yml index dfa7ff1e1f..7b10225d79 100644 --- a/.github/actions/confWriter/action.yml +++ b/.github/actions/confWriter/action.yml @@ -109,19 +109,13 @@ runs: run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo sed -i 's/enablePushDown=false/enablePushDown=true/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i 's/FilterPushDownAddSchemaPrefixRule=off,FilterPushDownAddSchemaPrefixRule=off/FilterPushDownAddSchemaPrefixRule=on,FilterPushDownAddSchemaPrefixRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i 's/FilterPushDownPathUnionJoinRule=off,FilterPushDownProjectReorderSortRule=off,FilterPushDownRenameRule=off,FilterPushDownSelectRule=off/FilterPushDownPathUnionJoinRule=on,FilterPushDownProjectReorderSortRule=on,FilterPushDownRenameRule=on,FilterPushDownSelectRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i 's/FilterPushDownSetOpRule=off,FilterPushDownTransformRule=off,FilterPushIntoJoinConditionRule=off,FilterPushOutJoinConditionRule=off,FilterPushDownGroupByRule=off/FilterPushDownSetOpRule=on,FilterPushDownTransformRule=on,FilterPushIntoJoinConditionRule=on,FilterPushOutJoinConditionRule=on,FilterPushDownGroupByRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties + sed -i 's/FilterPushDownRule=off/FilterPushDownRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties elif [ "$RUNNER_OS" == "Windows" ]; then sed -i 's/enablePushDown=false/enablePushDown=true/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i 's/FilterPushDownAddSchemaPrefixRule=off,FilterPushDownAddSchemaPrefixRule=off/FilterPushDownAddSchemaPrefixRule=on,FilterPushDownAddSchemaPrefixRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i 's/FilterPushDownPathUnionJoinRule=off,FilterPushDownProjectReorderSortRule=off,FilterPushDownRenameRule=off,FilterPushDownSelectRule=off/FilterPushDownPathUnionJoinRule=on,FilterPushDownProjectReorderSortRule=on,FilterPushDownRenameRule=on,FilterPushDownSelectRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i 's/FilterPushDownSetOpRule=off,FilterPushDownTransformRule=off,FilterPushIntoJoinConditionRule=off,FilterPushOutJoinConditionRule=off,FilterPushDownGroupByRule=off/FilterPushDownSetOpRule=on,FilterPushDownTransformRule=on,FilterPushIntoJoinConditionRule=on,FilterPushOutJoinConditionRule=on,FilterPushDownGroupByRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties + sed -i 's/FilterPushDownRule=off/FilterPushDownRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties elif [ "$RUNNER_OS" == "macOS" ]; then sudo sed -i '' 's/enablePushDown=false/enablePushDown=true/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i '' 's/FilterPushDownAddSchemaPrefixRule=off,FilterPushDownAddSchemaPrefixRule=off/FilterPushDownAddSchemaPrefixRule=on,FilterPushDownAddSchemaPrefixRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i '' 's/FilterPushDownPathUnionJoinRule=off,FilterPushDownProjectReorderSortRule=off,FilterPushDownRenameRule=off,FilterPushDownSelectRule=off/FilterPushDownPathUnionJoinRule=on,FilterPushDownProjectReorderSortRule=on,FilterPushDownRenameRule=on,FilterPushDownSelectRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties - sed -i '' 's/FilterPushDownSetOpRule=off,FilterPushDownTransformRule=off,FilterPushIntoJoinConditionRule=off,FilterPushOutJoinConditionRule=off,FilterPushDownGroupByRule=off/FilterPushDownSetOpRule=on,FilterPushDownTransformRule=on,FilterPushIntoJoinConditionRule=on,FilterPushOutJoinConditionRule=on,FilterPushDownGroupByRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties + sed -i '' 's/FilterPushDownRule=off/FilterPushDownRule=on/g' ${{ inputs.Root-Dir-Path }}/core/target/iginx-core-${VERSION}/conf/config.properties else echo "$RUNNER_OS is not supported" exit 1 diff --git a/conf/config.properties b/conf/config.properties index 2317db27f1..ecc595251c 100644 --- a/conf/config.properties +++ b/conf/config.properties @@ -66,11 +66,8 @@ maxCachedPhysicalTaskPerStorage=500 queryOptimizer=rbo # 优化器规则 -ruleBasedOptimizer=NotFilterRemoveRule=on,FragmentPruningByFilterRule=on,ColumnPruningRule=on,FragmentPruningByPatternRule=on,ConstantPropagationRule=on,FunctionDistinctEliminateRule=on,InExistsDistinctEliminateRule=on,\ - FilterConstantFoldingRule=on,RowTransformConstantFoldingRule=on,FilterPushDownAddSchemaPrefixRule=off,FilterPushDownAddSchemaPrefixRule=off,\ - FilterPushDownPathUnionJoinRule=off,FilterPushDownProjectReorderSortRule=off,FilterPushDownRenameRule=off,FilterPushDownSelectRule=off,\ - FilterPushDownSetOpRule=off,FilterPushDownTransformRule=off,FilterPushIntoJoinConditionRule=off,FilterPushOutJoinConditionRule=off,FilterPushDownGroupByRule=off,\ - JoinFactorizationRule=on,SetTransformPushDownPathUnionJoinRule=off +ruleBasedOptimizer=NotFilterRemoveRule=on,FragmentPruningByFilterRule=on,ColumnPruningRule=on,ConstantPropagationRule=on,DistinctEliminateRule=on,\ + ConstantFoldingRule=on,FilterPushDownRule=off,JoinFactorizationRule=on,SetTransformPushDownPathUnionJoinRule=off # ParallelFilter触发行数 parallelFilterThreshold=10000 diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/ColumnPruningRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/ColumnPruningRule.java index 0d01fac51c..a8833220af 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/ColumnPruningRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/ColumnPruningRule.java @@ -57,7 +57,11 @@ public ColumnPruningRule() { * Any */ // 匹配任意操作符,但由于策略是ONCE,所以只会匹配到树的顶端 - super("ColumnPruningRule", operand(AbstractOperator.class, any()), RuleStrategy.ONCE); + super( + "ColumnPruningRule", + "ColumnPruningRule", + operand(AbstractOperator.class, any()), + RuleStrategy.ONCE); } @Override diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterConstantFoldingRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterConstantFoldingRule.java index 9de5f1f110..40fd60e01e 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterConstantFoldingRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterConstantFoldingRule.java @@ -38,7 +38,7 @@ public FilterConstantFoldingRule() { * | * Any */ - super("FilterConstantFoldingRule", operand(Select.class, any())); + super("FilterConstantFoldingRule", "ConstantFoldingRule", operand(Select.class, any())); } @Override diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownAddSchemaPrefixRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownAddSchemaPrefixRule.java index baf1e6f60c..8ed8687e51 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownAddSchemaPrefixRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownAddSchemaPrefixRule.java @@ -38,6 +38,7 @@ public FilterPushDownAddSchemaPrefixRule() { */ super( "FilterPushDownAddSchemaPrefixRule", + "FilterPushDownRule", operand(Select.class, operand(AddSchemaPrefix.class, any()))); } diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownGroupByRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownGroupByRule.java index f30df3158b..cc0477144c 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownGroupByRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownGroupByRule.java @@ -45,6 +45,7 @@ public FilterPushDownGroupByRule() { */ super( "FilterPushDownGroupByRule", + "FilterPushDownRule", operand(Select.class, operand(AbstractUnaryOperator.class, any()))); } diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownPathUnionJoinRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownPathUnionJoinRule.java index 63b2fe4577..2a14b023d3 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownPathUnionJoinRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownPathUnionJoinRule.java @@ -58,6 +58,7 @@ public FilterPushDownPathUnionJoinRule() { */ super( "FilterPushDownPathUnionJoinRule", + "FilterPushDownRule", operand(Select.class, operand(AbstractBinaryOperator.class, any(), any()))); } diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownProjectReorderSortRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownProjectReorderSortRule.java index 10d8ab473e..9cf55a40f9 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownProjectReorderSortRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownProjectReorderSortRule.java @@ -42,6 +42,7 @@ public FilterPushDownProjectReorderSortRule() { */ super( "FilterPushDownProjectReorderSortRule", + "FilterPushDownRule", operand(Select.class, operand(AbstractUnaryOperator.class, any()))); } diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownRenameRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownRenameRule.java index 85b0398536..78cd4c4de4 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownRenameRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownRenameRule.java @@ -39,7 +39,10 @@ public FilterPushDownRenameRule() { * | * Rename */ - super("FilterPushDownRenameRule", operand(Select.class, operand(Rename.class, any()))); + super( + "FilterPushDownRenameRule", + "FilterPushDownRule", + operand(Select.class, operand(Rename.class, any()))); } @Override diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownSelectRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownSelectRule.java index 8c59575ee2..3b27f6c383 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownSelectRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownSelectRule.java @@ -33,7 +33,10 @@ public FilterPushDownSelectRule() { * | * Select */ - super("FilterPushDownSelectRule", operand(Select.class, operand(Select.class, any()))); + super( + "FilterPushDownSelectRule", + "FilterPushDownRule", + operand(Select.class, operand(Select.class, any()))); } @Override diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownSetOpRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownSetOpRule.java index 80f0e62abb..5d67c74250 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownSetOpRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownSetOpRule.java @@ -46,6 +46,7 @@ public FilterPushDownSetOpRule() { */ super( "FilterPushDownSetOpRule", + "FilterPushDownRule", operand(Select.class, operand(AbstractBinaryOperator.class, any(), any()))); } diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownTransformRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownTransformRule.java index a5768b65f7..c80392da6a 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownTransformRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushDownTransformRule.java @@ -44,6 +44,7 @@ public FilterPushDownTransformRule() { */ super( "FilterPushDownTransformRule", + "FilterPushDownRule", operand(Select.class, operand(AbstractUnaryOperator.class, any()))); } diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushIntoJoinConditionRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushIntoJoinConditionRule.java index 910d243b21..a316798ea6 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushIntoJoinConditionRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushIntoJoinConditionRule.java @@ -39,6 +39,7 @@ public FilterPushIntoJoinConditionRule() { */ super( "FilterPushIntoJoinConditionRule", + "FilterPushDownRule", operand(Select.class, operand(AbstractJoin.class, any(), any()))); } diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushOutJoinConditionRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushOutJoinConditionRule.java index f5b62f79c5..f511b7588c 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushOutJoinConditionRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FilterPushOutJoinConditionRule.java @@ -50,7 +50,10 @@ public FilterPushOutJoinConditionRule() { * / \ * any any */ - super("FilterPushOutJoinConditionRule", operand(AbstractJoin.class, any(), any())); + super( + "FilterPushOutJoinConditionRule", + "FilterPushDownRule", + operand(AbstractJoin.class, any(), any())); } @Override diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FragmentPruningByPatternRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FragmentPruningByPatternRule.java index ed428242ce..b110c99a59 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FragmentPruningByPatternRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FragmentPruningByPatternRule.java @@ -45,7 +45,7 @@ public FragmentPruningByPatternRule() { * Fragment */ // Fragment的检测在matches中进行 - super("FragmentPruningByPatternRule", operand(Project.class)); + super("FragmentPruningByPatternRule", "ColumnPruningRule", operand(Project.class)); } @Override diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FunctionDistinctEliminateRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FunctionDistinctEliminateRule.java index a5de437d5d..6215bb5bc4 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FunctionDistinctEliminateRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/FunctionDistinctEliminateRule.java @@ -42,7 +42,10 @@ public FunctionDistinctEliminateRule() { * | * Any */ - super("FunctionDistinctEliminateRule", operand(AbstractUnaryOperator.class, any())); + super( + "FunctionDistinctEliminateRule", + "DistinctEliminateRule", + operand(AbstractUnaryOperator.class, any())); } public boolean matches(RuleCall call) { diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/InExistsDistinctEliminateRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/InExistsDistinctEliminateRule.java index bf01bb503b..dfcc85b7b5 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/InExistsDistinctEliminateRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/InExistsDistinctEliminateRule.java @@ -43,7 +43,7 @@ public InExistsDistinctEliminateRule() { * | * Any */ - super("InExistsDistinctEliminateRule", operand(Distinct.class, any())); + super("InExistsDistinctEliminateRule", "DistinctEliminateRule", operand(Distinct.class, any())); } public boolean matches(RuleCall call) { diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/RowTransformConstantFoldingRule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/RowTransformConstantFoldingRule.java index 25b816c4c7..9339dac438 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/RowTransformConstantFoldingRule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/RowTransformConstantFoldingRule.java @@ -41,7 +41,10 @@ public RowTransformConstantFoldingRule() { * | * Any */ - super("RowTransformConstantFoldingRule", operand(RowTransform.class, any())); + super( + "RowTransformConstantFoldingRule", + "ConstantFoldingRule", + operand(RowTransform.class, any())); } @Override diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/Rule.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/Rule.java index 60537677a3..f1db29619a 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/Rule.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/Rule.java @@ -31,6 +31,8 @@ public abstract class Rule { private final String ruleName; + private final String ruleGroupName; + /** operand describes the local topology we want to match in this rule */ private final Operand operand; @@ -42,6 +44,10 @@ protected Rule(String ruleName, Operand operand) { this(ruleName, operand, DEFAULT_PRIORITY, DEFAULT_STRATEGY); } + protected Rule(String ruleName, String ruleGroupName, Operand operand) { + this(ruleName, ruleGroupName, operand, DEFAULT_PRIORITY, DEFAULT_STRATEGY); + } + protected Rule(String ruleName, Operand operand, long priority) { this(ruleName, operand, priority, DEFAULT_STRATEGY); } @@ -50,8 +56,26 @@ protected Rule(String ruleName, Operand operand, RuleStrategy strategy) { this(ruleName, operand, DEFAULT_PRIORITY, strategy); } + protected Rule(String ruleName, String ruleGroupName, Operand operand, RuleStrategy strategy) { + this(ruleName, ruleGroupName, operand, DEFAULT_PRIORITY, strategy); + } + protected Rule(String ruleName, Operand operand, long priority, RuleStrategy strategy) { this.ruleName = ruleName; + this.ruleGroupName = ruleName; + this.operand = operand; + this.priority = priority; + this.strategy = strategy; + } + + protected Rule( + String ruleName, + String ruleGroupName, + Operand operand, + long priority, + RuleStrategy strategy) { + this.ruleName = ruleName; + this.ruleGroupName = ruleGroupName; this.operand = operand; this.priority = priority; this.strategy = strategy; @@ -61,6 +85,10 @@ public String getRuleName() { return ruleName; } + public String getRuleGroupName() { + return ruleGroupName; + } + public Operand getOperand() { return operand; } diff --git a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/RuleCollection.java b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/RuleCollection.java index 4db5894c94..3f89d5f16a 100644 --- a/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/RuleCollection.java +++ b/optimizer/src/main/java/cn/edu/tsinghua/iginx/logical/optimizer/rules/RuleCollection.java @@ -62,7 +62,7 @@ private void setRulesByConfig() { Config config = configDescriptor.getConfig(); String[] ruleSettingList = config.getRuleBasedOptimizer().split(","); - Set banRules = new HashSet<>(rules.keySet()); + Set banRules = getAllGroup(); for (String ruleSetting : ruleSettingList) { String[] ruleInfo = ruleSetting.split("="); @@ -76,7 +76,15 @@ private void setRulesByConfig() { } } - banRulesByName(banRules); + banRulesGroupByName(banRules); + } + + private Set getAllGroup() { + Set group = new HashSet<>(); + for (Rule rule : rules.values()) { + group.add(rule.getRuleGroupName()); + } + return group; } private void addRule(Rule rule) { @@ -121,30 +129,35 @@ public boolean banRulesByName(Collection ruleNames) { return true; } - public boolean banRuleByName(String ruleName) { - if (!rules.containsKey(ruleName)) { - LOGGER.error("IGinX rule collection does not include rule: {}", ruleName); - return false; + public boolean banRulesGroupByName(Collection ruleGroupNames) { + for (String ruleGroupName : ruleGroupNames) { + banRulesGroup(ruleGroupName); } - bannedRules.put(ruleName, rules.get(ruleName)); return true; } - public boolean setRules(Map rulesChange) { - // Check whether any rule does not exist before setting it - // 先检查是否有不存在的规则,再进行设置 - for (String ruleName : rulesChange.keySet()) { - if (!rules.containsKey(ruleName)) { - LOGGER.error("IGinX rule collection does not include rule: {}", ruleName); - return false; + public void banRulesGroup(String ruleGroupName) { + for (Rule rule : rules.values()) { + if (rule.getRuleGroupName().equals(ruleGroupName)) { + banRules(rule); } } + } - for (String ruleName : rulesChange.keySet()) { - if (rulesChange.get(ruleName)) { - unbanRule(rules.get(ruleName)); + public void unbanRulesGroup(String ruleGroupName) { + for (Rule rule : rules.values()) { + if (rule.getRuleGroupName().equals(ruleGroupName)) { + unbanRule(rule); + } + } + } + + public boolean setRules(Map rulesChange) { + for (String ruleGroupName : rulesChange.keySet()) { + if (rulesChange.get(ruleGroupName)) { + unbanRulesGroup(ruleGroupName); } else { - banRules(rules.get(ruleName)); + banRulesGroup(ruleGroupName); } } @@ -153,8 +166,8 @@ public boolean setRules(Map rulesChange) { public Map getRulesInfo() { Map rulesInfo = new HashMap<>(); - for (String ruleName : rules.keySet()) { - rulesInfo.put(ruleName, !bannedRules.containsKey(ruleName)); + for (Rule rule : rules.values()) { + rulesInfo.put(rule.getRuleGroupName(), !bannedRules.containsKey(rule.getRuleName())); } return rulesInfo; } diff --git a/session_py/iginx/iginx_pyclient/thrift/__init__.py b/session_py/iginx/iginx_pyclient/thrift/__init__.py index e2e715db32..e69de29bb2 100644 --- a/session_py/iginx/iginx_pyclient/thrift/__init__.py +++ b/session_py/iginx/iginx_pyclient/thrift/__init__.py @@ -1,18 +0,0 @@ -# -# IGinX - the polystore system with high performance -# Copyright (C) Tsinghua University -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - diff --git a/session_py/iginx/iginx_pyclient/thrift/rpc/IService.py b/session_py/iginx/iginx_pyclient/thrift/rpc/IService.py index c3f3a4cccc..64ef332cff 100644 --- a/session_py/iginx/iginx_pyclient/thrift/rpc/IService.py +++ b/session_py/iginx/iginx_pyclient/thrift/rpc/IService.py @@ -1,21 +1,3 @@ -# -# IGinX - the polystore system with high performance -# Copyright (C) Tsinghua University -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - # # Autogenerated by Thrift Compiler (0.16.0) # diff --git a/session_py/iginx/iginx_pyclient/thrift/rpc/__init__.py b/session_py/iginx/iginx_pyclient/thrift/rpc/__init__.py index 323d5c2f12..cc24d07ca3 100644 --- a/session_py/iginx/iginx_pyclient/thrift/rpc/__init__.py +++ b/session_py/iginx/iginx_pyclient/thrift/rpc/__init__.py @@ -1,19 +1 @@ -# -# IGinX - the polystore system with high performance -# Copyright (C) Tsinghua University -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - __all__ = ['ttypes', 'constants', 'IService'] diff --git a/session_py/iginx/iginx_pyclient/thrift/rpc/constants.py b/session_py/iginx/iginx_pyclient/thrift/rpc/constants.py index db308b8bb8..82c674e052 100644 --- a/session_py/iginx/iginx_pyclient/thrift/rpc/constants.py +++ b/session_py/iginx/iginx_pyclient/thrift/rpc/constants.py @@ -1,21 +1,3 @@ -# -# IGinX - the polystore system with high performance -# Copyright (C) Tsinghua University -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - # # Autogenerated by Thrift Compiler (0.16.0) # diff --git a/session_py/iginx/iginx_pyclient/thrift/rpc/ttypes.py b/session_py/iginx/iginx_pyclient/thrift/rpc/ttypes.py index 90a3639d80..fbf2751f28 100644 --- a/session_py/iginx/iginx_pyclient/thrift/rpc/ttypes.py +++ b/session_py/iginx/iginx_pyclient/thrift/rpc/ttypes.py @@ -1,21 +1,3 @@ -# -# IGinX - the polystore system with high performance -# Copyright (C) Tsinghua University -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - # # Autogenerated by Thrift Compiler (0.16.0) # diff --git a/test/src/test/java/cn/edu/tsinghua/iginx/integration/func/sql/SQLSessionIT.java b/test/src/test/java/cn/edu/tsinghua/iginx/integration/func/sql/SQLSessionIT.java index 7bff1fb74e..4bf05234e6 100644 --- a/test/src/test/java/cn/edu/tsinghua/iginx/integration/func/sql/SQLSessionIT.java +++ b/test/src/test/java/cn/edu/tsinghua/iginx/integration/func/sql/SQLSessionIT.java @@ -103,7 +103,7 @@ public SQLSessionIT() { dbConf.getEnumValue(DBConfType.isSupportSpecialCharacterPath); String rules = executor.execute("SHOW RULES;"); - this.isFilterPushDown = rules.contains("FilterPushOutJoinConditionRule| ON|"); + this.isFilterPushDown = rules.contains("FilterPushDownRule| ON|"); } @BeforeClass @@ -6925,7 +6925,7 @@ public void testFilterPushDownExplain() { "INSERT INTO us.d3(key, s1) VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9);"; executor.execute(insert); - String closeRule = "SET RULES FragmentPruningByPatternRule=OFF, ColumnPruningRule=OFF;"; + String closeRule = "SET RULES ColumnPruningRule=OFF;"; executor.execute(closeRule); StringBuilder builder = new StringBuilder(); @@ -7315,7 +7315,7 @@ public void testFilterPushDownExplain() { assertEquals(res, expectRes); } - String openRule = "SET RULES FragmentPruningByPatternRule=ON, ColumnPruningRule=ON;"; + String openRule = "SET RULES ColumnPruningRule=ON;"; executor.execute(openRule); } @@ -7339,7 +7339,7 @@ public void testFilterFragmentOptimizer() { return; } - String closeRule = "SET RULES FragmentPruningByPatternRule=OFF, ColumnPruningRule=OFF;"; + String closeRule = "SET RULES ColumnPruningRule=OFF;"; executor.execute(closeRule); String insert = @@ -7535,8 +7535,7 @@ public void testFilterFragmentOptimizer() { executor.concurrentExecuteAndCompare(statementsAndExpectResNoChange); // 开启filter_fragment - statement = - "SET RULES FragmentPruningByFilterRule=ON, FragmentPruningByPatternRule=ON, ColumnPruningRule=ON;"; + statement = "SET RULES FragmentPruningByFilterRule=ON, ColumnPruningRule=ON;"; executor.execute(statement); } @@ -7694,7 +7693,7 @@ public void testColumnPruningAndFragmentPruning() { insert.append(";"); executor.execute(insert.toString()); - String closeRule = "SET RULES ColumnPruningRule=OFF, FragmentPruningByPatternRule=OFF;"; + String closeRule = "SET RULES ColumnPruningRule=OFF;"; executor.execute(closeRule); String sql1 = "explain SELECT us.d1.s1 FROM (SELECT * FROM us.d1);"; @@ -7814,7 +7813,7 @@ public void testColumnPruningAndFragmentPruning() { + "Total line number = 11\n"; executor.executeAndCompare(sql6, expect6); - String openRule = "SET RULES ColumnPruningRule=ON, FragmentPruningByPatternRule=ON;"; + String openRule = "SET RULES ColumnPruningRule=ON;"; executor.execute(openRule); expect1 = @@ -7978,9 +7977,8 @@ public void testConstantPropagation() { /** 对常量折叠进行测试,因为RowTransform常量折叠和Filter常量折叠使用的代码都是公共的,所以这里只测试更好对比结果的RowTransform常量折叠 */ @Test public void testConstantFolding() { - String openRule = "SET RULES RowTransformConstantFoldingRule=on, FilterConstantFoldingRule=on;"; - String closeRule = - "SET RULES RowTransformConstantFoldingRule=off, FilterConstantFoldingRule=off;"; + String openRule = "SET RULES ConstantFoldingRule=on;"; + String closeRule = "SET RULES ConstantFoldingRule=off;"; executor.execute(openRule); @@ -8188,10 +8186,8 @@ public void testDistinctEliminate() { insert.append(";"); executor.execute(insert.toString()); - String openRule = - "SET RULES FunctionDistinctEliminateRule=on, InExistsDistinctEliminateRule=on;"; - String closeRule = - "SET RULES FunctionDistinctEliminateRule=off, InExistsDistinctEliminateRule=off;"; + String openRule = "SET RULES DistinctEliminateRule=on;"; + String closeRule = "SET RULES DistinctEliminateRule=off;"; String closeResult = null; // 测试InExistsDistinctEliminateRule