diff --git a/src/main/java/au/org/ala/biocache/util/QueryFormatUtils.java b/src/main/java/au/org/ala/biocache/util/QueryFormatUtils.java index 85e35dbfa..35bde6431 100644 --- a/src/main/java/au/org/ala/biocache/util/QueryFormatUtils.java +++ b/src/main/java/au/org/ala/biocache/util/QueryFormatUtils.java @@ -136,10 +136,11 @@ public Map[] formatSearchQuery(SpatialSearchRequestDTO searchParams, boolean for Map activeFacetMap = new HashMap(); Map> activeFacetObj = new HashMap<>(); Map[] fqMaps = {activeFacetMap, activeFacetObj}; + Boolean isIncludeUnfilteredFacetValues = searchParams.getIncludeUnfilteredFacetValues(); //Only format the query if it doesn't already supply a formattedQuery. if (forceQueryFormat || StringUtils.isEmpty(searchParams.getFormattedQuery())) { - String[] originalFqs = Arrays.copyOf(searchParams.getFq(), searchParams.getFq().length); // copy by value + String[] originalFqs = searchParams.getFq(); String [] formatted = formatQueryTerm(searchParams.getQ(), searchParams); searchParams.setDisplayString(formatted[0]); @@ -149,7 +150,7 @@ public Map[] formatSearchQuery(SpatialSearchRequestDTO searchParams, boolean for searchParams.setFormattedFq(null); // Apply filter tagging and excluding filters if flag is set - if (searchParams.getIncludeUnfilteredFacetValues()) { + if (isIncludeUnfilteredFacetValues) { applyFilterTagging(searchParams); } @@ -157,7 +158,7 @@ public Map[] formatSearchQuery(SpatialSearchRequestDTO searchParams, boolean for if (searchParams.getFq() != null) { for (int i = 0; i < searchParams.getFq().length; i++) { String fq = searchParams.getFq()[i]; - String fqOriginal = originalFqs[i]; // not altered by `applyFilterTagging()` + String fqOriginal = (originalFqs.length > i) ? originalFqs[i] : fq; // not altered by `applyFilterTagging()` if (fq != null && !fq.isEmpty()) { formatted = formatQueryTerm(fq, searchParams); @@ -167,11 +168,11 @@ public Map[] formatSearchQuery(SpatialSearchRequestDTO searchParams, boolean for addFormattedFq(new String[]{formatted[1]}, searchParams); } - //add to activeFacetMap fqs that are not inserted by a qid, and the q of qids in fqs. - //do not add spatial fields - if (originalFqs != null && i < originalFqs.length && !formatted[1].contains(spatialField + ":")) { + // add to activeFacetMap fqs that are not inserted by a qid, and the q of qids in fqs. + // do not add spatial fields + if (originalFqs != null && originalFqs.length > i && !formatted[1].contains(spatialField + ":")) { Facet facet = new Facet(); - facet.setDisplayName(formattedOriginal[0]); + facet.setDisplayName(isIncludeUnfilteredFacetValues ? formattedOriginal[0] : formatted[0]); String[] fv = fqOriginal.split(":"); if (fv.length >= 2) { facet.setName(fv[0]); @@ -184,7 +185,8 @@ public Map[] formatSearchQuery(SpatialSearchRequestDTO searchParams, boolean for // activeFacetObj which is [StringKey: List] String fqKey = parseFQ(fqOriginal); if (fqKey != null) { - Facet fct = new Facet(fqKey, formattedOriginal[0]); // display name is the formatted name, for example '11' to 'November' + String formattedFacet = (isIncludeUnfilteredFacetValues) ? formattedOriginal[0] : formatted[0]; + Facet fct = new Facet(fqKey, formattedFacet); // display name is the formatted name, for example '11' to 'November' fct.setValue(fqOriginal); // value in activeFacetMap is the part with key replaced by '', but here is the original fq because front end will need it List valList = activeFacetObj.getOrDefault(fqKey, new ArrayList<>()); valList.add(fct); diff --git a/src/test/java/au/org/ala/biocache/util/QueryFormatUtilsSpec.groovy b/src/test/java/au/org/ala/biocache/util/QueryFormatUtilsSpec.groovy index c7ea46be3..2b89a2a23 100644 --- a/src/test/java/au/org/ala/biocache/util/QueryFormatUtilsSpec.groovy +++ b/src/test/java/au/org/ala/biocache/util/QueryFormatUtilsSpec.groovy @@ -134,6 +134,25 @@ class QueryFormatUtilsSpec extends Specification { searchParams.getDisplayString() == "scientificName:Test" } + def "test formatSearchQuery with qid fq"() { + given: + SpatialSearchRequestDTO searchParams = new SpatialSearchRequestDTO() + searchParams.setQ("*:*") + searchParams.setFq(new String[]{"qid:123456"}) + qidCacheDao.get(_) >> new Qid(q: "scientificName:TestTaxon", fqs: new String[0]) + searchParams.setFacet(true) + when: + def result = queryFormatUtils.formatSearchQuery(searchParams, false) + + then: + result[0].size() == 1 + result[1].size() == 1 + searchParams.getFormattedQuery() == "*:*" + searchParams.getDisplayString() == "[all records]" + searchParams.getFq() == new String[]{"qid:123456"} + searchParams.getFormattedFq() == new String[]{"scientificName:TestTaxon"} + } + def "test formatSearchQuery with facets"() { given: SpatialSearchRequestDTO searchParams = new SpatialSearchRequestDTO() @@ -157,8 +176,6 @@ class QueryFormatUtilsSpec extends Specification { searchParams.getPivotFacets() == new String[]{} } - - def "test formatSearchQuery with tagging and excluded facets"() { given: SpatialSearchRequestDTO searchParams = new SpatialSearchRequestDTO()