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 d4ae2ef..57da3d9 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 @@ -17,18 +17,22 @@ */ package org.apache.hadoop.hive.ql.optimizer.calcite.stats; +import java.util.List; + 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.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.util.BuiltInMethod; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.apache.calcite.util.ImmutableIntList; +import org.apache.hadoop.hive.ql.optimizer.calcite.RelOptHiveTable; +import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableScan; +import org.apache.hadoop.hive.ql.plan.ColStatistics; -public class HiveRelMdSize extends RelMdSize { +import com.google.common.collect.ImmutableList; - protected static final Log LOG = LogFactory.getLog(HiveRelMdSize.class.getName()); +public class HiveRelMdSize extends RelMdSize { private static final HiveRelMdSize INSTANCE = new HiveRelMdSize(); @@ -43,6 +47,27 @@ private HiveRelMdSize() {} //~ Methods ---------------------------------------------------------------- + public List averageColumnSizes(HiveTableScan scan) { + // Number of fields + final int numCols = scan.getRowType().getFieldList().size(); + List cols = ImmutableIntList.range(0, numCols); + // Get col stats + final RelOptHiveTable table = (RelOptHiveTable) scan.getTable(); + List columnStatistics = table.getColStat(cols); + // Obtain list of col stats, or use default if they are not available + final ImmutableList.Builder list = ImmutableList.builder(); + for (int i=0; i