package com.constellio.model.services.search.query.logical.criteria;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;
import com.constellio.model.entities.schemas.DataStoreField;
import com.constellio.model.services.search.query.logical.LogicalSearchValueCondition;
public class IsLessThanCriterion extends LogicalSearchValueCondition {
private final Object index;
public IsLessThanCriterion(Object index) {
super();
this.index = index;
}
public Object getIndex() {
return index;
}
@Override
public boolean isValidFor(DataStoreField dataStoreField) {
switch (dataStoreField.getType()) {
case BOOLEAN:
return false;
default:
return true;
}
}
@Override
public String getSolrQuery(DataStoreField dataStoreField) {
StringBuilder query = new StringBuilder();
if (index instanceof Number) {
query.append(
dataStoreField.getDataStoreCode() + ":{* TO " + index + "} AND (*:* -(" + dataStoreField.getDataStoreCode()
+ ":\""
+ Integer.MIN_VALUE + "\"))");
} else if (index instanceof LocalDateTime || index instanceof LocalDate) {
String value = CriteriaUtils.toSolrStringValue(index, dataStoreField);
String excludedValue;
LocalDateTime dateValue;
if (index instanceof LocalDateTime) {
excludedValue = value;
} else {
LocalDateTime localDateTime = ((LocalDate) index).toLocalDateTime(LocalTime.MIDNIGHT);
excludedValue = CriteriaUtils.toSolrStringValue(localDateTime, dataStoreField);
}
String code = dataStoreField.getDataStoreCode();
String between = code + ":{* TO " + value + "}";
String notNull = "(*:* -(" + code + ":\"" + CriteriaUtils.getNullDateValue() + "\")) ";
query.append(between + " AND " + notNull);
} else {
query.append(dataStoreField.getDataStoreCode() + ":{* TO \"" + index + "\"} AND (*:* -(" + dataStoreField
.getDataStoreCode()
+ ":\"__NULL__\"))");
}
return query.toString();
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}