package cassandra.cql.query; import java.util.ArrayList; import java.util.List; public interface Clause { void accept(QueryVisitor visitor); public static abstract class AbstractClause<T> implements Clause { protected String name; protected T value; protected AbstractClause(String name, T value) { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new IllegalArgumentException("empty name"); } if (value == null) { throw new NullPointerException("value"); } this.name = name; this.value = value; } public String name() { return name; } public T value() { return value; } } public static class And implements Clause { private List<Clause> clauses; public And() { this(new ArrayList<Clause>()); } public And(List<Clause> clauses) { this.clauses = clauses; } public List<Clause> clauses() { return clauses; } @Override public void accept(QueryVisitor visitor) { visitor.visit(this); } } public static class Selection implements Clause { private boolean distinct; private Selector[] selectors; public Selection(boolean distinct, Selector... selectors) { if (selectors == null) { throw new NullPointerException("selectors"); } this.distinct = distinct; this.selectors = selectors; } public Selector[] selectors() { return selectors; } public boolean isDistinct() { return distinct; } @Override public void accept(QueryVisitor visitor) { visitor.visit(this); } public static class Selector { String name, alias; Object value; public String name() { if (alias != null) { return name + " AS " + alias; } else { return name; } } public boolean hasValue() { return value != null; } public Object value() { return value; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Selector selector = (Selector)o; return !(alias != null ? !alias.equals(selector.alias) : selector.alias != null) && !(name != null ? !name.equals(selector.name) : selector.name != null); } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (alias != null ? alias.hashCode() : 0); return result; } } } public static class Using extends AbstractClause<Object> { public Using(String name, Object value) { super(name, value); } @Override public void accept(QueryVisitor visitor) { visitor.visit(this); } } public static interface Operator extends Clause { // Tag } public static class Equal extends AbstractClause<Object> implements Operator { public Equal(String name, Object value) { super(name, value); } @Override public void accept(QueryVisitor visitor) { visitor.visit(this); } } public static class LessThan extends AbstractClause<Object> implements Operator { public LessThan(String name, Object value) { super(name, value); } @Override public void accept(QueryVisitor visitor) { visitor.visit(this); } } public static class LessThanEquals extends AbstractClause<Object> implements Operator { public LessThanEquals(String name, Object value) { super(name, value); } @Override public void accept(QueryVisitor visitor) { } } public static class GreaterThan extends AbstractClause<Object> implements Operator { public GreaterThan(String name, Object value) { super(name, value); } @Override public void accept(QueryVisitor visitor) { visitor.visit(this); } } public static class GreaterThanEquals extends AbstractClause<Object> implements Operator { public GreaterThanEquals(String name, Object value) { super(name, value); } @Override public void accept(QueryVisitor visitor) { visitor.visit(this); } } public static class In extends AbstractClause<Object[]> implements Operator { public In(String name, Object[] values) { super(name, values); } @Override public void accept(QueryVisitor visitor) { visitor.visit(this); } } }