package com.constellio.model.services.search.query.logical;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import com.constellio.data.utils.KeySetMap;
public class LogicalSearchQueryFacetFilters {
private KeySetMap<String, String> fieldFacetFilters = new KeySetMap<>();
private KeySetMap<String, String> queries = new KeySetMap<>();
public LogicalSearchQueryFacetFilters() {
}
public LogicalSearchQueryFacetFilters(LogicalSearchQueryFacetFilters filters) {
this.fieldFacetFilters = new KeySetMap<>(filters.fieldFacetFilters);
this.queries = new KeySetMap<>(filters.queries);
}
public LogicalSearchQueryFacetFilters selectedFieldFacetValue(String datastoreCode, String value) {
fieldFacetFilters.add(datastoreCode, value);
return this;
}
public LogicalSearchQueryFacetFilters selectedFieldFacetValues(String datastoreCode, Collection<String> values) {
for (String value : values) {
fieldFacetFilters.add(datastoreCode, value);
}
return this;
}
public LogicalSearchQueryFacetFilters unselectedFieldFacetValue(String datastoreCode, String value) {
fieldFacetFilters.remove(datastoreCode, value);
return this;
}
public LogicalSearchQueryFacetFilters selectedQueryFacetValues(String queriesGroup, Collection<String> queries) {
this.queries.get(queriesGroup).addAll(queries);
return this;
}
public LogicalSearchQueryFacetFilters selectedQueryFacetValue(String queriesGroup, String query) {
queries.add(queriesGroup, query);
return this;
}
public LogicalSearchQueryFacetFilters unselectedQueryFacetValue(String queriesGroup, String query) {
queries.remove(queriesGroup, query);
return this;
}
public List<String> toSolrFilterQueries() {
List<String> solrFilterQueries = new ArrayList<>();
for (Map.Entry<String, Set<String>> entry : fieldFacetFilters.getMapEntries()) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("{!tag=");
stringBuilder.append(entry.getKey());
stringBuilder.append("}");
stringBuilder.append(entry.getKey());
stringBuilder.append(":(\"");
stringBuilder.append(StringUtils.join(entry.getValue().toArray(), "\" OR \""));
stringBuilder.append("\")");
solrFilterQueries.add(stringBuilder.toString());
}
for (Entry<String, Set<String>> facetQueries : queries.getMapEntries()) {
// Set<String> excludedFields = CriteriaUtils.getFirstFieldsOfQueries(facetQueries.);
// for (String facetQuery : facetQueries) {
//
// }
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("{!tag=f");
stringBuilder.append(facetQueries.getKey());
stringBuilder.append("}");
stringBuilder.append(" (");
stringBuilder.append(StringUtils.join(facetQueries.getValue().toArray(), " OR "));
stringBuilder.append(")");
solrFilterQueries.add(stringBuilder.toString());
}
return solrFilterQueries;
}
public void clear() {
fieldFacetFilters.clear();
queries.clear();
}
public Set<String> getSelectedFieldValues(String fieldDataStoreCode) {
return fieldFacetFilters.get(fieldDataStoreCode);
}
public Set<String> getSelectedQueryFacets(String queriesGroup) {
return queries.get(queriesGroup);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}