diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java index bc1eec7f2..b3e8e6018 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java @@ -3747,7 +3747,7 @@ public class SolrInformationServer implements InformationServer long iterationStart = batchStartId; NamedList idCounts = this.getFacets(request, field + ":[" + batchStartId + " TO " + batchEndId + "]", - field, 1); // Min count of 1 ensures that the id returned is in the index + field, 1, maxId); // Min count of 1 ensures that the id returned is in the index for (Map.Entry idCount : idCounts) { idInIndex = Long.parseLong(idCount.getKey()); @@ -3847,6 +3847,25 @@ public class SolrInformationServer implements InformationServer NamedList facetFields = (NamedList) facetCounts.get("facet_fields"); return (NamedList) facetFields.get(field); } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + NamedList getFacets(SolrQueryRequest request, String query, String field, int minCount, + long maxCount) + { + ModifiableSolrParams params = + new ModifiableSolrParams(request.getParams()) + .set(CommonParams.Q, query) + .set(CommonParams.ROWS, 0) + .set(FacetParams.FACET, true) + .set(FacetParams.FACET_FIELD, field) + .set(FacetParams.FACET_LIMIT, Math.toIntExact(Math.min(maxCount, Integer.MAX_VALUE))) + .set(FacetParams.FACET_MINCOUNT, minCount); + + SolrQueryResponse response = cloud.getResponse(nativeRequestHandler, request, params); + NamedList facetCounts = (NamedList) response.getValues().get("facet_counts"); + NamedList facetFields = (NamedList) facetCounts.get("facet_fields"); + return (NamedList) facetFields.get(field); + } public int getDocListSize(String query) { diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/SolrInformationServerTest.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/SolrInformationServerTest.java index ca6d0999c..1fe634bad 100644 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/SolrInformationServerTest.java +++ b/search-services/alfresco-search/src/test/java/org/alfresco/solr/SolrInformationServerTest.java @@ -27,7 +27,6 @@ package org.alfresco.solr; import static java.util.Optional.ofNullable; - import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.ANY; import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.ASSOC_REF; import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.BOOLEAN; @@ -75,7 +74,6 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -533,5 +531,39 @@ public class SolrInformationServerTest // verifies if the method was called verify(updateRequestProcessor).processAdd(any()); } - + + @Test + public void testGetFacets() + { + SimpleOrderedMap responseContent = new SimpleOrderedMap<>(); + // Create facet_fields (TXID) as SimpleOrderedMap with Integer as value type + SimpleOrderedMap txidFacet = new SimpleOrderedMap<>(); + txidFacet.add("1", 1); + txidFacet.add("2", 1); + txidFacet.add("3", 1); + // Create and populate the NamedList to simulate facet_counts + NamedList facetCounts = new NamedList<>(); + facetCounts.add("facet_queries", new SimpleOrderedMap<>()); + facetCounts.add("facet_fields", new SimpleOrderedMap<>()); + // Add TXID facet to facet_fields + SimpleOrderedMap facetFields = (SimpleOrderedMap) facetCounts.get("facet_fields"); + facetFields.add("TXID", txidFacet); + // Add the facet_counts to the main facetMap + responseContent.add("facet_counts", facetCounts); + // Set up the request handler to return the fake response. + doAnswer(invocation -> { + SolrQueryResponse solrQueryResponse = invocation.getArgument(1); + solrQueryResponse.setAllValues(responseContent); + return null; + }).when(handler).handleRequest(any(SolrQueryRequest.class), any(SolrQueryResponse.class)); + NamedList actualResult = infoServer.getFacets(request, "TXID:[1 TO 3]", "TXID", 1, 3); + NamedList expectedResult = new NamedList() { + { + add("1", 1); + add("2", 1); + add("3", 1); + } + }; + assertEquals(expectedResult, actualResult); + } }