This is an automated email from the ASF dual-hosted git repository. liyang pushed a commit to branch kylin5 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 553219830193ec43f7b6d68fe626b04456633120 Author: Pengfei Zhan <dethr...@gmail.com> AuthorDate: Thu Jun 29 14:39:05 2023 +0800 KYLIN-5743 optimization of SumExpression prevents ProjectJoinTransposeRule to hit AggIndex --- .../kylin/query/engine/SumExprPlannerTest.java | 11 ++++++++ .../kylin/query/engine/SumExprPlannerTest.xml | 32 ++++++++++++++++++++++ .../apache/kylin/query/engine/PlannerFactory.java | 14 ++++++---- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/kylin-it/src/test/java/org/apache/kylin/query/engine/SumExprPlannerTest.java b/src/kylin-it/src/test/java/org/apache/kylin/query/engine/SumExprPlannerTest.java index 7e00b6cfb2..9692ec4f4e 100644 --- a/src/kylin-it/src/test/java/org/apache/kylin/query/engine/SumExprPlannerTest.java +++ b/src/kylin-it/src/test/java/org/apache/kylin/query/engine/SumExprPlannerTest.java @@ -199,6 +199,17 @@ public class SumExprPlannerTest extends CalciteRuleTestBase { KapJoinRule.INSTANCE, KapProjectRule.INSTANCE)); } + @Test + public void testSumExpressionSkipProjectJoinTransposeRule() { + String sql = "select sum( case when LO_COMMITDATE = '20230501' then LO_DISCOUNT end )\n" // + + "from (\n" // + + " select LO_COMMITDATE, LO_DISCOUNT, P_LINEORDER.LO_ORDERDATE from ssb.P_LINEORDER\n" // + + " ) a\n" // + + "where LO_COMMITDATE = ( select max(LO_COMMITDATE) from ssb.P_LINEORDER )"; + openSumCaseWhen(); + checkSQL("ssb", sql, null, null); + } + @Test public void testAggPushdownWithCrossJoin1() { diff --git a/src/kylin-it/src/test/resources/org/apache/kylin/query/engine/SumExprPlannerTest.xml b/src/kylin-it/src/test/resources/org/apache/kylin/query/engine/SumExprPlannerTest.xml index e7b560f9a5..0796314ef7 100644 --- a/src/kylin-it/src/test/resources/org/apache/kylin/query/engine/SumExprPlannerTest.xml +++ b/src/kylin-it/src/test/resources/org/apache/kylin/query/engine/SumExprPlannerTest.xml @@ -1377,6 +1377,38 @@ KapOLAPToEnumerableConverter ]]> </Resource> </TestCase> + <TestCase name="testSumExpressionSkipProjectJoinTransposeRule"> + <Resource name="planBefore"> + <![CDATA[ +KapOLAPToEnumerableConverter + KapAggregateRel(group-set=[[]], groups=[null], EXPR$0=[SUM($0)], ctx=[]) + KapProjectRel($f0=[CASE(=($0, 20230501), $1, null)], ctx=[]) + KapJoinRel(condition=[=($0, $3)], joinType=[inner], ctx=[]) + KapProjectRel(LO_COMMITDATE=[$15], LO_DISCOUNT=[$11], LO_ORDERDATE=[$5], ctx=[]) + KapTableScan(table=[[SSB, P_LINEORDER]], ctx=[], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]]) + KapAggregateRel(group-set=[[]], groups=[null], EXPR$0=[MAX($0)], ctx=[]) + KapProjectRel(LO_COMMITDATE=[$15], ctx=[]) + KapTableScan(table=[[SSB, P_LINEORDER]], ctx=[], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]]) +]]> + </Resource> + <Resource name="planAfter"> + <![CDATA[ +KapOLAPToEnumerableConverter + KapAggregateRel(group-set=[[]], groups=[null], AGG$0=[SUM($0)], ctx=[]) + KapProjectRel($f0=[CASE(=($0, 20230501), $1, null)], ctx=[]) + KapAggregateRel(group-set=[[0]], groups=[null], TOP_AGG$0=[SUM($1)], TOP_AGG$1=[SUM($2)], ctx=[]) + KapProjectRel(LO_COMMITDATE=[$0], SUM_CASE$0$0=[$1], $f2=[*(0, $2)], ctx=[]) + KapAggregateRel(group-set=[[0]], groups=[null], SUM_CASE$0$0=[SUM($1)], SUM_CONST$1=[COUNT()], ctx=[]) + KapProjectRel(LO_COMMITDATE=[$0], LO_DISCOUNT=[$1], ctx=[]) + KapJoinRel(condition=[=($0, $3)], joinType=[inner], ctx=[]) + KapProjectRel(LO_COMMITDATE=[$15], LO_DISCOUNT=[$11], LO_ORDERDATE=[$5], ctx=[]) + KapTableScan(table=[[SSB, P_LINEORDER]], ctx=[], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]]) + KapAggregateRel(group-set=[[]], groups=[null], EXPR$0=[MAX($0)], ctx=[]) + KapProjectRel(LO_COMMITDATE=[$15], ctx=[]) + KapTableScan(table=[[SSB, P_LINEORDER]], ctx=[], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]]) +]]> + </Resource> + </TestCase> <TestCase name="testAggPushdownWithCrossJoin2"> <Resource name="planBefore"> diff --git a/src/query/src/main/java/org/apache/kylin/query/engine/PlannerFactory.java b/src/query/src/main/java/org/apache/kylin/query/engine/PlannerFactory.java index 8616d6e14a..bac1fbf81b 100644 --- a/src/query/src/main/java/org/apache/kylin/query/engine/PlannerFactory.java +++ b/src/query/src/main/java/org/apache/kylin/query/engine/PlannerFactory.java @@ -65,10 +65,13 @@ import org.apache.commons.lang3.StringUtils; import org.apache.kylin.common.KapConfig; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.debug.BackdoorToggles; +import org.apache.kylin.guava30.shaded.common.base.Function; +import org.apache.kylin.guava30.shaded.common.collect.ImmutableList; +import org.apache.kylin.query.engine.meta.PlannerContext; +import org.apache.kylin.query.relnode.OLAPContext; + import io.kyligence.kap.query.optrule.AggregateMultipleExpandRule; import io.kyligence.kap.query.optrule.AggregateProjectReduceRule; -import org.apache.kylin.query.relnode.OLAPContext; -import org.apache.kylin.query.engine.meta.PlannerContext; import io.kyligence.kap.query.optrule.CorrReduceFunctionRule; import io.kyligence.kap.query.optrule.KAPValuesRule; import io.kyligence.kap.query.optrule.KapAggregateReduceFunctionsRule; @@ -89,9 +92,6 @@ import io.kyligence.kap.query.optrule.KapWindowRule; import io.kyligence.kap.query.optrule.RightJoinToLeftJoinRule; import io.kyligence.kap.query.optrule.SumConstantConvertRule; -import org.apache.kylin.guava30.shaded.common.base.Function; -import org.apache.kylin.guava30.shaded.common.collect.ImmutableList; - /** * factory that create optimizers and register opt rules * TODO sort and register only necessary rules @@ -240,7 +240,9 @@ public class PlannerFactory { // UnionMergeRule may slow volcano planner optimization on large number of union clause planner.removeRule(UnionMergeRule.INSTANCE); - planner.addRule(KapProjectJoinTransposeRule.INSTANCE); + if (!kylinConfig.isConvertSumExpressionEnabled()) { + planner.addRule(KapProjectJoinTransposeRule.INSTANCE); + } planner.removeRule(ProjectRemoveRule.INSTANCE); // skip corr expandsion during model suggestion