You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by mm...@apache.org on 2018/05/31 14:34:29 UTC

calcite git commit: [CALCITE-2345] added tests using fongo for Mongo Adapter (Andrei Sereda)

Repository: calcite
Updated Branches:
  refs/heads/master feb88cdfd -> 074d37a03


[CALCITE-2345] added tests using fongo for Mongo Adapter (Andrei Sereda)

Close apache/calcite#715


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

Branch: refs/heads/master
Commit: 074d37a0343cf96349a9e2634562249e4693e468
Parents: feb88cd
Author: Andrei Sereda <an...@nospam.com>
Authored: Thu May 31 00:32:20 2018 -0400
Committer: Michael Mior <mm...@uwaterloo.ca>
Committed: Thu May 31 10:31:49 2018 -0400

----------------------------------------------------------------------
 mongodb/pom.xml                                 |   6 +-
 .../calcite/adapter/mongodb/MongoSchema.java    |  14 +-
 .../adapter/mongodb/MongoAdapterTest.java       | 159 +++++++++++++++++++
 pom.xml                                         |   6 +
 4 files changed, 183 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/074d37a0/mongodb/pom.xml
----------------------------------------------------------------------
diff --git a/mongodb/pom.xml b/mongodb/pom.xml
index 8393706..25c0642 100644
--- a/mongodb/pom.xml
+++ b/mongodb/pom.xml
@@ -51,7 +51,6 @@ limitations under the License.
       <groupId>org.apache.calcite</groupId>
       <artifactId>calcite-linq4j</artifactId>
     </dependency>
-
     <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
@@ -67,6 +66,11 @@ limitations under the License.
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>com.github.fakemongo</groupId>
+      <artifactId>fongo</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.mongodb</groupId>
       <artifactId>mongo-java-driver</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/calcite/blob/074d37a0/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchema.java
----------------------------------------------------------------------
diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchema.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchema.java
index 40bdec5..85b3e61 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchema.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchema.java
@@ -19,13 +19,14 @@ package org.apache.calcite.adapter.mongodb;
 import org.apache.calcite.schema.Table;
 import org.apache.calcite.schema.impl.AbstractSchema;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 
 import com.mongodb.MongoClient;
 import com.mongodb.MongoClientOptions;
 import com.mongodb.MongoCredential;
 import com.mongodb.ServerAddress;
-
 import com.mongodb.client.MongoDatabase;
 
 import java.util.List;
@@ -56,6 +57,17 @@ public class MongoSchema extends AbstractSchema {
     }
   }
 
