/** * AnalyzerBeans * 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.eobjects.analyzer.beans.transform; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import junit.framework.TestCase; import org.eobjects.analyzer.beans.api.OutputColumns; import org.eobjects.analyzer.beans.api.OutputRowCollector; import org.eobjects.analyzer.beans.transform.TableLookupTransformer.JoinSemantic; import org.eobjects.analyzer.connection.CsvDatastore; import org.eobjects.analyzer.data.InputColumn; import org.eobjects.analyzer.data.MockInputColumn; import org.eobjects.analyzer.data.MockInputRow; public class TableLookupTransformerTest extends TestCase { public void testScenario() throws Exception { TableLookupTransformer trans = new TableLookupTransformer(); trans.datastore = new CsvDatastore("my ds", "src/test/resources/employees.csv"); trans.outputColumns = new String[] { "name" }; trans.conditionColumns = new String[] { "email" }; InputColumn<String> col1 = new MockInputColumn<String>("my email col", String.class); trans.conditionValues = new InputColumn[] { col1 }; OutputColumns outputColumns = trans.getOutputColumns(); assertEquals("OutputColumns[name (lookup)]", outputColumns.toString()); assertEquals(String.class, outputColumns.getColumnType(0)); trans.validate(); trans.init(); assertEquals("[Jane Doe]", Arrays.toString(trans.transform(new MockInputRow().put(col1, "jane.doe@company.com")))); assertEquals("[null]", Arrays.toString(trans.transform(new MockInputRow().put(col1, "foo bar")))); trans.close(); } public void testGetOutputColumnsClearCache() throws Exception { TableLookupTransformer trans = new TableLookupTransformer(); trans.datastore = new CsvDatastore("my ds", "src/test/resources/employees.csv"); trans.outputColumns = new String[] { "name", "email" }; trans.conditionColumns = new String[] { "email" }; assertEquals("OutputColumns[name (lookup), email (lookup)]", trans.getOutputColumns().toString()); trans.outputColumns = new String[] { "name" }; assertEquals("OutputColumns[name (lookup)]", trans.getOutputColumns().toString()); // check cache reuse by removing the datastore (that would be used when // re-fetching the columns) trans.datastore = null; assertEquals("OutputColumns[name (lookup)]", trans.getOutputColumns().toString()); // confirm the above assumption by creating a NPE when no datastore is // set. trans.outputColumns = new String[] { "name", "email" }; try { trans.getOutputColumns(); fail("Exception expected"); } catch (NullPointerException e) { // OK! } } public void testInnerJoinMinOneRecordSemantics() throws Exception { final List<Object[]> result = new ArrayList<Object[]>(); final TableLookupTransformer trans = new TableLookupTransformer(); trans.datastore = new CsvDatastore("my ds", "src/test/resources/employees.csv"); trans.outputColumns = new String[] { "name" }; trans.outputRowCollector = new OutputRowCollector() { @Override public void putValues(Object... values) { result.add(values); } }; trans.joinSemantic = JoinSemantic.LEFT_JOIN; trans.conditionColumns = new String[] { "email" }; InputColumn<String> col1 = new MockInputColumn<String>("my email col", String.class); trans.conditionValues = new InputColumn[] { col1 }; OutputColumns outputColumns = trans.getOutputColumns(); assertEquals("OutputColumns[name (lookup)]", outputColumns.toString()); assertEquals(String.class, outputColumns.getColumnType(0)); trans.validate(); trans.init(); assertEquals("[null]", Arrays.toString(trans.transform(new MockInputRow().put(col1, "foo bar")))); assertEquals(0, result.size()); assertNull(trans.transform(new MockInputRow().put(col1, "jane.doe@company.com"))); assertEquals(2, result.size()); assertEquals("[Jane Doe]", Arrays.toString(result.get(0))); assertEquals("[Jane doe]", Arrays.toString(result.get(1))); trans.close(); } public void testInnerJoinSemantics() throws Exception { final List<Object[]> result = new ArrayList<Object[]>(); final TableLookupTransformer trans = new TableLookupTransformer(); trans.datastore = new CsvDatastore("my ds", "src/test/resources/employees.csv"); trans.outputColumns = new String[] { "name" }; trans.outputRowCollector = new OutputRowCollector() { @Override public void putValues(Object... values) { result.add(values); } }; trans.joinSemantic = JoinSemantic.INNER_JOIN; trans.conditionColumns = new String[] { "email" }; InputColumn<String> col1 = new MockInputColumn<String>("my email col", String.class); trans.conditionValues = new InputColumn[] { col1 }; OutputColumns outputColumns = trans.getOutputColumns(); assertEquals("OutputColumns[name (lookup)]", outputColumns.toString()); assertEquals(String.class, outputColumns.getColumnType(0)); trans.validate(); trans.init(); assertNull(trans.transform(new MockInputRow().put(col1, "foo bar"))); assertEquals(0, result.size()); assertNull(trans.transform(new MockInputRow().put(col1, "jane.doe@company.com"))); assertEquals(2, result.size()); assertEquals("[Jane Doe]", Arrays.toString(result.get(0))); assertEquals("[Jane doe]", Arrays.toString(result.get(1))); trans.close(); } public void testCarthesianJoin() throws Exception { final List<Object[]> result = new ArrayList<Object[]>(); final TableLookupTransformer trans = new TableLookupTransformer(); trans.datastore = new CsvDatastore("my ds", "src/test/resources/employees.csv"); trans.outputColumns = new String[] { "name" }; trans.outputRowCollector = new OutputRowCollector() { @Override public void putValues(Object... values) { result.add(values); } }; trans.joinSemantic = JoinSemantic.INNER_JOIN; InputColumn<String> col1 = new MockInputColumn<String>("my email col", String.class); OutputColumns outputColumns = trans.getOutputColumns(); assertEquals("OutputColumns[name (lookup)]", outputColumns.toString()); assertEquals(String.class, outputColumns.getColumnType(0)); trans.validate(); trans.init(); assertNull(trans.transform(new MockInputRow().put(col1, "foo bar"))); assertEquals(7, result.size()); assertEquals("[John Doe]", Arrays.toString(result.get(0))); assertEquals("[Jane Doe]", Arrays.toString(result.get(1))); assertEquals("[Jane doe]", Arrays.toString(result.get(2))); assertNull(trans.transform(new MockInputRow().put(col1, "jane.doe@company.com"))); assertEquals(14, result.size()); assertEquals("[John Doe]", Arrays.toString(result.get(0))); assertEquals("[Jane Doe]", Arrays.toString(result.get(1))); assertEquals("[Jane doe]", Arrays.toString(result.get(2))); assertEquals("[John Doe]", Arrays.toString(result.get(7 + 0))); assertEquals("[Jane Doe]", Arrays.toString(result.get(7 + 1))); assertEquals("[Jane doe]", Arrays.toString(result.get(7 + 2))); trans.close(); } }