package org.dayatang.domain.internal.criterion;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.dayatang.domain.Entity;
import org.dayatang.domain.NamedParameters;
import java.util.*;
/**
* 代表某个属性的值包含在指定集合或数组中的查询条件
*
* @author yyang
*/
public class InCriterion extends BasicCriterion {
private Collection<? extends Object> value = new ArrayList<Object>();
/**
* 创建查询条件
* @param propName 属性名
* @param value 集合值
*/
public InCriterion(String propName, Collection<? extends Object> value) {
super(propName);
if (value != null) {
this.value = value;
}
}
/**
* 创建查询条件
* @param propName 属性名
* @param value 数组值
*/
public InCriterion(String propName, Object[] value) {
super(propName);
if (value != null && value.length > 0) {
this.value = Arrays.asList(value);
}
}
/**
* 获得集合值
* @return 集合值
*/
public Collection<? extends Object> getValue() {
return value;
}
@Override
public String toQueryString() {
if (value == null || value.isEmpty()) {
return "1 > 1";
}
return getPropNameWithAlias() + " in " + getParamNameWithColon();
}
@Override
public NamedParameters getParameters() {
NamedParameters result = NamedParameters.create();
if (!value.isEmpty()) {
result = result.add(getParamName(), value);
}
return result;
}
private String createInString(Collection<? extends Object> value) {
Set<Object> elements = new HashSet<Object>();
for (Object item : value) {
Object element;
if (item instanceof Entity) {
element = ((Entity) item).getId();
} else {
element = item;
}
if (element instanceof String || element instanceof Date) {
element = "'" + element + "'";
}
elements.add(element);
}
return StringUtils.join(elements, ", ");
}
@Override
public boolean equals(final Object other) {
if (this == other) {
return true;
}
if (!(other instanceof InCriterion)) {
return false;
}
InCriterion that = (InCriterion) other;
return new EqualsBuilder()
.append(this.getPropName(), that.getPropName())
.append(value, that.value).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37).append(getPropName()).append(value).toHashCode();
}
@Override
public String toString() {
return getPropName() + " in collection [" + collectionToString(value) + "]";
}
private String collectionToString(Collection<? extends Object> value) {
return StringUtils.join(value, ", ");
}
}