package com.constellio.model.services.search.query.logical.condition; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import com.constellio.model.entities.schemas.DataStoreField; import com.constellio.model.services.search.query.logical.LogicalOperator; import com.constellio.model.services.search.query.logical.LogicalSearchConditionRuntimeException; import com.constellio.model.services.search.query.logical.LogicalSearchValueCondition; import com.constellio.model.services.search.query.logical.criteria.CompositeLogicalSearchValueOperator; public class DataStoreFieldLogicalSearchCondition extends LogicalSearchCondition { final List<DataStoreField> dataStoreFields; final LogicalOperator metadataLogicalOperator; final LogicalSearchValueCondition valueCondition; private Boolean preferAnalyzedField; public DataStoreFieldLogicalSearchCondition(DataStoreFilters filters, List<?> dataStoreFields, LogicalOperator metadataLogicalOperator, LogicalSearchValueCondition valueCondition) { super(filters); if (dataStoreFields == null) { this.dataStoreFields = null; } else { this.dataStoreFields = Collections.unmodifiableList((List<DataStoreField>) dataStoreFields); } this.metadataLogicalOperator = metadataLogicalOperator; this.valueCondition = valueCondition; } public DataStoreFieldLogicalSearchCondition(DataStoreFilters filters) { super(filters); this.dataStoreFields = null; this.metadataLogicalOperator = null; this.valueCondition = null; } public List<DataStoreField> getDataStoreFields() { return dataStoreFields; } public LogicalOperator getMetadataLogicalOperator() { return metadataLogicalOperator; } public LogicalSearchValueCondition getValueCondition() { return valueCondition; } @Override public LogicalSearchCondition withFilters(DataStoreFilters filters) { return new DataStoreFieldLogicalSearchCondition(filters, dataStoreFields, metadataLogicalOperator, valueCondition); } @Override public LogicalSearchCondition withOrValueConditions(List<LogicalSearchValueCondition> conditions) { List<LogicalSearchValueCondition> zeConditions = new ArrayList<>(); zeConditions.add(valueCondition); zeConditions.addAll(conditions); LogicalSearchValueCondition newValueCondition = new CompositeLogicalSearchValueOperator(LogicalOperator.OR, zeConditions); return new DataStoreFieldLogicalSearchCondition(filters, dataStoreFields, metadataLogicalOperator, newValueCondition); } @Override public LogicalSearchCondition withAndValueConditions(List<LogicalSearchValueCondition> conditions) { List<LogicalSearchValueCondition> zeConditions = new ArrayList<>(); zeConditions.add(valueCondition); zeConditions.addAll(conditions); LogicalSearchValueCondition newValueCondition = new CompositeLogicalSearchValueOperator(LogicalOperator.AND, zeConditions); return new DataStoreFieldLogicalSearchCondition(filters, dataStoreFields, metadataLogicalOperator, newValueCondition); } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } @Override public String toString() { StringBuilder sb = new StringBuilder(); if (dataStoreFields == null) { sb.append(" *:* "); } else { sb.append(filters + ":"); for (DataStoreField dataStoreField : dataStoreFields) { if (sb.length() > 0) { sb.append(" " + metadataLogicalOperator + " "); } sb.append(dataStoreField.getDataStoreCode()); } sb.append(":"); sb.append(valueCondition); } return sb.toString(); } @Override public void validate() { for (DataStoreField dataStoreField : this.dataStoreFields) { if (!valueCondition.isValidFor(dataStoreField)) { throw new LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata(dataStoreField); } } } @Override public String getSolrQuery(SolrQueryBuilderParams params) { String query = "("; if (dataStoreFields == null) { query += " *:*"; } else { for (int i = 0; i < dataStoreFields.size() - 1; i++) { query += " " + valueCondition.getSolrQuery(getSearchedField(params, dataStoreFields.get(i))) + " " + metadataLogicalOperator; } DataStoreField metadata = dataStoreFields.get(dataStoreFields.size() - 1); String solrQuery = valueCondition.getSolrQuery(getSearchedField(params, metadata)); query += " " + solrQuery; } query += " )"; return query; } private DataStoreField getSearchedField(SolrQueryBuilderParams params, DataStoreField dataStoreField) { if (params.isPreferAnalyzedFields() && dataStoreField.isSearchable()) { return dataStoreField.getAnalyzedField(params.getLanguageCode()); } else { return dataStoreField; } } public DataStoreFieldLogicalSearchCondition replacingValueConditionWith(LogicalSearchValueCondition newValueCondition) { return new DataStoreFieldLogicalSearchCondition(filters, dataStoreFields, metadataLogicalOperator, newValueCondition); } }