package com.linkedin.thirdeye.rootcause;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Internal class for DAG execution in RCAFramework
*/
class PipelineCallable implements Callable<PipelineResult> {
private final static Logger LOG = LoggerFactory.getLogger(PipelineCallable.class);
public static final long TIMEOUT = RCAFramework.TIMEOUT;
private final Map<String, Future<PipelineResult>> dependencies;
private final Pipeline pipeline;
public PipelineCallable(Map<String, Future<PipelineResult>> dependencies, Pipeline pipeline) {
this.dependencies = dependencies;
this.pipeline = pipeline;
}
@Override
public PipelineResult call() throws Exception {
LOG.info("Preparing pipeline '{}'. Waiting for inputs '{}'", this.pipeline.getOutputName(), this.dependencies.keySet());
Map<String, Set<Entity>> inputs = new HashMap<>();
for(Map.Entry<String, Future<PipelineResult>> e : this.dependencies.entrySet()) {
PipelineResult r = e.getValue().get(TIMEOUT, TimeUnit.MILLISECONDS);
inputs.put(e.getKey(), r.getEntities());
}
LOG.info("Executing pipeline '{}'", this.pipeline.getOutputName());
PipelineContext context = new PipelineContext(inputs);
PipelineResult result = this.pipeline.run(context);
LOG.info("Completed pipeline '{}'. Got {} results", this.pipeline.getOutputName(), result.getEntities().size());
return result;
}
}