diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java index 768e512..1acbe3c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java @@ -41,6 +41,7 @@ import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.ErrorMsg; import org.apache.hadoop.hive.ql.exec.ColumnInfo; +import org.apache.hadoop.hive.ql.exec.FilterOperator; import org.apache.hadoop.hive.ql.exec.JoinOperator; import org.apache.hadoop.hive.ql.exec.LimitOperator; import org.apache.hadoop.hive.ql.exec.Operator; @@ -53,6 +54,7 @@ import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil; import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil.JoinLeafPredicateInfo; import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil.JoinPredicateInfo; +import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveFilter; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveJoin; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSort; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveUnion; @@ -62,6 +64,7 @@ import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDescUtils; +import org.apache.hadoop.hive.ql.plan.FilterDesc; import org.apache.hadoop.hive.ql.plan.JoinCondDesc; import org.apache.hadoop.hive.ql.plan.JoinDesc; import org.apache.hadoop.hive.ql.plan.LimitDesc; @@ -143,6 +146,8 @@ OpAttr dispatch(RelNode rn) throws SemanticException { HiveJoin hj = HiveJoin.getJoin(sj.getCluster(), sj.getLeft(), sj.getRight(), sj.getCondition(), sj.getJoinType(), true); return visit(hj); + } else if (rn instanceof HiveFilter) { + return visit((HiveFilter) rn); } else if (rn instanceof HiveSort) { return visit((HiveSort) rn); } else if (rn instanceof HiveUnion) { @@ -293,6 +298,31 @@ else if (sortRel.fetch == null) { return inputOpAf.clone(resultOp); } + /** + * TODO: 1) isSamplingPred 2) sampleDesc 3) isSortedFilter + */ + OpAttr visit(HiveFilter filterRel) throws SemanticException { + OpAttr inputOpAf = dispatch(filterRel.getInput()); + + if (LOG.isDebugEnabled()) { + LOG.debug("Translating operator rel#" + filterRel.getId() + ":" + filterRel.getRelTypeName() + + " with row type: [" + filterRel.getRowType() + "]"); + } + + ExprNodeDesc filCondExpr = filterRel.getCondition().accept( + new ExprNodeConverter(inputOpAf.tabAlias, filterRel.getInput().getRowType(), false)); + FilterDesc filDesc = new FilterDesc(filCondExpr, false); + ArrayList cinfoLst = createColInfos(inputOpAf.inputs.get(0)); + FilterOperator filOp = (FilterOperator) OperatorFactory.getAndMakeChild(filDesc, new RowSchema( + cinfoLst), inputOpAf.inputs.get(0)); + + if (LOG.isDebugEnabled()) { + LOG.debug("Generated " + filOp + " with row schema: [" + filOp.getSchema() + "]"); + } + + return inputOpAf.clone(filOp); + } + OpAttr visit(HiveUnion unionRel) throws SemanticException { // 1. Convert inputs OpAttr[] inputs = new OpAttr[unionRel.getInputs().size()];