You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2018/12/03 21:21:40 UTC
[3/3] calcite git commit: [CALCITE-2709] In Geode adapter,
allow filtering on DATE, TIME, TIMESTAMP fields (Sandeep Chada)
[CALCITE-2709] In Geode adapter, allow filtering on DATE, TIME, TIMESTAMP fields (Sandeep Chada)
GeodeFilter changes to support filtering with datetime types (DATE,
TIME, TIMESTAMP).
Close apache/calcite#952
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/be540471
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/be540471
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/be540471
Branch: refs/heads/master
Commit: be5404713bbcd8cdc19f2651af33707b895d2c04
Parents: 25c332d
Author: chadasa <44...@users.noreply.github.com>
Authored: Sat Dec 1 20:44:09 2018 +0530
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Dec 3 10:57:14 2018 -0800
----------------------------------------------------------------------
.../calcite/adapter/geode/rel/GeodeFilter.java | 24 +-
.../geode/rel/GeodeAllDataTypesTest.java | 233 ++++++++++++++++---
.../calcite/adapter/geode/rel/JsonLoader.java | 9 +-
3 files changed, 225 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/be540471/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java
----------------------------------------------------------------------
diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java
index 9887306..91435fe 100644
--- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java
+++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java
@@ -30,6 +30,9 @@ import org.apache.calcite.rex.RexInputRef;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.util.DateString;
+import org.apache.calcite.util.TimeString;
+import org.apache.calcite.util.TimestampString;
import org.apache.calcite.util.Util;
import com.google.common.base.Preconditions;
@@ -98,10 +101,23 @@ public class GeodeFilter extends Filter implements GeodeRel {
* @return String representation of the literal
*/
private static String literalValue(RexLiteral literal) {
- Object value = literal.getValue3();
- StringBuilder buf = new StringBuilder();
- buf.append(value);
- return buf.toString();
+ final Comparable valueComparable = literal.getValueAs(Comparable.class);
+
+ switch (literal.getTypeName()) {
+ case TIMESTAMP:
+ case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
+ assert valueComparable instanceof TimestampString;
+ return "TIMESTAMP '" + valueComparable.toString() + "'";
+ case DATE:
+ assert valueComparable instanceof DateString;
+ return "DATE '" + valueComparable.toString() + "'";
+ case TIME:
+ case TIME_WITH_LOCAL_TIME_ZONE:
+ assert valueComparable instanceof TimeString;
+ return "TIME '" + valueComparable.toString() + "'";
+ default:
+ return String.valueOf(literal.getValue3());
+ }
}
/**
http://git-wip-us.apache.org/repos/asf/calcite/blob/be540471/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java
----------------------------------------------------------------------
diff --git a/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java b/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java
index 9af131a..41700e5 100644
--- a/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java
+++ b/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java
@@ -23,6 +23,9 @@ import org.apache.calcite.test.CalciteAssert;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.Region;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
import org.junit.BeforeClass;
import org.junit.Test;
@@ -32,9 +35,7 @@ import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
-import java.util.Arrays;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -45,42 +46,42 @@ public class GeodeAllDataTypesTest extends AbstractGeodeTest {
@BeforeClass
public static void setUp() {
- Cache cache = POLICY.cache();
- Region<?, ?> region = cache.<String, Object>createRegionFactory().create("allDataTypesRegion");
+ final Cache cache = POLICY.cache();
+ final Region<?, ?> region =
+ cache.<String, Object>createRegionFactory()
+ .create("allDataTypesRegion");
- List<Map> mapList = createMapList();
+ final List<Map<String, Object>> mapList = createMapList();
new JsonLoader(region).loadMapList(mapList);
}
- private static List<Map> createMapList() {
-
- return Arrays.asList(
- new HashMap() {{
- put("booleanValue", true);
- put("dateValue", Date.valueOf("2018-02-03"));
- put("timeValue", Time.valueOf("02:22:23"));
- put("timestampValue", Timestamp.valueOf("2018-02-03 02:22:33"));
- put("stringValue", "abc");
- put("floatValue", 1.5678);
- }},
- new HashMap() {{
- put("booleanValue", false);
- put("dateValue", Date.valueOf("2018-02-04"));
- put("timeValue", Time.valueOf("03:22:23"));
- put("timestampValue", Timestamp.valueOf("2018-02-04 04:22:33"));
- put("stringValue", "def");
- put("floatValue", 3.5678);
- }},
- new HashMap() {{
- put("booleanValue", true);
- put("dateValue", Date.valueOf("2018-02-05"));
- put("timeValue", Time.valueOf("04:22:23"));
- put("timestampValue", Timestamp.valueOf("2018-02-05 04:22:33"));
- put("stringValue", "ghi");
- put("floatValue", 8.9267);
- }}
- );
+ private static List<Map<String, Object>> createMapList() {
+ return ImmutableList.of(
+ ImmutableMap.<String, Object>builder()
+ .put("booleanValue", true)
+ .put("dateValue", Date.valueOf("2018-02-03"))
+ .put("timeValue", Time.valueOf("02:22:23"))
+ .put("timestampValue", Timestamp.valueOf("2018-02-03 02:22:33"))
+ .put("stringValue", "abc")
+ .put("floatValue", 1.5678)
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("booleanValue", false)
+ .put("dateValue", Date.valueOf("2018-02-04"))
+ .put("timeValue", Time.valueOf("03:22:23"))
+ .put("timestampValue", Timestamp.valueOf("2018-02-04 04:22:33"))
+ .put("stringValue", "def")
+ .put("floatValue", 3.5678)
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("booleanValue", true)
+ .put("dateValue", Date.valueOf("2018-02-05"))
+ .put("timeValue", Time.valueOf("04:22:23"))
+ .put("timestampValue", Timestamp.valueOf("2018-02-05 04:22:33"))
+ .put("stringValue", "ghi")
+ .put("floatValue", 8.9267)
+ .build());
}
private CalciteAssert.ConnectionFactory newConnectionFactory() {
@@ -140,6 +141,172 @@ public class GeodeAllDataTypesTest extends AbstractGeodeTest {
+ "stringValue IN SET('abc', 'def') OR floatValue IN SET(1.5678, null) "
+ "OR booleanValue IN SET(true, false, null)"));
}
+
+ @Test
+ public void testSqlSingleDateWhereFilter() {
+ calciteAssert()
+ .query("SELECT dateValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE dateValue = DATE '2018-02-03'")
+ .returnsCount(1)
+ .queryContains(
+ GeodeAssertions.query("SELECT dateValue AS dateValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE dateValue = DATE '2018-02-03'"));
+
+ calciteAssert()
+ .query("SELECT dateValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE dateValue > DATE '2018-02-03'")
+ .returnsCount(2)
+ .queryContains(
+ GeodeAssertions.query("SELECT dateValue AS dateValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE dateValue > DATE '2018-02-03'"));
+
+ calciteAssert()
+ .query("SELECT dateValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE dateValue < DATE '2018-02-03'")
+ .returnsCount(0)
+ .queryContains(
+ GeodeAssertions.query("SELECT dateValue AS dateValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE dateValue < DATE '2018-02-03'"));
+ }
+
+ @Test
+ public void testSqlMultipleDateWhereFilter() {
+ calciteAssert()
+ .query("SELECT dateValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE dateValue = DATE '2018-02-03'\n"
+ + " OR dateValue = DATE '2018-02-04'")
+ .returnsCount(2)
+ .queryContains(
+ GeodeAssertions.query("SELECT dateValue AS dateValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE dateValue IN SET(DATE '2018-02-03',"
+ + " DATE '2018-02-04')"));
+ }
+
+ @Test
+ public void testSqlSingleTimeWhereFilter() {
+ calciteAssert()
+ .query("SELECT timeValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE timeValue = TIME '02:22:23'")
+ .returnsCount(1)
+ .queryContains(
+ GeodeAssertions.query("SELECT timeValue AS timeValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE timeValue = TIME '02:22:23'"));
+
+ calciteAssert()
+ .query("SELECT timeValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE timeValue > TIME '02:22:23'")
+ .returnsCount(2)
+ .queryContains(
+ GeodeAssertions.query("SELECT timeValue AS timeValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE timeValue > TIME '02:22:23'"));
+
+ calciteAssert()
+ .query("SELECT timeValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE timeValue < TIME '02:22:23'")
+ .returnsCount(0)
+ .queryContains(
+ GeodeAssertions.query("SELECT timeValue AS timeValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE timeValue < TIME '02:22:23'"));
+ }
+
+ @Test
+ public void testSqlMultipleTimeWhereFilter() {
+ calciteAssert()
+ .query("SELECT timeValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE timeValue = TIME '02:22:23'\n"
+ + " OR timeValue = TIME '03:22:23'")
+ .returnsCount(2)
+ .queryContains(
+ GeodeAssertions.query("SELECT timeValue AS timeValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE timeValue IN SET(TIME '02:22:23', TIME '03:22:23')"));
+ }
+
+ @Test
+ public void testSqlSingleTimestampWhereFilter() {
+ calciteAssert()
+ .query("SELECT timestampValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE timestampValue = TIMESTAMP '2018-02-03 02:22:33'")
+ .returnsCount(1)
+ .queryContains(
+ GeodeAssertions.query("SELECT timestampValue AS timestampValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE timestampValue = TIMESTAMP '2018-02-03 02:22:33'"));
+
+ calciteAssert()
+ .query("SELECT timestampValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE timestampValue > TIMESTAMP '2018-02-03 02:22:33'")
+ .returnsCount(2)
+ .queryContains(
+ GeodeAssertions.query("SELECT timestampValue AS timestampValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE timestampValue > TIMESTAMP '2018-02-03 02:22:33'"));
+
+ calciteAssert()
+ .query("SELECT timestampValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE timestampValue < TIMESTAMP '2018-02-03 02:22:33'")
+ .returnsCount(0)
+ .queryContains(
+ GeodeAssertions.query("SELECT timestampValue AS timestampValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE timestampValue < TIMESTAMP '2018-02-03 02:22:33'"));
+ }
+
+ @Test
+ public void testSqlMultipleTimestampWhereFilter() {
+ calciteAssert()
+ .query("SELECT timestampValue\n"
+ + "FROM geode.allDataTypesRegion\n"
+ + "WHERE timestampValue = TIMESTAMP '2018-02-03 02:22:33'\n"
+ + " OR timestampValue = TIMESTAMP '2018-02-05 04:22:33'")
+ .returnsCount(2)
+ .queryContains(
+ GeodeAssertions.query("SELECT timestampValue AS timestampValue "
+ + "FROM /allDataTypesRegion "
+ + "WHERE timestampValue IN SET("
+ + "TIMESTAMP '2018-02-03 02:22:33', "
+ + "TIMESTAMP '2018-02-05 04:22:33')"));
+ }
+
+ @Test
+ public void testSqlWhereWithMultipleOrForAllFields() {
+ calciteAssert()
+ .query("SELECT stringValue "
+ + "FROM geode.allDataTypesRegion WHERE (stringValue = 'abc' OR stringValue = 'def') OR "
+ + "(floatValue = 1.5678 OR floatValue = null) OR "
+ + "(dateValue = DATE '2018-02-05' OR dateValue = DATE '2018-02-06' ) OR "
+ + "(timeValue = TIME '03:22:23' OR timeValue = TIME '07:22:23') OR "
+ + "(timestampValue = TIMESTAMP '2018-02-05 04:22:33' OR "
+ + "timestampValue = TIMESTAMP '2017-02-05 04:22:33') OR "
+ + "(booleanValue = true OR booleanValue = false OR booleanValue = null)")
+ .returnsCount(3)
+ .queryContains(
+ GeodeAssertions.query("SELECT stringValue AS stringValue "
+ + "FROM /allDataTypesRegion WHERE "
+ + "stringValue IN SET('abc', 'def') OR floatValue IN SET(1.5678, null) OR dateValue "
+ + "IN SET(DATE '2018-02-05', DATE '2018-02-06') OR timeValue "
+ + "IN SET(TIME '03:22:23', TIME '07:22:23') OR timestampValue "
+ + "IN SET(TIMESTAMP '2018-02-05 04:22:33', TIMESTAMP '2017-02-05 04:22:33') "
+ + "OR booleanValue IN SET(true, false, null)"));
+ }
}
// End GeodeAllDataTypesTest.java
http://git-wip-us.apache.org/repos/asf/calcite/blob/be540471/geode/src/test/java/org/apache/calcite/adapter/geode/rel/JsonLoader.java
----------------------------------------------------------------------
diff --git a/geode/src/test/java/org/apache/calcite/adapter/geode/rel/JsonLoader.java b/geode/src/test/java/org/apache/calcite/adapter/geode/rel/JsonLoader.java
index 90bb560..235e3e3 100644
--- a/geode/src/test/java/org/apache/calcite/adapter/geode/rel/JsonLoader.java
+++ b/geode/src/test/java/org/apache/calcite/adapter/geode/rel/JsonLoader.java
@@ -53,18 +53,19 @@ class JsonLoader {
private void load(Reader reader) throws IOException {
Objects.requireNonNull(reader, "reader");
try (BufferedReader br = new BufferedReader(reader)) {
- List<Map> mapList = new ArrayList<>();
+ List<Map<String, Object>> mapList = new ArrayList<>();
for (String line; (line = br.readLine()) != null;) {
- Map jsonMap = mapper.readValue(line, Map.class);
+ @SuppressWarnings("unchecked")
+ Map<String, Object> jsonMap = mapper.readValue(line, Map.class);
mapList.add(jsonMap);
}
loadMapList(mapList);
}
}
- void loadMapList(List<Map> mapList) {
+ void loadMapList(List<Map<String, Object>> mapList) {
int key = 0;
- for (Map jsonMap : mapList) {
+ for (Map<String, Object> jsonMap : mapList) {
PdxInstance pdxInstance = mapToPdx(rootPackage, jsonMap);
region.put(key++, pdxInstance);
}