You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2017/07/27 01:49:26 UTC

[3/7] metamodel git commit: Test cases for the join implementation

Test cases for the join implementation


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

Branch: refs/heads/master
Commit: ef5ac06f17937365603e2be2eb1333c9d1407062
Parents: 65574d3
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Tue Jul 18 15:28:30 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Fri Jul 21 23:25:38 2017 +0200

----------------------------------------------------------------------
 .../apache/metamodel/MetaModelHelperTest.java   |  88 ++++++++--
 .../metamodel/jdbc/MultiJDBCDataSetTest.java    | 161 +++++++++++++++++++
 2 files changed, 235 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/ef5ac06f/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java b/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
index 540aa95..50591ca 100644
--- a/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
+++ b/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
@@ -115,21 +115,16 @@ public class MetaModelHelperTest extends MetaModelTestCase {
 
     public void testSimpleCarthesianProduct() throws Exception {
         DataSet dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet2());
-
+        List<String> results = new ArrayList<String>();
+        
+        while(dataSet.next()){
+          results.add(dataSet.getRow().toString());
+        }
         assertEquals(2, dataSet.getSelectItems().length);
-        assertTrue(dataSet.next());
-        assertEquals("Row[values=[f, b]]", dataSet.getRow().toString());
-        assertTrue(dataSet.next());
-        assertEquals("Row[values=[f, a]]", dataSet.getRow().toString());
-        assertTrue(dataSet.next());
-        assertTrue(dataSet.next());
-        assertTrue(dataSet.next());
-        assertTrue(dataSet.next());
-        assertTrue(dataSet.next());
-        assertTrue(dataSet.next());
-        assertTrue(dataSet.next());
-        assertEquals("Row[values=[o, r]]", dataSet.getRow().toString());
-        assertFalse(dataSet.next());
+        assertEquals(9, results.size());
+        assertTrue(results.contains("Row[values=[f, b]]"));
+        assertTrue(results.contains("Row[values=[f, a]]"));
+        assertTrue(results.contains("Row[values=[o, r]]"));
     }
 
     public void testTripleCarthesianProduct() throws Exception {
@@ -215,6 +210,52 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         DataSet dataSet4 = createDataSet(new SelectItem[] { new SelectItem("abc", "abc") }, data4);
         return dataSet4;
     }
+    
+    
+    
+    private int bigDataSetSize = 10000;
+
+    /**
+     * 
+     * @return a big dataset, mocking an employee table
+     */
+    private DataSet createDataSet5() {
+      List<Object[]> data5 = new ArrayList<Object[]>();
+      
+      
+      for(int i = 0; i<bigDataSetSize;i++){
+        data5.add(new Object[]{i,"Person_" + i, bigDataSetSize-(i+1) });
+      }
+      
+      DataSet dataSet5 = createDataSet(
+          new SelectItem[] { 
+              new SelectItem(new MutableColumn("nr", ColumnType.BIGINT)),
+              new SelectItem(new MutableColumn("name", ColumnType.STRING)),
+              new SelectItem(new MutableColumn("dnr", ColumnType.BIGINT))
+          }, 
+          data5);
+      return dataSet5;
+  }
+    
+    /**
+     * 
+     * @return a big dataset, mocking an department table
+     */
+    private DataSet createDataSet6() {
+      List<Object[]> data6 = new ArrayList<Object[]>();
+
+      for(int i = 0; i<bigDataSetSize;i++){
+        data6.add(new Object[]{i,"Department_" + i });
+      }
+      
+      DataSet dataSet6 = createDataSet(
+          new SelectItem[] { 
+              new SelectItem(new MutableColumn("nr", ColumnType.BIGINT)),
+              new SelectItem(new MutableColumn("name", ColumnType.STRING)),
+          }, 
+          data6);
+      return dataSet6;
+  }
 
     public void testGetTables() throws Exception {
         MutableTable table1 = new MutableTable("table1");
@@ -324,4 +365,23 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         assertEquals("Row[values=[1, 2, null]]", joinedDs.getRow().toString());
         assertFalse(joinedDs.next());
     }
