diff --git ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java index 6aa35e1..5e49717 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java @@ -18,17 +18,21 @@ package org.apache.hadoop.hive.ql.io.sarg; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Deque; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.common.type.HiveChar; import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.common.type.HiveVarchar; -import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf; -import org.apache.hadoop.hive.ql.io.sarg.SearchArgument; import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; @@ -52,15 +56,9 @@ import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; -import java.math.BigDecimal; -import java.sql.Timestamp; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Deque; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; /** * The implementation of SearchArguments. @@ -366,7 +364,7 @@ private static Object boxLiteral(ExprNodeConstantDesc lit) { case STRING: return StringUtils.stripEnd(lit.getValue().toString(), null); case FLOAT: - return ((Number) lit.getValue()).doubleValue(); + return Double.parseDouble(lit.getValue().toString()); case DATE: case TIMESTAMP: case DECIMAL: @@ -977,7 +975,7 @@ private static Object boxLiteral(Object literal) { literal instanceof Integer) { return Long.valueOf(literal.toString()); } else if (literal instanceof Float) { - return Double.valueOf((Float) literal); + return Double.parseDouble(literal.toString()); } else { throw new IllegalArgumentException("Unknown type for literal " + literal); diff --git ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java index 96728d9..1d83c5f 100644 --- ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java +++ ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java @@ -2881,4 +2881,36 @@ public void testBuilderComplexTypes2() throws Exception { "leaf-3 = (NULL_SAFE_EQUALS a stinger)\n" + "expr = (and (not leaf-0) (not leaf-1) (not leaf-2) (not leaf-3))", sarg.toString()); } + + @Test + public void testBuilderFloat() throws Exception { + SearchArgument sarg = + SearchArgumentFactory.newBuilder() + .startAnd() + .lessThan("x", new DateWritable(10)) + .lessThanEquals("y", new HiveChar("hi", 10)) + .equals("z", new Float("0.22")) + .end() + .build(); + assertEquals("leaf-0 = (LESS_THAN x 1970-01-11)\n" + + "leaf-1 = (LESS_THAN_EQUALS y hi)\n" + + "leaf-2 = (EQUALS z 0.22)\n" + + "expr = (and leaf-0 leaf-1 leaf-2)", sarg.toString()); + + sarg = SearchArgumentFactory.newBuilder() + .startNot() + .startOr() + .isNull("x") + .between("y", new BigDecimal(10), 20.0) + .in("z", (byte)1, (short)2, (int)3) + .nullSafeEquals("a", new HiveVarchar("stinger", 100)) + .end() + .end() + .build(); + assertEquals("leaf-0 = (IS_NULL x)\n" + + "leaf-1 = (BETWEEN y 10 20.0)\n" + + "leaf-2 = (IN z 1 2 3)\n" + + "leaf-3 = (NULL_SAFE_EQUALS a stinger)\n" + + "expr = (and (not leaf-0) (not leaf-1) (not leaf-2) (not leaf-3))", sarg.toString()); + } }