diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java index cfa032c..9189e63 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java @@ -27,6 +27,7 @@ import org.eigenbase.rel.rules.SemiJoinRel; import org.eigenbase.reltype.RelDataTypeField; import org.eigenbase.rex.RexCall; +import org.eigenbase.rex.RexFieldAccess; import org.eigenbase.rex.RexFieldCollation; import org.eigenbase.rex.RexInputRef; import org.eigenbase.rex.RexLiteral; @@ -272,6 +273,13 @@ protected RexVisitor(Schema schema) { } @Override + public ASTNode visitFieldAccess(RexFieldAccess fieldAccess) { + return ASTBuilder + .construct(HiveParser.DOT, ".") + .add(super.visitFieldAccess(fieldAccess)).add(HiveParser.Identifier, fieldAccess.getField().getName()).node(); + } + + @Override public ASTNode visitInputRef(RexInputRef inputRef) { ColumnInfo cI = schema.get(inputRef.getIndex()); if (cI.agg != null) { @@ -495,7 +503,7 @@ public QueryBlockInfo(Schema schema, ASTNode ast) { * 1. ProjectRel will always be child of SortRel.
* 2. In Optiq every projection in ProjectRelBase is uniquely named * (unambigous) without using table qualifier (table name).
- * + * * @param order * Hive Sort Rel Node * @return Schema diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java index 0228553..fcba801 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java @@ -14,6 +14,7 @@ import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; +import org.apache.hadoop.hive.ql.plan.ExprNodeFieldDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeNullDesc; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; @@ -90,10 +91,17 @@ public RexNode convert(ExprNodeDesc expr) throws SemanticException { return convert((ExprNodeConstantDesc) expr); } else if (expr instanceof ExprNodeColumnDesc) { return convert((ExprNodeColumnDesc) expr); + } else if (expr instanceof ExprNodeFieldDesc) { + return convert((ExprNodeFieldDesc) expr); } else { throw new RuntimeException("Unsupported Expression"); } - // TODO: handle a) ExprNodeFieldDesc b) ExprNodeColumnListDesc + // TODO: handle ExprNodeColumnListDesc + } + + private RexNode convert(final ExprNodeFieldDesc fieldDesc) throws SemanticException { + return m_cluster.getRexBuilder().makeFieldAccess(convert(fieldDesc.getDesc()), + fieldDesc.getFieldName(), true); } private RexNode convert(final ExprNodeGenericFuncDesc func) throws SemanticException {