This is an automated email from the ASF dual-hosted git repository.
ajantha pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/carbondata.git
The following commit(s) were added to refs/heads/master by this push:
new 1c78af7 [CARBONDATA-3981] Presto filter check on binary, byte and
float datatypes
1c78af7 is described below
commit 1c78af7acab957e9ae7cf8a42a5626fdd2a0eb53
Author: akkio-97 <[email protected]>
AuthorDate: Thu Sep 10 21:35:22 2020 +0530
[CARBONDATA-3981] Presto filter check on binary, byte and float datatypes
Why is this PR needed?
Due to the absence of binary, byte and float datatypes check, there were
either empty results or a problem during object serialisation in presto filter
queries.
What changes were proposed in this PR?
Above datatype conversions and checks has been added in
prestoFIlterUtil.java
Does this PR introduce any user interface change?
No
Is any new testcase added?
Yes
This closes #3920
---
.../apache/carbondata/core/util/DataTypeUtil.java | 5 +++++
.../apache/carbondata/presto/PrestoFilterUtil.java | 10 +++++++++-
.../apache/carbondata/presto/PrestoFilterUtil.java | 10 +++++++++-
.../PrestoTestNonTransactionalTableFiles.scala | 20 +++++++++++++++++++-
4 files changed, 42 insertions(+), 3 deletions(-)
diff --git
a/core/src/main/java/org/apache/carbondata/core/util/DataTypeUtil.java
b/core/src/main/java/org/apache/carbondata/core/util/DataTypeUtil.java
index 19139e0..32381e7 100644
--- a/core/src/main/java/org/apache/carbondata/core/util/DataTypeUtil.java
+++ b/core/src/main/java/org/apache/carbondata/core/util/DataTypeUtil.java
@@ -327,6 +327,11 @@ public final class DataTypeUtil {
return null;
}
return Float.parseFloat(data);
+ } else if (actualDataType == DataTypes.BYTE) {
+ if (data.isEmpty()) {
+ return null;
+ }
+ return Byte.parseByte(data);
} else if (actualDataType == DataTypes.DOUBLE) {
if (data.isEmpty()) {
return null;
diff --git
a/integration/presto/src/main/prestodb/org/apache/carbondata/presto/PrestoFilterUtil.java
b/integration/presto/src/main/prestodb/org/apache/carbondata/presto/PrestoFilterUtil.java
index 0b9a7c8..d1d9e13 100755
---
a/integration/presto/src/main/prestodb/org/apache/carbondata/presto/PrestoFilterUtil.java
+++
b/integration/presto/src/main/prestodb/org/apache/carbondata/presto/PrestoFilterUtil.java
@@ -78,16 +78,22 @@ public class PrestoFilterUtil {
HiveType colType = columnHandle.getHiveType();
if (colType.equals(HiveType.HIVE_BOOLEAN)) {
return DataTypes.BOOLEAN;
+ } else if (colType.equals(HiveType.HIVE_BINARY)) {
+ return DataTypes.BINARY;
} else if (colType.equals(HiveType.HIVE_SHORT)) {
return DataTypes.SHORT;
} else if (colType.equals(HiveType.HIVE_INT)) {
return DataTypes.INT;
+ } else if (colType.equals(HiveType.HIVE_FLOAT)) {
+ return DataTypes.FLOAT;
} else if (colType.equals(HiveType.HIVE_LONG)) {
return DataTypes.LONG;
} else if (colType.equals(HiveType.HIVE_DOUBLE)) {
return DataTypes.DOUBLE;
} else if (colType.equals(HiveType.HIVE_STRING)) {
return DataTypes.STRING;
+ } else if (colType.equals(HiveType.HIVE_BYTE)) {
+ return DataTypes.BYTE;
} else if (colType.equals(HiveType.HIVE_DATE)) {
return DataTypes.DATE;
} else if (colType.equals(HiveType.HIVE_TIMESTAMP)) {
@@ -282,9 +288,11 @@ public class PrestoFilterUtil {
private static Object convertDataByType(Object rawData, HiveType type) {
if (type.equals(HiveType.HIVE_INT) || type.equals(HiveType.HIVE_SHORT)) {
return Integer.valueOf(rawData.toString());
+ } else if (type.equals(HiveType.HIVE_FLOAT)) {
+ return Float.intBitsToFloat((int) ((Long) rawData).longValue());
} else if (type.equals(HiveType.HIVE_LONG)) {
return rawData;
- } else if (type.equals(HiveType.HIVE_STRING)) {
+ } else if (type.equals(HiveType.HIVE_STRING) ||
type.equals(HiveType.HIVE_BINARY)) {
if (rawData instanceof Slice) {
return ((Slice) rawData).toStringUtf8();
} else {
diff --git
a/integration/presto/src/main/prestosql/org/apache/carbondata/presto/PrestoFilterUtil.java
b/integration/presto/src/main/prestosql/org/apache/carbondata/presto/PrestoFilterUtil.java
index e5449f0..310b214 100755
---
a/integration/presto/src/main/prestosql/org/apache/carbondata/presto/PrestoFilterUtil.java
+++
b/integration/presto/src/main/prestosql/org/apache/carbondata/presto/PrestoFilterUtil.java
@@ -78,16 +78,22 @@ public class PrestoFilterUtil {
HiveType colType = columnHandle.getHiveType();
if (colType.equals(HiveType.HIVE_BOOLEAN)) {
return DataTypes.BOOLEAN;
+ } else if (colType.equals(HiveType.HIVE_BINARY)) {
+ return DataTypes.BINARY;
} else if (colType.equals(HiveType.HIVE_SHORT)) {
return DataTypes.SHORT;
} else if (colType.equals(HiveType.HIVE_INT)) {
return DataTypes.INT;
+ } else if (colType.equals(HiveType.HIVE_FLOAT)) {
+ return DataTypes.FLOAT;
} else if (colType.equals(HiveType.HIVE_LONG)) {
return DataTypes.LONG;
} else if (colType.equals(HiveType.HIVE_DOUBLE)) {
return DataTypes.DOUBLE;
} else if (colType.equals(HiveType.HIVE_STRING)) {
return DataTypes.STRING;
+ } else if (colType.equals(HiveType.HIVE_BYTE)) {
+ return DataTypes.BYTE;
} else if (colType.equals(HiveType.HIVE_DATE)) {
return DataTypes.DATE;
} else if (colType.equals(HiveType.HIVE_TIMESTAMP)) {
@@ -282,9 +288,11 @@ public class PrestoFilterUtil {
private static Object convertDataByType(Object rawData, HiveType type) {
if (type.equals(HiveType.HIVE_INT) || type.equals(HiveType.HIVE_SHORT)) {
return Integer.valueOf(rawData.toString());
+ } else if (type.equals(HiveType.HIVE_FLOAT)) {
+ return Float.intBitsToFloat((int) ((Long) rawData).longValue());
} else if (type.equals(HiveType.HIVE_LONG)) {
return rawData;
- } else if (type.equals(HiveType.HIVE_STRING)) {
+ } else if (type.equals(HiveType.HIVE_STRING) ||
type.equals(HiveType.HIVE_BINARY)) {
if (rawData instanceof Slice) {
return ((Slice) rawData).toStringUtf8();
} else {
diff --git
a/integration/presto/src/test/scala/org/apache/carbondata/presto/integrationtest/PrestoTestNonTransactionalTableFiles.scala
b/integration/presto/src/test/scala/org/apache/carbondata/presto/integrationtest/PrestoTestNonTransactionalTableFiles.scala
index 611f33d..6bee1ed 100644
---
a/integration/presto/src/test/scala/org/apache/carbondata/presto/integrationtest/PrestoTestNonTransactionalTableFiles.scala
+++
b/integration/presto/src/test/scala/org/apache/carbondata/presto/integrationtest/PrestoTestNonTransactionalTableFiles.scala
@@ -223,6 +223,12 @@ class PrestoTestNonTransactionalTableFiles extends
FunSuiteLike with BeforeAndAf
String.valueOf(i.toFloat / 2)))
i += 1
}
+ writer
+ .write(Array[String]("true",
+ String.valueOf(i),
+ String.valueOf("abc"),
+ String.valueOf(i.toDouble / 2),
+ String.valueOf(i.toFloat / 2)))
writer.close()
} catch {
case ex: Throwable => throw new RuntimeException(ex)
@@ -271,6 +277,14 @@ class PrestoTestNonTransactionalTableFiles extends
FunSuiteLike with BeforeAndAf
.executeQuery("SELECT COUNT(*) AS RESULT FROM files ")
val expectedResult: List[Map[String, Any]] = List(Map("RESULT" -> 3))
assert(actualResult.equals(expectedResult))
+
+ val FloatFilterResult: List[Map[String, Any]] = prestoServer
+ .executeQuery("SELECT * FROM files where salary > 0.0")
+ assert(FloatFilterResult.length == 2 )
+
+ val ByteFilterResult: List[Map[String, Any]] = prestoServer
+ .executeQuery("SELECT * FROM files where id = 2")
+ assert(ByteFilterResult.length == 1 )
cleanTestData()
}
@@ -302,7 +316,7 @@ class PrestoTestNonTransactionalTableFiles extends
FunSuiteLike with BeforeAndAf
buildTestDataOtherDataType(3, null, writerPathBinary)
val actualResult: List[Map[String, Any]] = prestoServer
.executeQuery("select id from files1 ")
- assert(actualResult.size == 3)
+ assert(actualResult.size == 4)
// check the binary byte Array size, as original hex encoded image byte
array size is 118198
assert(actualResult.head("id").asInstanceOf[Array[Byte]].length == 118198)
// validate some initial bytes
@@ -310,6 +324,10 @@ class PrestoTestNonTransactionalTableFiles extends
FunSuiteLike with BeforeAndAf
assert(actualResult.head("id").asInstanceOf[Array[Byte]](1) == 57)
assert(actualResult.head("id").asInstanceOf[Array[Byte]](2) == 53)
assert(actualResult.head("id").asInstanceOf[Array[Byte]](3) == 48)
+
+ val binaryFilterResult: List[Map[String, Any]] = prestoServer
+ .executeQuery("select id from files1 where id = cast('abc' as
varbinary)");
+ assert(binaryFilterResult.length == 1)
FileUtils.deleteDirectory(new File(writerPathBinary))
}