rewriteQueryCtx.getParseContext().getTopOps();
Map<Operator<? extends OperatorDesc>, OpParseContext> opParseContext =
rewriteQueryCtx.getParseContext().getOpParseCtx();
//need this to set rowResolver for new scanOperator
OpParseContext operatorContext = opParseContext.get(scanOperator);
//remove original TableScanOperator
topOps.remove(alias);
topToTable.remove(scanOperator);
opParseContext.remove(scanOperator);
//construct a new descriptor for the index table scan
TableScanDesc indexTableScanDesc = new TableScanDesc();
indexTableScanDesc.setGatherStats(false);
String indexTableName = rewriteQueryCtx.getIndexName();
Table indexTableHandle = null;
try {
indexTableHandle = rewriteQueryCtx.getHiveDb().getTable(indexTableName);
} catch (HiveException e) {
LOG.error("Error while getting the table handle for index table.");
LOG.error(org.apache.hadoop.util.StringUtils.stringifyException(e));
throw new SemanticException(e.getMessage(), e);
}
String k = indexTableName + Path.SEPARATOR;
indexTableScanDesc.setStatsAggPrefix(k);
scanOperator.setConf(indexTableScanDesc);
//Construct the new RowResolver for the new TableScanOperator
RowResolver rr = new RowResolver();
try {
StructObjectInspector rowObjectInspector =
(StructObjectInspector) indexTableHandle.getDeserializer().getObjectInspector();
for (String column : rewriteQueryCtx.getColumns()) {
StructField field = rowObjectInspector.getStructFieldRef(column);
rr.put(indexTableName, field.getFieldName(), new ColumnInfo(field.getFieldName(),
TypeInfoUtils.getTypeInfoFromObjectInspector(field.getFieldObjectInspector()),
indexTableName, false));
}
} catch (SerDeException e) {
LOG.error("Error while creating the RowResolver for new TableScanOperator.");
LOG.error(org.apache.hadoop.util.StringUtils.stringifyException(e));
throw new SemanticException(e.getMessage(), e);
}
//Set row resolver for new table
operatorContext.setRowResolver(rr);
String newAlias = indexTableName;
int index = alias.lastIndexOf(":");
if (index >= 0) {
newAlias = alias.substring(0, index) + ":" + indexTableName;