diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdUniqueKeys.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdUniqueKeys.java index 06ff584..834c28b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdUniqueKeys.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdUniqueKeys.java @@ -30,6 +30,7 @@ import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveTableScanRel; import org.apache.hadoop.hive.ql.plan.ColStatistics; +import org.eigenbase.rel.FilterRelBase; import org.eigenbase.rel.ProjectRelBase; import org.eigenbase.rel.RelNode; import org.eigenbase.rel.metadata.BuiltInMetadata; @@ -37,6 +38,7 @@ import org.eigenbase.rel.metadata.ReflectiveRelMetadataProvider; import org.eigenbase.rel.metadata.RelMdUniqueKeys; import org.eigenbase.rel.metadata.RelMetadataProvider; +import org.eigenbase.relopt.hep.HepRelVertex; import org.eigenbase.rex.RexInputRef; import org.eigenbase.rex.RexNode; @@ -59,16 +61,15 @@ */ public Set getUniqueKeys(ProjectRelBase rel, boolean ignoreNulls) { - RelNode child = rel.getChild(); + HiveTableScanRel tScan = getTableScan(rel.getChild()); - if (!(child instanceof HiveTableScanRel)) { + if ( tScan == null ) { Function fn = RelMdUniqueKeys.SOURCE.apply( rel.getClass(), BuiltInMetadata.UniqueKeys.class); return ((BuiltInMetadata.UniqueKeys) fn.apply(rel)) .getUniqueKeys(ignoreNulls); } - HiveTableScanRel tScan = (HiveTableScanRel) child; Map posMap = new HashMap(); int projectPos = 0; int colStatsPos = 0; @@ -112,4 +113,18 @@ return keys; } + HiveTableScanRel getTableScan(RelNode r) { + + while (r != null && !(r instanceof HiveTableScanRel)) { + if (r instanceof HepRelVertex) { + r = ((HepRelVertex) r).getCurrentRel(); + } else if (r instanceof FilterRelBase) { + r = ((FilterRelBase) r).getChild(); + } else { + r = null; + } + } + return r == null ? null : (HiveTableScanRel) r; + } + }