+    
+    
+    public void testCarthesianProductScalability(){
+      
+      DataSet employees = createDataSet5();
+      DataSet departmens = createDataSet6();
+      
+      FilterItem fi = new FilterItem(employees.getSelectItems()[2], OperatorType.EQUALS_TO,departmens.getSelectItems()[0]);
+      
+      DataSet joined =  MetaModelHelper.getCarthesianProduct(new DataSet[]{employees,departmens}, fi);
+      int count = 0; 
+      while(joined.next()){
+        count++;
+      }
+      
+      assertTrue(count == 10000);
+      
+      
+    }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ef5ac06f/jdbc/src/test/java/org/apache/metamodel/jdbc/MultiJDBCDataSetTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/MultiJDBCDataSetTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/MultiJDBCDataSetTest.java
new file mode 100644
index 0000000..d910362
--- /dev/null
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/MultiJDBCDataSetTest.java
@@ -0,0 +1,161 @@
+/**
+ * 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.metamodel.jdbc;
+
+import com.google.common.base.Stopwatch;
+import org.apache.metamodel.CompositeDataContext;
+import org.apache.metamodel.UpdateableDataContext;
+import org.apache.metamodel.create.CreateTable;
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.data.Row;
+import org.apache.metamodel.drop.DropTable;
+import org.apache.metamodel.insert.InsertInto;
+import org.apache.metamodel.schema.ColumnType;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A test case using two simple h2 in memory databases for executing single query over both databases.
+ */
+public class MultiJDBCDataSetTest {
+
+
+    public static final String DRIVER_CLASS = "org.h2.Driver";
+    public static final String EMP_URL_MEMORY_DATABASE = "jdbc:h2:mem:emp";
+    public static final String DEP_URL_MEMORY_DATABASE = "jdbc:h2:mem:dep";
+
+    private Connection dep_conn;
+    private UpdateableDataContext dep_dcon;
+
+    private Connection emp_conn;
+    private UpdateableDataContext emp_dcon;
+
+    private int employeeSize = 10000;
+    private int departmentSize = 1000;
+    int employeesPerDepartment =  employeeSize/ departmentSize;
+
+
+    private static final Logger logger = LoggerFactory.getLogger(MultiJDBCDataSetTest.class);
+
+
+    @Before
+    public void setup() throws Exception {
+        Class.forName(DRIVER_CLASS);
+        emp_conn = DriverManager.getConnection(EMP_URL_MEMORY_DATABASE);
+        dep_conn =  DriverManager.getConnection(DEP_URL_MEMORY_DATABASE);
+
+
+        emp_dcon = new JdbcDataContext(emp_conn);
+        dep_dcon = new JdbcDataContext(dep_conn);
+
+
+
+
+        emp_dcon.executeUpdate(new CreateTable(emp_dcon.getDefaultSchema(),"employee")
+                .withColumn("id").ofType(ColumnType.INTEGER).asPrimaryKey()
+                .withColumn("name").ofType(ColumnType.VARCHAR).ofSize(200)
+                .withColumn("dep_id").ofType(ColumnType.INTEGER));
+
+
+        for(int i = 0;i<employeeSize;i++){
+            emp_dcon.executeUpdate(new InsertInto(emp_dcon.getDefaultSchema().getTableByName("employee"))
+                    .value("id",i)
+                    .value("name","emp" + i)
+                    .value("dep_id",i% departmentSize));
+        }
+
+
+        dep_dcon.executeUpdate(new CreateTable(dep_dcon.getDefaultSchema(),"department")
+                .withColumn("id").ofType(ColumnType.INTEGER).asPrimaryKey()
+                .withColumn("name").ofType(ColumnType.VARCHAR).ofSize(200));
+
+
+        for(int i = 0; i< departmentSize; i++){
+            dep_dcon.executeUpdate(new InsertInto(dep_dcon.getDefaultSchema().getTableByName("department"))
+                    .value("id",i)
+                    .value("name","dep" + i));
+        }
+
+    }
+
+
+    @After
+    public void tearDown(){
+        dep_dcon.executeUpdate(new DropTable("department"));
+        emp_dcon.executeUpdate(new DropTable("employee"));
+    }
+
+
+
+    @Test
+    public void testJoin(){
+        Stopwatch duration = Stopwatch.createStarted();
+        CompositeDataContext compDcon = new CompositeDataContext(this.emp_dcon,this.dep_dcon );
+
+        DataSet ds = compDcon.query()
+                .from("employee")
+                .innerJoin("department")
+                .on("dep_id","id")
+                .selectAll()
+                .execute();
+        int rowCount = 0;
+        while(ds.next()){
+            Row row = ds.getRow();
+            rowCount++;
+        }
+        duration.stop();
+        logger.info("Test duration was {} ms", duration.elapsed(TimeUnit.MILLISECONDS));
+
+        Assert.assertEquals(employeeSize,rowCount);
+
+    }
+
+    @Test
+    public void testSelectiveJoin(){
+        Stopwatch duration = Stopwatch.createStarted();
+        CompositeDataContext compDcon = new CompositeDataContext(this.emp_dcon,this.dep_dcon );
+
+        DataSet ds = compDcon.query()
+                .from("employee")
+                .innerJoin("department")
+                .on("dep_id","id")
+                .selectAll()
+                .where(compDcon.getTableByQualifiedLabel("department").getColumnByName("id")).eq(1)
+                .execute();
+        int rowCount = 0;
+        while(ds.next()){
+            Row row = ds.getRow();
+            rowCount++;
+        }
+        duration.stop();
+        logger.info("Test duration was {} ms", duration.elapsed(TimeUnit.MILLISECONDS));
+
+        Assert.assertEquals(employeesPerDepartment,rowCount);
+
+    }
+
+
+
+
+}