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 2015/06/10 00:08:11 UTC

[7/7] incubator-calcite git commit: [CALCITE-665] ClassCastException in MongoDB adapter

[CALCITE-665] ClassCastException in MongoDB adapter


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/dbdb091d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/dbdb091d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/dbdb091d

Branch: refs/heads/master
Commit: dbdb091dc6fa5d2322d87df65bde142276930129
Parents: 6609cb1
Author: Julian Hyde <jh...@apache.org>
Authored: Mon Jun 8 10:25:55 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Jun 8 10:25:55 2015 -0700

----------------------------------------------------------------------
 .../adapter/mongodb/MongoEnumerator.java        | 21 ++++++++++---
 .../org/apache/calcite/test/MongoAdapterIT.java | 32 +++++++++++++++++---
 2 files changed, 44 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/dbdb091d/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java
----------------------------------------------------------------------
diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java
index 94efffb..0821f32 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java
@@ -19,6 +19,7 @@ package org.apache.calcite.adapter.mongodb;
 import org.apache.calcite.avatica.util.DateTimeUtils;
 import org.apache.calcite.linq4j.Enumerator;
 import org.apache.calcite.linq4j.function.Function1;
+import org.apache.calcite.linq4j.tree.Primitive;
 
 import com.mongodb.DBCursor;
 import com.mongodb.DBObject;
@@ -122,13 +123,23 @@ class MongoEnumerator implements Enumerator<Object> {
   }
 
   private static Object convert(Object o, Class clazz) {
-    if (o == null || clazz.isInstance(o)) {
+    if (o == null) {
+      return null;
+    }
+    Primitive primitive = Primitive.of(clazz);
+    if (primitive != null) {
+      clazz = primitive.boxClass;
+    } else {
+      primitive = Primitive.ofBox(clazz);
+    }
+    if (clazz.isInstance(o)) {
       return o;
     }
-    if (clazz == int.class || clazz == Integer.class) {
-      if (o instanceof Date) {
-        return (int) (((Date) o).getTime() / DateTimeUtils.MILLIS_PER_DAY);
-      }
+    if (o instanceof Date && primitive != null) {
+      o = ((Date) o).getTime() / DateTimeUtils.MILLIS_PER_DAY;
+    }
+    if (o instanceof Number && primitive != null) {
+      return primitive.number((Number) o);
     }
     return o;
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/dbdb091d/mongodb/src/test/java/org/apache/calcite/test/MongoAdapterIT.java
----------------------------------------------------------------------
diff --git a/mongodb/src/test/java/org/apache/calcite/test/MongoAdapterIT.java b/mongodb/src/test/java/org/apache/calcite/test/MongoAdapterIT.java
index d3b37e1..f994142 100644
--- a/mongodb/src/test/java/org/apache/calcite/test/MongoAdapterIT.java
+++ b/mongodb/src/test/java/org/apache/calcite/test/MongoAdapterIT.java
@@ -22,9 +22,11 @@ import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
 
 import com.google.common.base.Function;
+import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 
+import org.hamcrest.CoreMatchers;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -496,8 +498,8 @@ public class MongoAdapterIT {
         .query(
             "select state, avg(pop) as a from zips group by state order by state")
         .limit(2)
-        .returns("STATE=AK; A=2793.3230769230768\n"
-            + "STATE=AL; A=7126.255731922399\n")
+        .returns("STATE=AK; A=2793\n"
+            + "STATE=AL; A=7126\n")
         .queryContains(
             mongoChecker(
                 "{$project: {POP: '$pop', STATE: '$state'}}",
@@ -513,8 +515,8 @@ public class MongoAdapterIT {
         .query(
             "select state, avg(pop) as a, sum(pop) as s, count(pop) as c from zips group by state order by state")
         .limit(2)
-        .returns("STATE=AK; A=2793.3230769230768; S=544698; C=195\n"
-            + "STATE=AL; A=7126.255731922399; S=4040587; C=567\n")
+        .returns("STATE=AK; A=2793; S=544698; C=195\n"
+            + "STATE=AL; A=7126; S=4040587; C=567\n")
         .queryContains(
             mongoChecker(
                 "{$project: {POP: '$pop', STATE: '$state'}}",
@@ -774,6 +776,28 @@ public class MongoAdapterIT {
         .query("select cast(_MAP['date'] as DATE) from \"datatypes\"")
         .returnsUnordered("EXPR$0=2012-09-05");
   }
+
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-665">[CALCITE-665]
+   * ClassCastException in MongoDB adapter</a>. */
+  @Test public void testCountViaInt() {
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query("select count(*) from zips")
+        .returns(
+            new Function<ResultSet, Void>() {
+              public Void apply(ResultSet input) {
+                try {
+                  assertThat(input.next(), CoreMatchers.is(true));
+                  assertThat(input.getInt(1), CoreMatchers.is(29353));
+                  return null;
+                } catch (SQLException e) {
+                  throw Throwables.propagate(e);
+                }
+              }
+            });
+  }
 }
 
 // End MongoAdapterIT.java