Drill 1416: convert_from() on JSON fails - regression
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/e22803a1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/e22803a1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/e22803a1 Branch: refs/heads/master Commit: e22803a1d80fd47a39066c525c5598e7501db73a Parents: 130e24a Author: Jason Altekruse <altekruseja...@gmail.com> Authored: Mon Sep 15 16:49:06 2014 -0700 Committer: Steven Phillips <sphill...@maprtech.com> Committed: Mon Sep 29 18:21:44 2014 -0700 ---------------------------------------------------------------------- .../src/main/codegen/templates/NullReader.java | 14 ++++++- .../drill/exec/expr/EvaluationVisitor.java | 10 ++++- .../physical/impl/TestConvertFunctions.java | 7 ++++ .../src/test/resources/store/json/input2.json | 39 ++++++++++++++++++++ .../json_project_null_object_from_list.json | 10 +++++ 5 files changed, 78 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/main/codegen/templates/NullReader.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/codegen/templates/NullReader.java b/exec/java-exec/src/main/codegen/templates/NullReader.java index b246e36..a0e5f50 100644 --- a/exec/java-exec/src/main/codegen/templates/NullReader.java +++ b/exec/java-exec/src/main/codegen/templates/NullReader.java @@ -26,18 +26,30 @@ package org.apache.drill.exec.vector.complex.impl; <#include "/@includes/vv_imports.ftl" /> +import org.apache.drill.common.types.TypeProtos; + + @SuppressWarnings("unused") public class NullReader extends AbstractBaseReader implements FieldReader{ public static final NullReader INSTANCE = new NullReader(); + public static final NullReader EMPTY_LIST_INSTANCE = new NullReader(Types.repeated(TypeProtos.MinorType.NULL)); + public static final NullReader EMPTY_MAP_INSTANCE = new NullReader(Types.required(TypeProtos.MinorType.MAP)); + private MajorType type; private NullReader(){ super(); + type = Types.NULL; + } + + private NullReader(MajorType type){ + super(); + this.type = type; } @Override public MajorType getType() { - return Types.NULL; + return type; } public void copyAsValue(MapWriter writer) {} http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java index 6280c40..d1e10ae 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java @@ -442,7 +442,15 @@ public class EvaluationVisitor { JConditional jc = generator.getEvalBlock()._if(isNull.eq(JExpr.lit(0))); JClass nrClass = generator.getModel().ref(org.apache.drill.exec.vector.complex.impl.NullReader.class); - JExpression nullReader = nrClass.staticRef("INSTANCE"); + JExpression nullReader; + if (complex) { + nullReader = nrClass.staticRef("EMPTY_MAP_INSTANCE"); + } else if (repeated) { + nullReader = nrClass.staticRef("EMPTY_LIST_INSTANCE"); + } else { + nullReader = nrClass.staticRef("INSTANCE"); + } + jc._then().assign(complexReader, expr); jc._else().assign(complexReader, nullReader); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java index c64c7a3..2c03b69 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestConvertFunctions.java @@ -64,6 +64,13 @@ public class TestConvertFunctions extends BaseTestQuery { String textFileContent; @Test + public void test_JSON_convertTo_empty_list_drill_1416() throws Exception { + test("select cast(convert_to(rl[1], 'JSON') as varchar(100)) from cp.`/store/json/input2.json`"); + test("select convert_from(convert_to(rl[1], 'JSON'), 'JSON') from cp.`/store/json/input2.json`"); + test("select convert_from(convert_to(rl[1], 'JSON'), 'JSON') from cp.`/store/json/json_project_null_object_from_list.json`"); + } + + @Test public void testDateTime1() throws Throwable { verifyPhysicalPlan("(convert_from(binary_string('" + DATE_TIME_BE + "'), 'TIME_EPOCH_BE'))", time); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/test/resources/store/json/input2.json ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/resources/store/json/input2.json b/exec/java-exec/src/test/resources/store/json/input2.json new file mode 100644 index 0000000..587732c --- /dev/null +++ b/exec/java-exec/src/test/resources/store/json/input2.json @@ -0,0 +1,39 @@ +{ "integer" : 2010, +"float" : 17.4, +"x": +{ "y": "kevin", "z": "paul" } +, +"z": [ +{"orange" : "yellow" , "pink": "red"} +, +{"pink" : "purple" } +], +"l": [4,2], +"rl": [ [2,1], [4,6] ] +} + +{ "integer" : -2002, "float" : -1.2 } + +{ "integer" : 2001, +"float" : 1.2, +"x": +{ "y": "bill", "z": "peter" } +, +"z": [ +{"pink" : "lilac" } +], +"l": [4,2], +"rl": [ [2,1], [4,6] ] +} + +{ "integer" : 6005, +"float" : 1.2, +"x": +{ "y": "mike", "z": "mary" } +, +"z": [ +{"orange" : "stucco" } +], +"l": [4,2], +"rl": [ [2,1], [4,6] ] +} http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/e22803a1/exec/java-exec/src/test/resources/store/json/json_project_null_object_from_list.json ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/resources/store/json/json_project_null_object_from_list.json b/exec/java-exec/src/test/resources/store/json/json_project_null_object_from_list.json new file mode 100644 index 0000000..f09c366 --- /dev/null +++ b/exec/java-exec/src/test/resources/store/json/json_project_null_object_from_list.json @@ -0,0 +1,10 @@ +{ +"rl": [ { "f1" : 2, "f2" : 1}, { "f1" : 4, "f2" : 6} ] +} +{} +{ +"rl": [ { "f1" : 4, "f2" : 7}, { "f1" : 11} ] +} +{ +"rl": [ { "f1" : 2, "f2" : 1}, { "f1" : 4, "f2" : 6} ] +} \ No newline at end of file