diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveDefaultRelMetadataProvider.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveDefaultRelMetadataProvider.java index 653a3c1170..7d55f640ec 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveDefaultRelMetadataProvider.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveDefaultRelMetadataProvider.java @@ -56,6 +56,7 @@ import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.jdbc.JdbcHiveTableScan; import org.apache.hadoop.hive.ql.optimizer.calcite.stats.HiveRelMdColumnUniqueness; import org.apache.hadoop.hive.ql.optimizer.calcite.stats.HiveRelMdCollation; +import org.apache.hadoop.hive.ql.optimizer.calcite.stats.HiveRelMdCumulativeCost; import org.apache.hadoop.hive.ql.optimizer.calcite.stats.HiveRelMdDistinctRowCount; import org.apache.hadoop.hive.ql.optimizer.calcite.stats.HiveRelMdDistribution; import org.apache.hadoop.hive.ql.optimizer.calcite.stats.HiveRelMdMemory; @@ -80,6 +81,7 @@ ChainedRelMetadataProvider.of( ImmutableList.of( HiveRelMdDistinctRowCount.SOURCE, + HiveRelMdCumulativeCost.SOURCE, new HiveRelMdCost(HiveDefaultCostModel.getCostModel()).getMetadataProvider(), HiveRelMdSelectivity.SOURCE, HiveRelMdRuntimeRowCount.SOURCE, @@ -151,6 +153,7 @@ private RelMetadataProvider init(HiveConf hiveConf) { ChainedRelMetadataProvider.of( ImmutableList.of( HiveRelMdDistinctRowCount.SOURCE, + HiveRelMdCumulativeCost.SOURCE, new HiveRelMdCost(HiveOnTezCostModel.getCostModel(hiveConf)).getMetadataProvider(), HiveRelMdSelectivity.SOURCE, HiveRelMdRowCount.SOURCE, diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdCumulativeCost.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdCumulativeCost.java new file mode 100644 index 0000000000..7eded8614c --- /dev/null +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdCumulativeCost.java @@ -0,0 +1,67 @@ +/* + * 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.hadoop.hive.ql.optimizer.calcite.stats; + +import java.util.List; +import org.apache.calcite.plan.RelOptCost; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.metadata.BuiltInMetadata; +import org.apache.calcite.rel.metadata.MetadataDef; +import org.apache.calcite.rel.metadata.MetadataHandler; +import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider; +import org.apache.calcite.rel.metadata.RelMetadataProvider; +import org.apache.calcite.rel.metadata.RelMetadataQuery; +import org.apache.calcite.util.BuiltInMethod; +import org.apache.hadoop.hive.ql.optimizer.calcite.cost.HiveCost; +import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveJoin; + + +public class HiveRelMdCumulativeCost implements MetadataHandler { + + public static final RelMetadataProvider SOURCE = + ReflectiveRelMetadataProvider.reflectiveSource( + BuiltInMethod.CUMULATIVE_COST.method, new HiveRelMdCumulativeCost()); + + //~ Constructors ----------------------------------------------------------- + + private HiveRelMdCumulativeCost() { + } + + //~ Methods ---------------------------------------------------------------- + + @Override + public MetadataDef getDef() { + return BuiltInMetadata.CumulativeCost.DEF; + } + + /* + * Favor Broad Plans over Deep Plans. + */ + public RelOptCost getCumulativeCost(HiveJoin rel, RelMetadataQuery mq) { + RelOptCost cost = mq.getNonCumulativeCost(rel); + List inputs = rel.getInputs(); + RelOptCost maxICost = HiveCost.ZERO; + for (RelNode input : inputs) { + RelOptCost iCost = mq.getCumulativeCost(input); + if (maxICost.isLt(iCost)) { + maxICost = iCost; + } + } + return cost.plus(maxICost); + } +} diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdDistinctRowCount.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdDistinctRowCount.java index e99048bc0c..af9635455d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdDistinctRowCount.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdDistinctRowCount.java @@ -48,17 +48,9 @@ public class HiveRelMdDistinctRowCount extends RelMdDistinctRowCount { - private static final HiveRelMdDistinctRowCount INSTANCE = - new HiveRelMdDistinctRowCount(); - - public static final RelMetadataProvider SOURCE = ChainedRelMetadataProvider - .of(ImmutableList.of( - - ReflectiveRelMetadataProvider.reflectiveSource( - BuiltInMethod.DISTINCT_ROW_COUNT.method, INSTANCE), - + public static final RelMetadataProvider SOURCE = ReflectiveRelMetadataProvider.reflectiveSource( - BuiltInMethod.CUMULATIVE_COST.method, INSTANCE))); + BuiltInMethod.DISTINCT_ROW_COUNT.method, new HiveRelMdDistinctRowCount()); private HiveRelMdDistinctRowCount() { } @@ -165,19 +157,4 @@ private static Double getJoinDistinctRowCount(RelMetadataQuery mq, return RelMdUtil.numDistinctVals(distRowCount, mq.getRowCount(joinRel)); } - /* - * Favor Broad Plans over Deep Plans. - */ - public RelOptCost getCumulativeCost(HiveJoin rel, RelMetadataQuery mq) { - RelOptCost cost = mq.getNonCumulativeCost(rel); - List inputs = rel.getInputs(); - RelOptCost maxICost = HiveCost.ZERO; - for (RelNode input : inputs) { - RelOptCost iCost = mq.getCumulativeCost(input); - if (maxICost.isLt(iCost)) { - maxICost = iCost; - } - } - return cost.plus(maxICost); - } }