/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed 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.pentaho.di.trans.steps.unique; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Test; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.RowMetaAndData; import org.pentaho.di.core.exception.KettleValueException; import org.pentaho.di.core.plugins.PluginRegistry; import org.pentaho.di.core.plugins.StepPluginType; import org.pentaho.di.core.row.RowMeta; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.core.row.ValueMetaInterface; import org.pentaho.di.core.row.value.ValueMetaString; import org.pentaho.di.core.variables.Variables; import org.pentaho.di.trans.RowProducer; import org.pentaho.di.trans.RowStepCollector; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransHopMeta; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.StepErrorMeta; import org.pentaho.di.trans.step.StepInterface; import org.pentaho.di.trans.step.StepMeta; import org.pentaho.di.trans.steps.dummytrans.DummyTransMeta; import org.pentaho.di.trans.steps.injector.InjectorMeta; import org.pentaho.di.trans.steps.sort.SortRowsMeta; import org.pentaho.di.trans.steps.uniquerows.UniqueRowsMeta; import junit.framework.TestCase; /** * Test class for the Unique step. * * These tests only cover the case (in)sensitive comparison of a single key field, and to ensure the first row is not * treated as both duplicate and unique. * * @author Daniel Einspanjer */ public class UniqueRowsTest extends TestCase { public static int MAX_COUNT = 1000; public RowMetaInterface createRowMetaInterface() { RowMetaInterface rm = new RowMeta(); ValueMetaInterface[] valuesMeta = { new ValueMetaString( "KEY" ), }; for ( int i = 0; i < valuesMeta.length; i++ ) { rm.addValueMeta( valuesMeta[i] ); } return rm; } public List<RowMetaAndData> createData() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "abc" }; Object[] r2 = new Object[] { "ABC" }; Object[] r3 = new Object[] { "abc" }; Object[] r4 = new Object[] { "ABC" }; list.add( new RowMetaAndData( rm, r1 ) ); list.add( new RowMetaAndData( rm, r2 ) ); list.add( new RowMetaAndData( rm, r3 ) ); list.add( new RowMetaAndData( rm, r4 ) ); return list; } public List<RowMetaAndData> createDataAllUnique() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "A" }; Object[] r2 = new Object[] { "B" }; Object[] r3 = new Object[] { "C" }; Object[] r4 = new Object[] { "D" }; list.add( new RowMetaAndData( rm, r1 ) ); list.add( new RowMetaAndData( rm, r2 ) ); list.add( new RowMetaAndData( rm, r3 ) ); list.add( new RowMetaAndData( rm, r4 ) ); return list; } public List<RowMetaAndData> createResultDataAllUnique() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "A" }; Object[] r2 = new Object[] { "B" }; Object[] r3 = new Object[] { "C" }; Object[] r4 = new Object[] { "D" }; list.add( new RowMetaAndData( rm, r1 ) ); list.add( new RowMetaAndData( rm, r2 ) ); list.add( new RowMetaAndData( rm, r3 ) ); list.add( new RowMetaAndData( rm, r4 ) ); return list; } public List<RowMetaAndData> createResultDataCaseSensitiveNoPreviousSort() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "abc" }; Object[] r2 = new Object[] { "ABC" }; Object[] r3 = new Object[] { "abc" }; Object[] r4 = new Object[] { "ABC" }; list.add( new RowMetaAndData( rm, r1 ) ); list.add( new RowMetaAndData( rm, r2 ) ); list.add( new RowMetaAndData( rm, r3 ) ); list.add( new RowMetaAndData( rm, r4 ) ); return list; } public List<RowMetaAndData> createResultDataCaseInsensitiveNoPreviousSort() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "abc" }; list.add( new RowMetaAndData( rm, r1 ) ); return list; } public List<RowMetaAndData> createResultDataSortCaseSensitiveUniqueCaseSensitive() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "ABC" }; Object[] r2 = new Object[] { "abc" }; list.add( new RowMetaAndData( rm, r1 ) ); list.add( new RowMetaAndData( rm, r2 ) ); return list; } public List<RowMetaAndData> createResultDataSortCaseSensitiveUniqueCaseInsensitive() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "ABC" }; list.add( new RowMetaAndData( rm, r1 ) ); return list; } public List<RowMetaAndData> createResultDataSortCaseInsensitiveUniqueCaseSensitive() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "abc" }; Object[] r2 = new Object[] { "ABC" }; Object[] r3 = new Object[] { "abc" }; Object[] r4 = new Object[] { "ABC" }; list.add( new RowMetaAndData( rm, r1 ) ); list.add( new RowMetaAndData( rm, r2 ) ); list.add( new RowMetaAndData( rm, r3 ) ); list.add( new RowMetaAndData( rm, r4 ) ); return list; } public List<RowMetaAndData> createResultDataSortCaseInsensitiveUniqueCaseInsensitive() { List<RowMetaAndData> list = new ArrayList<RowMetaAndData>(); RowMetaInterface rm = createRowMetaInterface(); Object[] r1 = new Object[] { "abc" }; list.add( new RowMetaAndData( rm, r1 ) ); return list; } /** * Check the 2 lists comparing the rows in order. If they are not the same fail the test. */ public void checkRows( List<RowMetaAndData> rows1, List<RowMetaAndData> rows2 ) { int idx = 1; if ( rows1.size() != rows2.size() ) { fail( "Number of rows is not the same: " + rows1.size() + " and " + rows2.size() ); } Iterator<RowMetaAndData> it1 = rows1.iterator(); Iterator<RowMetaAndData> it2 = rows2.iterator(); while ( it1.hasNext() && it2.hasNext() ) { RowMetaAndData rm1 = it1.next(); RowMetaAndData rm2 = it2.next(); Object[] r1 = rm1.getData(); Object[] r2 = rm2.getData(); if ( rm1.size() != rm2.size() ) { fail( "row nr " + idx + " is not equal" ); } int[] fields = new int[r1.length]; for ( int ydx = 0; ydx < r1.length; ydx++ ) { fields[ydx] = ydx; } try { if ( rm1.getRowMeta().compare( r1, r2, fields ) != 0 ) { fail( "row nr " + idx + " is not equal" ); } } catch ( KettleValueException e ) { fail( "row nr " + idx + " is not equal" ); } idx++; } } public void testCaseSensitiveNoPreviousSort() throws Exception { KettleEnvironment.init(); // // Create a new transformation... // TransMeta transMeta = new TransMeta(); transMeta.setName( "uniquerowstest" ); PluginRegistry registry = PluginRegistry.getInstance(); // // create an injector step... // String injectorStepname = "injector step"; InjectorMeta im = new InjectorMeta(); // Set the information of the injector. String injectorPid = registry.getPluginId( StepPluginType.class, im ); StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im ); transMeta.addStep( injectorStep ); // // Create a unique rows step // String uniqueRowsStepname = "unique rows step"; UniqueRowsMeta urm = new UniqueRowsMeta(); urm.setCompareFields( new String[] { "KEY" } ); urm.setCaseInsensitive( new boolean[] { false } ); String uniqueRowsStepPid = registry.getPluginId( StepPluginType.class, urm ); StepMeta uniqueRowsStep = new StepMeta( uniqueRowsStepPid, uniqueRowsStepname, urm ); transMeta.addStep( uniqueRowsStep ); transMeta.addTransHop( new TransHopMeta( injectorStep, uniqueRowsStep ) ); // // Create a dummy step // String dummyStepname = "dummy step"; DummyTransMeta dm = new DummyTransMeta(); String dummyPid = registry.getPluginId( StepPluginType.class, dm ); StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm ); transMeta.addStep( dummyStep ); transMeta.addTransHop( new TransHopMeta( uniqueRowsStep, dummyStep ) ); // Now execute the transformation... Trans trans = new Trans( transMeta ); trans.prepareExecution( null ); StepInterface si = trans.getStepInterface( dummyStepname, 0 ); RowStepCollector dummyRc = new RowStepCollector(); si.addRowListener( dummyRc ); RowProducer rp = trans.addRowProducer( injectorStepname, 0 ); trans.startThreads(); // add rows List<RowMetaAndData> inputList = createData(); for ( RowMetaAndData rm : inputList ) { rp.putRow( rm.getRowMeta(), rm.getData() ); } rp.finished(); trans.waitUntilFinished(); List<RowMetaAndData> resultRows = dummyRc.getRowsWritten(); checkRows( createResultDataCaseSensitiveNoPreviousSort(), resultRows ); } public void testCaseInsensitiveNoPreviousSort() throws Exception { KettleEnvironment.init(); // // Create a new transformation... // TransMeta transMeta = new TransMeta(); transMeta.setName( "uniquerowstest" ); PluginRegistry registry = PluginRegistry.getInstance(); // // create an injector step... // String injectorStepname = "injector step"; InjectorMeta im = new InjectorMeta(); // Set the information of the injector. String injectorPid = registry.getPluginId( StepPluginType.class, im ); StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im ); transMeta.addStep( injectorStep ); // // Create a unique rows step // String uniqueRowsStepname = "unique rows step"; UniqueRowsMeta urm = new UniqueRowsMeta(); urm.setCompareFields( new String[] { "KEY" } ); urm.setCaseInsensitive( new boolean[] { true } ); String uniqueRowsStepPid = registry.getPluginId( StepPluginType.class, urm ); StepMeta uniqueRowsStep = new StepMeta( uniqueRowsStepPid, uniqueRowsStepname, urm ); transMeta.addStep( uniqueRowsStep ); transMeta.addTransHop( new TransHopMeta( injectorStep, uniqueRowsStep ) ); // // Create a dummy step // String dummyStepname = "dummy step"; DummyTransMeta dm = new DummyTransMeta(); String dummyPid = registry.getPluginId( StepPluginType.class, dm ); StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm ); transMeta.addStep( dummyStep ); transMeta.addTransHop( new TransHopMeta( uniqueRowsStep, dummyStep ) ); // Now execute the transformation... Trans trans = new Trans( transMeta ); trans.prepareExecution( null ); StepInterface si = trans.getStepInterface( dummyStepname, 0 ); RowStepCollector dummyRc = new RowStepCollector(); si.addRowListener( dummyRc ); RowProducer rp = trans.addRowProducer( injectorStepname, 0 ); trans.startThreads(); // add rows List<RowMetaAndData> inputList = createData(); for ( RowMetaAndData rm : inputList ) { rp.putRow( rm.getRowMeta(), rm.getData() ); } rp.finished(); trans.waitUntilFinished(); List<RowMetaAndData> resultRows = dummyRc.getRowsWritten(); checkRows( createResultDataCaseInsensitiveNoPreviousSort(), resultRows ); } public void testSortCaseSensitiveUniqueCaseSensitive() throws Exception { KettleEnvironment.init(); // // Create a new transformation... // TransMeta transMeta = new TransMeta(); transMeta.setName( "uniquerowstest" ); PluginRegistry registry = PluginRegistry.getInstance(); // // create an injector step... // String injectorStepname = "injector step"; InjectorMeta im = new InjectorMeta(); // Set the information of the injector. String injectorPid = registry.getPluginId( StepPluginType.class, im ); StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im ); transMeta.addStep( injectorStep ); // // Create a sort rows step // String sortRowsStepname = "sort rows step"; SortRowsMeta srm = new SortRowsMeta(); srm.setFieldName( new String[] { "KEY" } ); srm.setAscending( new boolean[] { true } ); srm.setCaseSensitive( new boolean[] { true } ); srm.setPreSortedField( new boolean[] { false } ); srm.setPrefix( "SortRowsTest" ); srm.setDirectory( "." ); String sortRowsStepPid = registry.getPluginId( StepPluginType.class, srm ); StepMeta sortRowsStep = new StepMeta( sortRowsStepPid, sortRowsStepname, srm ); transMeta.addStep( sortRowsStep ); transMeta.addTransHop( new TransHopMeta( injectorStep, sortRowsStep ) ); // // Create a unique rows step // String uniqueRowsStepname = "unique rows step"; UniqueRowsMeta urm = new UniqueRowsMeta(); urm.setCompareFields( new String[] { "KEY" } ); urm.setCaseInsensitive( new boolean[] { false } ); String uniqueRowsStepPid = registry.getPluginId( StepPluginType.class, urm ); StepMeta uniqueRowsStep = new StepMeta( uniqueRowsStepPid, uniqueRowsStepname, urm ); transMeta.addStep( uniqueRowsStep ); transMeta.addTransHop( new TransHopMeta( sortRowsStep, uniqueRowsStep ) ); // // Create a dummy step // String dummyStepname = "dummy step"; DummyTransMeta dm = new DummyTransMeta(); String dummyPid = registry.getPluginId( StepPluginType.class, dm ); StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm ); transMeta.addStep( dummyStep ); transMeta.addTransHop( new TransHopMeta( uniqueRowsStep, dummyStep ) ); // Now execute the transformation... Trans trans = new Trans( transMeta ); trans.prepareExecution( null ); StepInterface si = trans.getStepInterface( dummyStepname, 0 ); RowStepCollector dummyRc = new RowStepCollector(); si.addRowListener( dummyRc ); RowProducer rp = trans.addRowProducer( injectorStepname, 0 ); trans.startThreads(); // add rows List<RowMetaAndData> inputList = createData(); for ( RowMetaAndData rm : inputList ) { rp.putRow( rm.getRowMeta(), rm.getData() ); } rp.finished(); trans.waitUntilFinished(); List<RowMetaAndData> resultRows = dummyRc.getRowsWritten(); checkRows( createResultDataSortCaseSensitiveUniqueCaseSensitive(), resultRows ); } public void testSortCaseSensitiveUniqueCaseInsensitive() throws Exception { KettleEnvironment.init(); // // Create a new transformation... // TransMeta transMeta = new TransMeta(); transMeta.setName( "uniquerowstest" ); PluginRegistry registry = PluginRegistry.getInstance(); // // create an injector step... // String injectorStepname = "injector step"; InjectorMeta im = new InjectorMeta(); // Set the information of the injector. String injectorPid = registry.getPluginId( StepPluginType.class, im ); StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im ); transMeta.addStep( injectorStep ); // // Create a sort rows step // String sortRowsStepname = "sort rows step"; SortRowsMeta srm = new SortRowsMeta(); srm.setFieldName( new String[] { "KEY" } ); srm.setAscending( new boolean[] { true } ); srm.setCaseSensitive( new boolean[] { true } ); srm.setPreSortedField( new boolean[] { false } ); srm.setPrefix( "SortRowsTest" ); srm.setDirectory( "." ); String sortRowsStepPid = registry.getPluginId( StepPluginType.class, srm ); StepMeta sortRowsStep = new StepMeta( sortRowsStepPid, sortRowsStepname, srm ); transMeta.addStep( sortRowsStep ); transMeta.addTransHop( new TransHopMeta( injectorStep, sortRowsStep ) ); // // Create a unique rows step // String uniqueRowsStepname = "unique rows step"; UniqueRowsMeta urm = new UniqueRowsMeta(); urm.setCompareFields( new String[] { "KEY" } ); urm.setCaseInsensitive( new boolean[] { true } ); String uniqueRowsStepPid = registry.getPluginId( StepPluginType.class, urm ); StepMeta uniqueRowsStep = new StepMeta( uniqueRowsStepPid, uniqueRowsStepname, urm ); transMeta.addStep( uniqueRowsStep ); transMeta.addTransHop( new TransHopMeta( sortRowsStep, uniqueRowsStep ) ); // // Create a dummy step // String dummyStepname = "dummy step"; DummyTransMeta dm = new DummyTransMeta(); String dummyPid = registry.getPluginId( StepPluginType.class, dm ); StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm ); transMeta.addStep( dummyStep ); transMeta.addTransHop( new TransHopMeta( uniqueRowsStep, dummyStep ) ); // Now execute the transformation... Trans trans = new Trans( transMeta ); trans.prepareExecution( null ); StepInterface si = trans.getStepInterface( dummyStepname, 0 ); RowStepCollector dummyRc = new RowStepCollector(); si.addRowListener( dummyRc ); RowProducer rp = trans.addRowProducer( injectorStepname, 0 ); trans.startThreads(); // add rows List<RowMetaAndData> inputList = createData(); for ( RowMetaAndData rm : inputList ) { rp.putRow( rm.getRowMeta(), rm.getData() ); } rp.finished(); trans.waitUntilFinished(); List<RowMetaAndData> resultRows = dummyRc.getRowsWritten(); checkRows( createResultDataSortCaseSensitiveUniqueCaseInsensitive(), resultRows ); } public void testSortCaseInsensitiveUniqueCaseSensitive() throws Exception { KettleEnvironment.init(); // // Create a new transformation... // TransMeta transMeta = new TransMeta(); transMeta.setName( "uniquerowstest" ); PluginRegistry registry = PluginRegistry.getInstance(); // // create an injector step... // String injectorStepname = "injector step"; InjectorMeta im = new InjectorMeta(); // Set the information of the injector. String injectorPid = registry.getPluginId( StepPluginType.class, im ); StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im ); transMeta.addStep( injectorStep ); // // Create a sort rows step // String sortRowsStepname = "sort rows step"; SortRowsMeta srm = new SortRowsMeta(); srm.setFieldName( new String[] { "KEY" } ); srm.setAscending( new boolean[] { true } ); srm.setCaseSensitive( new boolean[] { false } ); srm.setPreSortedField( new boolean[] { false } ); srm.setPrefix( "SortRowsTest" ); srm.setDirectory( "." ); String sortRowsStepPid = registry.getPluginId( StepPluginType.class, srm ); StepMeta sortRowsStep = new StepMeta( sortRowsStepPid, sortRowsStepname, srm ); transMeta.addStep( sortRowsStep ); transMeta.addTransHop( new TransHopMeta( injectorStep, sortRowsStep ) ); // // Create a unique rows step // String uniqueRowsStepname = "unique rows step"; UniqueRowsMeta urm = new UniqueRowsMeta(); urm.setCompareFields( new String[] { "KEY" } ); urm.setCaseInsensitive( new boolean[] { false } ); String uniqueRowsStepPid = registry.getPluginId( StepPluginType.class, urm ); StepMeta uniqueRowsStep = new StepMeta( uniqueRowsStepPid, uniqueRowsStepname, urm ); transMeta.addStep( uniqueRowsStep ); transMeta.addTransHop( new TransHopMeta( sortRowsStep, uniqueRowsStep ) ); // // Create a dummy step // String dummyStepname = "dummy step"; DummyTransMeta dm = new DummyTransMeta(); String dummyPid = registry.getPluginId( StepPluginType.class, dm ); StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm ); transMeta.addStep( dummyStep ); transMeta.addTransHop( new TransHopMeta( uniqueRowsStep, dummyStep ) ); // Now execute the transformation... Trans trans = new Trans( transMeta ); trans.prepareExecution( null ); StepInterface si = trans.getStepInterface( dummyStepname, 0 ); RowStepCollector dummyRc = new RowStepCollector(); si.addRowListener( dummyRc ); RowProducer rp = trans.addRowProducer( injectorStepname, 0 ); trans.startThreads(); // add rows List<RowMetaAndData> inputList = createData(); for ( RowMetaAndData rm : inputList ) { rp.putRow( rm.getRowMeta(), rm.getData() ); } rp.finished(); trans.waitUntilFinished(); List<RowMetaAndData> resultRows = dummyRc.getRowsWritten(); checkRows( createResultDataSortCaseInsensitiveUniqueCaseSensitive(), resultRows ); } public void testSortCaseInsensitiveUniqueCaseInsensitive() throws Exception { KettleEnvironment.init(); // // Create a new transformation... // TransMeta transMeta = new TransMeta(); transMeta.setName( "uniquerowstest" ); PluginRegistry registry = PluginRegistry.getInstance(); // // create an injector step... // String injectorStepname = "injector step"; InjectorMeta im = new InjectorMeta(); // Set the information of the injector. String injectorPid = registry.getPluginId( StepPluginType.class, im ); StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im ); transMeta.addStep( injectorStep ); // // Create a sort rows step // String sortRowsStepname = "sort rows step"; SortRowsMeta srm = new SortRowsMeta(); srm.setFieldName( new String[] { "KEY" } ); srm.setAscending( new boolean[] { true } ); srm.setCaseSensitive( new boolean[] { false } ); srm.setPreSortedField( new boolean[] { false } ); srm.setPrefix( "SortRowsTest" ); srm.setDirectory( "." ); String sortRowsStepPid = registry.getPluginId( StepPluginType.class, srm ); StepMeta sortRowsStep = new StepMeta( sortRowsStepPid, sortRowsStepname, srm ); transMeta.addStep( sortRowsStep ); transMeta.addTransHop( new TransHopMeta( injectorStep, sortRowsStep ) ); // // Create a unique rows step // String uniqueRowsStepname = "unique rows step"; UniqueRowsMeta urm = new UniqueRowsMeta(); urm.setCompareFields( new String[] { "KEY" } ); urm.setCaseInsensitive( new boolean[] { true } ); String uniqueRowsStepPid = registry.getPluginId( StepPluginType.class, urm ); StepMeta uniqueRowsStep = new StepMeta( uniqueRowsStepPid, uniqueRowsStepname, urm ); transMeta.addStep( uniqueRowsStep ); transMeta.addTransHop( new TransHopMeta( sortRowsStep, uniqueRowsStep ) ); // // Create a dummy step // String dummyStepname = "dummy step"; DummyTransMeta dm = new DummyTransMeta(); String dummyPid = registry.getPluginId( StepPluginType.class, dm ); StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm ); transMeta.addStep( dummyStep ); transMeta.addTransHop( new TransHopMeta( uniqueRowsStep, dummyStep ) ); // Now execute the transformation... Trans trans = new Trans( transMeta ); trans.prepareExecution( null ); StepInterface si = trans.getStepInterface( dummyStepname, 0 ); RowStepCollector dummyRc = new RowStepCollector(); si.addRowListener( dummyRc ); RowProducer rp = trans.addRowProducer( injectorStepname, 0 ); trans.startThreads(); // add rows List<RowMetaAndData> inputList = createData(); for ( RowMetaAndData rm : inputList ) { rp.putRow( rm.getRowMeta(), rm.getData() ); } rp.finished(); trans.waitUntilFinished(); List<RowMetaAndData> resultRows = dummyRc.getRowsWritten(); checkRows( createResultDataSortCaseInsensitiveUniqueCaseInsensitive(), resultRows ); } @Test public void testAllUnique() throws Exception { KettleEnvironment.init(); // // Create a new transformation... // TransMeta transMeta = new TransMeta(); transMeta.setName( "uniquerowstest" ); PluginRegistry registry = PluginRegistry.getInstance(); // // create an injector step... // String injectorStepname = "injector step"; InjectorMeta im = new InjectorMeta(); // Set the information of the injector. String injectorPid = registry.getPluginId( StepPluginType.class, im ); StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im ); transMeta.addStep( injectorStep ); // // Create a unique rows step // String uniqueRowsStepname = "unique rows step"; UniqueRowsMeta urm = new UniqueRowsMeta(); urm.setCompareFields( new String[] { "KEY" } ); urm.setCaseInsensitive( new boolean[] { true } ); urm.setRejectDuplicateRow( true ); String uniqueRowsStepPid = registry.getPluginId( StepPluginType.class, urm ); StepMeta uniqueRowsStep = new StepMeta( uniqueRowsStepPid, uniqueRowsStepname, urm ); uniqueRowsStep.setDistributes( false ); transMeta.addStep( uniqueRowsStep ); transMeta.addTransHop( new TransHopMeta( injectorStep, uniqueRowsStep ) ); // // Create a dummy step to receive the unique rows // String dummyStepname1 = "dummy step"; DummyTransMeta dm1 = new DummyTransMeta(); String dummyPid1 = registry.getPluginId( StepPluginType.class, dm1 ); StepMeta dummyStep1 = new StepMeta( dummyPid1, dummyStepname1, dm1 ); transMeta.addStep( dummyStep1 ); transMeta.addTransHop( new TransHopMeta( uniqueRowsStep, dummyStep1 ) ); // // Create a dummy step to receive the duplicate rows (errors) // String dummyStepname2 = "dummy step2"; DummyTransMeta dm2 = new DummyTransMeta(); String dummyPid2 = registry.getPluginId( StepPluginType.class, dm2 ); StepMeta dummyStep2 = new StepMeta( dummyPid2, dummyStepname2, dm2 ); transMeta.addStep( dummyStep2 ); // Set up error (aka duplicates) handling info StepErrorMeta stepErrorMeta = new StepErrorMeta( new Variables(), uniqueRowsStep ); stepErrorMeta.setTargetStep( dummyStep2 ); stepErrorMeta.setEnabled( true ); stepErrorMeta.setNrErrorsValuename( "numErrors" ); stepErrorMeta.setErrorDescriptionsValuename( "duplicates" ); stepErrorMeta.setErrorFieldsValuename( "KEY" ); stepErrorMeta.setErrorCodesValuename( "errorCodes" ); stepErrorMeta.setMaxErrors( "9999" ); stepErrorMeta.setMaxPercentErrors( "" ); stepErrorMeta.setMinPercentRows( "" ); uniqueRowsStep.setStepErrorMeta( stepErrorMeta ); transMeta.addTransHop( new TransHopMeta( uniqueRowsStep, dummyStep2 ) ); // Now execute the transformation... Trans trans = new Trans( transMeta ); trans.prepareExecution( null ); StepInterface si = trans.getStepInterface( dummyStepname1, 0 ); RowStepCollector dummyRc1 = new RowStepCollector(); si.addRowListener( dummyRc1 ); StepInterface si2 = trans.getStepInterface( dummyStepname2, 0 ); RowStepCollector dummyRc2 = new RowStepCollector(); si2.addRowListener( dummyRc2 ); RowProducer rp = trans.addRowProducer( injectorStepname, 0 ); trans.startThreads(); // add rows List<RowMetaAndData> inputList = createDataAllUnique(); for ( RowMetaAndData rm : inputList ) { rp.putRow( rm.getRowMeta(), rm.getData() ); } rp.finished(); trans.waitUntilFinished(); List<RowMetaAndData> resultRows = dummyRc1.getRowsWritten(); checkRows( createResultDataAllUnique(), resultRows ); List<RowMetaAndData> errorRows = dummyRc2.getRowsWritten(); assertEquals( errorRows.size(), 0 ); // There should be no duplicates for this test } }