From 2182b598068a4e7eeddd246d5303804df3e69566 Mon Sep 17 00:00:00 2001 From: Gethin James Date: Tue, 11 Oct 2016 07:12:26 +0000 Subject: [PATCH] SEARCH-195: Implementing hightlighting for the search public API git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@131292 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rest/api/search/impl/SearchMapper.java | 12 +++++++++ .../rest/api/search/model/SearchQuery.java | 13 ++++++--- .../rest/api/search/SearchMapperTests.java | 15 ++++++++++- .../search/SearchQuerySerializerTests.java | 27 +++++++++++++++++++ .../rest/api/search/SerializerTestHelper.java | 6 +++++ 5 files changed, 69 insertions(+), 4 deletions(-) diff --git a/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java b/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java index 7d8b9b5219..8eea696026 100644 --- a/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java @@ -43,6 +43,7 @@ import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; import org.alfresco.rest.framework.resource.parameters.Paging; import org.alfresco.rest.framework.resource.parameters.Params; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.search.GeneralHighlightParameters; import org.alfresco.service.cmr.search.LimitBy; import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchParameters.FieldFacet; @@ -102,6 +103,7 @@ public class SearchMapper fromFacetQuery(sp, searchQuery.getFacetQueries()); fromFacetFields(sp, searchQuery.getFacetFields()); fromSpellCheck(sp, searchQuery.getSpellcheck()); + fromHighlight(sp, searchQuery.getHighlight()); fromScope(sp, searchQuery.getScope()); fromLimits(sp, searchQuery.getLimits()); @@ -426,6 +428,16 @@ public class SearchMapper } } + /** + * Sets the hightlight object on search parameters + * @param sp SearchParameters + * @param hightlight GeneralHighlightParameters + */ + public void fromHighlight(SearchParameters sp, GeneralHighlightParameters hightlight) + { + sp.setHightlight(hightlight); + } + /** * SearchParameters from the Limits object * @param sp SearchParameters diff --git a/source/java/org/alfresco/rest/api/search/model/SearchQuery.java b/source/java/org/alfresco/rest/api/search/model/SearchQuery.java index 76950a9f32..a87d51c012 100644 --- a/source/java/org/alfresco/rest/api/search/model/SearchQuery.java +++ b/source/java/org/alfresco/rest/api/search/model/SearchQuery.java @@ -27,7 +27,7 @@ package org.alfresco.rest.api.search.model; import org.alfresco.rest.framework.resource.parameters.Paging; -import org.apache.solr.common.params.SpellingParams; +import org.alfresco.service.cmr.search.GeneralHighlightParameters; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonProperty; @@ -53,8 +53,9 @@ public class SearchQuery private final Spelling spellcheck; private final Scope scope; private final Limits limits; + private final GeneralHighlightParameters highlight; - public static final SearchQuery EMPTY = new SearchQuery(null, null, null, null, null,null, null, null,null, null, null, null, null); + public static final SearchQuery EMPTY = new SearchQuery(null, null, null, null, null,null, null, null,null, null, null, null, null, null); @JsonCreator public SearchQuery(@JsonProperty("query") Query query, @@ -69,7 +70,8 @@ public class SearchQuery @JsonProperty("facetQueries") List facetQueries, @JsonProperty("spellcheck") Spelling spellcheck, @JsonProperty("scope") Scope scope, - @JsonProperty("limits")Limits limits) + @JsonProperty("limits")Limits limits, + @JsonProperty("highlight")GeneralHighlightParameters highlight) { this.query = query; this.paging = paging; @@ -84,6 +86,7 @@ public class SearchQuery this.scope = scope; this.facetFields = facetFields; this.limits = limits; + this.highlight = highlight; } public Query getQuery() @@ -145,6 +148,10 @@ public class SearchQuery return facetFields; } + public GeneralHighlightParameters getHighlight() + { + return highlight; + } public Limits getLimits() { return limits; diff --git a/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java b/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java index 96b4f25a12..d4eec88f62 100644 --- a/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java +++ b/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java @@ -53,6 +53,8 @@ import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; import org.alfresco.rest.framework.resource.parameters.Paging; import org.alfresco.rest.framework.resource.parameters.Params; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.search.FieldHighlightParameters; +import org.alfresco.service.cmr.search.GeneralHighlightParameters; import org.alfresco.service.cmr.search.LimitBy; import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchParameters.FieldFacet; @@ -60,6 +62,7 @@ import org.alfresco.service.cmr.search.SearchService; import org.junit.Test; import java.util.Arrays; +import java.util.List; /** * Tests the SearchMapper class @@ -511,10 +514,20 @@ public class SearchMapperTests assertEquals(-1, searchParameters.getMaxPermissionChecks()); } + @Test + public void fromHighlight() throws Exception + { + SearchParameters searchParameters = new SearchParameters(); + List fields = Arrays.asList(new FieldHighlightParameters("desc",50,100,false,"@","#"), new FieldHighlightParameters("title",55,105,true,"*","¿")); + GeneralHighlightParameters highlightParameters = new GeneralHighlightParameters(5, 10, false, "{", "}", 20, true, fields); + searchMapper.fromHighlight(searchParameters,highlightParameters); + assertEquals(searchParameters.getHightlight(), highlightParameters); + } + private SearchQuery minimalQuery() { Query query = new Query("cmis", "foo", ""); - SearchQuery sq = new SearchQuery(query,null, null, null, null, null, null, null, null, null, null, null, null); + SearchQuery sq = new SearchQuery(query,null, null, null, null, null, null, null, null, null, null, null, null, null); return sq; } } diff --git a/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java b/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java index 0a9a59feee..03c030fb72 100644 --- a/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java +++ b/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java @@ -39,6 +39,7 @@ import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.api.search.context.SearchContext; import org.alfresco.rest.api.search.context.FacetQueryContext; import org.alfresco.rest.framework.tests.api.mocks.Farmer; +import org.alfresco.service.cmr.search.FieldHighlightParameters; import org.junit.BeforeClass; import org.junit.Test; @@ -109,6 +110,32 @@ public class SearchQuerySerializerTests assertEquals(2, searchQuery.getFields().size()); assertTrue(searchQuery.getFields().contains("id")); assertTrue(searchQuery.getFields().contains("name")); + + //Highlight + assertEquals("]", searchQuery.getHighlight().getPostfix()); + assertEquals("[", searchQuery.getHighlight().getPrefix()); + assertEquals(20, searchQuery.getHighlight().getSnippetCount().intValue()); + assertEquals(10, searchQuery.getHighlight().getFragmentSize().intValue()); + assertEquals(true, searchQuery.getHighlight().getMergeContiguous()); + assertEquals(40, searchQuery.getHighlight().getMaxAnalyzedChars().intValue()); + assertEquals(true, searchQuery.getHighlight().getUsePhraseHighlighter()); + + assertEquals(2, searchQuery.getHighlight().getFields().size()); + FieldHighlightParameters high1 = searchQuery.getHighlight().getFields().get(0); + assertEquals("my", high1.getField()); + assertEquals("¡", high1.getPostfix()); + assertEquals("?", high1.getPrefix()); + assertEquals(23, high1.getSnippetCount().intValue()); + assertEquals(5, high1.getFragmentSize().intValue()); + assertEquals(true,high1.getMergeContiguous()); + + FieldHighlightParameters high2 = searchQuery.getHighlight().getFields().get(1); + assertEquals("your", high2.getField()); + assertEquals(")", high2.getPostfix()); + assertEquals("(", high2.getPrefix()); + assertEquals(3, high2.getSnippetCount().intValue()); + assertEquals(15, high2.getFragmentSize().intValue()); + assertEquals(false,high2.getMergeContiguous()); } @Test diff --git a/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java b/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java index 2a19ec07dc..47068ba871 100644 --- a/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java +++ b/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java @@ -66,6 +66,12 @@ public class SerializerTestHelper implements RequestReader + "\"limits\": {\"permissionEvaluationCount\": \"2000\",\"permissionEvaluationTime\": \"5000\"}," + "\"scope\": { \"stores\": [\"workspace://SpacesStore\"]}," + "\"fields\": [\"id\", \"name\"]," + + "\"highlight\": {\"prefix\": \"[\",\"postfix\": \"]\",\"snippetCount\": \"20\"," + + "\"fragmentSize\": \"10\",\"mergeContiguous\": \"true\",\"maxAnalyzedChars\": \"40\", \"usePhraseHighlighter\": \"true\"," + + "\"fields\": [ " + +" {\"field\": \"my\", \"snippetCount\": \"23\", \"fragmentSize\": \"5\", \"mergeContiguous\": \"true\", \"prefix\": \"?\", \"postfix\": \"¡\" }, " + +" {\"field\": \"your\", \"snippetCount\": \"3\", \"fragmentSize\": \"15\", \"mergeContiguous\": \"false\", \"prefix\": \"(\", \"postfix\": \")\" } " + + " ]" + " }," + "\"include\": [\"aspectNames\", \"properties\"]}"; public SerializerTestHelper()