package nl.uva.softwcons.ql.validation;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import nl.uva.softwcons.ql.ast.expression.Expression;
import nl.uva.softwcons.ql.ast.expression.ExpressionVisitor;
import nl.uva.softwcons.ql.ast.expression.binary.BinaryExpression;
import nl.uva.softwcons.ql.ast.expression.binary.arithmetic.Addition;
import nl.uva.softwcons.ql.ast.expression.binary.arithmetic.Division;
import nl.uva.softwcons.ql.ast.expression.binary.arithmetic.Multiplication;
import nl.uva.softwcons.ql.ast.expression.binary.arithmetic.Subtraction;
import nl.uva.softwcons.ql.ast.expression.binary.comparison.Equal;
import nl.uva.softwcons.ql.ast.expression.binary.comparison.GreaterOrEqual;
import nl.uva.softwcons.ql.ast.expression.binary.comparison.GreaterThan;
import nl.uva.softwcons.ql.ast.expression.binary.comparison.LowerOrEqual;
import nl.uva.softwcons.ql.ast.expression.binary.comparison.LowerThan;
import nl.uva.softwcons.ql.ast.expression.binary.comparison.NotEqual;
import nl.uva.softwcons.ql.ast.expression.binary.logical.And;
import nl.uva.softwcons.ql.ast.expression.binary.logical.Or;
import nl.uva.softwcons.ql.ast.expression.identifier.Identifier;
import nl.uva.softwcons.ql.ast.expression.literal.BooleanLiteral;
import nl.uva.softwcons.ql.ast.expression.literal.NumberLiteral;
import nl.uva.softwcons.ql.ast.expression.literal.StringLiteral;
import nl.uva.softwcons.ql.ast.expression.unary.logical.Not;
public final class VariableExctractor implements ExpressionVisitor<Set<Identifier>> {
private VariableExctractor() {
}
public static Set<Identifier> extractFrom(final Expression expression) {
return expression.accept(new VariableExctractor());
}
@Override
public Set<Identifier> visit(final Addition expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final Division expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final Multiplication expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final Subtraction expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final Equal expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final GreaterOrEqual expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final GreaterThan expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final LowerOrEqual expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final LowerThan expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final NotEqual expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final And expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final Or expr) {
return extractVariablesFrom(expr);
}
@Override
public Set<Identifier> visit(final Not expr) {
return visitUnaryOperand(expr);
}
@Override
public Set<Identifier> visit(final Identifier questionId) {
return new HashSet<>(Arrays.asList(questionId));
}
@Override
public Set<Identifier> visit(final BooleanLiteral expr) {
return new HashSet<>();
}
@Override
public Set<Identifier> visit(final StringLiteral expr) {
return new HashSet<>();
}
@Override
public Set<Identifier> visit(final NumberLiteral expr) {
return new HashSet<>();
}
private Set<Identifier> extractVariablesFrom(final BinaryExpression expr) {
final Set<Identifier> variables = visitLeftOperand(expr);
variables.addAll(visitRightOperand(expr));
return variables;
}
}