HIVE-19923: Follow up of HIVE-19615, use UnaryFunction instead of prefix (Slim Bouguerra, reviewed by Nishant Bangarwa, Ashutosh Chauhan)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/3a6ad266 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/3a6ad266 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/3a6ad266 Branch: refs/heads/master-txnstats Commit: 3a6ad2661e5fdd3e6ce8b8f7ee5a35ddb3bd2c47 Parents: 6a16a71 Author: Slim Bouguerra <slim.bougue...@gmail.com> Authored: Mon Jun 18 07:54:44 2018 -0700 Committer: Jesus Camacho Rodriguez <jcama...@apache.org> Committed: Mon Jun 18 07:54:44 2018 -0700 ---------------------------------------------------------------------- .../ql/parse/DruidSqlOperatorConverter.java | 35 ++++++++++++++++++-- .../clientpositive/druid/druidmini_test1.q.out | 2 +- 2 files changed, 34 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/3a6ad266/ql/src/java/org/apache/hadoop/hive/ql/parse/DruidSqlOperatorConverter.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/DruidSqlOperatorConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/DruidSqlOperatorConverter.java index 4db0714..6aa98c0 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DruidSqlOperatorConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DruidSqlOperatorConverter.java @@ -21,6 +21,7 @@ package org.apache.hadoop.hive.ql.parse; import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import org.apache.calcite.adapter.druid.DirectOperatorConversion; import org.apache.calcite.adapter.druid.DruidExpressions; @@ -51,6 +52,7 @@ import org.joda.time.Period; import javax.annotation.Nullable; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.TimeZone; @@ -87,9 +89,9 @@ public class DruidSqlOperatorConverter { druidOperatorMap .put(SqlStdOperatorTable.SUBSTRING, new DruidSqlOperatorConverter.DruidSubstringOperatorConversion()); druidOperatorMap - .put(SqlStdOperatorTable.IS_NULL, new UnarySuffixOperatorConversion(SqlStdOperatorTable.IS_NULL, "isnull")); + .put(SqlStdOperatorTable.IS_NULL, new UnaryFunctionOperatorConversion(SqlStdOperatorTable.IS_NULL, "isnull")); druidOperatorMap.put(SqlStdOperatorTable.IS_NOT_NULL, - new UnarySuffixOperatorConversion(SqlStdOperatorTable.IS_NOT_NULL, "notnull") + new UnaryFunctionOperatorConversion(SqlStdOperatorTable.IS_NOT_NULL, "notnull") ); druidOperatorMap.put(HiveTruncSqlOperator.INSTANCE, new DruidDateTruncOperatorConversion()); druidOperatorMap.put(HiveToDateSqlOperator.INSTANCE, new DruidToDateOperatorConversion()); @@ -346,4 +348,33 @@ public class DruidSqlOperatorConverter { ); } + public static class UnaryFunctionOperatorConversion implements org.apache.calcite.adapter.druid.DruidSqlOperatorConverter { + + private final SqlOperator operator; + private final String druidOperator; + + public UnaryFunctionOperatorConversion(SqlOperator operator, String druidOperator) { + this.operator = operator; + this.druidOperator = druidOperator; + } + + @Override public SqlOperator calciteOperator() { + return operator; + } + + @Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, + DruidQuery druidQuery) { + final RexCall call = (RexCall) rexNode; + + final List<String> druidExpressions = DruidExpressions.toDruidExpressions( + druidQuery, rowType, + call.getOperands()); + + if (druidExpressions == null) { + return null; + } + + return DruidQuery.format("%s(%s)", druidOperator, Iterables.getOnlyElement(druidExpressions)); + } + } } http://git-wip-us.apache.org/repos/asf/hive/blob/3a6ad266/ql/src/test/results/clientpositive/druid/druidmini_test1.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/druid/druidmini_test1.q.out b/ql/src/test/results/clientpositive/druid/druidmini_test1.q.out index 89da36a..4e078aa 100644 --- a/ql/src/test/results/clientpositive/druid/druidmini_test1.q.out +++ b/ql/src/test/results/clientpositive/druid/druidmini_test1.q.out @@ -814,7 +814,7 @@ STAGE PLANS: properties: druid.fieldNames vc,vc0 druid.fieldTypes boolean,boolean - druid.query.json {"queryType":"scan","dataSource":"default.druid_table_n3","intervals":["1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z"],"virtualColumns":[{"type":"expression","name":"vc","expression":"(\"cstring1\" isnull)","outputType":"FLOAT"},{"type":"expression","name":"vc0","expression":"(\"cint\" notnull)","outputType":"FLOAT"}],"columns":["vc","vc0"],"resultFormat":"compactedList"} + druid.query.json {"queryType":"scan","dataSource":"default.druid_table_n3","intervals":["1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z"],"virtualColumns":[{"type":"expression","name":"vc","expression":"isnull(\"cstring1\")","outputType":"FLOAT"},{"type":"expression","name":"vc0","expression":"notnull(\"cint\")","outputType":"FLOAT"}],"columns":["vc","vc0"],"resultFormat":"compactedList"} druid.query.type scan Select Operator expressions: vc (type: boolean), vc0 (type: boolean)