package org.ggp.base.util.gdl.model.assignments;
import java.util.List;
import java.util.Map;
import org.ggp.base.util.gdl.grammar.GdlConstant;
import org.ggp.base.util.gdl.grammar.GdlDistinct;
import org.ggp.base.util.gdl.grammar.GdlVariable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
public class AssignmentIterationPlan {
//TODO: Come up with better representations
private final ImmutableList<GdlVariable> varsToAssign;
private final ImmutableList<ImmutableList<ImmutableList<GdlConstant>>> tuplesBySource;
private final ImmutableMap<GdlVariable, GdlConstant> headAssignment;
private final ImmutableList<Integer> indicesToChangeWhenNull;
private final ImmutableList<GdlDistinct> distincts;
private final ImmutableMap<Integer, GdlVariable> varsToChangePerDistinct;
private final ImmutableMap<Integer, AssignmentFunction> valuesToCompute;
private final ImmutableList<Integer> sourceDefiningSlot;
private final ImmutableList<ImmutableList<GdlConstant>> valuesToIterate;
private final ImmutableList<ImmutableList<Integer>> varsChosenBySource;
private final ImmutableList<ImmutableList<Boolean>> putDontCheckBySource;
private final boolean empty;
private final boolean allDone;
public AssignmentIterationPlan(
ImmutableList<GdlVariable> varsToAssign,
ImmutableList<ImmutableList<ImmutableList<GdlConstant>>> tuplesBySource,
ImmutableMap<GdlVariable, GdlConstant> headAssignment,
ImmutableList<Integer> indicesToChangeWhenNull,
ImmutableList<GdlDistinct> distincts,
ImmutableMap<Integer, GdlVariable> varsToChangePerDistinct,
ImmutableMap<Integer, AssignmentFunction> valuesToCompute,
ImmutableList<Integer> sourceDefiningSlot,
ImmutableList<ImmutableList<GdlConstant>> valuesToIterate,
ImmutableList<ImmutableList<Integer>> varsChosenBySource,
ImmutableList<ImmutableList<Boolean>> putDontCheckBySource,
boolean empty,
boolean allDone) {
this.varsToAssign = varsToAssign;
this.tuplesBySource = tuplesBySource;
this.headAssignment = headAssignment;
this.indicesToChangeWhenNull = indicesToChangeWhenNull;
this.distincts = distincts;
this.varsToChangePerDistinct = varsToChangePerDistinct;
this.valuesToCompute = valuesToCompute;
this.sourceDefiningSlot = sourceDefiningSlot;
this.valuesToIterate = valuesToIterate;
this.varsChosenBySource = varsChosenBySource;
this.putDontCheckBySource = putDontCheckBySource;
this.empty = empty;
this.allDone = allDone;
}
public ImmutableList<GdlVariable> getVarsToAssign() {
return varsToAssign;
}
public ImmutableList<ImmutableList<ImmutableList<GdlConstant>>> getTuplesBySource() {
return tuplesBySource;
}
public ImmutableMap<GdlVariable, GdlConstant> getHeadAssignment() {
return headAssignment;
}
public ImmutableList<Integer> getIndicesToChangeWhenNull() {
return indicesToChangeWhenNull;
}
public ImmutableList<GdlDistinct> getDistincts() {
return distincts;
}
public ImmutableMap<Integer, GdlVariable> getVarsToChangePerDistinct() {
return varsToChangePerDistinct;
}
public ImmutableMap<Integer, AssignmentFunction> getValuesToCompute() {
return valuesToCompute;
}
public ImmutableList<Integer> getSourceDefiningSlot() {
return sourceDefiningSlot;
}
public ImmutableList<ImmutableList<GdlConstant>> getValuesToIterate() {
return valuesToIterate;
}
public ImmutableList<ImmutableList<Integer>> getVarsChosenBySource() {
return varsChosenBySource;
}
public ImmutableList<ImmutableList<Boolean>> getPutDontCheckBySource() {
return putDontCheckBySource;
}
public boolean getEmpty() {
return empty;
}
public boolean getAllDone() {
return allDone;
}
private static final AssignmentIterationPlan EMPTY_ITERATION_PLAN =
new AssignmentIterationPlan(
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
true,
false
);
public static AssignmentIterationPlan create(List<GdlVariable> varsToAssign,
List<ImmutableList<ImmutableList<GdlConstant>>> tuplesBySource,
Map<GdlVariable, GdlConstant> headAssignment,
List<Integer> indicesToChangeWhenNull,
List<GdlDistinct> distincts,
List<GdlVariable> varsToChangePerDistinct,
List<AssignmentFunction> valuesToCompute,
List<Integer> sourceDefiningSlot,
List<ImmutableList<GdlConstant>> valuesToIterate,
List<ImmutableList<Integer>> varsChosenBySource,
List<ImmutableList<Boolean>> putDontCheckBySource,
boolean empty,
boolean allDone) {
if (empty) {
return EMPTY_ITERATION_PLAN;
}
return new AssignmentIterationPlan(ImmutableList.copyOf(varsToAssign),
ImmutableList.copyOf(tuplesBySource),
ImmutableMap.copyOf(headAssignment),
ImmutableList.copyOf(indicesToChangeWhenNull),
ImmutableList.copyOf(distincts),
fromNullableList(varsToChangePerDistinct),
fromNullableList(valuesToCompute),
ImmutableList.copyOf(sourceDefiningSlot),
ImmutableList.copyOf(valuesToIterate),
ImmutableList.copyOf(varsChosenBySource),
ImmutableList.copyOf(putDontCheckBySource),
empty,
allDone);
}
private static <T> ImmutableMap<Integer, T> fromNullableList(
List<T> nullableList) {
ImmutableMap.Builder<Integer, T> builder = ImmutableMap.builder();
for (int i = 0; i < nullableList.size(); i++) {
if (nullableList.get(i) != null) {
builder.put(i, nullableList.get(i));
}
}
return builder.build();
}
}