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.schema.FieldDefinition;
import com.revolsys.record.schema.RecordStore;
public abstract class AbstractBinaryQueryValue implements QueryValue {
private QueryValue left;
private QueryValue right;
public AbstractBinaryQueryValue(final QueryValue left, final QueryValue right) {
this.left = left;
this.right = right;
}
protected void appendLeft(final StringBuilder buffer, final Query query,
final RecordStore recordStore) {
if (this.left == null) {
buffer.append("NULL");
} else {
this.left.appendSql(query, recordStore, buffer);
}
buffer.append(" ");
}
@Override
public int appendParameters(int index, final PreparedStatement statement) {
if (this.left != null) {
if (this.right instanceof Column && !(this.left instanceof Column)) {
final FieldDefinition rightFieldDefinition = ((Column)this.right).getFieldDefinition();
this.left.setFieldDefinition(rightFieldDefinition);
}
index = this.left.appendParameters(index, statement);
}
if (this.right != null) {
if (this.left instanceof Column && !(this.right instanceof Column)) {
final FieldDefinition rightFieldDefinition = ((Column)this.left).getFieldDefinition();
this.right.setFieldDefinition(rightFieldDefinition);
}
index = this.right.appendParameters(index, statement);
}
return index;
}
protected void appendRight(final StringBuilder buffer, final Query query,
final RecordStore recordStore) {
buffer.append(" ");
if (this.right == null) {
buffer.append("NULL");
} else {
this.right.appendSql(query, recordStore, buffer);
}
}
@Override
public AbstractBinaryQueryValue clone() {
try {
final AbstractBinaryQueryValue clone = (AbstractBinaryQueryValue)super.clone();
clone.left = this.left.clone();
clone.right = this.right.clone();
return clone;
} catch (final CloneNotSupportedException e) {
return null;
}
}
@Override
public boolean equals(final Object obj) {
if (obj instanceof AbstractBinaryQueryValue) {
final AbstractBinaryQueryValue binary = (AbstractBinaryQueryValue)obj;
if (DataType.equal(binary.getLeft(), this.getLeft())) {
if (DataType.equal(binary.getRight(), this.getRight())) {
return true;
}
}
}
return false;
}
@SuppressWarnings("unchecked")
public <V extends QueryValue> V getLeft() {
return (V)this.left;
}
@Override
public List<QueryValue> getQueryValues() {
return Arrays.asList(this.left, this.right);
}
@SuppressWarnings("unchecked")
public <V extends QueryValue> V getRight() {
return (V)this.right;
}
@SuppressWarnings("unchecked")
@Override
public <QV extends QueryValue> QV updateQueryValues(
final Function<QueryValue, QueryValue> valueHandler) {
final QueryValue left = valueHandler.apply(this.left);
final QueryValue right = valueHandler.apply(this.right);
if (left == this.left && right == this.right) {
return (QV)this;
} else {
final AbstractBinaryQueryValue clone = clone();
clone.left = left;
clone.right = right;
return (QV)clone;
}
}
}