diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/FilterSelectivityEstimator.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/FilterSelectivityEstimator.java index a25b58b..70bffe3 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/FilterSelectivityEstimator.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/FilterSelectivityEstimator.java @@ -44,11 +44,13 @@ public class FilterSelectivityEstimator extends RexVisitorImpl { private final RelNode childRel; private final double childCardinality; + private final RelMetadataQuery mq; - protected FilterSelectivityEstimator(RelNode childRel) { + protected FilterSelectivityEstimator(RelNode childRel, RelMetadataQuery mq) { super(true); + this.mq = mq; this.childRel = childRel; - this.childCardinality = RelMetadataQuery.instance().getRowCount(childRel); + this.childCardinality = mq.getRowCount(childRel); } public Double estimateSelectivity(RexNode predicate) { @@ -91,7 +93,7 @@ public Double visitCall(RexCall call) { case IS_NOT_NULL: { if (childRel instanceof HiveTableScan) { double noOfNulls = getMaxNulls(call, (HiveTableScan) childRel); - double totalNoOfTuples = childRel.getRows(); + double totalNoOfTuples = childRel.estimateRowCount(mq); if (totalNoOfTuples >= noOfNulls) { selectivity = (totalNoOfTuples - noOfNulls) / Math.max(totalNoOfTuples, 1); } else { 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 77f7aa8..87adc24 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 @@ -81,7 +81,7 @@ private Double getDistinctRowCount(HiveTableScan htRel, RelMetadataQuery mq, Imm noDistinctRows *= cStat.getCountDistint(); } - return Math.min(noDistinctRows, htRel.getRows()); + return Math.min(noDistinctRows, htRel.estimateRowCount(mq)); } public static Double getDistinctRowCount(RelNode r, RelMetadataQuery mq, int indx) { diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdRowCount.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdRowCount.java index 7bba80b..82b6d79 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdRowCount.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdRowCount.java @@ -72,7 +72,7 @@ public Double getRowCount(Join join, RelMetadataQuery mq) { } return pkfk.fkInfo.rowCount * selectivity; } - return join.getRows(); + return join.estimateRowCount(mq); } @Override diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSelectivity.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSelectivity.java index 7192684..046f51b 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSelectivity.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSelectivity.java @@ -56,7 +56,7 @@ private HiveRelMdSelectivity() {} public Double getSelectivity(HiveTableScan t, RelMetadataQuery mq, RexNode predicate) { if (predicate != null) { - FilterSelectivityEstimator filterSelEstmator = new FilterSelectivityEstimator(t); + FilterSelectivityEstimator filterSelEstmator = new FilterSelectivityEstimator(t, mq); return filterSelEstmator.estimateSelectivity(predicate); } @@ -85,7 +85,7 @@ private Double computeInnerJoinSelectivity(Join j, RelMetadataQuery mq, RexNode getCombinedPredicateForJoin(j, predicate); if (!predInfo.getKey()) { return - new FilterSelectivityEstimator(j). + new FilterSelectivityEstimator(j, mq). estimateSelectivity(predInfo.getValue()); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdUniqueKeys.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdUniqueKeys.java index 9a5a2ba..c534655 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdUniqueKeys.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdUniqueKeys.java @@ -138,7 +138,7 @@ projectPos++; } - double numRows = tScan.getRows(); + double numRows = tScan.estimateRowCount(mq); List colStats = tScan.getColStat(BitSets .toList(projectedCols)); Set keys = new HashSet();