diff --git a/source/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java b/source/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java index 5df506bbcb..fc651c6076 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java +++ b/source/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java @@ -1,28 +1,28 @@ -/* - * #%L - * Alfresco Repository - * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ +/* + * #%L + * Alfresco Repository + * %% + * Copyright (C) 2005 - 2016 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ package org.alfresco.repo.search.impl.solr; import static org.alfresco.util.SearchDateConversion.parseDateInterval; @@ -634,6 +634,7 @@ public class SolrQueryHTTPClient implements BeanFactoryAware, InitializingBean } buildFacetParameters(searchParameters, isSharded, encoder, url); + buildPivotParameters(searchParameters, encoder, url); buildFacetIntervalParameters(searchParameters, encoder, url); buildHightlightParameters(searchParameters, encoder, url); } @@ -735,6 +736,15 @@ public class SolrQueryHTTPClient implements BeanFactoryAware, InitializingBean } } + protected void buildPivotParameters(SearchParameters searchParameters, URLCodec encoder, StringBuilder url) throws UnsupportedEncodingException + { + if (searchParameters.getPivots() != null && !searchParameters.getPivots().isEmpty()) + { + url.append("&facet=").append(encoder.encode("true", "UTF-8")); + url.append("&facet.pivot=").append(encoder.encode(String.join(",", searchParameters.getPivots()), "UTF-8")); + } + } + protected void buildHightlightParameters(SearchParameters searchParameters, URLCodec encoder, StringBuilder url) throws UnsupportedEncodingException { if (searchParameters.getHighlight() != null) diff --git a/source/test-java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClientTest.java b/source/test-java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClientTest.java index 0e2af80c79..615596064b 100644 --- a/source/test-java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClientTest.java +++ b/source/test-java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClientTest.java @@ -101,8 +101,7 @@ public class SolrQueryHTTPClientTest when(namespaceDAO.getPrefixes()).thenReturn(Arrays.asList(CONTENT_MODEL_PREFIX, "exif")); when(namespaceDAO.getNamespaceURI(anyString())).thenReturn(NamespaceService.CONTENT_MODEL_1_0_URI); - when(dictionaryService.getProperty(notNull(QName.class))).thenAnswer(invocation -> - { + when(dictionaryService.getProperty(notNull(QName.class))).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); QName qName = (QName) args[0]; if (qName.getLocalName().contains("created")) @@ -309,7 +308,7 @@ public class SolrQueryHTTPClientTest assertTrue(url.contains("&facet=true")); assertTrue(url.contains("facet.field=creator")); assertTrue(url.contains("f.creator.facet.limit=100")); - assertTrue(url.contains("facet.field="+encoder.encode("{!afts something=right}modifier", "UTF-8"))); + assertTrue(url.contains("facet.field=" + encoder.encode("{!afts something=right}modifier", "UTF-8"))); assertTrue(url.contains("f.modifier.facet.limit=100")); prefixff.setLabel("myLabel"); @@ -320,9 +319,9 @@ public class SolrQueryHTTPClientTest url = urlBuilder.toString(); assertNotNull(url); assertTrue(url.contains("&facet=true")); - assertTrue(url.contains("facet.field="+encoder.encode("{!afts key=yourLabel}creator", "UTF-8"))); + assertTrue(url.contains("facet.field=" + encoder.encode("{!afts key=yourLabel}creator", "UTF-8"))); assertTrue(url.contains("f.creator.facet.limit=100")); - assertTrue(url.contains("facet.field="+encoder.encode("{!afts key=myLabel something=right}modifier", "UTF-8"))); + assertTrue(url.contains("facet.field=" + encoder.encode("{!afts key=myLabel something=right}modifier", "UTF-8"))); assertTrue(url.contains("f.modifier.facet.limit=100")); prefixff.setExcludeFilters(Arrays.asList("x", "y")); @@ -333,9 +332,9 @@ public class SolrQueryHTTPClientTest url = urlBuilder.toString(); assertNotNull(url); assertTrue(url.contains("&facet=true")); - assertTrue(url.contains("facet.field="+encoder.encode("{!afts ex=B key=yourLabel}creator", "UTF-8"))); + assertTrue(url.contains("facet.field=" + encoder.encode("{!afts ex=B key=yourLabel}creator", "UTF-8"))); assertTrue(url.contains("f.creator.facet.limit=100")); - assertTrue(url.contains("facet.field="+encoder.encode("{!afts ex=x,y key=myLabel something=right}modifier", "UTF-8"))); + assertTrue(url.contains("facet.field=" + encoder.encode("{!afts ex=x,y key=myLabel something=right}modifier", "UTF-8"))); assertTrue(url.contains("f.modifier.facet.limit=100")); prefixff.setField("bill"); @@ -348,10 +347,37 @@ public class SolrQueryHTTPClientTest url = urlBuilder.toString(); assertNotNull(url); assertTrue(url.contains("&facet=true")); - assertTrue(url.contains("facet.field="+encoder.encode("{!afts ex=B}ben", "UTF-8"))); + assertTrue(url.contains("facet.field=" + encoder.encode("{!afts ex=B}ben", "UTF-8"))); assertTrue(url.contains("f.ben.facet.limit=100")); - assertTrue(url.contains("facet.field="+encoder.encode("{!afts key=myLabel}bill", "UTF-8"))); + assertTrue(url.contains("facet.field=" + encoder.encode("{!afts key=myLabel}bill", "UTF-8"))); assertTrue(url.contains("f.bill.facet.limit=100")); } + + @Test + public void testBuildPivots() throws UnsupportedEncodingException + { + SearchParameters params = new SearchParameters(); + params.setSearchTerm("bob"); + params.addPivot("creator"); + + StringBuilder urlBuilder = new StringBuilder(); + + client.buildPivotParameters(params, encoder, urlBuilder); + String url = urlBuilder.toString(); + assertNotNull(url); + assertTrue(url.contains("&facet=true")); + assertTrue(url.contains("facet.pivot=creator")); + + params.addPivot("cm:name"); + params.addPivot("{!stats=piv1}cat"); + + urlBuilder = new StringBuilder(); + client.buildPivotParameters(params, encoder, urlBuilder); + url = urlBuilder.toString(); + assertNotNull(url); + assertTrue(url.contains("&facet=true")); + assertTrue(url.contains("facet.pivot="+ encoder.encode("creator,cm:name,{!stats=piv1}cat", "UTF-8"))); + } + } \ No newline at end of file