/*! ******************************************************************************
*
* 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.mappinginput;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.pentaho.di.core.BlockingRowSet;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.logging.LoggingObjectInterface;
import org.pentaho.di.core.logging.LoggingObjectType;
import org.pentaho.di.core.logging.SimpleLoggingObject;
import org.pentaho.di.core.plugins.Plugin;
import org.pentaho.di.core.plugins.PluginRegistry;
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.ValueMetaInteger;
import org.pentaho.di.core.row.value.ValueMetaPluginType;
import org.pentaho.di.core.row.value.ValueMetaString;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.steps.mapping.MappingValueRename;
public class MappingInputFieldsTest {
private static Plugin p1;
private static Plugin p2;
MappingInput step;
MappingInputMeta meta;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
KettleEnvironment.init();
// PluginRegistry.addPluginType(ValueMetaPluginType.getInstance());
PluginRegistry.getInstance().registerPluginType( ValueMetaPluginType.class );
Map<Class<?>, String> classes = new HashMap<Class<?>, String>();
classes.put( ValueMetaInterface.class, "org.pentaho.di.core.row.value.ValueMetaString" );
p1 =
new Plugin( new String[] { "2" }, ValueMetaPluginType.class, ValueMetaInterface.class, "", "", "", "", false,
true, classes, null, null, null );
classes = new HashMap<Class<?>, String>();
classes.put( ValueMetaInterface.class, "org.pentaho.di.core.row.value.ValueMetaInteger" );
p2 =
new Plugin( new String[] { "5" }, ValueMetaPluginType.class, ValueMetaInterface.class, "", "", "", "", false,
true, classes, null, null, null );
PluginRegistry.getInstance().registerPlugin( ValueMetaPluginType.class, p1 );
PluginRegistry.getInstance().registerPlugin( ValueMetaPluginType.class, p2 );
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
if ( p1 != null ) {
PluginRegistry.getInstance().removePlugin( ValueMetaPluginType.class, p1 );
}
if ( p2 != null ) {
PluginRegistry.getInstance().removePlugin( ValueMetaPluginType.class, p2 );
}
}
@Before
public void setUp() throws Exception {
meta = new MappingInputMeta();
meta.setFieldName( new String[] { "n2", "n4" } );
meta.setFieldType( new int[] { ValueMetaInterface.TYPE_INTEGER, ValueMetaInterface.TYPE_INTEGER } );
meta.setFieldLength( new int[] { 0, 0 } );
meta.setFieldPrecision( new int[] { 0, 0 } );
StepMeta sm = new StepMeta( "MappingInput", "SubTrans", meta );
TransMeta tm = new TransMeta();
tm.addStep( sm );
LoggingObjectInterface loi = new SimpleLoggingObject( "lo", LoggingObjectType.STEP, null );
Trans tr = new Trans( tm, loi );
step = new MappingInput( sm, null, 0, tm, tr );
step.getTrans().setRunning( true );
}
/**
* verifies: If SelectingAndSortingUnspecifiedFields checkbox is checked, then
* <ol>
* <li>all fields throw to the next step;
* <li>fields are resorted: mapped fields, then alphabetical sorted not mapped fields.
* </ol>
*/
@Test
public void testSelectingAndSortingUnspecifiedFields() throws Exception {
meta.setSelectingAndSortingUnspecifiedFields( true );
MappingInputData sdi = new MappingInputData();
sdi.linked = true;
sdi.valueRenames = new ArrayList<MappingValueRename>();
sdi.valueRenames.add( new MappingValueRename( "number2", "n2" ) );
sdi.valueRenames.add( new MappingValueRename( "number4", "n4" ) );
BlockingRowSet in = new BlockingRowSet( 10 );
BlockingRowSet out = new BlockingRowSet( 10 );
RowMeta rm = new RowMeta();
rm.addValueMeta( new ValueMetaString( "string" ) );
rm.addValueMeta( new ValueMetaInteger( "number1" ) );
rm.addValueMeta( new ValueMetaInteger( "number2" ) );
rm.addValueMeta( new ValueMetaInteger( "number3" ) );
rm.addValueMeta( new ValueMetaInteger( "number" ) );
rm.addValueMeta( new ValueMetaInteger( "number4" ) );
rm.addValueMeta( new ValueMetaInteger( "number5" ) );
in.putRow( rm, new Object[] { "str", new Integer( 100501 ), new Integer( 100502 ), new Integer( 100503 ),
new Integer( 100500 ), new Integer( 100504 ), new Integer( 100505 ) } );
in.putRow( rm, new Object[] { "str_1", new Integer( 200501 ), new Integer( 200502 ), new Integer( 200503 ),
new Integer( 200500 ), new Integer( 200504 ), new Integer( 200505 ) } );
step.getInputRowSets().add( in );
step.getOutputRowSets().add( out );
assertTrue( step.init( meta, sdi ) );
assertTrue( step.processRow( meta, sdi ) );
Object[] outRowData = out.getRow();
RowMetaInterface outMeta = out.getRowMeta();
assertEquals( "All fields are expected.", 7, outMeta.size() );
int i = 0;
// Check if row-meta is formed according to the step specification
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "n2", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "n4", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number1", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number3", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number5", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_STRING, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "string", outMeta.getValueMeta( i++ ).getName() );
// Check if row-data corresponds to the row-meta
assertEquals( "the field value mismatch.", new Integer( 100502 ), outRowData[0] );
assertEquals( "the field value mismatch.", new Integer( 100504 ), outRowData[1] );
assertEquals( "the field value mismatch.", new Integer( 100500 ), outRowData[2] );
assertEquals( "the field value mismatch.", new Integer( 100501 ), outRowData[3] );
assertEquals( "the field value mismatch.", new Integer( 100503 ), outRowData[4] );
assertEquals( "the field value mismatch.", new Integer( 100505 ), outRowData[5] );
assertEquals( "the field value mismatch.", "str", outRowData[6] );
assertTrue( step.processRow( meta, sdi ) );
outRowData = out.getRow();
outMeta = out.getRowMeta();
assertEquals( "All fields are expected.", 7, outMeta.size() );
i = 0;
// Check if row-meta is formed according to the step specification
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "n2", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "n4", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number1", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number3", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number5", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_STRING, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "string", outMeta.getValueMeta( i++ ).getName() );
// Check if row-data corresponds to the row-meta
assertEquals( "the field value mismatch.", new Integer( 200502 ), outRowData[0] );
assertEquals( "the field value mismatch.", new Integer( 200504 ), outRowData[1] );
assertEquals( "the field value mismatch.", new Integer( 200500 ), outRowData[2] );
assertEquals( "the field value mismatch.", new Integer( 200501 ), outRowData[3] );
assertEquals( "the field value mismatch.", new Integer( 200503 ), outRowData[4] );
assertEquals( "the field value mismatch.", new Integer( 200505 ), outRowData[5] );
assertEquals( "the field value mismatch.", "str_1", outRowData[6] );
}
/*
* verifies: If SelectingAndSortingUnspecifiedFields checkbox is not checked, then 1)all fields throw to the next step;
* 2)fields are not resorted;
*/
@Test
public void testOnlySpecifiedFields() throws Exception {
meta.setSelectingAndSortingUnspecifiedFields( false );
MappingInputData sdi = new MappingInputData();
sdi.linked = true;
sdi.valueRenames = new ArrayList<MappingValueRename>();
sdi.valueRenames.add( new MappingValueRename( "number2", "n2" ) );
sdi.valueRenames.add( new MappingValueRename( "number4", "n4" ) );
BlockingRowSet in = new BlockingRowSet( 10 );
BlockingRowSet out = new BlockingRowSet( 10 );
RowMeta rm = new RowMeta();
rm.addValueMeta( new ValueMetaString( "string" ) );
rm.addValueMeta( new ValueMetaInteger( "number1" ) );
rm.addValueMeta( new ValueMetaInteger( "number2" ) );
rm.addValueMeta( new ValueMetaInteger( "number3" ) );
rm.addValueMeta( new ValueMetaInteger( "number" ) );
rm.addValueMeta( new ValueMetaInteger( "number4" ) );
rm.addValueMeta( new ValueMetaInteger( "number5" ) );
in.putRow( rm, new Object[] { "str", new Integer( 100501 ), new Integer( 100502 ), new Integer( 100503 ),
new Integer( 100500 ), new Integer( 100504 ), new Integer( 100505 ) } );
in.putRow( rm, new Object[] { "str_1", new Integer( 200501 ), new Integer( 200502 ), new Integer( 200503 ),
new Integer( 200500 ), new Integer( 200504 ), new Integer( 200505 ) } );
step.getInputRowSets().add( in );
step.getOutputRowSets().add( out );
assertTrue( step.init( meta, sdi ) );
assertTrue( step.processRow( meta, sdi ) );
Object[] outRowData = out.getRow();
RowMetaInterface outMeta = out.getRowMeta();
assertEquals( "All fields are expected.", 7, outMeta.size() );
int i = 0;
// Check if row-meta is formed according to the step specification
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_STRING, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "string", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number1", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "n2", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number3", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "n4", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number5", outMeta.getValueMeta( i++ ).getName() );
// Check if row-data corresponds to the row-meta
assertEquals( "the field value mismatch.", "str", outRowData[0] );
assertEquals( "the field value mismatch.", new Integer( 100501 ), outRowData[1] );
assertEquals( "the field value mismatch.", new Integer( 100502 ), outRowData[2] );
assertEquals( "the field value mismatch.", new Integer( 100503 ), outRowData[3] );
assertEquals( "the field value mismatch.", new Integer( 100500 ), outRowData[4] );
assertEquals( "the field value mismatch.", new Integer( 100504 ), outRowData[5] );
assertEquals( "the field value mismatch.", new Integer( 100505 ), outRowData[6] );
assertTrue( step.processRow( meta, sdi ) );
outRowData = out.getRow();
outMeta = out.getRowMeta();
assertEquals( "All fields are expected.", 7, outMeta.size() );
i = 0;
// Check if row-meta is formed according to the step specification
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_STRING, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "string", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number1", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "n2", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number3", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "n4", outMeta.getValueMeta( i++ ).getName() );
assertEquals( "the field type-meta mismatch.", ValueMetaInterface.TYPE_INTEGER, outMeta.getValueMeta( i ).getType() );
assertEquals( "the field name-meta mismatch.", "number5", outMeta.getValueMeta( i++ ).getName() );
// Check if row-data corresponds to the row-meta
assertEquals( "the field value mismatch.", "str_1", outRowData[0] );
assertEquals( "the field value mismatch.", new Integer( 200501 ), outRowData[1] );
assertEquals( "the field value mismatch.", new Integer( 200502 ), outRowData[2] );
assertEquals( "the field value mismatch.", new Integer( 200503 ), outRowData[3] );
assertEquals( "the field value mismatch.", new Integer( 200500 ), outRowData[4] );
assertEquals( "the field value mismatch.", new Integer( 200504 ), outRowData[5] );
assertEquals( "the field value mismatch.", new Integer( 200505 ), outRowData[6] );
}
}