package com.constellio.model.services.search.query.logical.criteria; import org.apache.solr.client.solrj.util.ClientUtils; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.joda.time.LocalTime; import com.constellio.model.entities.EnumWithSmallCode; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.RecordWrapper; import com.constellio.model.entities.schemas.DataStoreField; public class CriteriaUtils { public static String escape(String string) { return ClientUtils.escapeQueryChars(string); } public static String toSolrStringValue(Object value, DataStoreField dataStoreField) { if (value == null) { return CriteriaUtils.getNullValueForDataStoreField(dataStoreField); } else if (value instanceof LocalDateTime) { return correctLocalDateTime((LocalDateTime) value); } else if (value instanceof LocalDate) { LocalDateTime localDateTime = ((LocalDate) value).toLocalDateTime(LocalTime.MIDNIGHT); return localDateTime + "Z"; } else if (value instanceof Record) { return ((Record) value).getId(); } else if (value instanceof RecordWrapper) { return ((RecordWrapper) value).getId(); } else if (value instanceof Boolean) { return getBooleanStringValue((Boolean) value); } else if (value instanceof EnumWithSmallCode) { return ((EnumWithSmallCode) value).getCode(); } else { return escape(value.toString()); } } private static String correctLocalDateTime(LocalDateTime value) { if (value.isEqual(new LocalDateTime(Integer.MIN_VALUE))) { return getNullDateValue(); } else { return value + "Z"; } } public static int getOffSetMillis(LocalDateTime ldt) { return -1 * (DateTimeZone.getDefault().getOffset(ldt.toDate().getTime())); } public static String getBooleanStringValue(boolean value) { return value ? "__TRUE__" : "__FALSE__"; } public static String getNullStringValue() { return "__NULL__"; } public static String getNullDateValue() { return "4242-06-06T06:42:42.666Z"; } public static String getNullNumberValue() { return "" + Integer.MIN_VALUE; } public static String getNullValueForDataStoreField(DataStoreField dataStoreField) { switch (dataStoreField.getType()) { case DATE: case DATE_TIME: return getNullDateValue(); case NUMBER: return getNullNumberValue(); default: return getNullStringValue(); } } }