/*! ******************************************************************************
*
* 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.core.row;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.pentaho.di.core.exception.KettleEOFException;
import org.pentaho.di.core.exception.KettleFileException;
import org.pentaho.di.core.row.value.ValueMetaBigNumber;
import org.pentaho.di.core.row.value.ValueMetaBoolean;
import org.pentaho.di.core.row.value.ValueMetaDate;
import org.pentaho.di.core.row.value.ValueMetaInteger;
import org.pentaho.di.core.row.value.ValueMetaNumber;
import org.pentaho.di.core.row.value.ValueMetaString;
import org.pentaho.di.core.row.value.ValueMetaTimestamp;
import junit.framework.TestCase;
public class RowTest extends TestCase {
public void testNormalStringConversion() throws Exception {
SimpleDateFormat fmt = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss.SSS" );
Object[] rowData1 =
new Object[] { "sampleString", fmt.parse( "2007/05/07 13:04:13.203" ), new Double( 9123.00 ),
new Long( 12345 ), new BigDecimal( "123456789012345678.9349" ), Boolean.TRUE, };
RowMetaInterface rowMeta1 = createTestRowMetaNormalStringConversion1();
assertEquals( "sampleString", rowMeta1.getString( rowData1, 0 ) );
assertEquals( "2007/05/07 13:04:13.203", rowMeta1.getString( rowData1, 1 ) );
assertEquals( "9,123.00", rowMeta1.getString( rowData1, 2 ) );
assertEquals( "0012345", rowMeta1.getString( rowData1, 3 ) );
assertEquals( "123456789012345678.9349", rowMeta1.getString( rowData1, 4 ) );
assertEquals( "Y", rowMeta1.getString( rowData1, 5 ) );
fmt = new SimpleDateFormat( "yyyyMMddHHmmss" );
Object[] rowData2 =
new Object[] { null, fmt.parse( "20070507130413" ), new Double( 9123.9 ), new Long( 12345 ),
new BigDecimal( "123456789012345678.9349" ), Boolean.FALSE, };
RowMetaInterface rowMeta2 = createTestRowMetaNormalStringConversion2();
assertTrue( rowMeta2.getString( rowData2, 0 ) == null );
assertEquals( "20070507130413", rowMeta2.getString( rowData2, 1 ) );
assertEquals( "9.123,9", rowMeta2.getString( rowData2, 2 ) );
assertEquals( "0012345", rowMeta2.getString( rowData2, 3 ) );
assertEquals( "123456789012345678.9349", rowMeta2.getString( rowData2, 4 ) );
assertEquals( "false", rowMeta2.getString( rowData2, 5 ) );
}
public void testIndexedStringConversion() throws Exception {
String[] colors = new String[] { "Green", "Red", "Blue", "Yellow", null, };
// create some timezone friendly dates
SimpleDateFormat fmt = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss.SSS" );
Date[] dates =
new Date[] { fmt.parse( "2007/05/07 13:04:13.203" ), null, fmt.parse( "2007/05/05 05:15:49.349" ),
fmt.parse( "2007/05/05 19:08:44.736" ), };
RowMetaInterface rowMeta = createTestRowMetaIndexedStringConversion1( colors, dates );
Object[] rowData1 = new Object[] { Integer.valueOf( 0 ), Integer.valueOf( 0 ), };
Object[] rowData2 = new Object[] { Integer.valueOf( 1 ), Integer.valueOf( 1 ), };
Object[] rowData3 = new Object[] { Integer.valueOf( 2 ), Integer.valueOf( 2 ), };
Object[] rowData4 = new Object[] { Integer.valueOf( 3 ), Integer.valueOf( 3 ), };
Object[] rowData5 = new Object[] { Integer.valueOf( 4 ), Integer.valueOf( 0 ), };
assertEquals( "Green", rowMeta.getString( rowData1, 0 ) );
assertEquals( "2007/05/07 13:04:13.203", rowMeta.getString( rowData1, 1 ) );
assertEquals( "Red", rowMeta.getString( rowData2, 0 ) );
assertTrue( null == rowMeta.getString( rowData2, 1 ) );
assertEquals( "Blue", rowMeta.getString( rowData3, 0 ) );
assertEquals( "2007/05/05 05:15:49.349", rowMeta.getString( rowData3, 1 ) );
assertEquals( "Yellow", rowMeta.getString( rowData4, 0 ) );
assertEquals( "2007/05/05 19:08:44.736", rowMeta.getString( rowData4, 1 ) );
assertTrue( null == rowMeta.getString( rowData5, 0 ) );
assertEquals( "2007/05/07 13:04:13.203", rowMeta.getString( rowData5, 1 ) );
}
public void testExtractDataWithTimestampConversion() throws Exception {
RowMetaInterface rowMeta = createTestRowMetaNormalTimestampConversion();
Timestamp constTimestamp = Timestamp.valueOf( "2012-04-05 04:03:02.123456" );
Timestamp constTimestampForDate = Timestamp.valueOf( "2012-04-05 04:03:02.123" );
makeTestExtractDataWithTimestampConversion( rowMeta, " Test1", constTimestamp, constTimestamp );
makeTestExtractDataWithTimestampConversion( rowMeta, " Test2", new Date( constTimestamp.getTime() ),
constTimestampForDate );
makeTestExtractDataWithTimestampConversion( rowMeta, " Test3", new java.sql.Date( constTimestamp.getTime() ),
constTimestampForDate );
}
private void makeTestExtractDataWithTimestampConversion( RowMetaInterface rowMeta, String str, Date date,
Timestamp constTimestamp ) throws KettleEOFException, KettleFileException, IOException {
Object[] rowData = new Object[] { str, date };
byte[] result = RowMeta.extractData( rowMeta, rowData );
DataInputStream stream = new DataInputStream( new ByteArrayInputStream( result ) );
String extractedString = (String) new ValueMetaString().readData( stream );
Timestamp time = (Timestamp) new ValueMetaTimestamp().readData( stream );
stream.close();
assertTrue( str.equals( extractedString ) );
assertTrue( constTimestamp.equals( time ) );
}
private RowMetaInterface createTestRowMetaNormalStringConversion1() {
RowMetaInterface rowMeta = new RowMeta();
// A string object
ValueMetaInterface meta1 = new ValueMetaString( "stringValue", 30, 0 );
rowMeta.addValueMeta( meta1 );
ValueMetaInterface meta2 = new ValueMetaDate( "dateValue", ValueMetaInterface.TYPE_DATE );
rowMeta.addValueMeta( meta2 );
ValueMetaInterface meta3 = new ValueMetaNumber( "numberValue", 5, 2 );
meta3.setConversionMask( "#,##0.00" );
meta3.setDecimalSymbol( "." );
meta3.setGroupingSymbol( "," );
rowMeta.addValueMeta( meta3 );
ValueMetaInterface meta4 = new ValueMetaInteger( "integerValue", 7, 0 );
meta4.setConversionMask( "0000000" );
meta4.setDecimalSymbol( "." );
meta4.setGroupingSymbol( "," );
rowMeta.addValueMeta( meta4 );
ValueMetaInterface meta5 = new ValueMetaBigNumber( "bigNumberValue", 30, 7 );
meta5.setDecimalSymbol( "." );
rowMeta.addValueMeta( meta5 );
ValueMetaInterface meta6 = new ValueMetaBoolean( "booleanValue" );
rowMeta.addValueMeta( meta6 );
return rowMeta;
}
private RowMetaInterface createTestRowMetaNormalTimestampConversion() {
RowMetaInterface rowMeta = new RowMeta();
// A string object
ValueMetaInterface meta1 = new ValueMetaString( "stringValue" );
rowMeta.addValueMeta( meta1 );
ValueMetaInterface meta2 = new ValueMetaTimestamp( "timestampValue" );
rowMeta.addValueMeta( meta2 );
return rowMeta;
}
private RowMetaInterface createTestRowMetaNormalStringConversion2() {
RowMetaInterface rowMeta = new RowMeta();
// A string object
ValueMetaInterface meta1 = new ValueMetaString( "stringValue", 30, 0 );
meta1.setStorageType( ValueMetaInterface.STORAGE_TYPE_INDEXED );
rowMeta.addValueMeta( meta1 );
ValueMetaInterface meta2 = new ValueMetaDate( "dateValue" );
meta2.setConversionMask( "yyyyMMddHHmmss" );
rowMeta.addValueMeta( meta2 );
ValueMetaInterface meta3 = new ValueMetaNumber( "numberValue", 5, 2 );
meta3.setConversionMask( "###,##0.##" );
meta3.setDecimalSymbol( "," );
meta3.setGroupingSymbol( "." );
rowMeta.addValueMeta( meta3 );
ValueMetaInterface meta4 = new ValueMetaInteger( "integerValue", 7, 0 );
meta4.setConversionMask( "0000000" );
meta4.setDecimalSymbol( "," );
meta4.setGroupingSymbol( "." );
rowMeta.addValueMeta( meta4 );
ValueMetaInterface meta5 = new ValueMetaBigNumber( "bigNumberValue", 30, 7 );
meta5.setDecimalSymbol( "." );
rowMeta.addValueMeta( meta5 );
ValueMetaInterface meta6 = new ValueMetaBoolean( "booleanValue", 3, 0 );
rowMeta.addValueMeta( meta6 );
return rowMeta;
}
private RowMetaInterface createTestRowMetaIndexedStringConversion1( String[] colors, Date[] dates ) {
RowMetaInterface rowMeta = new RowMeta();
// A string object, indexed.
ValueMetaInterface meta1 = new ValueMetaString( "stringValue", 30, 0 );
meta1.setIndex( colors );
meta1.setStorageType( ValueMetaInterface.STORAGE_TYPE_INDEXED );
rowMeta.addValueMeta( meta1 );
ValueMetaInterface meta2 = new ValueMetaDate( "dateValue" );
meta2.setIndex( dates );
meta2.setStorageType( ValueMetaInterface.STORAGE_TYPE_INDEXED );
rowMeta.addValueMeta( meta2 );
return rowMeta;
}
}