package org.dayatang.domain.internal.criterion;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.dayatang.domain.NamedParameters;
import org.dayatang.domain.QueryCriterion;
import org.dayatang.utils.Assert;
import java.util.ArrayList;
import java.util.List;
/**
* 代表两个或两个以上的查询条件AND操作结果的查询条件
* @author yyang
*/
public class AndCriterion extends AbstractCriterion {
private final List<QueryCriterion> criteria;
/**
* 根据多个查询条件创建AND查询条件。创建过程中会去除为null或EmptyCriterion的查询条件。如果
* 剩余查询条件不足两个,则抛出异常。
* @param criteria 要用来执行AND操作的查询条件
*/
public AndCriterion(QueryCriterion... criteria) {
Assert.notNull(criteria, "Criteria to \"AND\" is null!");
this.criteria = removeNullOrEmptyCriterion(criteria);
Assert.isTrue(criteria.length > 1, "At least two query criteria required!");
}
/**
* 获得要用来执行AND操作的查询条件
* @return 要用来执行AND操作的查询条件,去除了Null和EmptyCriterion类型的元素。
*/
public List<QueryCriterion> getCriteria() {
return criteria;
}
@Override
public String toQueryString() {
List<String> subCriteriaStr = new ArrayList<String>();
for (QueryCriterion each : getCriteria()) {
subCriteriaStr.add(each.toQueryString());
}
return StringUtils.join(subCriteriaStr, " and ");
}
@Override
public NamedParameters getParameters() {
NamedParameters result = NamedParameters.create();
for (QueryCriterion each : getCriteria()) {
result.add(each.getParameters());
}
return result;
}
/**
* 判断等价性
* @param other 要用来判等的另一个对象
* @return 如果当前对象和other等价,则返回true,否则返回false
*/
@Override
public boolean equals(final Object other) {
if (this == other) {
return true;
}
if (!(other instanceof AndCriterion)) {
return false;
}
AndCriterion that = (AndCriterion) other;
return this.criteria.containsAll(that.criteria) && that.criteria.containsAll(this.criteria);
}
/**
* 计算哈希值
* @return 当前对象实例的哈希值
*/
@Override
public int hashCode() {
HashCodeBuilder builder = new HashCodeBuilder(17, 37);
for (QueryCriterion criterion : criteria) {
builder = builder.append(criterion);
}
return builder.toHashCode();
}
}