diff --git a/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java b/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java index aaf043e8a9..45d56fdf50 100644 --- a/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java @@ -42,6 +42,7 @@ import org.alfresco.rest.api.search.context.FacetFieldContext.Bucket; import org.alfresco.rest.api.search.context.FacetQueryContext; import org.alfresco.rest.api.search.context.SearchContext; import org.alfresco.rest.api.search.context.SpellCheckContext; +import org.alfresco.rest.api.search.model.FacetField; import org.alfresco.rest.api.search.model.FacetQuery; import org.alfresco.rest.api.search.model.HighlightEntry; import org.alfresco.rest.api.search.model.SearchEntry; @@ -53,7 +54,6 @@ import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.InvalidNodeRefException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.search.Interval; -import org.alfresco.service.cmr.search.IntervalParameters; import org.alfresco.service.cmr.search.IntervalSet; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.ResultSetRow; @@ -292,10 +292,10 @@ public class ResultMapper //Field Facets Map>> facetFields = solrResultSet.getFieldFacets(); - ffcs = getFacetBuckets(facetFields, true, null); + ffcs = getFacetBucketsForFacetFields(facetFields, searchQuery); Map>> facetInterval = solrResultSet.getFacetIntervals(); - List intervals = getFacetBuckets(facetInterval, false, searchQuery); + List intervals = getFacetBucketsForIntervals(facetInterval, searchQuery); //Spelling SpellCheckResult spell = solrResultSet.getSpellCheckResult(); @@ -309,7 +309,7 @@ public class ResultMapper return isNullContext(context)?null:context; } - protected List getFacetBuckets(Map>> facetFields, boolean withDisplay, SearchQuery searchQuery) + protected List getFacetBucketsForFacetFields(Map>> facetFields, SearchQuery searchQuery) { if (facetFields != null && !facetFields.isEmpty()) { @@ -321,8 +321,24 @@ public class ResultMapper List buckets = new ArrayList<>(facet.getValue().size()); for (Pair buck:facet.getValue()) { - Object display = withDisplay?propertyLookup.lookup(facet.getKey(), buck.getFirst()):null; - String filterQuery = lookupQuery(facet.getKey(), buck.getFirst(), searchQuery); + Object display = propertyLookup.lookup(facet.getKey(), buck.getFirst()); + String filterQuery = null; + if (searchQuery != null + && searchQuery.getFacetFields() != null + && searchQuery.getFacetFields().getFacets() != null + && !searchQuery.getFacetFields().getFacets().isEmpty()) + { + Optional found = searchQuery.getFacetFields().getFacets().stream().filter( + queryable -> facet.getKey().equals(queryable.getLabel()!=null?queryable.getLabel():queryable.getField())).findFirst(); + if (found.isPresent()) + { + String fq = found.get().toFilterQuery(buck.getFirst()); + if (fq != null) + { + filterQuery = fq; + } + } + } buckets.add(new Bucket(buck.getFirst(), filterQuery, buck.getSecond(), display)); } ffcs.add(new FacetFieldContext(facet.getKey(), buckets)); @@ -334,25 +350,45 @@ public class ResultMapper return null; } - protected String lookupQuery(String facetKey, String key, SearchQuery searchQuery) + protected List getFacetBucketsForIntervals(Map>> facetFields, SearchQuery searchQuery) { - if (searchQuery != null - && searchQuery.getFacetIntervals() != null - && searchQuery.getFacetIntervals().getIntervals() != null - && !searchQuery.getFacetIntervals().getIntervals().isEmpty()) + if (facetFields != null && !facetFields.isEmpty()) { - Optional found = searchQuery.getFacetIntervals().getIntervals().stream().filter( - interval -> facetKey.equals(interval.getLabel()!=null?interval.getLabel():interval.getField())).findFirst(); - if (found.isPresent()) + List ffcs = new ArrayList<>(facetFields.size()); + for (Entry>> facet:facetFields.entrySet()) { - if (found.get().getSets() != null) + if (facet.getValue() != null && !facet.getValue().isEmpty()) { - Optional foundSet = found.get().getSets().stream().filter(aSet -> key.equals(aSet.getLabel())).findFirst(); - if (foundSet.isPresent()) return found.get().getField()+":"+foundSet.get().toRange(); + List buckets = new ArrayList<>(facet.getValue().size()); + for (Pair buck:facet.getValue()) + { + String filterQuery = null; + if (searchQuery != null + && searchQuery.getFacetIntervals() != null + && searchQuery.getFacetIntervals().getIntervals() != null + && !searchQuery.getFacetIntervals().getIntervals().isEmpty()) + { + Optional found = searchQuery.getFacetIntervals().getIntervals().stream().filter( + interval -> facet.getKey().equals(interval.getLabel()!=null?interval.getLabel():interval.getField())).findFirst(); + if (found.isPresent()) + { + if (found.get().getSets() != null) + { + Optional foundSet = found.get().getSets().stream().filter(aSet -> buck.getFirst().equals(aSet.getLabel())).findFirst(); + if (foundSet.isPresent()) filterQuery = found.get().getField()+":"+foundSet.get().toRange(); + } + } + } + Bucket bucket = new Bucket(buck.getFirst(), filterQuery, buck.getSecond(), null); + buckets.add(bucket); + } + ffcs.add(new FacetFieldContext(facet.getKey(), buckets)); } } + + return ffcs; } - return key; + return null; } /** diff --git a/source/java/org/alfresco/rest/api/search/model/FacetField.java b/source/java/org/alfresco/rest/api/search/model/FacetField.java index d4e03b9541..d39f8e30ed 100644 --- a/source/java/org/alfresco/rest/api/search/model/FacetField.java +++ b/source/java/org/alfresco/rest/api/search/model/FacetField.java @@ -93,6 +93,11 @@ public class FacetField return label; } + public String toFilterQuery(String value) + { + return field+":"+value; + } + public String getPrefix() { return prefix;