/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2017 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.normaliser;
import org.junit.BeforeClass;
import org.junit.Test;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.RowMetaAndData;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaDate;
import org.pentaho.di.core.row.value.ValueMetaInteger;
import org.pentaho.di.core.row.value.ValueMetaString;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.TransTestFactory;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class NormaliserTest {
@BeforeClass
public static void before() throws KettleException {
KettleEnvironment.init( false );
}
private NormaliserMeta.NormaliserField[] getTestNormaliserFieldsWiki() {
NormaliserMeta.NormaliserField[] rtn = new NormaliserMeta.NormaliserField[6];
rtn[0] = new NormaliserMeta.NormaliserField();
rtn[0].setName( "pr_sl" );
rtn[0].setNorm( "Product Sales" );
rtn[0].setValue( "Product1" ); // Type
rtn[1] = new NormaliserMeta.NormaliserField();
rtn[1].setName( "pr1_nr" );
rtn[1].setNorm( "Product Number" );
rtn[1].setValue( "Product1" );
rtn[2] = new NormaliserMeta.NormaliserField();
rtn[2].setName( "pr2_sl" );
rtn[2].setNorm( "Product Sales" );
rtn[2].setValue( "Product2" );
rtn[3] = new NormaliserMeta.NormaliserField();
rtn[3].setName( "pr2_nr" );
rtn[3].setNorm( "Product Number" );
rtn[3].setValue( "Product2" );
rtn[4] = new NormaliserMeta.NormaliserField();
rtn[4].setName( "pr3_sl" );
rtn[4].setNorm( "Product Sales" );
rtn[4].setValue( "Product3" );
rtn[5] = new NormaliserMeta.NormaliserField();
rtn[5].setName( "pr3_nr" );
rtn[5].setNorm( "Product Number" );
rtn[5].setValue( "Product3" );
return rtn;
}
private List<RowMetaAndData> getExpectedWikiOutputRowMetaAndData() {
final Date theDate = new Date( 103, 01, 01 );
List<RowMetaAndData> list = new ArrayList<>();
RowMetaInterface rm = new RowMeta();
rm.addValueMeta( new ValueMetaDate( "DATE" ) );
rm.addValueMeta( new ValueMetaString( "Type" ) );
rm.addValueMeta( new ValueMetaInteger( "Product Sales" ) );
rm.addValueMeta( new ValueMetaInteger( "Product Number" ) );
Object[] row = new Object[4];
row[0] = theDate;
row[1] = "Product1";
row[2] = 100;
row[3] = 5;
list.add( new RowMetaAndData( rm, row ) );
row = new Object[4];
row[0] = theDate;
row[1] = "Product2";
row[2] = 250;
row[3] = 10;
list.add( new RowMetaAndData( rm, row ) );
row = new Object[4];
row[0] = theDate;
row[1] = "Product3";
row[2] = 150;
row[3] = 4;
list.add( new RowMetaAndData( rm, row ) );
return list;
}
private List<RowMetaAndData> getWikiInputRowMetaAndData() {
List<RowMetaAndData> list = new ArrayList<>();
Object[] row = new Object[7];
RowMetaInterface rm = new RowMeta();
rm.addValueMeta( new ValueMetaDate( "DATE" ) );
row[0] = new Date( 103, 01, 01 );
rm.addValueMeta( new ValueMetaInteger( "PR1_NR" ) );
row[1] = 5;
rm.addValueMeta( new ValueMetaInteger( "PR_SL" ) );
row[2] = 100;
rm.addValueMeta( new ValueMetaInteger( "PR2_NR" ) );
row[3] = 10;
rm.addValueMeta( new ValueMetaInteger( "PR2_SL" ) );
row[4] = 250;
rm.addValueMeta( new ValueMetaInteger( "PR3_NR" ) );
row[5] = 4;
rm.addValueMeta( new ValueMetaInteger( "PR3_SL" ) );
row[6] = 150;
list.add( new RowMetaAndData( rm, row ) );
return list;
}
private void checkResults( List<RowMetaAndData> expectedOutput, List<RowMetaAndData> outputList ) {
assertEquals( expectedOutput.size(), outputList.size() );
for ( int i = 0; i < outputList.size(); i++ ) {
RowMetaAndData aRowMetaAndData = outputList.get( i );
RowMetaAndData expectedRowMetaAndData = expectedOutput.get( i );
RowMetaInterface rowMeta = aRowMetaAndData.getRowMeta();
RowMetaInterface expectedRowMeta = expectedRowMetaAndData.getRowMeta();
String[] fields = rowMeta.getFieldNames();
String[] expectedFields = expectedRowMeta.getFieldNames();
assertEquals( expectedFields.length, fields.length );
assertArrayEquals( expectedFields, fields );
Object[] aRow = aRowMetaAndData.getData();
Object[] expectedRow = expectedRowMetaAndData.getData();
assertEquals( expectedRow.length, aRow.length );
assertArrayEquals( expectedRow, aRow );
}
}
@Test
public void testNormaliserProcessRowsWikiData() throws Exception {
// We should have 1 row as input to the normaliser and 3 rows as output to the normaliser with the data
// shown on the Wiki page: http://wiki.pentaho.com/display/EAI/Row+Normaliser
//
//
// Data input looks like this:
//
// DATE PR1_NR PR_SL PR2_NR PR2_SL PR3_NR PR3_SL
// 2003010 5 100 10 250 4 150
//
// Data output looks like this:
//
// DATE Type Product Sales Product Number
// 2003010 Product1 100 5
// 2003010 Product2 250 10
// 2003010 Product3 150 4
//
final String stepName = "Row Normaliser";
NormaliserMeta stepMeta = new NormaliserMeta();
stepMeta.setDefault();
stepMeta.setNormaliserFields( getTestNormaliserFieldsWiki() );
stepMeta.setTypeField( "Type" );
TransMeta transMeta = TransTestFactory.generateTestTransformation( null, stepMeta, stepName );
List<RowMetaAndData> inputList = getWikiInputRowMetaAndData();
List<RowMetaAndData> outputList = TransTestFactory.executeTestTransformation( transMeta, TransTestFactory.INJECTOR_STEPNAME, stepName, TransTestFactory.DUMMY_STEPNAME, inputList );
List<RowMetaAndData> expectedOutput = this.getExpectedWikiOutputRowMetaAndData();
checkResults( expectedOutput, outputList );
}
}