| /** |
| * 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; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import org.apache.metamodel.data.DataSet; |
| import org.apache.metamodel.data.DataSetHeader; |
| import org.apache.metamodel.data.DefaultRow; |
| import org.apache.metamodel.data.EmptyDataSet; |
| import org.apache.metamodel.data.InMemoryDataSet; |
| import org.apache.metamodel.data.Row; |
| import org.apache.metamodel.data.SimpleDataSetHeader; |
| import org.apache.metamodel.data.SubSelectionDataSet; |
| import org.apache.metamodel.query.FilterItem; |
| import org.apache.metamodel.query.FromItem; |
| import org.apache.metamodel.query.JoinType; |
| import org.apache.metamodel.query.OperatorType; |
| import org.apache.metamodel.query.OrderByItem; |
| import org.apache.metamodel.query.Query; |
| import org.apache.metamodel.query.SelectItem; |
| import org.apache.metamodel.schema.Column; |
| import org.apache.metamodel.schema.ColumnType; |
| import org.apache.metamodel.schema.MutableColumn; |
| import org.apache.metamodel.schema.MutableTable; |
| import org.apache.metamodel.schema.Schema; |
| import org.apache.metamodel.schema.Table; |
| |
| public class MetaModelHelperTest extends MetaModelTestCase { |
| |
| public void testLeftJoin() throws Exception { |
| SelectItem si1 = new SelectItem(new MutableColumn("person_id", ColumnType.INTEGER)); |
| SelectItem si2 = new SelectItem(new MutableColumn("person_name", ColumnType.VARCHAR)); |
| SelectItem si3 = new SelectItem(new MutableColumn("person_age", ColumnType.INTEGER)); |
| SelectItem si4 = new SelectItem(new MutableColumn("person_role_id", ColumnType.INTEGER)); |
| SelectItem si5 = new SelectItem(new MutableColumn("role_id", ColumnType.INTEGER)); |
| SelectItem si6 = new SelectItem(new MutableColumn("role_name", ColumnType.VARCHAR)); |
| SelectItem si7 = new SelectItem(new MutableColumn("role_code", ColumnType.VARCHAR)); |
| List<Object[]> data1 = new ArrayList<Object[]>(); |
| data1.add(new Object[] { 1, "peter", 18, 1 }); |
| data1.add(new Object[] { 2, "tom", 19, 2 }); |
| data1.add(new Object[] { 3, "betty", 19, null }); |
| data1.add(new Object[] { 4, "barbara", 17, 3 }); |
| data1.add(new Object[] { 5, "susie", 18, 4 }); |
| |
| List<Object[]> data2 = new ArrayList<Object[]>(); |
| data2.add(new Object[] { 1, "class president", "clpr" }); |
| data2.add(new Object[] { 2, "bad boy", "bb" }); |
| data2.add(new Object[] { 4, "trying harder", "try" }); |
| |
| DataSet ds1 = createDataSet(new SelectItem[] { si1, si2, si3, si4 }, data1); |
| DataSet ds2 = createDataSet(new SelectItem[] { si5, si6, si7 }, data2); |
| FilterItem[] onConditions = new FilterItem[1]; |
| onConditions[0] = new FilterItem(si4, OperatorType.EQUALS_TO, si5); |
| |
| DataSet result = MetaModelHelper.getLeftJoin(ds1, ds2, onConditions); |
| List<Object[]> objectArrays = result.toObjectArrays(); |
| assertEquals("[1, peter, 18, 1, 1, class president, clpr]", Arrays.toString(objectArrays.get(0))); |
| assertEquals("[2, tom, 19, 2, 2, bad boy, bb]", Arrays.toString(objectArrays.get(1))); |
| assertEquals("[3, betty, 19, null, null, null, null]", Arrays.toString(objectArrays.get(2))); |
| assertEquals("[4, barbara, 17, 3, null, null, null]", Arrays.toString(objectArrays.get(3))); |
| assertEquals("[5, susie, 18, 4, 4, trying harder, try]", Arrays.toString(objectArrays.get(4))); |
| assertEquals(5, objectArrays.size()); |
| } |
| |
| public void testRightJoin() throws Exception { |
| SelectItem si1 = new SelectItem(new MutableColumn("person_id", ColumnType.INTEGER)); |
| SelectItem si2 = new SelectItem(new MutableColumn("person_name", ColumnType.VARCHAR)); |
| SelectItem si3 = new SelectItem(new MutableColumn("person_age", ColumnType.INTEGER)); |
| SelectItem si4 = new SelectItem(new MutableColumn("person_role_id", ColumnType.INTEGER)); |
| SelectItem si5 = new SelectItem(new MutableColumn("role_id", ColumnType.INTEGER)); |
| SelectItem si6 = new SelectItem(new MutableColumn("role_name", ColumnType.VARCHAR)); |
| SelectItem si7 = new SelectItem(new MutableColumn("role_code", ColumnType.VARCHAR)); |
| List<Object[]> data1 = new ArrayList<Object[]>(); |
| data1.add(new Object[] { 1, "peter", 18, 1 }); |
| data1.add(new Object[] { 2, "tom", 19, 2 }); |
| data1.add(new Object[] { 3, "betty", 19, null }); |
| data1.add(new Object[] { 4, "barbara", 17, 3 }); |
| |
| List<Object[]> data2 = new ArrayList<Object[]>(); |
| data2.add(new Object[] { 1, "class president", "clpr" }); |
| data2.add(new Object[] { 2, "bad boy", "bb" }); |
| data2.add(new Object[] { 4, "trying harder", "try" }); |
| |
| DataSet ds1 = createDataSet(new SelectItem[] { si1, si2, si3, si4 }, data1); |
| DataSet ds2 = createDataSet(new SelectItem[] { si5, si6, si7 }, data2); |
| FilterItem[] onConditions = new FilterItem[1]; |
| onConditions[0] = new FilterItem(si4, OperatorType.EQUALS_TO, si5); |
| |
| DataSet result = MetaModelHelper.getRightJoin(ds1, ds2, onConditions); |
| List<Object[]> objectArrays = result.toObjectArrays(); |
| assertEquals("[1, peter, 18, 1, 1, class president, clpr]", Arrays.toString(objectArrays.get(0))); |
| assertEquals("[2, tom, 19, 2, 2, bad boy, bb]", Arrays.toString(objectArrays.get(1))); |
| assertEquals("[null, null, null, null, 4, trying harder, try]", Arrays.toString(objectArrays.get(2))); |
| assertEquals(3, objectArrays.size()); |
| } |
| |
| public void testSimpleCarthesianProduct() throws Exception { |
| DataSet dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet2()); |
| |
| 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()); |
| } |
| |
| public void testTripleCarthesianProduct() throws Exception { |
| DataSet dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet2(), createDataSet3()); |
| assertEquals(4, dataSet.getSelectItems().length); |
| for (int i = 0; i < 3 * 3 * 2; i++) { |
| assertTrue("Assertion failed at i=" + i, dataSet.next()); |
| } |
| assertFalse(dataSet.next()); |
| } |
| |
| public void testTripleCarthesianProductWithWhereItems() throws Exception { |
| DataSet ds1 = createDataSet1(); |
| DataSet ds2 = createDataSet2(); |
| DataSet[] dataSets = new DataSet[] { ds1, ds2, }; |
| FilterItem w1 = new FilterItem(ds1.getSelectItems()[0], OperatorType.EQUALS_TO, "f"); |
| DataSet dataSet = MetaModelHelper.getCarthesianProduct(dataSets, w1); |
| assertEquals(2, dataSet.getSelectItems().length); |
| for (int i = 0; i < 1 * 3; i++) { |
| assertTrue("Assertion failed at i=" + i, dataSet.next()); |
| assertEquals("f", dataSet.getRow().getValue(0)); |
| } |
| assertFalse(dataSet.next()); |
| } |
| |
| public void testGetCarthesianProductNoRows() throws Exception { |
| DataSet dataSet = MetaModelHelper.getCarthesianProduct(createDataSet4(), createDataSet2(), createDataSet3()); |
| assertEquals(4, dataSet.getSelectItems().length); |
| assertFalse(dataSet.next()); |
| |
| dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet4(), createDataSet3()); |
| assertEquals(4, dataSet.getSelectItems().length); |
| assertFalse(dataSet.next()); |
| |
| dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet2(), createDataSet4()); |
| assertEquals(3, dataSet.getSelectItems().length); |
| assertFalse(dataSet.next()); |
| } |
| |
| public void testGetOrdered() throws Exception { |
| DataSet dataSet = createDataSet3(); |
| List<OrderByItem> orderByItems = new ArrayList<OrderByItem>(); |
| orderByItems.add(new OrderByItem(dataSet.getSelectItems()[0])); |
| |
| dataSet = MetaModelHelper.getOrdered(dataSet, orderByItems); |
| assertTrue(dataSet.next()); |
| assertEquals("Row[values=[w00p, true]]", dataSet.getRow().toString()); |
| assertTrue(dataSet.next()); |
| assertEquals("Row[values=[yippie, false]]", dataSet.getRow().toString()); |
| assertFalse(dataSet.next()); |
| } |
| |
| private DataSet createDataSet1() { |
| List<Object[]> data1 = new ArrayList<Object[]>(); |
| data1.add(new Object[] { "f" }); |
| data1.add(new Object[] { "o" }); |
| data1.add(new Object[] { "o" }); |
| DataSet dataSet1 = createDataSet( |
| new SelectItem[] { new SelectItem(new MutableColumn("foo", ColumnType.VARCHAR)) }, data1); |
| return dataSet1; |
| } |
| |
| private DataSet createDataSet2() { |
| List<Object[]> data2 = new ArrayList<Object[]>(); |
| data2.add(new Object[] { "b" }); |
| data2.add(new Object[] { "a" }); |
| data2.add(new Object[] { "r" }); |
| DataSet dataSet2 = createDataSet(new SelectItem[] { new SelectItem("bar", "bar") }, data2); |
| return dataSet2; |
| } |
| |
| private DataSet createDataSet3() { |
| List<Object[]> data3 = new ArrayList<Object[]>(); |
| data3.add(new Object[] { "w00p", true }); |
| data3.add(new Object[] { "yippie", false }); |
| DataSet dataSet3 = createDataSet(new SelectItem[] { new SelectItem("expression", "e"), |
| new SelectItem("webish?", "w") }, data3); |
| return dataSet3; |
| } |
| |
| private DataSet createDataSet4() { |
| List<Object[]> data4 = new ArrayList<Object[]>(); |
| DataSet dataSet4 = createDataSet(new SelectItem[] { new SelectItem("abc", "abc") }, data4); |
| return dataSet4; |
| } |
| |
| public void testGetTables() throws Exception { |
| MutableTable table1 = new MutableTable("table1"); |
| MutableTable table2 = new MutableTable("table2"); |
| MutableColumn t1column1 = new MutableColumn("t1c1", ColumnType.BIGINT); |
| MutableColumn t2column1 = new MutableColumn("t2c1", ColumnType.BIGINT); |
| MutableColumn t2column2 = new MutableColumn("t2c2", ColumnType.BIGINT); |
| table1.addColumn(t1column1); |
| t1column1.setTable(table1); |
| table2.addColumn(t2column1); |
| t2column1.setTable(table2); |
| table2.addColumn(t2column2); |
| t2column2.setTable(table2); |
| |
| ArrayList<Table> tableList = new ArrayList<Table>(); |
| tableList.add(table1); |
| |
| ArrayList<Column> columnList = new ArrayList<Column>(); |
| columnList.add(t2column1); |
| |
| Table[] tables = MetaModelHelper.getTables(tableList, columnList); |
| assertEquals(2, tables.length); |
| assertTrue(Arrays.asList(tables).contains(table1)); |
| assertTrue(Arrays.asList(tables).contains(table2)); |
| } |
| |
| public void testGetTableColumns() throws Exception { |
| MutableTable table1 = new MutableTable("table1"); |
| MutableColumn column1 = new MutableColumn("c1", ColumnType.BIGINT); |
| MutableColumn column2 = new MutableColumn("c2", ColumnType.BIGINT); |
| MutableColumn column3 = new MutableColumn("c3", ColumnType.BIGINT); |
| table1.addColumn(column1); |
| column1.setTable(table1); |
| table1.addColumn(column2); |
| column2.setTable(table1); |
| table1.addColumn(column3); |
| column3.setTable(table1); |
| |
| ArrayList<Column> columnList = new ArrayList<Column>(); |
| |
| Column[] columns = MetaModelHelper.getTableColumns(table1, columnList); |
| assertEquals(0, columns.length); |
| |
| columnList.add(column1); |
| columnList.add(column3); |
| |
| columns = MetaModelHelper.getTableColumns(table1, columnList); |
| assertEquals(2, columns.length); |
| assertSame(column1, columns[0]); |
| assertSame(column3, columns[1]); |
| } |
| |
| public void testGetTableFromItems() throws Exception { |
| Schema schema = getExampleSchema(); |
| Table contributorTable = schema.getTableByName(TABLE_CONTRIBUTOR); |
| Table projectTable = schema.getTableByName(TABLE_PROJECT); |
| Table projectContributorTable = schema.getTableByName(TABLE_PROJECT_CONTRIBUTOR); |
| |
| FromItem sqFromItem = new FromItem(new Query().from(projectTable).from(projectContributorTable)); |
| FromItem fromItem = new FromItem(JoinType.INNER, new FromItem(contributorTable), sqFromItem, new SelectItem[0], |
| new SelectItem[0]); |
| Query q = new Query().from(fromItem); |
| |
| FromItem[] fromItems = MetaModelHelper.getTableFromItems(q); |
| assertEquals(3, fromItems.length); |
| assertEquals("[MetaModelSchema.contributor, MetaModelSchema.project, MetaModelSchema.project_contributor]", |
| Arrays.toString(fromItems)); |
| } |
| |
| public void testGetSelectionNoRows() throws Exception { |
| SelectItem item1 = new SelectItem("foo", "f"); |
| SelectItem item2 = new SelectItem("bar", "b"); |
| SelectItem item3 = new SelectItem("baz", "bz"); |
| List<SelectItem> selectItems1 = Arrays.asList(item1, item2, item3); |
| List<SelectItem> selectItems2 = Arrays.asList(item2, item1); |
| |
| DataSet ds = MetaModelHelper.getSelection(selectItems2, new EmptyDataSet(selectItems1)); |
| assertEquals(SubSelectionDataSet.class, ds.getClass()); |
| |
| assertEquals("[bar AS b, foo AS f]", Arrays.toString(ds.getSelectItems())); |
| } |
| |
| public void testLeftJoinNoRowsOrSingleRow() throws Exception { |
| SelectItem item1 = new SelectItem("foo", "f"); |
| SelectItem item2 = new SelectItem("bar", "b"); |
| SelectItem item3 = new SelectItem("baz", "z"); |
| List<SelectItem> selectItems1 = Arrays.asList(item1, item2); |
| List<SelectItem> selectItems2 = Arrays.asList(item3); |
| |
| DataSet ds1 = new EmptyDataSet(selectItems1); |
| DataSet ds2 = new EmptyDataSet(selectItems2); |
| |
| DataSet joinedDs = MetaModelHelper.getLeftJoin(ds1, ds2, new FilterItem[] { new FilterItem(item2, |
| OperatorType.EQUALS_TO, item3) }); |
| |
| assertEquals(SubSelectionDataSet.class, joinedDs.getClass()); |
| assertEquals("[foo AS f, bar AS b, baz AS z]", Arrays.toString(joinedDs.getSelectItems())); |
| |
| DataSetHeader header1 = new SimpleDataSetHeader(selectItems1); |
| Row row = new DefaultRow(header1, new Object[] { 1, 2 }, null); |
| ds1 = new InMemoryDataSet(header1, row); |
| |
| joinedDs = MetaModelHelper.getLeftJoin(ds1, ds2, new FilterItem[] { new FilterItem(item2, |
| OperatorType.EQUALS_TO, item3) }); |
| assertEquals("[foo AS f, bar AS b, baz AS z]", Arrays.toString(joinedDs.getSelectItems())); |
| assertTrue(joinedDs.next()); |
| assertEquals("Row[values=[1, 2, null]]", joinedDs.getRow().toString()); |
| assertFalse(joinedDs.next()); |
| } |
| } |