From d4676e8aaccbc83efba2d3d78c153e43a2bad80e Mon Sep 17 00:00:00 2001 From: Gethin James Date: Tue, 6 Sep 2016 15:39:10 +0000 Subject: [PATCH] Merged searchapi (5.2.1) to 5.2.N (5.2.1) 130107 gjames: SEARCH-122: Implementing spellcheck queries git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@130301 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../api/search/context/SearchContext.java | 9 +++- .../api/search/context/SpellCheckContext.java | 53 +++++++++++++++++++ .../rest/api/search/impl/ResultMapper.java | 13 ++++- .../rest/api/search/impl/SearchMapper.java | 29 +++++++++- .../rest/api/search/model/SearchQuery.java | 13 ++++- .../rest/api/search/model/Spelling.java | 49 +++++++++++++++++ .../rest/api/search/ResultMapperTests.java | 4 ++ .../rest/api/search/SearchMapperTests.java | 33 +++++++++++- .../search/SearchQuerySerializerTests.java | 8 ++- 9 files changed, 202 insertions(+), 9 deletions(-) create mode 100644 source/java/org/alfresco/rest/api/search/context/SpellCheckContext.java create mode 100644 source/java/org/alfresco/rest/api/search/model/Spelling.java diff --git a/source/java/org/alfresco/rest/api/search/context/SearchContext.java b/source/java/org/alfresco/rest/api/search/context/SearchContext.java index 180772ff47..761f8c9eea 100644 --- a/source/java/org/alfresco/rest/api/search/context/SearchContext.java +++ b/source/java/org/alfresco/rest/api/search/context/SearchContext.java @@ -34,9 +34,11 @@ public class SearchContext { private final Consistency consistency; private final List facetQueries; + private final SpellCheckContext spellCheck; - public SearchContext(long lastTxId, List facetQueries) + public SearchContext(long lastTxId, List facetQueries, SpellCheckContext spellCheck) { + this.spellCheck = spellCheck; if (lastTxId > 0) { consistency = new Consistency(lastTxId); @@ -58,6 +60,11 @@ public class SearchContext return facetQueries; } + public SpellCheckContext getSpellCheck() + { + return spellCheck; + } + public class Consistency { private final long lastTxId; diff --git a/source/java/org/alfresco/rest/api/search/context/SpellCheckContext.java b/source/java/org/alfresco/rest/api/search/context/SpellCheckContext.java new file mode 100644 index 0000000000..2ecde4907f --- /dev/null +++ b/source/java/org/alfresco/rest/api/search/context/SpellCheckContext.java @@ -0,0 +1,53 @@ +/*- + * #%L + * Alfresco Remote API + * %% + * 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.rest.api.search.context; + +import java.util.List; + +/** + * The results of a SpellCheck + */ +public class SpellCheckContext +{ + private final String type; + private final List suggestions; + + public SpellCheckContext(String type, List suggestions) + { + this.type = type; + this.suggestions = suggestions; + } + + public String getType() + { + return type; + } + + public List getSuggestions() + { + return suggestions; + } +} 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 d80c10d5c6..8192836a38 100644 --- a/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java @@ -30,12 +30,14 @@ import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet; import org.alfresco.rest.api.Nodes; import org.alfresco.rest.api.model.Node; import org.alfresco.rest.api.model.UserInfo; +import org.alfresco.rest.api.search.context.SpellCheckContext; import org.alfresco.rest.api.search.model.SearchEntry; import org.alfresco.rest.api.search.model.SearchQuery; 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.service.cmr.search.ResultSet; +import org.alfresco.service.cmr.search.SpellCheckResult; import org.alfresco.util.ParameterCheck; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -135,6 +137,7 @@ public class ResultMapper SearchContext context = null; Map facetQueries = solrResultSet.getFacetQueries(); List facetResults = null; + SpellCheckContext spellCheckContext = null; if(facetQueries!= null && !facetQueries.isEmpty()) { @@ -144,7 +147,13 @@ public class ResultMapper facetResults.add(new FacetQueryContext(fq.getKey(), fq.getValue())); } } - context = new SearchContext(solrResultSet.getLastIndexedTxId(), facetResults); + + SpellCheckResult spell = solrResultSet.getSpellCheckResult(); + if (spell != null && spell.getResultName() != null && !spell.getResults().isEmpty()) + { + spellCheckContext = new SpellCheckContext(spell.getResultName(),spell.getResults()); + } + context = new SearchContext(solrResultSet.getLastIndexedTxId(), facetResults, spellCheckContext); return isNullContext(context)?null:context; } @@ -155,7 +164,7 @@ public class ResultMapper */ protected boolean isNullContext(SearchContext context) { - return (context.getFacetQueries() == null && context.getConsistency() == null); + return (context.getFacetQueries() == null && context.getConsistency() == null && context.getSpellCheck() == null); } /** 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 4c83e71520..c7da981ca3 100644 --- a/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java @@ -32,6 +32,7 @@ import org.alfresco.rest.api.search.model.FilterQuery; import org.alfresco.rest.api.search.model.Query; import org.alfresco.rest.api.search.model.SearchQuery; import org.alfresco.rest.api.search.model.SortDef; +import org.alfresco.rest.api.search.model.Spelling; import org.alfresco.rest.api.search.model.Template; import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; import org.alfresco.rest.framework.resource.content.BasicContentInfo; @@ -82,7 +83,7 @@ public class SearchMapper public static final String AFTS = "afts"; /** - * Turn the params into the Java SearchParameters object + * Turn the SearchQuery params serialized by Jackson into the Java SearchParameters object * @param params * @return SearchParameters */ @@ -101,6 +102,7 @@ public class SearchMapper fromDefault(sp, searchQuery.getDefaults()); fromFilterQuery(sp, searchQuery.getFilterQueries()); fromFacetQuery(sp, searchQuery.getFacetQueries()); + fromSpellCheck(sp, searchQuery.getSpellcheck()); return sp; } @@ -304,4 +306,29 @@ public class SearchMapper } } + /** + * SearchParameters from SpellCheck object + * @param sp SearchParameters + * @param defaults SpellCheck + */ + public void fromSpellCheck(SearchParameters sp, Spelling spelling) + { + if (spelling != null) + { + if (spelling.getQuery() != null && !spelling.getQuery().isEmpty()) + { + sp.setSearchTerm(spelling.getQuery()); + } + else + { + if (sp.getSearchTerm() == null || sp.getSearchTerm().isEmpty()) + { + //We don't have a valid search term to use with the spelling + throw new InvalidArgumentException(InvalidArgumentException.DEFAULT_MESSAGE_ID, + new Object[] { ": userQuery or spelling.query required." }); + } + } + sp.setSpellCheck(true); + } + } } 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 f55a7627b2..e7cb6e5c9f 100644 --- a/source/java/org/alfresco/rest/api/search/model/SearchQuery.java +++ b/source/java/org/alfresco/rest/api/search/model/SearchQuery.java @@ -27,6 +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.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonProperty; @@ -47,8 +48,9 @@ public class SearchQuery private final Default defaults; private final List filterQueries; private final List facetQueries; + private final Spelling spellcheck; - public static final SearchQuery EMPTY = new SearchQuery(null, null, null, null, null,null, null, null); + public static final SearchQuery EMPTY = new SearchQuery(null, null, null, null, null,null, null, null, null); @JsonCreator public SearchQuery(@JsonProperty("query") Query query, @@ -58,7 +60,8 @@ public class SearchQuery @JsonProperty("templates") List