package org.radargun.stages.query;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.radargun.DistStageAck;
import org.radargun.StageResult;
import org.radargun.config.PropertyDelegate;
import org.radargun.config.Stage;
import org.radargun.reporting.Report;
import org.radargun.stages.test.OperationLogic;
import org.radargun.stages.test.Stressor;
import org.radargun.stages.test.TestStage;
import org.radargun.stages.test.TransactionMode;
import org.radargun.state.SlaveState;
import org.radargun.stats.Statistics;
import org.radargun.traits.InjectTrait;
import org.radargun.traits.InternalsExposition;
import org.radargun.traits.Queryable;
/**
* This stage was refactored out to {@link org.radargun.stages.query} package in order
* to make that code reusable with different threading models.
*/
@Stage(doc = "Stage which executes a query.")
public class QueryStage extends TestStage {
@PropertyDelegate
public QueryConfiguration query = new QueryConfiguration();
@PropertyDelegate
public QueryBase base = new QueryBase();
@InjectTrait(dependency = InjectTrait.Dependency.MANDATORY)
private Queryable queryable;
@InjectTrait
private InternalsExposition internalsExposition;
@Override
public OperationLogic getLogic() {
boolean useTxs = useTransactions == TransactionMode.ALWAYS ? true : useTransactions == TransactionMode.NEVER ? false : useTransactions(null);
return new QueryLogic(base, queryable, useTxs);
}
@Override
public void init() {
base.init(queryable, query);
}
@Override
protected DistStageAck newStatisticsAck(List<Stressor> stressors) {
QueryBase.Data data = base.createQueryData(internalsExposition);
return new QueryAck(slaveState, gatherResults(stressors, new StatisticsResultRetriever()), data);
}
@Override
public StageResult processAckOnMaster(List<DistStageAck> acks) {
StageResult result = super.processAckOnMaster(acks);
if (result.isError()) return result;
Map<Integer, QueryBase.Data> results = acks.stream().filter(QueryAck.class::isInstance).collect(
Collectors.toMap(ack -> ack.getSlaveIndex(), ack -> ((QueryAck) ack).data));
Report.Test test = getTest(true); // the test was already created in super.processAckOnMaster
base.checkAndRecordResults(results, test, getTestIteration());
return result;
}
protected static class QueryAck extends StatisticsAck {
private final QueryBase.Data data;
public QueryAck(SlaveState slaveState, List<Statistics> statistics, QueryBase.Data data) {
super(slaveState, statistics, null);
this.data = data;
}
}
}