+  /**
+   * Allows tests to inject their instance of the database.
+   *
+   * @param mongoDb existing mongo database instance
+   */
+  @VisibleForTesting
+  MongoSchema(MongoDatabase mongoDb) {
+    super();
+    this.mongoDb = Preconditions.checkNotNull(mongoDb, "mongoDb");
+  }
+
   @Override protected Map<String, Table> getTableMap() {
     final ImmutableMap.Builder<String, Table> builder = ImmutableMap.builder();
     for (String collectionName : mongoDb.listCollectionNames()) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/074d37a0/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
----------------------------------------------------------------------
diff --git a/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java b/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
new file mode 100644
index 0000000..b6ca4f3
--- /dev/null
+++ b/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.calcite.adapter.mongodb;
+
+import org.apache.calcite.jdbc.CalciteConnection;
+import org.apache.calcite.schema.SchemaPlus;
+import org.apache.calcite.test.CalciteAssert;
+
+import com.github.fakemongo.junit.FongoRule;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+
+import org.bson.BsonDocument;
+import org.bson.Document;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+/**
+ * Tests current adapter using in-memory (fake) implementation of Mongo API:
+ * <a href="https://github.com/fakemongo/fongo">Fongo</a>.
+ *
+ */
+public class MongoAdapterTest {
+
+  @Rule
+  public final FongoRule rule = new FongoRule();
+
+  private MongoDatabase mongoDb;
+  private MongoCollection<Document> zips;
+
+  @Before
+  public void setUp() throws Exception {
+    mongoDb = rule.getDatabase(getClass().getSimpleName());
+    zips = mongoDb.getCollection("zips");
+  }
+
+  /**
+   * Handcrafted connection where we manually added {@link MongoSchema}
+   */
+  private CalciteAssert.ConnectionFactory newConnectionFactory() {
+    return new CalciteAssert.ConnectionFactory() {
+      @Override public Connection createConnection() throws SQLException {
+        Connection connection = DriverManager.getConnection("jdbc:calcite:");
+        final SchemaPlus root = connection.unwrap(CalciteConnection.class).getRootSchema();
+        root.add("mongo", new MongoSchema(mongoDb));
+        return connection;
+      }
+    };
+  }
+
+  @Test
+  public void single() {
+    zips.insertOne(new Document());
+    CalciteAssert.that()
+            .with(newConnectionFactory())
+            .query("select * from \"mongo\".\"zips\"")
+            .runs()
+            .returnsCount(1);
+  }
+
+  @Test
+  public void empty() {
+    // for some reason fongo doesn't list collection if it was unused
+    zips.insertOne(new Document());
+    zips.deleteMany(new BsonDocument());
+
+    CalciteAssert.that()
+            .with(newConnectionFactory())
+            .query("select * from \"mongo\".\"zips\"")
+            .runs()
+            .returnsCount(0);
+  }
+
+  @Test
+  public void filter() {
+    zips.insertOne(new Document("CITY", "New York").append("STATE", "NY"));
+    zips.insertOne(new Document("CITY", "Washington").append("STATE", "DC"));
+
+    CalciteAssert.that()
+            .with(newConnectionFactory())
+            .query("select cast(_MAP['CITY'] as varchar(20)) as \"city\" from \"mongo\".\"zips\" "
+                    + " where _MAP['STATE'] = 'NY'")
+            .returns("city=New York\n");
+
+    CalciteAssert.that()
+            .with(newConnectionFactory())
+            .query("select cast(_MAP['CITY'] as varchar(20)) as \"city\" from \"mongo\".\"zips\" "
+                   + " where _MAP['STATE'] = 'DC'")
+            .returns("city=Washington\n");
+
+    CalciteAssert.that()
+            .with(newConnectionFactory())
+            .query("select cast(_MAP['CITY'] as varchar(20)) as \"city\" from \"mongo\".\"zips\" "
+                    + " where _MAP['STATE'] in ('DC', 'NY')")
+            .returns("city=New York\ncity=Washington\n");
+  }
+
+  @Test
+  public void limit() {
+    zips.insertOne(new Document("CITY", "New York").append("STATE", "NY"));
+    zips.insertOne(new Document("CITY", "Washington").append("STATE", "DC"));
+
+    CalciteAssert.that()
+            .with(newConnectionFactory())
+            .query("select * from \"mongo\".\"zips\" limit 1")
+            .returnsCount(1);
+
+    CalciteAssert.that()
+            .with(newConnectionFactory())
+            .query("select * from \"mongo\".\"zips\" limit 2")
+            .returnsCount(2);
+
+  }
+
+  /**
+   * Following queries are not supported in Mongo adapter :
+   * <pre>
+   * {@code A and (B or C)}
+   * {@code (A or B) and C}
+   * </pre>
+   *
+   * @see <a href="https://issues.apache.org/jira/browse/CALCITE-2331">[CALCITE-2331]</a>
+   */
+  @Ignore("broken; [CALCITE-2331] is logged to fix it")
+  @Test
+  public void validateCALCITE2331() {
+    zips.insertOne(new Document("CITY", "New York").append("STATE", "NY"));
+    zips.insertOne(new Document("CITY", "Washington").append("STATE", "DC"));
+
+    CalciteAssert.that()
+            .with(newConnectionFactory())
+            .query("select cast(_MAP['CITY'] as varchar(20)) as \"city\" from \"mongo\".\"zips\" "
+                    + " where _MAP['STATE'] in ('DC', 'NY') and _MAP['CITY'] = 'New York'")
+            .returns("city=New York\n");
+  }
+}
+
+// End MongoAdapterTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/074d37a0/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 277f5b0..f7544ed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -77,6 +77,7 @@ limitations under the License.
     <freemarker.version>2.3.25-incubating</freemarker.version>
     <git-commit-id-plugin.version>2.1.9</git-commit-id-plugin.version>
     <geode.version>1.3.0</geode.version>
+    <fongo.version>2.1.1</fongo.version>
 
     <!-- We support (and test against) Guava versions between
          19.0 and 23.0. Default is 19.0 due to Cassandra adapter. -->
@@ -459,6 +460,11 @@ limitations under the License.
         <version>${mongo-java-driver.version}</version>
       </dependency>
       <dependency>
+        <groupId>com.github.fakemongo</groupId>
+        <artifactId>fongo</artifactId>
+        <version>${fongo.version}</version>
+      </dependency>
+      <dependency>
         <groupId>org.openjdk.jmh</groupId>
         <artifactId>jmh-core</artifactId>
         <version>${jmh.version}</version>