minor, restore OLAPToEnumerableConverter to original
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/bd048b96 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/bd048b96 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/bd048b96 Branch: refs/heads/sync Commit: bd048b96971ed92e5e5dc1cc05173bd678ae3c24 Parents: 91ed19b Author: Roger Shi <rogershijich...@hotmail.com> Authored: Wed Jan 3 22:21:28 2018 +0800 Committer: Li Yang <liy...@apache.org> Committed: Fri Jan 26 17:30:46 2018 +0800 ---------------------------------------------------------------------- .../apache/calcite/plan/OLAPRelMdRowCount.java | 174 ---------------- .../calcite/plan/OLAPRelMetadataProvider.java | 39 ---- .../org/apache/calcite/plan/RelOptCluster.java | 199 ------------------- .../src/test/resources/query/sql/query110.sql | 58 ++++++ .../relnode/OLAPToEnumerableConverter.java | 2 +- 5 files changed, 59 insertions(+), 413 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/bd048b96/atopcalcite/src/main/java/org/apache/calcite/plan/OLAPRelMdRowCount.java ---------------------------------------------------------------------- diff --git a/atopcalcite/src/main/java/org/apache/calcite/plan/OLAPRelMdRowCount.java b/atopcalcite/src/main/java/org/apache/calcite/plan/OLAPRelMdRowCount.java deleted file mode 100644 index 751561f..0000000 --- a/atopcalcite/src/main/java/org/apache/calcite/plan/OLAPRelMdRowCount.java +++ /dev/null @@ -1,174 +0,0 @@ -package org.apache.calcite.plan; - -import org.apache.calcite.adapter.enumerable.EnumerableLimit; -import org.apache.calcite.plan.volcano.RelSubset; -import org.apache.calcite.rel.RelNode; -import org.apache.calcite.rel.SingleRel; -import org.apache.calcite.rel.core.Aggregate; -import org.apache.calcite.rel.core.Calc; -import org.apache.calcite.rel.core.Filter; -import org.apache.calcite.rel.core.Intersect; -import org.apache.calcite.rel.core.Join; -import org.apache.calcite.rel.core.Minus; -import org.apache.calcite.rel.core.Project; -import org.apache.calcite.rel.core.SemiJoin; -import org.apache.calcite.rel.core.Sort; -import org.apache.calcite.rel.core.TableScan; -import org.apache.calcite.rel.core.Union; -import org.apache.calcite.rel.core.Values; -import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider; -import org.apache.calcite.rel.metadata.RelMdRowCount; -import org.apache.calcite.rel.metadata.RelMetadataProvider; -import org.apache.calcite.rel.metadata.RelMetadataQuery; -import org.apache.calcite.util.BuiltInMethod; - -public class OLAPRelMdRowCount extends RelMdRowCount { - public static final RelMetadataProvider SOURCE = ReflectiveRelMetadataProvider - .reflectiveSource(BuiltInMethod.ROW_COUNT.method, new OLAPRelMdRowCount()); - - //avoid case like sql/query60.sql, which will generate plan: - /* - EnumerableLimit(fetch=[3]) - OLAPToEnumerableConverter - OLAPAggregateRel(group=[{0}], SUM_PRICE=[SUM($1)], CNT_1=[COUNT()], TOTAL_ITEMS=[SUM($2)]) - */ - private boolean shouldIntercept(RelNode rel) { - for (RelNode input : rel.getInputs()) { - if (input instanceof RelSubset) { - RelSubset relSubset = (RelSubset) input; - if (relSubset.getBest() != null - && relSubset.getBest().getClass().getCanonicalName().endsWith("OLAPToEnumerableConverter")) { - return true; - } - } - } - return false; - } - - @Override - public Double getRowCount(RelNode rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(RelSubset subset, RelMetadataQuery mq) { - if (shouldIntercept(subset)) - return 1E10; - - return super.getRowCount(subset, mq); - } - - @Override - public Double getRowCount(Union rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Intersect rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Minus rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Filter rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Calc rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Project rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Sort rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(EnumerableLimit rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(SingleRel rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Join rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(SemiJoin rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Aggregate rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(TableScan rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } - - @Override - public Double getRowCount(Values rel, RelMetadataQuery mq) { - if (shouldIntercept(rel)) - return 1E10; - - return super.getRowCount(rel, mq); - } -} http://git-wip-us.apache.org/repos/asf/kylin/blob/bd048b96/atopcalcite/src/main/java/org/apache/calcite/plan/OLAPRelMetadataProvider.java ---------------------------------------------------------------------- diff --git a/atopcalcite/src/main/java/org/apache/calcite/plan/OLAPRelMetadataProvider.java b/atopcalcite/src/main/java/org/apache/calcite/plan/OLAPRelMetadataProvider.java deleted file mode 100644 index ad944db..0000000 --- a/atopcalcite/src/main/java/org/apache/calcite/plan/OLAPRelMetadataProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.apache.calcite.plan; - -import org.apache.calcite.rel.metadata.ChainedRelMetadataProvider; -import org.apache.calcite.rel.metadata.RelMdAllPredicates; -import org.apache.calcite.rel.metadata.RelMdCollation; -import org.apache.calcite.rel.metadata.RelMdColumnOrigins; -import org.apache.calcite.rel.metadata.RelMdColumnUniqueness; -import org.apache.calcite.rel.metadata.RelMdDistinctRowCount; -import org.apache.calcite.rel.metadata.RelMdDistribution; -import org.apache.calcite.rel.metadata.RelMdExplainVisibility; -import org.apache.calcite.rel.metadata.RelMdExpressionLineage; -import org.apache.calcite.rel.metadata.RelMdMaxRowCount; -import org.apache.calcite.rel.metadata.RelMdMemory; -import org.apache.calcite.rel.metadata.RelMdMinRowCount; -import org.apache.calcite.rel.metadata.RelMdNodeTypes; -import org.apache.calcite.rel.metadata.RelMdParallelism; -import org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows; -import org.apache.calcite.rel.metadata.RelMdPopulationSize; -import org.apache.calcite.rel.metadata.RelMdPredicates; -import org.apache.calcite.rel.metadata.RelMdSelectivity; -import org.apache.calcite.rel.metadata.RelMdSize; -import org.apache.calcite.rel.metadata.RelMdTableReferences; -import org.apache.calcite.rel.metadata.RelMdUniqueKeys; - -import com.google.common.collect.ImmutableList; - -public class OLAPRelMetadataProvider extends ChainedRelMetadataProvider { - public static final OLAPRelMetadataProvider INSTANCE = new OLAPRelMetadataProvider(); - - public OLAPRelMetadataProvider() { - super(ImmutableList.of(RelMdPercentageOriginalRows.SOURCE, RelMdColumnOrigins.SOURCE, - RelMdExpressionLineage.SOURCE, RelMdTableReferences.SOURCE, RelMdNodeTypes.SOURCE, - OLAPRelMdRowCount.SOURCE, RelMdMaxRowCount.SOURCE, RelMdMinRowCount.SOURCE, RelMdUniqueKeys.SOURCE, - RelMdColumnUniqueness.SOURCE, RelMdPopulationSize.SOURCE, RelMdSize.SOURCE, RelMdParallelism.SOURCE, - RelMdDistribution.SOURCE, RelMdMemory.SOURCE, RelMdDistinctRowCount.SOURCE, RelMdSelectivity.SOURCE, - RelMdExplainVisibility.SOURCE, RelMdPredicates.SOURCE, RelMdAllPredicates.SOURCE, - RelMdCollation.SOURCE)); - } -} http://git-wip-us.apache.org/repos/asf/kylin/blob/bd048b96/atopcalcite/src/main/java/org/apache/calcite/plan/RelOptCluster.java ---------------------------------------------------------------------- diff --git a/atopcalcite/src/main/java/org/apache/calcite/plan/RelOptCluster.java b/atopcalcite/src/main/java/org/apache/calcite/plan/RelOptCluster.java deleted file mode 100644 index 62a3ef5..0000000 --- a/atopcalcite/src/main/java/org/apache/calcite/plan/RelOptCluster.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to you under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.calcite.plan; - -import org.apache.calcite.rel.RelNode; -import org.apache.calcite.rel.core.CorrelationId; -import org.apache.calcite.rel.metadata.DefaultRelMetadataProvider; -import org.apache.calcite.rel.metadata.MetadataFactory; -import org.apache.calcite.rel.metadata.MetadataFactoryImpl; -import org.apache.calcite.rel.metadata.RelMetadataProvider; -import org.apache.calcite.rel.metadata.RelMetadataQuery; -import org.apache.calcite.rel.type.RelDataTypeFactory; -import org.apache.calcite.rex.RexBuilder; -import org.apache.calcite.rex.RexNode; - -import com.google.common.base.Preconditions; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -/* - * OVERRIDE POINT: - * - grep OLAPRelMetadataProvider(); - */ -/** - * An environment for related relational expressions during the - * optimization of a query. - */ -public class RelOptCluster { - //~ Instance fields -------------------------------------------------------- - - private final RelDataTypeFactory typeFactory; - private final RelOptPlanner planner; - private final AtomicInteger nextCorrel; - private final Map<String, RelNode> mapCorrelToRel; - private RexNode originalExpression; - private final RexBuilder rexBuilder; - private RelMetadataProvider metadataProvider; - private MetadataFactory metadataFactory; - private final RelTraitSet emptyTraitSet; - private RelMetadataQuery mq; - - //~ Constructors ----------------------------------------------------------- - - /** - * Creates a cluster. - */ - @Deprecated // to be removed before 2.0 - RelOptCluster( - RelOptQuery query, - RelOptPlanner planner, - RelDataTypeFactory typeFactory, - RexBuilder rexBuilder) { - this(planner, typeFactory, rexBuilder, query.nextCorrel, - query.mapCorrelToRel); - } - - /** - * Creates a cluster. - * - * <p>For use only from {@link #create} and {@link RelOptQuery}. - */ - RelOptCluster(RelOptPlanner planner, RelDataTypeFactory typeFactory, - RexBuilder rexBuilder, AtomicInteger nextCorrel, - Map<String, RelNode> mapCorrelToRel) { - this.nextCorrel = nextCorrel; - this.mapCorrelToRel = mapCorrelToRel; - this.planner = Preconditions.checkNotNull(planner); - this.typeFactory = Preconditions.checkNotNull(typeFactory); - this.rexBuilder = rexBuilder; - this.originalExpression = rexBuilder.makeLiteral("?"); - - // set up a default rel metadata provider, - // giving the planner first crack at everything - setMetadataProvider(OLAPRelMetadataProvider.INSTANCE); - this.emptyTraitSet = planner.emptyTraitSet(); - assert emptyTraitSet.size() == planner.getRelTraitDefs().size(); - } - - /** Creates a cluster. */ - public static RelOptCluster create(RelOptPlanner planner, - RexBuilder rexBuilder) { - return new RelOptCluster(planner, rexBuilder.getTypeFactory(), - rexBuilder, new AtomicInteger(0), new HashMap<String, RelNode>()); - } - - //~ Methods ---------------------------------------------------------------- - - @Deprecated // to be removed before 2.0 - public RelOptQuery getQuery() { - return new RelOptQuery(planner, nextCorrel, mapCorrelToRel); - } - - @Deprecated // to be removed before 2.0 - public RexNode getOriginalExpression() { - return originalExpression; - } - - @Deprecated // to be removed before 2.0 - public void setOriginalExpression(RexNode originalExpression) { - this.originalExpression = originalExpression; - } - - public RelOptPlanner getPlanner() { - return planner; - } - - public RelDataTypeFactory getTypeFactory() { - return typeFactory; - } - - public RexBuilder getRexBuilder() { - return rexBuilder; - } - - public RelMetadataProvider getMetadataProvider() { - return metadataProvider; - } - - /** - * Overrides the default metadata provider for this cluster. - * - * @param metadataProvider custom provider - */ - public void setMetadataProvider(RelMetadataProvider metadataProvider) { - this.metadataProvider = metadataProvider; - this.metadataFactory = new MetadataFactoryImpl(metadataProvider); - } - - public MetadataFactory getMetadataFactory() { - return metadataFactory; - } - - /** Returns the current RelMetadataQuery. - * - * <p>This method might be changed or moved in future. - * If you have a {@link RelOptRuleCall} available, - * for example if you are in a {@link RelOptRule#onMatch(RelOptRuleCall)} - * method, then use {@link RelOptRuleCall#getMetadataQuery()} instead. */ - public RelMetadataQuery getMetadataQuery() { - if (mq == null) { - mq = RelMetadataQuery.instance(); - } - return mq; - } - - /** - * Should be called whenever the current {@link RelMetadataQuery} becomes - * invalid. Typically invoked from {@link RelOptRuleCall#transformTo}. - */ - public void invalidateMetadataQuery() { - mq = null; - } - - /** - * Constructs a new id for a correlating variable. It is unique within the - * whole query. - */ - public CorrelationId createCorrel() { - return new CorrelationId(nextCorrel.getAndIncrement()); - } - - /** Returns the default trait set for this cluster. */ - public RelTraitSet traitSet() { - return emptyTraitSet; - } - - /** @deprecated For {@code traitSetOf(t1, t2)}, - * use {@link #traitSet}().replace(t1).replace(t2). */ - @Deprecated // to be removed before 2.0 - public RelTraitSet traitSetOf(RelTrait... traits) { - RelTraitSet traitSet = emptyTraitSet; - for (RelTrait trait : traits) { - traitSet = traitSet.replace(trait); - } - return traitSet; - } - - public RelTraitSet traitSetOf(RelTrait trait) { - return emptyTraitSet.replace(trait); - } -} - -// End RelOptCluster.java http://git-wip-us.apache.org/repos/asf/kylin/blob/bd048b96/kylin-it/src/test/resources/query/sql/query110.sql ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql/query110.sql b/kylin-it/src/test/resources/query/sql/query110.sql new file mode 100644 index 0000000..07cd3b2 --- /dev/null +++ b/kylin-it/src/test/resources/query/sql/query110.sql @@ -0,0 +1,58 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +SELECT TEST_KYLIN_FACT.CAL_DT as TEST_KYLIN_FACT_CAL_DT, + TEST_KYLIN_FACT.ORDER_ID as TEST_KYLIN_FACT_ORDER_ID, + TEST_ORDER.TEST_DATE_ENC as TEST_ORDER_TEST_DATE_ENC, + TEST_ORDER.TEST_TIME_ENC as TEST_ORDER_TEST_TIME_ENC, + TEST_KYLIN_FACT.LEAF_CATEG_ID as TEST_KYLIN_FACT_LEAF_CATEG_ID, + TEST_KYLIN_FACT.LSTG_SITE_ID as TEST_KYLIN_FACT_LSTG_SITE_ID, + TEST_CATEGORY_GROUPINGS.META_CATEG_NAME as TEST_CATEGORY_GROUPINGS_META_CATEG_NAME, + TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME as TEST_CATEGORY_GROUPINGS_CATEG_LVL2_NAME, + TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME as TEST_CATEGORY_GROUPINGS_CATEG_LVL3_NAME, + TEST_KYLIN_FACT.LSTG_FORMAT_NAME as TEST_KYLIN_FACT_LSTG_FORMAT_NAME, + TEST_KYLIN_FACT.SLR_SEGMENT_CD as TEST_KYLIN_FACT_SLR_SEGMENT_CD, + TEST_KYLIN_FACT.SELLER_ID as TEST_KYLIN_FACT_SELLER_ID, + SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL as SELLER_ACCOUNT_ACCOUNT_BUYER_LEVEL, + SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL as SELLER_ACCOUNT_ACCOUNT_SELLER_LEVEL, + SELLER_ACCOUNT.ACCOUNT_COUNTRY as SELLER_ACCOUNT_ACCOUNT_COUNTRY, + SELLER_COUNTRY.NAME as SELLER_COUNTRY_NAME, + TEST_ORDER.BUYER_ID as TEST_ORDER_BUYER_ID, + BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL as BUYER_ACCOUNT_ACCOUNT_BUYER_LEVEL, + BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL as BUYER_ACCOUNT_ACCOUNT_SELLER_LEVEL, + BUYER_ACCOUNT.ACCOUNT_COUNTRY as BUYER_ACCOUNT_ACCOUNT_COUNTRY, + year(TEST_KYLIN_FACT.CAL_DT) as TEST_KYLIN_FACT_DEAL_YEAR + FROM "DEFAULT".TEST_KYLIN_FACT as TEST_KYLIN_FACT + LEFT JOIN "DEFAULT".TEST_ORDER as TEST_ORDER + ON TEST_KYLIN_FACT.ORDER_ID = TEST_ORDER.ORDER_ID + LEFT JOIN EDW.TEST_CAL_DT as TEST_CAL_DT + ON TEST_KYLIN_FACT.CAL_DT = TEST_CAL_DT.CAL_DT + LEFT JOIN "DEFAULT".TEST_CATEGORY_GROUPINGS as TEST_CATEGORY_GROUPINGS + ON TEST_KYLIN_FACT.LEAF_CATEG_ID = TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID AND TEST_KYLIN_FACT.LSTG_SITE_ID = TEST_CATEGORY_GROUPINGS.SITE_ID + LEFT JOIN EDW.TEST_SITES as TEST_SITES + ON TEST_KYLIN_FACT.LSTG_SITE_ID = TEST_SITES.SITE_ID + LEFT JOIN EDW.TEST_SELLER_TYPE_DIM as TEST_SELLER_TYPE_DIM + ON TEST_KYLIN_FACT.SLR_SEGMENT_CD = TEST_SELLER_TYPE_DIM.SELLER_TYPE_CD + LEFT JOIN "DEFAULT".TEST_ACCOUNT as SELLER_ACCOUNT + ON TEST_KYLIN_FACT.SELLER_ID = SELLER_ACCOUNT.ACCOUNT_ID + LEFT JOIN "DEFAULT".TEST_ACCOUNT as BUYER_ACCOUNT + ON TEST_ORDER.BUYER_ID = BUYER_ACCOUNT.ACCOUNT_ID + LEFT JOIN "DEFAULT".TEST_COUNTRY as SELLER_COUNTRY + ON SELLER_ACCOUNT.ACCOUNT_COUNTRY = SELLER_COUNTRY.COUNTRY + LEFT JOIN "DEFAULT".TEST_COUNTRY as BUYER_COUNTRY + ON BUYER_ACCOUNT.ACCOUNT_COUNTRY = BUYER_COUNTRY.COUNTRY + WHERE 1=1 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/kylin/blob/bd048b96/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java ---------------------------------------------------------------------- diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java index 697827f..89c9041 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java @@ -58,7 +58,7 @@ public class OLAPToEnumerableConverter extends ConverterImpl implements Enumerab @Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { // huge cost to ensure OLAPToEnumerableConverter only appears once in rel tree - return planner.getCostFactory().makeCost(1E10, 0, 0); + return planner.getCostFactory().makeCost(1E100, 0, 0); } @Override