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);
+
+ }
+
+
+
+
+}