package uk.ac.imperial.lsds.seep.api;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.imperial.lsds.seep.api.operator.LogicalOperator;
import uk.ac.imperial.lsds.seep.api.operator.Operator;
import uk.ac.imperial.lsds.seep.api.operator.sinks.Sink;
import uk.ac.imperial.lsds.seep.api.operator.sources.Source;
import uk.ac.imperial.lsds.seep.api.state.SeepState;
import uk.ac.imperial.lsds.seep.infrastructure.ControlEndPoint;
import uk.ac.imperial.lsds.seep.scheduler.ScheduleDescription;
import uk.ac.imperial.lsds.seep.scheduler.Stage;
import uk.ac.imperial.lsds.seep.scheduler.StageType;
public class ScheduleBuilder implements ScheduleAPI {
final private Logger LOG = LoggerFactory.getLogger(ScheduleBuilder.class);
private Set<Stage> stages = new HashSet<>();
/**
* ScheduleAPI implementation
*/
public ScheduleDescription build() {
// TODO: make sure stages were declared, defined, etc
ScheduleDescription sd = new ScheduleDescription(stages, queryAPI.getQueryOperators());
return sd;
}
@Override
public boolean declareStages(Stage... stagesToDeclare) {
for(Stage s : stagesToDeclare) {
stages.add(s);
}
return true;
}
@Override
public Stage createStage(int stageId, int opId, StageType t, ControlEndPoint location) {
// TODO: do all error checking here
if(t.equals(StageType.SINK_STAGE) && stageId != 0) {
LOG.error("Sink stage must have id == 0 (fix this constrain)");
System.exit(0);
}
Stage stage = new Stage(stageId);
stage.add(opId);
stage.setStageType(t);
stage.setStageLocation(location);
return stage;
}
/**
* QueryAPI implementation
*/
private static QueryBuilder queryAPI = new QueryBuilder();
@Override
public List<LogicalOperator> getQueryOperators() {
return queryAPI.getQueryOperators();
}
@Override
public List<SeepState> getQueryState() {
return queryAPI.getQueryState();
}
@Override
public int getInitialPhysicalInstancesPerLogicalOperator(int logicalOperatorId) {
return queryAPI.getInitialPhysicalInstancesPerLogicalOperator(logicalOperatorId);
}
@Override
public List<LogicalOperator> getSources() {
return queryAPI.getSources();
}
@Override
public LogicalOperator getSink() {
return queryAPI.getSink();
}
@Override
public LogicalOperator newStatefulSource(Source seepTask, SeepState state, int opId) {
return queryAPI.newStatefulSource(seepTask, state, opId);
}
@Override
public LogicalOperator newStatelessSource(Source seepTask, int opId) {
return queryAPI.newStatelessSource(seepTask, opId);
}
@Override
public LogicalOperator newStatefulOperator(SeepTask seepTask, SeepState state, int opId) {
return queryAPI.newStatefulOperator(seepTask, state, opId);
}
@Override
public LogicalOperator newStatelessOperator(SeepTask seepTask, int opId) {
return queryAPI.newStatelessOperator(seepTask, opId);
}
@Override
public LogicalOperator newStatefulSink(Sink seepTask, SeepState state, int opId) {
return queryAPI.newStatefulSink(seepTask, state, opId);
}
@Override
public LogicalOperator newStatelessSink(Sink seepTask, int opId) {
return queryAPI.newStatelessSink(seepTask, opId);
}
@Override
public Operator newChooseOperator(SeepChooseTask choose, int opId) {
return queryAPI.newChooseOperator(choose, opId);
}
@Override
public void setInitialPhysicalInstancesForLogicalOperator(int opId, int numInstances) {
System.out.println("TODO: ERROR, invalid option");
System.exit(0);
}
}