package com.revolsys.record.query.functions;
import java.sql.PreparedStatement;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.revolsys.datatype.DataType;
import com.revolsys.record.Record;
import com.revolsys.record.query.AbstractMultiQueryValue;
import com.revolsys.record.query.Query;
import com.revolsys.record.query.QueryValue;
import com.revolsys.record.schema.RecordStore;
import com.revolsys.util.Strings;
public class Function extends AbstractMultiQueryValue {
private final String name;
public Function(final String name, final List<QueryValue> parameters) {
super(parameters);
this.name = name;
}
public Function(final String name, final QueryValue... parameters) {
this(name, Arrays.asList(parameters));
}
public void add(final QueryValue value) {
addValue(value);
}
@Override
public void appendDefaultSql(final Query query, final RecordStore recordStore,
final StringBuilder buffer) {
buffer.append(this.name);
buffer.append("(");
boolean first = true;
for (final QueryValue parameter : getParameters()) {
if (first) {
first = false;
} else {
buffer.append(", ");
}
parameter.appendSql(query, recordStore, buffer);
}
buffer.append(")");
}
@Override
public int appendParameters(int index, final PreparedStatement statement) {
for (final QueryValue value : getParameters()) {
index = value.appendParameters(index, statement);
}
return index;
}
@Override
public Function clone() {
final Function clone = (Function)super.clone();
return clone;
}
@Override
public boolean equals(final Object obj) {
if (obj instanceof Function) {
final Function value = (Function)obj;
if (DataType.equal(getName(), value.getName())) {
final List<QueryValue> parameters1 = getParameters();
final List<QueryValue> parameters2 = value.getParameters();
if (parameters1.size() == parameters2.size()) {
for (int i = 0; i < parameters1.size(); i++) {
final QueryValue value1 = parameters1.get(i);
final QueryValue value2 = parameters2.get(i);
if (!DataType.equal(value1, value2)) {
return false;
}
}
return true;
}
}
}
return false;
}
public String getName() {
return this.name;
}
public QueryValue getParameter(final int index) {
final List<QueryValue> parameters = getParameters();
if (index >= 0 && index < parameters.size()) {
return parameters.get(index);
} else {
return null;
}
}
public List<QueryValue> getParameters() {
return Collections.unmodifiableList(getQueryValues());
}
public String getParameterStringValue(final int index, final Record record) {
final QueryValue parameter = getParameter(index);
if (parameter == null) {
return null;
} else {
return parameter.getStringValue(record);
}
}
public <V> V getParameterValue(final int index, final Record record) {
final QueryValue parameter = getParameter(index);
if (parameter == null) {
return null;
} else {
final V value = parameter.getValue(record);
return value;
}
}
@Override
public <V> V getValue(final Record record) {
throw new UnsupportedOperationException("Function is not supported" + getName());
}
@Override
public String toString() {
final List<QueryValue> parameters = getParameters();
return getName() + "(" + Strings.toString(", ", parameters) + ")";
}
}