package com.constellio.data.dao.services.bigVault.solr;
import static com.constellio.data.utils.SimpleDateFormatSingleton.getSimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.MultiMapSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.servlet.SolrRequestParsers;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;
public class SolrUtils {
public static final LocalDate NULL_ITEM_LOCALDATE = new LocalDate(4242, 4, 2);
public static final LocalDateTime NULL_ITEM_LOCAL_DATE_TIME = new LocalDateTime(4242, 4, 2, 4, 2, 4, 242);
public static final Date NULL_DATE_TIME = new LocalDateTime(4242, 6, 6, 6, 42, 42, 666).toDate();
public static final String NULL_STRING = "__NULL__";
public static final String SOLR_DATE_FORMATTER_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
private SolrUtils() {
}
public static String toString(BigVaultServerTransaction transaction) {
StringBuilder sb = new StringBuilder();
if (transaction.getNewDocuments().size() > 0) {
sb.append("New documents : ");
for (SolrInputDocument addedDoc : transaction.getNewDocuments()) {
sb.append("\n" + toString(addedDoc, "\t"));
}
sb.append("\n");
}
if (transaction.getUpdatedDocuments().size() > 0) {
sb.append("Updated documents : ");
for (SolrInputDocument addedDoc : transaction.getUpdatedDocuments()) {
sb.append("\n" + toString(addedDoc, "\t"));
}
sb.append("\n");
}
if (transaction.getDeletedRecords().size() > 0) {
sb.append("Delete ids : " + transaction.getDeletedRecords());
sb.append("\n");
}
if (transaction.getDeletedQueries().size() > 0) {
sb.append("Delete by queries : " + transaction.getDeletedQueries());
sb.append("\n");
}
return sb.toString();
}
private static String toString(SolrInputDocument doc, String indent) {
StringBuilder sb = new StringBuilder();
String id = (String) doc.getFieldValue("id");
sb.append(indent + "Document '" + id + "' {");
List<String> fieldNames = new ArrayList<>(doc.getFieldNames());
Collections.sort(fieldNames);
for (String fieldName : fieldNames) {
if (!fieldName.equals("id")) {
sb.append("\n" + indent + "\t" + fieldName + " : " + doc.getFieldValues(fieldName));
}
}
sb.append("}");
return sb.toString();
}
public static String toString(SolrParams params) {
StringBuilder sb = new StringBuilder();
sb.append("[");
if (params != null && params.getParameterNamesIterator() != null) {
List<String> keyValues = new ArrayList<>();
Iterator<String> namesIterator = params.getParameterNamesIterator();
while (namesIterator.hasNext()) {
String name = namesIterator.next();
for (String value : params.getParams(name)) {
keyValues.add(name + "=" + value);
}
}
sb.append(StringUtils.join(keyValues, ", "));
}
sb.append("]");
return sb.toString();
}
public static String toIdString(SolrDocumentList list) {
StringBuilder sb = new StringBuilder();
sb.append("[");
List<String> ids = new ArrayList<>();
if (list != null && list.iterator() != null) {
for (SolrDocument solrDocument : list) {
ids.add((String) solrDocument.getFieldValue("id"));
}
}
sb.append(StringUtils.join(ids, ", "));
sb.append("]");
return sb.toString();
}
public static Object convertNullToSolrValue(String fieldName) {
Object convertedFieldValue = null;
if (isSingleValueStringOrText(fieldName)) {
convertedFieldValue = null;
} else if (fieldName.endsWith("_dt") || fieldName.endsWith("_da")) {
convertedFieldValue = null;
} else if (fieldName.endsWith("_d")) {
convertedFieldValue = null;
} else if (isMultiValueStringOrText(fieldName)) {
convertedFieldValue = null;
} else if (fieldName.endsWith("_dts") || fieldName.endsWith("_das")) {
convertedFieldValue = null;
} else if (fieldName.endsWith("_ds")) {
convertedFieldValue = null;
}
return convertedFieldValue;
}
public static boolean isSingleValueStringOrText(String fieldName) {
return fieldName.endsWith("_s") || fieldName.endsWith("_t");
}
public static boolean isMultiValueStringOrText(String fieldName) {
return fieldName.endsWith("_ss") || fieldName.endsWith("_txt");
}
public static boolean isMultivalue(String fieldName) {
return isMultiValueStringOrText(fieldName) || fieldName.endsWith("_dts") || fieldName.endsWith("_das")
|| fieldName.endsWith("_ds") || fieldName.endsWith("_is") || fieldName.endsWith("_fs") || fieldName
.endsWith("_ls");
}
public static String toIdString(SolrInputDocument document) {
return (String) document.getFieldValue("id");
}
public static List<String> toDeleteQueries(List<SolrParams> params) {
List<String> queries = new ArrayList<>();
for (SolrParams param : params) {
queries.add(toDeleteQueries(param));
}
return queries;
}
public static String toDeleteQueries(SolrParams params) {
StringBuffer query = new StringBuffer();
query.append("((");
query.append(params.get("q"));
query.append(")");
if (params.getParams("fq") != null) {
for (String fq : params.getParams("fq")) {
query.append(" AND (");
query.append(fq);
query.append(")");
}
}
query.append(")");
return query.toString();
}
public static String convertLocalDateTimeToSolrDate(LocalDateTime localDateTime) {
if (localDateTime == null) {
localDateTime = null;
}
if (localDateTime != null && localDateTime.getYear() < 1900) {
return localDateTime.withTime(12, 0, 0, 0).toString(SOLR_DATE_FORMATTER_PATTERN);
} else {
return getSimpleDateFormat(SOLR_DATE_FORMATTER_PATTERN).format(localDateTime.toDate());
}
}
public static String convertLocalDateToSolrDate(LocalDate localDate) {
if (localDate == null) {
return null;
}
return convertLocalDateTimeToSolrDate(localDate.toLocalDateTime(LocalTime.MIDNIGHT));
}
public static String toSingleQueryString(ModifiableSolrParams params) {
params = new ModifiableSolrParams(params);
params.remove("bq");
return params.toString();
}
public static ModifiableSolrParams parseQueryString(String queryString) {
MultiMapSolrParams multiMapSolrParams = SolrRequestParsers.parseQueryString(queryString);
return new ModifiableSolrParams(multiMapSolrParams);
}
}