/** * DataCleaner (community edition) * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.datacleaner.util; import java.io.File; import java.util.Arrays; import java.util.List; import org.apache.metamodel.DataContext; import org.apache.metamodel.DataContextFactory; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.schema.Column; import org.apache.metamodel.schema.MutableColumn; import org.apache.metamodel.schema.MutableSchema; import org.apache.metamodel.schema.MutableTable; import org.apache.metamodel.schema.Schema; import org.apache.metamodel.schema.Table; import org.apache.metamodel.util.CollectionUtils; import org.apache.metamodel.util.HasNameMapper; import org.datacleaner.connection.SchemaNavigator; import junit.framework.TestCase; public class SchemaNavigatorTest extends TestCase { public void testTheBasics() throws Exception { final DataContext dc = DataContextFactory.createCsvDataContext(new File("src/test/resources/employees.csv"), ',', '\"'); final SchemaNavigator sn = new SchemaNavigator(dc); sn.refreshSchemas(); // columns assertEquals("Column[name=email,columnNumber=1,type=STRING,nullable=true,nativeType=null,columnSize=null]", sn.convertToColumn("email").toString()); assertEquals("Column[name=email,columnNumber=1,type=STRING,nullable=true,nativeType=null,columnSize=null]", sn.convertToColumn("employees.csv.email").toString()); assertEquals("Column[name=email,columnNumber=1,type=STRING,nullable=true,nativeType=null,columnSize=null]", sn.convertToColumn("resources.employees.csv.email").toString()); assertEquals("Column[name=email,columnNumber=1,type=STRING,nullable=true,nativeType=null,columnSize=null]", sn.convertToColumn("resources.email").toString()); assertNull(sn.convertToColumns("foo", "bar", null)); assertEquals(0, (sn.convertToColumns("foo", "bar", new String[0])).length); assertEquals("[Column[name=email,columnNumber=1,type=STRING,nullable=true,nativeType=null,columnSize=null], " + "Column[name=name,columnNumber=0,type=STRING,nullable=true,nativeType=null,columnSize=null]]", Arrays.toString(sn.convertToColumns(new String[] { "email", "employees.csv.name" }))); assertEquals("[Column[name=email,columnNumber=1,type=STRING,nullable=true,nativeType=null,columnSize=null], " + "null, Column[name=name,columnNumber=0,type=STRING,nullable=true,nativeType=null," + "columnSize=null]]", Arrays.toString( sn.convertToColumns("resources", "employees.csv", new String[] { "email", "not-existing", "name" }))); assertEquals("[Column[name=email,columnNumber=1,type=STRING,nullable=true,nativeType=null,columnSize=null], " + "null, Column[name=name,columnNumber=0," + "type=STRING,nullable=true,nativeType=null,columnSize=null]]", Arrays.toString( sn.convertToColumns(null, "employees.csv", new String[] { "email", "not-existing", "name" }))); try { sn.convertToColumns("not-existing", "employees.csv", new String[] { "email", "not-existing", "name" }); fail("Exception expected"); } catch (final Exception e) { assertEquals("Schema not-existing not found. Available schema names are: [information_schema, resources]", e.getMessage()); } try { sn.convertToColumns("resources", "not-existing", new String[] { "email", "not-existing", "name" }); fail("Exception expected"); } catch (final Exception e) { assertEquals("Table not found. Available table names are: [employees.csv]", e.getMessage()); } // tables assertEquals("Table[name=employees.csv,type=TABLE,remarks=null]", sn.convertToTable("employees.csv").toString()); assertEquals("Table[name=employees.csv,type=TABLE,remarks=null]", sn.convertToTable(null, "employees.csv").toString()); assertEquals("Table[name=employees.csv,type=TABLE,remarks=null]", sn.convertToTable(null, null).toString()); try { sn.convertToTable("information_schema", null); fail("Excpetion expected"); } catch (final Exception e) { assertEquals("No table name specified, and multiple options exist. " + "Available table names are: [tables, columns, relationships]", e.getMessage()); } assertEquals("Table[name=employees.csv,type=TABLE,remarks=null]", sn.convertToTable("resources", "employees.csv").toString()); assertEquals("[Table[name=employees.csv,type=TABLE,remarks=null], " + "Table[name=employees.csv,type=TABLE,remarks=null], null]", Arrays.toString( sn.convertToTables(new String[] { "employees.csv", "resources.employees.csv", "foo" }))); // schemas assertEquals("Schema[name=resources]", sn.convertToSchema("resources").toString()); assertEquals(null, sn.convertToSchema("foo")); assertEquals("[null, Schema[name=resources], Schema[name=information_schema]]", Arrays.toString(sn.convertToSchemas(new String[] { "foo", "resources", "information_schema" }))); assertEquals("Schema[name=resources]", sn.getDefaultSchema().toString()); assertEquals(null, sn.getSchemaByName("foo")); assertEquals("[Schema[name=information_schema], Schema[name=resources]]", Arrays.toString(sn.getSchemas())); } public void testSchemaWithDot() throws Exception { final DataContext dc = DataContextFactory.createCsvDataContext(new File("src/test/resources/employees.csv"), ',', '\"'); assertEquals(2, dc.getDefaultSchema().getTables()[0].getColumnCount()); final SchemaNavigator sn = new SchemaNavigator(dc); final Column column = sn.convertToColumn("resources.employees.csv.email"); assertEquals("Column[name=email,columnNumber=1,type=STRING,nullable=true,nativeType=null,columnSize=null]", column.toString()); } public void testColumnNamesWithDots() throws Exception { final MutableSchema schema = new MutableSchema("SCHE"); schema.addTable(new MutableTable("tabl1").setSchema(schema)); final MutableTable orgTable = new MutableTable("tabl2").setSchema(schema); orgTable.addColumn(new MutableColumn("source_id").setTable(orgTable)); orgTable.addColumn(new MutableColumn("BLOB.BLOBNumberMain").setTable(orgTable)); orgTable.addColumn(new MutableColumn("BLOB.BLOBNumberBranch").setTable(orgTable)); schema.addTable(orgTable); final DataContext dataContext = new QueryPostprocessDataContext() { @Override protected DataSet materializeMainSchemaTable(final Table table, final Column[] columns, final int maxRows) { throw new UnsupportedOperationException(); } @Override protected String getMainSchemaName() throws MetaModelException { return schema.getName(); } @Override protected Schema getMainSchema() throws MetaModelException { return schema; } }; final SchemaNavigator schemaNavigator = new SchemaNavigator(dataContext); final String[] columnNames = new String[] { "SCHE.tabl2.source_id", "SCHE.tabl2.BLOB.BLOBNumberMain", "SCHE.tabl2.BLOB.BLOBNumberBranch" }; final Column[] columnsResult = schemaNavigator.convertToColumns(columnNames); for (final Column column : columnsResult) { assertNotNull(column); } final List<String> columnNamesResult = CollectionUtils.map(columnsResult, new HasNameMapper()); assertEquals("[source_id, BLOB.BLOBNumberMain, BLOB.BLOBNumberBranch]", columnNamesResult.toString()); } }