package com.revolsys.record.query;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import com.revolsys.datatype.DataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.record.Record;
import com.revolsys.record.schema.FieldDefinition;
import com.revolsys.record.schema.RecordStore;
public class In extends AbstractBinaryQueryValue implements Condition {
public In(final FieldDefinition field, final Collection<? extends Object> values) {
this(field.getName(), new CollectionValue(field, values));
}
public In(final QueryValue left, final CollectionValue values) {
super(left, values);
if (left instanceof Column) {
final Column column = (Column)left;
final FieldDefinition field = column.getFieldDefinition();
if (field != null) {
values.setFieldDefinition(field);
}
}
}
public In(final String name, final Collection<? extends Object> values) {
this(new Column(name), new CollectionValue(values));
}
public In(final String name, final CollectionValue values) {
this(new Column(name), values);
}
public In(final String name, final Object... values) {
this(name, Arrays.asList(values));
}
@Override
public void appendDefaultSql(final Query query, final RecordStore recordStore,
final StringBuilder buffer) {
super.appendLeft(buffer, query, recordStore);
buffer.append("IN");
super.appendRight(buffer, query, recordStore);
}
@Override
public In clone() {
final In clone = (In)super.clone();
return clone;
}
@Override
public boolean equals(final Object obj) {
if (obj instanceof In) {
final In in = (In)obj;
return super.equals(in);
}
return false;
}
public CollectionValue getValues() {
return (CollectionValue)getRight();
}
@Override
public boolean isEmpty() {
return getValues().isEmpty();
}
@Override
public boolean test(final Record record) {
final QueryValue left = getLeft();
final Object value = left.getValue(record);
final CollectionValue right = getValues();
final List<Object> allowedValues = right.getValues();
for (final Object allowedValue : allowedValues) {
if (DataType.equal(value, allowedValue)) {
return true;
}
}
return false;
}
@Override
public String toString() {
final Object value = getLeft();
final Object value1 = getRight();
return DataTypes.toString(value) + " IN " + DataTypes.toString(value1);
}
}