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: JoÌrg Unbehauen <jo...@unbehauen.net> Authored: Tue Jul 18 15:28:30 2017 +0200 Committer: JoÌ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); + + } + + + + +}