package com.linkedin.thirdeye.rootcause; import com.linkedin.thirdeye.rootcause.impl.EntityUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * StaticPipeline emits a fixed set of entities as a result, regardless of the input. It is * used to encapsulate constants (such as user input) during framework execution. */ public class StaticPipeline extends Pipeline { private static final String PROP_ENTITIES = "entities"; private static final String PROP_SCORES = "scores"; private final Set<Entity> entities; /** * Constructor for dependency injection * * @param outputName pipeline output name * @param inputNames input pipeline names * @param entities entities to emit as result */ public StaticPipeline(String outputName, Set<String> inputNames, Set<Entity> entities) { super(outputName, inputNames); this.entities = entities; } /** * Alternate constructor for use by PipelineLoader * * @param outputName pipeline output name * @param inputNames input pipeline names * @param properties configuration properties ({@code PROP_ENTITIES}, {@code PROP_SCORES}) */ public StaticPipeline(String outputName, Set<String> inputNames, Map<String, String> properties) { super(outputName, inputNames); if(!properties.containsKey(PROP_ENTITIES)) throw new IllegalArgumentException(String.format("Property '%s' required, but not found", PROP_ENTITIES)); this.entities = new HashSet<>(); String entitiesProp = properties.get(PROP_ENTITIES); String[] urns = entitiesProp.split(","); List<Double> scores = new ArrayList<>(); if(properties.containsKey(PROP_SCORES)) { // per entity score String scoresProp = properties.get(PROP_SCORES); String[] scoreStrings = scoresProp.split(","); for(String s : scoreStrings) { scores.add(Double.parseDouble(s)); } } else { // default score for(int i=0; i<urns.length; i++) scores.add(1.0); } if(scores.size() != urns.length) throw new IllegalArgumentException(String.format("Requires equal number of scores [=%d] and entities [=%d]", scores.size(), urns.length)); for(int i=0; i<urns.length; i++) { this.entities.add(EntityUtils.parseURN(urns[i], scores.get(i))); } } @Override public PipelineResult run(PipelineContext context) { return new PipelineResult(context, this.entities); } }