diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveTableScan.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveTableScan.java index fcf09a5..c8e9b52 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveTableScan.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveTableScan.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hive.ql.optimizer.calcite.reloperators; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -31,6 +32,8 @@ import org.apache.calcite.rel.core.TableScan; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexNode; import org.apache.calcite.util.ImmutableBitSet; import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil; import org.apache.hadoop.hive.ql.optimizer.calcite.RelOptHiveTable; @@ -98,11 +101,6 @@ public HiveTableScan copy(RelDataType newRowtype) { } @Override - public RelDataType deriveRowType() { - return hiveTableScanRowType; - } - - @Override public RelOptCost computeSelfCost(RelOptPlanner planner) { return HiveCost.FACTORY.makeZeroCost(); } @@ -145,22 +143,30 @@ public RelNode project(ImmutableBitSet fieldsUsed, Set extraFi final List fields = getRowType().getFieldList(); List fieldTypes = new LinkedList(); List fieldNames = new LinkedList(); + List exprList = new ArrayList(); + RexBuilder rexBuilder = getCluster().getRexBuilder(); for (int i : fieldsUsed) { RelDataTypeField field = fields.get(i); fieldTypes.add(field.getType()); fieldNames.add(field.getName()); + exprList.add(rexBuilder.makeInputRef(this, i)); } // 4. Build new TS HiveTableScan newHT = copy(getCluster().getTypeFactory().createStructType(fieldTypes, fieldNames)); - return newHT; + // 5. Add Proj on top of TS + return projectFactory.createProject(newHT, exprList, new ArrayList(fieldNames)); } public List getNeededColIndxsFrmReloptHT() { return neededColIndxsFrmReloptHT; } + + public RelDataType getPrunedRowType() { + return hiveTableScanRowType; + } private static ImmutableList buildNeededColIndxsFrmReloptHT(RelDataType htRowtype, RelDataType scanRowType) { diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSize.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSize.java index 280828f..b5d0bf1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSize.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdSize.java @@ -17,7 +17,9 @@ */ package org.apache.hadoop.hive.ql.optimizer.calcite.stats; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider; @@ -27,7 +29,6 @@ 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; @@ -52,23 +53,30 @@ 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); + List neededcolsLst = scan.getNeededColIndxsFrmReloptHT(); + Set needColsSet = new HashSet(neededcolsLst); + List columnStatistics = ((RelOptHiveTable) scan.getTable()) + .getColStat(neededcolsLst); + // Obtain list of col stats, or use default if they are not available final ImmutableList.Builder list = ImmutableList.builder(); - for (int i=0; i