package com.ldbc.driver.validation;
import com.ldbc.driver.Db;
import com.ldbc.driver.DbConnectionState;
import com.ldbc.driver.DbException;
import com.ldbc.driver.Operation;
import com.ldbc.driver.OperationHandler;
import com.ldbc.driver.OperationHandlerRunnableContext;
import com.ldbc.driver.ResultReporter;
import com.ldbc.driver.Workload;
import com.ldbc.driver.WorkloadException;
import com.ldbc.driver.runtime.ConcurrentErrorReporter;
import java.text.DecimalFormat;
import java.util.Iterator;
import static java.lang.String.format;
public class DbValidator
{
public DbValidationResult validate( Iterator<ValidationParam> validationParameters,
Db db,
int validationParamsCount,
Workload workload ) throws WorkloadException
{
System.out.println( "----" );
DecimalFormat numberFormat = new DecimalFormat( "###,###,###,###,###" );
DbValidationResult dbValidationResult = new DbValidationResult( db );
ConcurrentErrorReporter errorReporter = new ConcurrentErrorReporter();
ResultReporter resultReporter = new ResultReporter.SimpleResultReporter( errorReporter );
int validationParamsProcessedSoFar = 0;
int validationParamsCrashedSoFar = 0;
int validationParamsIncorrectSoFar = 0;
while ( validationParameters.hasNext() )
{
ValidationParam validationParam = validationParameters.next();
Operation operation = validationParam.operation();
Object expectedOperationResult = validationParam.operationResult();
OperationHandlerRunnableContext handlerRunner;
try
{
handlerRunner = db.getOperationHandlerRunnableContext( operation );
}
catch ( Throwable e )
{
dbValidationResult.reportMissingHandlerForOperation( operation );
continue;
}
try
{
OperationHandler handler = handlerRunner.operationHandler();
DbConnectionState dbConnectionState = handlerRunner.dbConnectionState();
System.out.print( format(
"Processed %s / %s -- Crashed %s -- Incorrect %s -- Currently processing %s...\r",
numberFormat.format( validationParamsProcessedSoFar ),
numberFormat.format( validationParamsCount ),
numberFormat.format( validationParamsCrashedSoFar ),
numberFormat.format( validationParamsIncorrectSoFar ),
operation.getClass().getSimpleName()
) );
handler.executeOperation( operation, dbConnectionState, resultReporter );
if ( null == resultReporter.result() )
{
throw new DbException(
format( "Db returned null result for: %s", operation.getClass().getSimpleName() ) );
}
}
catch ( Throwable e )
{
// Not necessary, but perhaps useful for debugging
e.printStackTrace();
validationParamsCrashedSoFar++;
dbValidationResult
.reportUnableToExecuteOperation( operation, ConcurrentErrorReporter.stackTraceToString( e ) );
continue;
}
finally
{
validationParamsProcessedSoFar++;
handlerRunner.cleanup();
}
Object actualOperationResult = resultReporter.result();
if ( false == workload.resultsEqual( operation, expectedOperationResult, actualOperationResult ) )
{
validationParamsIncorrectSoFar++;
dbValidationResult
.reportIncorrectResultForOperation( operation, expectedOperationResult, actualOperationResult );
continue;
}
dbValidationResult.reportSuccessfulExecution( operation );
}
System.out.println( "----" );
return dbValidationResult;
}
}