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.Workload.DbValidationParametersFilter; import com.ldbc.driver.Workload.DbValidationParametersFilterResult; import com.ldbc.driver.generator.Generator; import com.ldbc.driver.generator.GeneratorException; import com.ldbc.driver.runtime.ConcurrentErrorReporter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import static java.lang.String.format; public class ValidationParamsGenerator extends Generator<ValidationParam> { private final Db db; private final DbValidationParametersFilter dbValidationParametersFilter; private final Iterator<Operation> operations; private final ResultReporter resultReporter; private int entriesWrittenSoFar; private boolean needMoreValidationParameters; private final List<Operation> injectedOperations; public ValidationParamsGenerator( Db db, DbValidationParametersFilter dbValidationParametersFilter, Iterator<Operation> operations ) { this.db = db; this.dbValidationParametersFilter = dbValidationParametersFilter; this.operations = operations; this.resultReporter = new ResultReporter.SimpleResultReporter( new ConcurrentErrorReporter() ); this.entriesWrittenSoFar = 0; this.needMoreValidationParameters = true; this.injectedOperations = new ArrayList<>(); } public int entriesWrittenSoFar() { return entriesWrittenSoFar; } @Override protected ValidationParam doNext() throws GeneratorException { while ( (injectedOperations.size() > 0 || operations.hasNext()) && needMoreValidationParameters ) { Operation operation; if ( injectedOperations.isEmpty() ) { operation = operations.next(); } else { operation = injectedOperations.remove( 0 ); } if ( false == dbValidationParametersFilter.useOperation( operation ) ) { continue; } OperationHandlerRunnableContext operationHandlerRunner; try { operationHandlerRunner = db.getOperationHandlerRunnableContext( operation ); } catch ( DbException e ) { throw new GeneratorException( format( "Error retrieving operation handler for operation\n" + "Db: %s\n" + "Operation: %s", db.getClass().getName(), operation ), e ); } try { OperationHandler operationHandler = operationHandlerRunner.operationHandler(); DbConnectionState dbConnectionState = operationHandlerRunner.dbConnectionState(); operationHandler.executeOperation( operation, dbConnectionState, resultReporter ); } catch ( DbException e ) { throw new GeneratorException( format( "" + "Error executing operation to retrieve validation result\n" + "Db: %s\n" + "Operation: %s", db.getClass().getName(), operation ), e ); } finally { operationHandlerRunner.cleanup(); } Object result = resultReporter.result(); DbValidationParametersFilterResult dbValidationParametersFilterResult = dbValidationParametersFilter.useOperationAndResultForValidation( operation, result ); injectedOperations.addAll( dbValidationParametersFilterResult.injectedOperations() ); switch ( dbValidationParametersFilterResult.acceptance() ) { case REJECT_AND_CONTINUE: continue; case REJECT_AND_FINISH: needMoreValidationParameters = false; continue; case ACCEPT_AND_CONTINUE: entriesWrittenSoFar++; return ValidationParam.createUntyped( operation, result ); case ACCEPT_AND_FINISH: entriesWrittenSoFar++; needMoreValidationParameters = false; return ValidationParam.createUntyped( operation, result ); default: throw new GeneratorException( format( "Unrecognized %s value: %s", Workload.DbValidationParametersFilterAcceptance.class.getSimpleName(), dbValidationParametersFilterResult.acceptance().name() ) ); } } // ran out of operations OR validation set size has been reached return null; } }