This is an automated email from the ASF dual-hosted git repository.

kgyrtkirk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 1961d13  [CALCITE-2802] Druid adapter: Usage of range conditions like 
"2010-01-01 < timestamp" leads to incorrect results
1961d13 is described below

commit 1961d13fd801a6ef8d12ae6babdb75e61f87013f
Author: Zoltan Haindrich <k...@rxd.hu>
AuthorDate: Thu Jan 24 14:16:59 2019 +0100

    [CALCITE-2802] Druid adapter: Usage of range conditions like "2010-01-01 < 
timestamp" leads to incorrect results
---
 .../calcite/adapter/druid/DruidDateTimeUtils.java       | 14 ++++++--------
 .../apache/calcite/test/DruidDateRangeRulesTest.java    | 17 +++++++++++++++++
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git 
a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidDateTimeUtils.java 
b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidDateTimeUtils.java
index 8f24798..8fa16da 100644
--- 
a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidDateTimeUtils.java
+++ 
b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidDateTimeUtils.java
@@ -62,8 +62,7 @@ public class DruidDateTimeUtils {
    */
   @Nullable
   public static List<Interval> createInterval(RexNode e) {
-    final List<Range<Long>> ranges =
-        extractRanges(e, false);
+    final List<Range<Long>> ranges = extractRanges(e, false);
     if (ranges == null) {
       // We did not succeed, bail out
       return null;
@@ -72,11 +71,8 @@ public class DruidDateTimeUtils {
     for (Range r : ranges) {
       condensedRanges.add(r);
     }
-    if (LOGGER.isDebugEnabled()) {
-      LOGGER.debug("Inferred ranges on interval : " + condensedRanges);
-    }
-    return toInterval(
-        ImmutableList.<Range>copyOf(condensedRanges.asRanges()));
+    LOGGER.debug("Inferred ranges on interval : {}", condensedRanges);
+    return 
toInterval(ImmutableList.<Range<Long>>copyOf(condensedRanges.asRanges()));
   }
 
   protected static List<Interval> toInterval(
@@ -177,16 +173,18 @@ public class DruidDateTimeUtils {
     case GREATER_THAN_OR_EQUAL:
     {
       final Long value;
+      SqlKind kind = call.getKind();
       if (call.getOperands().get(0) instanceof RexInputRef
           && literalValue(call.getOperands().get(1)) != null) {
         value = literalValue(call.getOperands().get(1));
       } else if (call.getOperands().get(1) instanceof RexInputRef
           && literalValue(call.getOperands().get(0)) != null) {
         value = literalValue(call.getOperands().get(0));
+        kind = kind.reverse();
       } else {
         return null;
       }
-      switch (call.getKind()) {
+      switch (kind) {
       case LESS_THAN:
         return ImmutableList.of(withNot ? Range.atLeast(value) : 
Range.lessThan(value));
       case LESS_THAN_OR_EQUAL:
diff --git 
a/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java 
b/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java
index 9caa413..6f3d3eb 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java
@@ -49,6 +49,15 @@ public class DruidDateRangeRulesTest {
         is("[2014-06-01T00:00:00.000Z/2014-07-01T00:00:00.000Z]"));
   }
 
+  @Test public void testRangeCalc() {
+    final Fixture2 f = new Fixture2();
+    checkDateRange(f,
+        f.and(
+            f.le(f.timestampLiteral(2011, Calendar.JANUARY, 1), f.t),
+            f.le(f.t, f.timestampLiteral(2012, Calendar.FEBRUARY, 2))),
+        is("[2011-01-01T00:00:00.000Z/2012-02-02T00:00:00.001Z]"));
+  }
+
   @Test public void testExtractYearAndDayFromDateColumn() {
     final Fixture2 f = new Fixture2();
     // AND(AND(>=($8, 2010-01-01), <($8, 2011-01-01)),
@@ -175,6 +184,14 @@ public class DruidDateRangeRulesTest {
           SqlStdOperatorTable.EXTRACT,
           ImmutableList.of(rexBuilder.makeFlag(TimeUnitRange.DAY), ts));
     }
+
+    public RexNode timestampLiteral(int year, int month, int day) {
+      final Calendar c = Util.calendar();
+      c.clear();
+      c.set(year, month, day);
+      final TimestampString ts = TimestampString.fromCalendarFields(c);
+      return timestampLiteral(ts);
+    }
   }
 }
 

Reply via email to