diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java index 78a44dc..5d756c5 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java @@ -3,11 +3,17 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.ql.exec.ColumnInfo; +import org.apache.hadoop.hive.ql.exec.CommonJoinOperator; import org.apache.hadoop.hive.ql.metadata.Table; import org.apache.hadoop.hive.ql.plan.ColStatistics; import org.apache.hadoop.hive.ql.plan.Statistics; @@ -37,6 +43,9 @@ Statistics m_hiveStats; List m_hiveColStats = new ArrayList(); + protected static final Log LOG = LogFactory.getLog(RelOptHiveTable.class + .getName()); + // NOTE: name here is the table alias which may or may not be the real name in // metadata. Use // m_hiveTblMetadata.getTableName() for table name and @@ -90,12 +99,36 @@ public Statistics getHiveStats() { return m_hiveStats; } + private String getColNameList(Set colLst) { + StringBuffer sb = new StringBuffer(); + List schema = m_hiveTblMetadata.getAllCols(); + for (Integer i : colLst) { + String colName = (i < schema.size()) ? m_hiveTblMetadata.getAllCols().get(i).getName() : ""; + if (i == 0) + sb.append(colName); + else + sb.append(", " + colName); + } + return sb.toString(); + } + public List getColStat(List projIndxLst) { if (projIndxLst != null) { + Set colsWithoutStats = new HashSet(); List hiveColStatLst = new LinkedList(); for (Integer i : projIndxLst) { - hiveColStatLst.add(m_hiveColStats.get(i)); + if (i >= m_hiveColStats.size()) + colsWithoutStats.add(i); + else + hiveColStatLst.add(m_hiveColStats.get(i)); + } + if (!colsWithoutStats.isEmpty()) { + String logMsg = "No Stats for DB@Table " + m_hiveTblMetadata.getCompleteName() + + ", Columns: " + getColNameList(colsWithoutStats); + LOG.error(logMsg); + throw new RuntimeException(logMsg); } + return hiveColStatLst; } else { return m_hiveColStats;