You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by am...@apache.org on 2017/06/25 01:32:25 UTC

[3/6] drill git commit: DRILL-5130: Implement DrillValuesRel and ValuesPrel as Calcite Values sub-classes

DRILL-5130: Implement DrillValuesRel and ValuesPrel as Calcite Values sub-classes


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/33682be9
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/33682be9
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/33682be9

Branch: refs/heads/master
Commit: 33682be99e719dce9cb326e2835ebc4ae434104a
Parents: 886ccdc
Author: Arina Ielchiieva <ar...@gmail.com>
Authored: Thu Jun 15 18:03:34 2017 +0300
Committer: Aman Sinha <as...@maprtech.com>
Committed: Sat Jun 24 09:17:29 2017 -0700

----------------------------------------------------------------------
 .../exec/planner/common/DrillValuesRelBase.java | 251 ++++++++++++++++++
 .../exec/planner/logical/DrillValuesRel.java    | 255 +------------------
 .../drill/exec/planner/physical/ValuesPrel.java |  32 +--
 .../exec/planner/physical/ValuesPrule.java      |  14 +-
 .../java/org/apache/drill/TestUnionAll.java     |  11 +
 .../physical/impl/filter/TestLargeInClause.java |   2 +-
 6 files changed, 290 insertions(+), 275 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/33682be9/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillValuesRelBase.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillValuesRelBase.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillValuesRelBase.java
