package org.embulk.input; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import com.google.common.base.Objects; import com.google.common.base.Optional; import java.util.ArrayList; import java.util.List; public class ParamsConfig { private final List queries; @JsonCreator public ParamsConfig(List queries) { this.queries = queries; } @JsonValue public List getQueries() { return queries; } public List> generateQueries(Optional pagerConfig) { List> base = new ArrayList<>(queries.size()); for (QueryConfig p : queries) { base.add(p.expand()); } int productSize = 1; int baseSize = base.size(); for (int i = 0; i < baseSize; productSize *= base.get(i).size(), i++); List> expands = new ArrayList<>(productSize); for (int i = 0; i < productSize; i++) { int j = 1; List one = new ArrayList<>(); for (List list : base) { QueryConfig.Query pc = list.get((i / j) % list.size()); one.add(pc); j *= list.size(); } if (pagerConfig.isPresent()) { for (List q : pagerConfig.get().expand()) { expands.add(copyAndConcat(one, q)); } } else { expands.add(one); } } return expands; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof ParamsConfig)) { return false; } ParamsConfig other = (ParamsConfig) obj; return Objects.equal(queries, other.queries); } @Override public int hashCode() { return Objects.hashCode(queries); } private List copyAndConcat(List... srcs) { List dest = new ArrayList<>(); for (List src : srcs) { for (QueryConfig.Query q : src) { dest.add(q.copy()); } } return dest; } }