package cassandra.cql.query;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public interface Assignment {
void accept(QueryVisitor visitor);
public static abstract class AbstractAssignment<T> implements Assignment {
protected String name;
protected T value;
protected AbstractAssignment(String name, T value) {
if (name == null) {
throw new NullPointerException("name");
}
if (name.isEmpty()) {
throw new IllegalArgumentException("empty name");
}
this.name = name;
this.value = value;
}
public String name() {
return name;
}
public T value() {
return value;
}
}
public static class And implements Assignment {
private List<Assignment> assignments;
public And() {
this(new ArrayList<Assignment>());
}
public And(List<Assignment> assignments) {
this.assignments = assignments;
}
public List<Assignment> assignments() {
return assignments;
}
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
}
public static class Set extends AbstractAssignment<Object> {
public Set(String name, Object value) {
super(name, value);
}
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
}
public static interface CounterAssignment extends Assignment {
// Tag
}
public static class Increment extends AbstractAssignment<Long> implements CounterAssignment {
public Increment(String name, Long value) {
super(name, value);
}
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
}
public static class Decrement extends AbstractAssignment<Long> implements CounterAssignment {
public Decrement(String name, Long value) {
super(name, value);
}
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
}
public static interface CollectionAssignment extends Assignment {
// Tag
}
public static class CollectionAdd extends AbstractAssignment<Collection<?>> implements CollectionAssignment {
private boolean prepend;
public CollectionAdd(String name, Collection<?> value, boolean prepend) {
super(name, value);
this.prepend = prepend;
}
public boolean isPrepend() {
return prepend && value instanceof List;
}
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
}
public static class CollectionRemove extends AbstractAssignment<Collection<?>> implements CollectionAssignment {
public CollectionRemove(String name, Collection<?> value) {
super(name, value);
}
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
}
public static class ListSet extends AbstractAssignment<Object> implements CollectionAssignment {
private int index;
public ListSet(String name, int index, Object value) {
super(name, value);
if (index < 0) {
throw new IllegalArgumentException(String.format("index: %d (expected: >= 0)", index));
}
if (value instanceof List) {
throw new IllegalArgumentException("nested type not allowed");
}
this.index = index;
}
public int index() {
return index;
}
@Override
public void accept(QueryVisitor visitor) {
//
}
}
public static class ListRemoveAt extends AbstractAssignment<Integer> implements CollectionAssignment {
public ListRemoveAt(String name, Integer value) {
super(name, value);
}
@Override
public void accept(QueryVisitor visitor) {
//
}
}
public static class MapPut extends AbstractAssignment<Object> {
private Object key;
public MapPut(String name, Object key, Object value) {
super(name, value);
if (key == null) {
throw new NullPointerException("key");
}
this.key = key;
}
public Object key() {
return key;
}
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
}
public static class MapPutAll extends AbstractAssignment<Map<?, ?>> {
public MapPutAll(String name, Map<?, ?> value) {
super(name, value);
}
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
}
}