new file mode 100644
index 0000000..4d54fce
--- /dev/null
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillValuesRelBase.java
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.drill.exec.planner.common;
+
+import com.fasterxml.jackson.core.JsonLocation;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.util.TokenBuffer;
+import com.google.common.collect.ImmutableList;
+import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelTraitSet;
+import org.apache.calcite.rel.core.Values;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.util.NlsString;
+import org.apache.drill.common.JSONOptions;
+import org.apache.drill.common.exceptions.DrillRuntimeException;
+import org.apache.drill.exec.vector.complex.fn.ExtendedJsonOutput;
+import org.apache.drill.exec.vector.complex.fn.JsonOutput;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeConstants;
+import org.joda.time.Period;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.List;
+
+import static org.apache.drill.exec.planner.logical.DrillOptiq.isLiteralNull;
+
+/**
+ * Base class for logical and physical Values implemented in Drill.
+ */
+public abstract class DrillValuesRelBase extends Values implements DrillRelNode {
+
+  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillValuesRelBase.class);
+  private static final ObjectMapper MAPPER = new ObjectMapper();
+
+  protected final JSONOptions content;
+
+  public DrillValuesRelBase(RelOptCluster cluster, RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples, RelTraitSet traits) {
+    this(cluster, rowType, tuples, traits, convertToJsonOptions(rowType, tuples));
+  }
+
+  /**
+   * This constructor helps to avoid unnecessary tuples parsing into json options
+   * during copying or logical to physical values conversion.
+   */
+  public DrillValuesRelBase(RelOptCluster cluster,
+                            RelDataType rowType,
+                            ImmutableList<ImmutableList<RexLiteral>> tuples,
+                            RelTraitSet traits,
+                            JSONOptions content) {
+    super(cluster, rowType, tuples, traits);
+    this.content = content;
+  }
+
+  /**
+   * @return values content represented as json
+   */
+  public JSONOptions getContent() {
+    return content;
+  }
+
+  /**
+   * Converts tuples into json representation taking into account row type.
+   * Example: [['A']] -> [{"EXPR$0":"A"}], [[1]] -> [{"EXPR$0":{"$numberLong":1}}]
+   *
+   * @param rowType row type
+   * @param tuples list of constant values in a row-expression
+   * @return json representation of tuples
+   */
+  private static JSONOptions convertToJsonOptions(RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples) {
+    try {
+      return new JSONOptions(convertToJsonNode(rowType, tuples), JsonLocation.NA);
+    } catch (IOException e) {
+      throw new DrillRuntimeException("Failure while attempting to encode Values in JSON.", e);
+    }
+  }
+
+  private static JsonNode convertToJsonNode(RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples) throws IOException {
+    TokenBuffer out = new TokenBuffer(MAPPER.getFactory().getCodec(), false);
+    JsonOutput json = new ExtendedJsonOutput(out);
+    json.writeStartArray();
+    String[] fields = rowType.getFieldNames().toArray(new String[rowType.getFieldCount()]);
+
+    for (List<RexLiteral> row : tuples) {
+      json.writeStartObject();
+      int i = 0;
+      for (RexLiteral field : row) {
+        json.writeFieldName(fields[i]);
+        writeLiteral(field, json);
+        i++;
+      }
+      json.writeEndObject();
+    }
+    json.writeEndArray();
+    json.flush();
+    return out.asParser().readValueAsTree();
+  }
+
+  private static void writeLiteral(RexLiteral literal, JsonOutput out) throws IOException {
+    switch (literal.getType().getSqlTypeName()) {
+      case BIGINT:
+        if (isLiteralNull(literal)) {
+          out.writeBigIntNull();
+        } else {
+          out.writeBigInt((((BigDecimal) literal.getValue()).setScale(0, BigDecimal.ROUND_HALF_UP)).longValue());
+        }
+        return;
+
+      case BOOLEAN:
+        if (isLiteralNull(literal)) {
+          out.writeBooleanNull();
+        } else {
+          out.writeBoolean((Boolean) literal.getValue());
+        }
+        return;
+
+      case CHAR:
+        if (isLiteralNull(literal)) {
+          out.writeVarcharNull();
+        } else {
+          // Since Calcite treats string literals as fixed char and adds trailing spaces to the strings to make them the
+          // same length, here we do an rtrim() to get the string without the trailing spaces. If we don't rtrim, the comparison
+          // with Drill's varchar column values would not return a match.
+          // TODO: However, note that if the user had explicitly added spaces in the string literals then even those would get
+          // trimmed, so this exposes another issue that needs to be resolved.
+          out.writeVarChar(((NlsString) literal.getValue()).rtrim().getValue());
+        }
+        return;
+
+      case DOUBLE:
+        if (isLiteralNull(literal)) {
+          out.writeDoubleNull();
+        } else {
+          out.writeDouble(((BigDecimal) literal.getValue()).doubleValue());
+        }
+        return;
+
+      case FLOAT:
+        if (isLiteralNull(literal)) {
+          out.writeFloatNull();
+        } else {
+          out.writeFloat(((BigDecimal) literal.getValue()).floatValue());
+        }
+        return;
+
+      case INTEGER:
+        if (isLiteralNull(literal)) {
+          out.writeIntNull();
+        } else {
+          out.writeInt((((BigDecimal) literal.getValue()).setScale(0, BigDecimal.ROUND_HALF_UP)).intValue());
+        }
+        return;
+
+      case DECIMAL:
+        if (isLiteralNull(literal)) {
+          out.writeDoubleNull();
+        } else {
+          out.writeDouble(((BigDecimal) literal.getValue()).doubleValue());
+        }
+        logger.warn("Converting exact decimal into approximate decimal. Should be fixed once full decimal support is implemented.");
+        return;
+
+      case VARCHAR:
+        if (isLiteralNull(literal)) {
+          out.writeVarcharNull();
+        } else {
+          out.writeVarChar(((NlsString) literal.getValue()).getValue());
+        }
+        return;
+
+      case SYMBOL:
+        if (isLiteralNull(literal)) {
+          out.writeVarcharNull();
+        } else {
+          out.writeVarChar(literal.getValue().toString());
+        }
+        return;
+
+      case DATE:
+        if (isLiteralNull(literal)) {
+          out.writeDateNull();
+        } else {
+          out.writeDate(new DateTime(literal.getValue()));
+        }
+        return;
+
+      case TIME:
+        if (isLiteralNull(literal)) {
+          out.writeTimeNull();
+        } else {
+          out.writeTime(new DateTime(literal.getValue()));
+        }
+        return;
+
+      case TIMESTAMP:
+        if (isLiteralNull(literal)) {
+          out.writeTimestampNull();
+        } else {
+          out.writeTimestamp(new DateTime(literal.getValue()));
+        }
+        return;
+
+      case INTERVAL_YEAR_MONTH:
+        if (isLiteralNull(literal)) {
+          out.writeIntervalNull();
+        } else {
+          int months = ((BigDecimal) (literal.getValue())).intValue();
+          out.writeInterval(new Period().plusMonths(months));
+        }
+        return;
+
+      case INTERVAL_DAY_TIME:
+        if (isLiteralNull(literal)) {
+          out.writeIntervalNull();
+        } else {
+          long millis = ((BigDecimal) (literal.getValue())).longValue();
+          int days = (int) (millis / DateTimeConstants.MILLIS_PER_DAY);
+          millis = millis - (days * DateTimeConstants.MILLIS_PER_DAY);
+          out.writeInterval(new Period().plusDays(days).plusMillis((int) millis));
+        }
+        return;
+
+      case NULL:
+        out.writeUntypedNull();
+        return;
+
+      case ANY:
+      default:
+        throw new UnsupportedOperationException(
+            String.format("Unable to convert the value of %s and type %s to a Drill constant expression.",
+                literal, literal.getType().getSqlTypeName()));
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/33682be9/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillValuesRel.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillValuesRel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillValuesRel.java
index 816506a..fb66acd 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillValuesRel.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillValuesRel.java
@@ -17,282 +17,45 @@
  */
 package org.apache.drill.exec.planner.logical;
 
-import static org.apache.drill.exec.planner.logical.DrillOptiq.isLiteralNull;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.GregorianCalendar;
 import java.util.List;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.calcite.rel.AbstractRelNode;
-import org.apache.calcite.rel.RelWriter;
-import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.calcite.rel.type.RelDataTypeField;
-import org.apache.calcite.sql.SqlExplainLevel;
-import org.apache.calcite.sql.type.SqlTypeUtil;
-import org.apache.calcite.util.NlsString;
-import org.apache.calcite.util.Pair;
 import org.apache.drill.common.JSONOptions;
-import org.apache.drill.common.exceptions.DrillRuntimeException;
 import org.apache.drill.common.logical.data.LogicalOperator;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelOptCost;
-import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexLiteral;
 
-import com.fasterxml.jackson.core.JsonLocation;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.util.TokenBuffer;
 import org.apache.drill.common.logical.data.Values;
-import org.apache.drill.exec.vector.complex.fn.ExtendedJsonOutput;
-import org.apache.drill.exec.vector.complex.fn.JsonOutput;
-import org.joda.time.DateTime;
-import org.joda.time.Period;
+import org.apache.drill.exec.planner.common.DrillValuesRelBase;
 
 /**
- * Values implemented in Drill.
+ * Logical Values implementation in Drill.
  */
-public class DrillValuesRel extends AbstractRelNode implements DrillRel {
-  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillValuesRel.class);
-  private static final ObjectMapper MAPPER = new ObjectMapper();
-
-  private static final long MILLIS_IN_DAY = 1000*60*60*24;
-
-  private final JSONOptions options;
-  private final double rowCount;
-
-  protected DrillValuesRel(RelOptCluster cluster, RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples, RelTraitSet traits) {
-    super(cluster, traits);
-    assert getConvention() == DRILL_LOGICAL;
-    verifyRowType(tuples, rowType);
-
-    this.rowType = rowType;
-    this.rowCount = tuples.size();
-
-    try{
-      this.options = new JSONOptions(convertToJsonNode(rowType, tuples), JsonLocation.NA);
-    }catch(IOException e){
-      throw new DrillRuntimeException("Failure while attempting to encode ValuesRel in JSON.", e);
-    }
-
-  }
-
-  private DrillValuesRel(RelOptCluster cluster, RelDataType rowType, RelTraitSet traits, JSONOptions options, double rowCount){
-    super(cluster, traits);
-    this.options = options;
-    this.rowCount = rowCount;
-    this.rowType = rowType;
-  }
-
-  private static void verifyRowType(final ImmutableList<ImmutableList<RexLiteral>> tuples, RelDataType rowType){
-      for (List<RexLiteral> tuple : tuples) {
-        assert (tuple.size() == rowType.getFieldCount());
-
-        for (Pair<RexLiteral, RelDataTypeField> pair : Pair.zip(tuple, rowType.getFieldList())) {
-          RexLiteral literal = pair.left;
-          RelDataType fieldType = pair.right.getType();
-
-          if ((!(RexLiteral.isNullLiteral(literal)))
-              && (!(SqlTypeUtil.canAssignFrom(fieldType, literal.getType())))) {
-            throw new AssertionError("to " + fieldType + " from " + literal);
-          }
-        }
-      }
+public class DrillValuesRel extends DrillValuesRelBase implements DrillRel {
 
+  public DrillValuesRel(RelOptCluster cluster, RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples, RelTraitSet traits) {
+    super(cluster, rowType, tuples, traits);
   }
 
-  public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) {
-    return planner.getCostFactory().makeCost(this.rowCount, 1.0d, 0.0d);
+  public DrillValuesRel(RelOptCluster cluster, RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples, RelTraitSet traits, JSONOptions content) {
+    super(cluster, rowType, tuples, traits, content);
   }
 
   @Override
   public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
     assert inputs.isEmpty();
-    return new DrillValuesRel(getCluster(), rowType, traitSet, options, rowCount);
+    return new DrillValuesRel(getCluster(), rowType, tuples, traitSet, content);
   }
 
   @Override
   public LogicalOperator implement(DrillImplementor implementor) {
       return Values.builder()
-          .content(options.asNode())
+          .content(content.asNode())
           .build();
   }
 
-  public JSONOptions getTuplesAsJsonOptions() throws IOException {
-    return options;
-  }
-
-  public double estimateRowCount(RelMetadataQuery mq) {
-    return rowCount;
-  }
-
-  public RelWriter explainTerms(RelWriter pw) {
-    return super.explainTerms(pw)
-        .itemIf("type", this.rowType, pw.getDetailLevel() == SqlExplainLevel.DIGEST_ATTRIBUTES)
-        .itemIf("type", this.rowType.getFieldList(), pw.nest())
-        .itemIf("tuplesCount", rowCount, pw.getDetailLevel() != SqlExplainLevel.ALL_ATTRIBUTES)
-        .itemIf("tuples", options.asNode(), pw.getDetailLevel() == SqlExplainLevel.ALL_ATTRIBUTES);
-  }
 
-  private static JsonNode convertToJsonNode(RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples) throws IOException{
-    TokenBuffer out = new TokenBuffer(MAPPER.getFactory().getCodec(), false);
-    JsonOutput json = new ExtendedJsonOutput(out);
-    json.writeStartArray();
-    String[] fields = rowType.getFieldNames().toArray(new String[rowType.getFieldCount()]);
-
-    for(List<RexLiteral> row : tuples){
-      json.writeStartObject();
-      int i =0;
-      for(RexLiteral field : row){
-        json.writeFieldName(fields[i]);
-        writeLiteral(field, json);
-        i++;
-      }
-      json.writeEndObject();
-    }
-    json.writeEndArray();
-    json.flush();
-    return out.asParser().readValueAsTree();
-  }
-
-
-  private static void writeLiteral(RexLiteral literal, JsonOutput out) throws IOException{
-
-    switch(literal.getType().getSqlTypeName()){
-    case BIGINT:
-      if (isLiteralNull(literal)) {
-        out.writeBigIntNull();
-      }else{
-        out.writeBigInt((((BigDecimal) literal.getValue()).setScale(0, BigDecimal.ROUND_HALF_UP)).longValue());
-      }
-      return;
-
-    case BOOLEAN:
-      if (isLiteralNull(literal)) {
-        out.writeBooleanNull();
-      }else{
-        out.writeBoolean((Boolean) literal.getValue());
-      }
-      return;
-
-    case CHAR:
-      if (isLiteralNull(literal)) {
-        out.writeVarcharNull();
-      }else{
-        // Since Calcite treats string literals as fixed char and adds trailing spaces to the strings to make them the
-        // same length, here we do an rtrim() to get the string without the trailing spaces. If we don't rtrim, the comparison
-        // with Drill's varchar column values would not return a match.
-        // TODO: However, note that if the user had explicitly added spaces in the string literals then even those would get
-        // trimmed, so this exposes another issue that needs to be resolved.
-        out.writeVarChar(((NlsString)literal.getValue()).rtrim().getValue());
-      }
-      return ;
-
-    case DOUBLE:
-      if (isLiteralNull(literal)){
-        out.writeDoubleNull();
-      }else{
-        out.writeDouble(((BigDecimal) literal.getValue()).doubleValue());
-      }
-      return;
-
-    case FLOAT:
-      if (isLiteralNull(literal)) {
-        out.writeFloatNull();
-      }else{
-        out.writeFloat(((BigDecimal) literal.getValue()).floatValue());
-      }
-      return;
-
-    case INTEGER:
-      if (isLiteralNull(literal)) {
-        out.writeIntNull();
-      }else{
-        out.writeInt((((BigDecimal) literal.getValue()).setScale(0, BigDecimal.ROUND_HALF_UP)).intValue());
-      }
-      return;
-
-    case DECIMAL:
-      if (isLiteralNull(literal)) {
-        out.writeDoubleNull();
-      }else{
-        out.writeDouble(((BigDecimal) literal.getValue()).doubleValue());
-      }
-      logger.warn("Converting exact decimal into approximate decimal.  Should be fixed once decimal is implemented.");
-      return;
-
-    case VARCHAR:
-      if (isLiteralNull(literal)) {
-        out.writeVarcharNull();
-      }else{
-        out.writeVarChar( ((NlsString)literal.getValue()).getValue());
-      }
-      return;
-
-    case SYMBOL:
-      if (isLiteralNull(literal)) {
-        out.writeVarcharNull();
-      }else{
-        out.writeVarChar(literal.getValue().toString());
-      }
-      return;
-
-    case DATE:
-      if (isLiteralNull(literal)) {
-        out.writeDateNull();
-      }else{
-        out.writeDate(new DateTime((GregorianCalendar)literal.getValue()));
-      }
-      return;
-
-    case TIME:
-      if (isLiteralNull(literal)) {
-        out.writeTimeNull();
-      }else{
-        out.writeTime(new DateTime((GregorianCalendar)literal.getValue()));
-      }
-      return;
-
-    case TIMESTAMP:
-      if (isLiteralNull(literal)) {
-        out.writeTimestampNull();
-      }else{
-        out.writeTimestamp(new DateTime((GregorianCalendar)literal.getValue()));
-      }
-      return;
-
-    case INTERVAL_YEAR_MONTH:
-      if (isLiteralNull(literal)) {
-        out.writeIntervalNull();
-      }else{
-        int months = ((BigDecimal) (literal.getValue())).intValue();
-        out.writeInterval(new Period().plusMonths(months));
-      }
-      return;
-
-    case INTERVAL_DAY_TIME:
-      if (isLiteralNull(literal)) {
-        out.writeIntervalNull();
-      }else{
-        long millis = ((BigDecimal) (literal.getValue())).longValue();
-        int days = (int) (millis/MILLIS_IN_DAY);
-        millis = millis - (days * MILLIS_IN_DAY);
-        out.writeInterval(new Period().plusDays(days).plusMillis( (int) millis));
-      }
-      return;
-
-    case NULL:
-      out.writeUntypedNull();
-      return;
-
-    case ANY:
-    default:
-      throw new UnsupportedOperationException(String.format("Unable to convert the value of %s and type %s to a Drill constant expression.", literal, literal.getType().getSqlTypeName()));
-    }
-  }
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/33682be9/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrel.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrel.java
index cdb4787..095519f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrel.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrel.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -18,38 +18,39 @@
 package org.apache.drill.exec.planner.physical;
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
+import com.google.common.collect.ImmutableList;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.AbstractRelNode;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rex.RexLiteral;
 import org.apache.drill.common.JSONOptions;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.config.Values;
+import org.apache.drill.exec.planner.common.DrillValuesRelBase;
 import org.apache.drill.exec.planner.physical.visitor.PrelVisitor;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
-import com.google.common.collect.Iterators;
-
-public class ValuesPrel extends AbstractRelNode implements Prel {
-
-  @SuppressWarnings("unused")
-  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ValuesPrel.class);
+/**
+ * Physical Values implementation in Drill.
+ */
+public class ValuesPrel extends DrillValuesRelBase implements Prel {
 
-  private JSONOptions content;
+  public ValuesPrel(RelOptCluster cluster, RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples, RelTraitSet traits) {
+    super(cluster, rowType, tuples, traits);
+  }
 
-  public ValuesPrel(RelOptCluster cluster, RelTraitSet traitSet, RelDataType rowType, JSONOptions content) {
-    super(cluster, traitSet);
-    this.rowType = rowType;
-    this.content = content;
+  public ValuesPrel(RelOptCluster cluster, RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples, RelTraitSet traits, JSONOptions content) {
+    super(cluster, rowType, tuples, traits, content);
   }
 
   @Override
   public Iterator<Prel> iterator() {
-    return Iterators.emptyIterator();
+    return Collections.emptyIterator();
   }
 
   @Override
@@ -59,7 +60,7 @@ public class ValuesPrel extends AbstractRelNode implements Prel {
 
   @Override
   public Prel copy(RelTraitSet traitSet, List<RelNode> inputs) {
-    return new ValuesPrel(getCluster(), traitSet, rowType, content);
+    return new ValuesPrel(getCluster(), rowType, tuples, traitSet, content);
   }
 
   @Override
@@ -87,5 +88,4 @@ public class ValuesPrel extends AbstractRelNode implements Prel {
     return false;
   }
 
-
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/33682be9/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrule.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrule.java
index 85d568f..d1f2e28 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrule.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ValuesPrule.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,16 +17,12 @@
  */
 package org.apache.drill.exec.planner.physical;
 
-import java.io.IOException;
-
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.drill.exec.planner.logical.DrillValuesRel;
 import org.apache.drill.exec.planner.logical.RelOptHelper;
-import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 
 public class ValuesPrule extends RelOptRule {
-  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ValuesPrule.class);
 
   public static final ValuesPrule INSTANCE = new ValuesPrule();
 
@@ -37,13 +33,7 @@ public class ValuesPrule extends RelOptRule {
   @Override
   public void onMatch(final RelOptRuleCall call) {
     final DrillValuesRel rel = (DrillValuesRel) call.rel(0);
-    try{
-      call.transformTo(new ValuesPrel(rel.getCluster(), rel.getTraitSet().plus(Prel.DRILL_PHYSICAL), rel.getRowType(), rel.getTuplesAsJsonOptions()));
-    }catch(IOException e){
-      logger.warn("Failure while converting JSONOptions.", e);
-    }
+    call.transformTo(new ValuesPrel(rel.getCluster(), rel.getRowType(), rel.getTuples(), rel.getTraitSet().plus(Prel.DRILL_PHYSICAL), rel.getContent()));
   }
 
-
-
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/33682be9/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java b/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java
index 9046df6..924486f 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java
@@ -1180,4 +1180,15 @@ public class TestUnionAll extends BaseTestQuery{
     }
   }
 
+  @Test // DRILL-5130
+  public void testUnionAllWithValues() throws Exception {
+    testBuilder()
+        .sqlQuery("values('A') union all values('B')")
+        .unOrdered()
+        .baselineColumns("EXPR$0")
+        .baselineValues("A")
+        .baselineValues("B")
+        .go();
+  }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/drill/blob/33682be9/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/filter/TestLargeInClause.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/filter/TestLargeInClause.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/filter/TestLargeInClause.java
index 22826b4..aff2a60 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/filter/TestLargeInClause.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/filter/TestLargeInClause.java
@@ -87,7 +87,7 @@ public class TestLargeInClause extends BaseTestQuery {
 
     testBuilder()
         .sqlQuery(query)
-        .ordered()
+        .unOrdered()
         .baselineColumns("r_regionkey")
         .baselineValues(1)
         .baselineValues(2)