package com.revolsys.record.query; import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.function.Function; import com.revolsys.datatype.DataType; import com.revolsys.util.Exceptions; public abstract class AbstractMultiQueryValue implements QueryValue { private List<QueryValue> values = new ArrayList<>(); public AbstractMultiQueryValue() { } public AbstractMultiQueryValue(final Iterable<? extends QueryValue> values) { if (values != null) { for (final QueryValue value : values) { addValue(value); } } } protected boolean addValue(final QueryValue value) { if (value == null) { return false; } else { return this.values.add(value); } } @Override public int appendParameters(int index, final PreparedStatement statement) { for (final QueryValue value : getQueryValues()) { if (value != null) { index = value.appendParameters(index, statement); } } return index; } public void clear() { this.values.clear(); } @Override public AbstractMultiQueryValue clone() { try { final AbstractMultiQueryValue clone = (AbstractMultiQueryValue)super.clone(); clone.values = QueryValue.cloneQueryValues(this.values); return clone; } catch (final CloneNotSupportedException e) { throw Exceptions.wrap(e); } } @Override public boolean equals(final Object obj) { if (obj instanceof AbstractMultiQueryValue) { final AbstractMultiQueryValue value = (AbstractMultiQueryValue)obj; final List<QueryValue> values1 = getQueryValues(); final List<QueryValue> values2 = value.getQueryValues(); if (values1.size() == values2.size()) { for (int i = 0; i < values1.size(); i++) { final QueryValue value1 = values1.get(i); final QueryValue value2 = values2.get(i); if (!DataType.equal(value1, value2)) { return false; } } return true; } } return false; } @Override public List<QueryValue> getQueryValues() { return Collections.<QueryValue> unmodifiableList(this.values); } public boolean isEmpty() { return this.values.isEmpty(); } @SuppressWarnings("unchecked") @Override public <QV extends QueryValue> QV updateQueryValues( final Function<QueryValue, QueryValue> valueHandler) { List<QueryValue> newValues = null; final int index = 0; for (final QueryValue queryValue : this.values) { final QueryValue newValue = valueHandler.apply(queryValue); if (queryValue != newValue) { if (newValues == null) { newValues = new ArrayList<>(this.values); } } if (newValues != null) { newValues.set(index, newValue); } } if (newValues == null) { return (QV)this; } else { final AbstractMultiQueryValue clone = clone(); clone.values = newValues; return (QV)clone; } } }