package edu.ucsd.arcum.interpreter.ast.expressions; import java.util.List; import java.util.Set; import com.google.common.collect.Sets; import edu.ucsd.arcum.exceptions.ArcumError; import edu.ucsd.arcum.exceptions.SourceLocation; import edu.ucsd.arcum.interpreter.ast.TraitSignature; import edu.ucsd.arcum.interpreter.query.ArcumDeclarationTable; public class SelectExpression extends ConstraintExpression { private final List<ConstraintExpression> conditions; private final List<ConstraintExpression> values; public SelectExpression(SourceLocation location, List<ConstraintExpression> conditions, List<ConstraintExpression> values) { super(location); this.conditions = conditions; this.values = values; if (conditions.size() + 1 != values.size()) { ArcumError.fatalError("Internal parsing error: condition clause"); } } @Override protected void doCheckUserDefinedPredicates(List<TraitSignature> tupleSets, Set<String> varsInScope) { for (ConstraintExpression condition : conditions) { condition.doCheckUserDefinedPredicates(tupleSets, varsInScope); } for (ConstraintExpression value : values) { value.doCheckUserDefinedPredicates(tupleSets, varsInScope); } } @Override public Set<String> getArcumVariableReferences() { Set<String> result = Sets.newHashSet(); for (ConstraintExpression condition : conditions) { result.addAll(condition.getArcumVariableReferences()); } result.remove(ArcumDeclarationTable.SPECIAL_ANY_VARIABLE); for (ConstraintExpression value : values) { result.addAll(value.getArcumVariableReferences()); } return result; } @Override public String toString() { StringBuilder buff = new StringBuilder(); buff.append(String.format("select {%n")); for (int i = 0; i < conditions.size(); ++i) { buff.append(conditions.get(i).toString()); buff.append(" : "); buff.append(values.get(i).toString()); buff.append(String.format(",%n")); } buff.append("default : "); buff.append(values.get(values.size() - 1).toString()); buff.append(String.format("%n")); buff.append("}"); return buff.toString(); } public List<ConstraintExpression> getConditions() { return conditions; } public List<ConstraintExpression> getValues() { return values; } // EXAMPLE: This could probably be accomplished with visitors or collectors @Override public Set<String> findAllTraitDependencies() { return flattenFindAllTraitDependencies(conditions, values); } @Override public Set<String> findNonMonotonicDependencies() { return flattenFindNonMonotonicDependencies(conditions, values); } }