/*! ******************************************************************************
*
* 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.run;
import java.text.DecimalFormat;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.util.Utils;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.Result;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.logging.KettleLogStore;
import org.pentaho.di.core.logging.LogLevel;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.RowListener;
import org.pentaho.di.trans.step.StepInterface;
public class TimedTransRunner {
private String filename;
private LogLevel logLevel;
private long records;
private double runTime;
private double speed;
private Result result;
private String rowListenerStep;
private RowListener rowListener;
private TransMeta transMeta;
private DatabaseMeta targetDatabaseMeta;
public TimedTransRunner( String filename, LogLevel logLevel, DatabaseMeta newTargetDatabaseMeta, long records ) {
this.filename = filename;
this.logLevel = logLevel;
this.targetDatabaseMeta = newTargetDatabaseMeta;
this.records = records;
}
public boolean run() throws Exception {
return runEngine( false );
}
public void printTransDescription() {
System.out.println();
System.out.println( "Transformation name : " + transMeta.getName() );
System.out.println( "Transformation description : " + Const.NVL( transMeta.getDescription(), "" ) );
System.out.println(
"-----------------------------------------------------------------------------------------------------" );
}
private static DecimalFormat recordsDF = new DecimalFormat( "###,###,##0" );
private static DecimalFormat runtimeDF = new DecimalFormat( "##0.00" );
private static DecimalFormat speedDF = new DecimalFormat( "#,###,###,##0" );
private void printStats( String prefix, long lines, double runTime, double speed ) {
System.out.println( prefix
+ ", rows: " + recordsDF.format( lines ) + ", runtime: " + runtimeDF.format( runTime ) + "s, speed: "
+ speedDF.format( speed ) + " rows/s" );
}
public boolean runEngine() throws KettleException {
return runEngine( false );
}
public boolean runEngine( boolean printDescription ) throws KettleException {
System.gc();
KettleEnvironment.init();
transMeta = new TransMeta( filename );
transMeta.setVariable( "NR_OF_ROWS", Long.toString( records ) );
if ( printDescription ) {
printTransDescription();
}
// Replace the TARGET database connection settings with the one provided
if ( targetDatabaseMeta != null ) {
transMeta.addOrReplaceDatabase( targetDatabaseMeta );
}
// OK, now run this transFormation.
Trans trans = new Trans( transMeta );
trans.setLogLevel( logLevel );
try {
trans.prepareExecution( null );
} catch ( Exception e ) {
System.err.println( KettleLogStore.getAppender().getBuffer( trans.getLogChannelId(), true ) );
trans.getLogChannel().logError( "Error preparing / initializing transformation", e );
return false;
}
if ( !Utils.isEmpty( rowListenerStep ) ) {
StepInterface step = trans.findRunThread( rowListenerStep );
if ( step != null ) {
step.addRowListener( rowListener );
}
}
long startTime = System.currentTimeMillis();
trans.startThreads();
trans.waitUntilFinished();
long stopTime = System.currentTimeMillis();
result = trans.getResult();
runTime = (double) ( stopTime - startTime ) / 1000;
speed = records / ( runTime );
printStats( "V3 results", records, runTime, speed );
return true;
}
/**
* @return the filename
*/
public String getFilename() {
return filename;
}
/**
* @param filename
* the filename to set
*/
public void setFilename( String filename ) {
this.filename = filename;
}
/**
* @return the logLevel
*/
public LogLevel getLogLevel() {
return logLevel;
}
/**
* @param logLevel
* the logLevel to set
*/
public void setLogLevel( LogLevel logLevel ) {
this.logLevel = logLevel;
}
/**
* @return the records
*/
public long getRecords() {
return records;
}
/**
* @param records
* the records to set
*/
public void setRecords( long records ) {
this.records = records;
}
/**
* @return the result
*/
public Result getNewResult() {
return result;
}
/**
* @param result
* the result to set
*/
public void setNewResult( Result result ) {
this.result = result;
}
public void addRowListener( String stepname, RowListener rowListener ) {
this.rowListenerStep = stepname;
this.rowListener = rowListener;
}
/**
* @return the transMeta
*/
public TransMeta getTransMeta() {
return transMeta;
}
/**
* @param transMeta
* the transMeta to set
*/
public void setTransMeta( TransMeta transMeta ) {
this.transMeta = transMeta;
}
/**
* @return the Run Time
*/
public double getRunTime() {
return runTime;
}
/**
* @param runTime
* the run time to set
*/
public void setNewRunTime( double runTime ) {
this.runTime = runTime;
}
/**
* @return the speed
*/
public double speed() {
return speed;
}
/**
* @param speed
* the speed to set
*/
public void setSpeed( double speed ) {
this.speed = speed;
}
/**
* @return the targetDatabaseMeta
*/
public DatabaseMeta getTargetDatabaseMeta() {
return targetDatabaseMeta;
}
/**
* @param targetDatabaseMeta
* the targetDatabaseMeta to set
*/
public void setTargetDatabaseMeta( DatabaseMeta targetDatabaseMeta ) {
this.targetDatabaseMeta = targetDatabaseMeta;
}
}