package com.revolsys.record.query;
import java.sql.PreparedStatement;
import java.util.Collections;
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;
public abstract class AbstractUnaryQueryValue implements QueryValue {
private QueryValue value;
public AbstractUnaryQueryValue(final QueryValue value) {
this.value = value;
}
@Override
public void appendDefaultSql(final Query query, final RecordStore recordStore,
final StringBuilder buffer) {
this.value.appendSql(query, recordStore, buffer);
}
@Override
public int appendParameters(int index, final PreparedStatement statement) {
if (this.value != null) {
index = this.value.appendParameters(index, statement);
}
return index;
}
protected void appendValue(final StringBuilder buffer, final Query query,
final RecordStore recordStore) {
if (this.value == null) {
buffer.append("NULL");
} else {
this.value.appendSql(query, recordStore, buffer);
}
buffer.append(" ");
}
@Override
public AbstractUnaryQueryValue clone() {
try {
final AbstractUnaryQueryValue clone = (AbstractUnaryQueryValue)super.clone();
clone.value = this.value.clone();
return clone;
} catch (final CloneNotSupportedException e) {
return null;
}
}
@Override
public boolean equals(final Object obj) {
if (obj instanceof AbstractUnaryQueryValue) {
final AbstractUnaryQueryValue binary = (AbstractUnaryQueryValue)obj;
if (DataType.equal(binary.getValue(), this.getValue())) {
return true;
}
}
return false;
}
@Override
public List<QueryValue> getQueryValues() {
return Collections.singletonList(this.value);
}
@Override
public String getStringValue(final Record record) {
return this.value.getStringValue(record);
}
@SuppressWarnings("unchecked")
public <V extends QueryValue> V getValue() {
return (V)this.value;
}
@Override
public <V> V getValue(final Record record) {
return this.value.getValue(record);
}
@Override
public String toString() {
if (this.value == null) {
return "null";
} else {
return this.value.toString();
}
}
@SuppressWarnings("unchecked")
@Override
public <QV extends QueryValue> QV updateQueryValues(
final Function<QueryValue, QueryValue> valueHandler) {
final QueryValue value = valueHandler.apply(this.value);
if (value == this.value) {
return (QV)this;
} else {
final AbstractUnaryQueryValue clone = clone();
clone.value = value;
return (QV)clone;
}
}
}