diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSize.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSize.java index 57da3d9..9f71610 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSize.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSize.java @@ -19,14 +19,18 @@ import java.util.List; +import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider; import org.apache.calcite.rel.metadata.RelMdSize; import org.apache.calcite.rel.metadata.RelMetadataProvider; +import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.util.BuiltInMethod; import org.apache.calcite.util.ImmutableIntList; +import org.apache.calcite.util.ImmutableNullableList; import org.apache.hadoop.hive.ql.optimizer.calcite.RelOptHiveTable; +import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveJoin; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableScan; import org.apache.hadoop.hive.ql.plan.ColStatistics; @@ -68,6 +72,32 @@ private HiveRelMdSize() {} return list.build(); } + public List averageColumnSizes(HiveJoin rel) { + final RelNode left = rel.getLeft(); + final RelNode right = rel.getRight(); + final List lefts = + RelMetadataQuery.getAverageColumnSizes(left); + List rights = null; + if (!rel.isLeftSemiJoin()) { + rights = RelMetadataQuery.getAverageColumnSizes(right); + } + if (lefts == null && rights == null) { + return null; + } + final int fieldCount = rel.getRowType().getFieldCount(); + Double[] sizes = new Double[fieldCount]; + if (lefts != null) { + lefts.toArray(sizes); + } + if (rights != null) { + final int leftCount = left.getRowType().getFieldCount(); + for (int i = 0; i < rights.size(); i++) { + sizes[leftCount + i] = rights.get(i); + } + } + return ImmutableNullableList.copyOf(sizes); + } + public Double averageTypeValueSize(RelDataType type) { switch (type.getSqlTypeName()) { case BOOLEAN: