package com.revolsys.record.query; import java.sql.PreparedStatement; import java.util.Arrays; import java.util.List; import java.util.function.Function; import com.revolsys.datatype.DataType; import com.revolsys.record.Record; import com.revolsys.record.schema.RecordStore; import com.revolsys.util.CompareUtil; import com.revolsys.util.JavaBeanUtil; public class Between extends AbstractUnaryQueryValue implements Condition { private Value max; private Value min; public Between(final Column column, final Value min, final Value max) { super(column); this.min = min; this.max = max; } @Override public void appendDefaultSql(final Query query, final RecordStore recordStore, final StringBuilder buffer) { super.appendDefaultSql(query, recordStore, buffer); buffer.append(" BETWEEN "); this.min.appendSql(query, recordStore, buffer); buffer.append(" AND "); this.max.appendSql(query, recordStore, buffer); } @Override public int appendParameters(int index, final PreparedStatement statement) { index = super.appendParameters(index, statement); index = this.min.appendParameters(index, statement); index = this.max.appendParameters(index, statement); return index; } @Override public Between clone() { final Between clone = (Between)super.clone(); clone.min = JavaBeanUtil.clone(getMin()); clone.max = JavaBeanUtil.clone(getMax()); return clone; } @Override public boolean equals(final Object obj) { if (obj instanceof Between) { final Between condition = (Between)obj; if (DataType.equal(condition.getMin(), this.getMin())) { if (DataType.equal(condition.getMax(), this.getMax())) { return super.equals(condition); } } } return false; } public Column getColumn() { return super.getValue(); } public Value getMax() { return this.max; } public Value getMin() { return this.min; } @Override public List<QueryValue> getQueryValues() { return Arrays.<QueryValue> asList(getValue(), this.min, this.max); } @Override public boolean test(final Record record) { final QueryValue colum = getColumn(); final Object columnValue = colum.getValue(record); if (columnValue == null) { return false; } else { final QueryValue min = getMin(); final Object minValue = min.getValue(record); if (minValue == null || CompareUtil.compare(minValue, columnValue) > 0) { return false; } else { final QueryValue max = getMax(); final Object maxValue = max.getValue(record); if (maxValue == null || CompareUtil.compare(maxValue, columnValue) < 0) { return false; } else { return true; } } } } @Override public String toString() { return getColumn() + " BETWEEN " + this.min + " AND " + this.max; } @SuppressWarnings("unchecked") @Override public <QV extends QueryValue> QV updateQueryValues( final Function<QueryValue, QueryValue> valueHandler) { Between between = super.updateQueryValues(valueHandler); final Value min = (Value)valueHandler.apply(this.min); final Value max = (Value)valueHandler.apply(this.max); if (between == this) { if (min == this.min && max == this.max) { return (QV)this; } else { between = clone(); } } between.min = min; between.max = max; return (QV)between; } }