diff --git a/remote-api/src/main/java/org/alfresco/rest/api/search/impl/ResultMapper.java b/remote-api/src/main/java/org/alfresco/rest/api/search/impl/ResultMapper.java index 7de06085fe..f309a0a20a 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/search/impl/ResultMapper.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/search/impl/ResultMapper.java @@ -2,7 +2,7 @@ * #%L * Alfresco Remote API * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2021 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -26,6 +26,8 @@ package org.alfresco.rest.api.search.impl; +import static java.util.Optional.empty; +import static java.util.Optional.of; import static org.alfresco.rest.api.search.impl.StoreMapper.DELETED; import static org.alfresco.rest.api.search.impl.StoreMapper.HISTORY; import static org.alfresco.rest.api.search.impl.StoreMapper.LIVE_NODES; @@ -42,9 +44,10 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import org.alfresco.repo.search.impl.solr.SolrJSONResultSet; +import org.alfresco.repo.search.SearchEngineResultSet; import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericBucket; import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse; import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse.FACET_TYPE; @@ -153,12 +156,10 @@ public class ResultMapper */ public CollectionWithPagingInfo toCollectionWithPagingInfo(Params params, SearchRequestContext searchRequestContext, SearchQuery searchQuery, ResultSet results) { - SearchContext context = null; - Integer total = null; - List noderesults = new ArrayList(); + List noderesults = new ArrayList<>(); Map mapUserInfo = new HashMap<>(10); - Map>>> hightLighting = results.getHighlighting(); - int notFound = 0; + Map>>> highLighting = results.getHighlighting(); + final AtomicInteger unknownNodeRefsCount = new AtomicInteger(); boolean isHistory = searchRequestContext.getStores().contains(StoreMapper.HISTORY); for (ResultSetRow row:results) @@ -169,7 +170,7 @@ public class ResultMapper { float f = row.getScore(); List highlightEntries = null; - List>> high = hightLighting.get(row.getNodeRef()); + List>> high = highLighting.get(row.getNodeRef()); if (high != null && !high.isEmpty()) { @@ -185,26 +186,21 @@ public class ResultMapper else { logger.debug("Unknown noderef returned from search results "+row.getNodeRef()); - notFound++; + unknownNodeRefsCount.incrementAndGet(); } } - SolrJSONResultSet solrResultSet = findSolrResultSet(results); + SearchContext context = + toSearchEngineResultSet(results) + .map(resultSet -> toSearchContext(resultSet, searchRequestContext, searchQuery)) + .orElse(null); - if (solrResultSet != null) - { - //We used Solr for this query - context = toSearchContext(solrResultSet, searchRequestContext, searchQuery, notFound); - } - - total = setTotal(results); - - return CollectionWithPagingInfo.asPaged(params.getPaging(), noderesults, results.hasMore(), total, null, context); + return CollectionWithPagingInfo.asPaged(params.getPaging(), noderesults, results.hasMore(), setTotal(results), null, context); } /** * Builds a node representation based on a ResultSetRow; - * @param searchRequestContext + * * @param aRow * @param params * @param mapUserInfo @@ -285,14 +281,14 @@ public class ResultMapper /** * Uses the results from Solr to set the Search Context - * @param SolrJSONResultSet + * * @param searchQuery * @return SearchContext */ - public SearchContext toSearchContext(SolrJSONResultSet solrResultSet, SearchRequestContext searchRequestContext, SearchQuery searchQuery, int notFound) + public SearchContext toSearchContext(SearchEngineResultSet resultSet, SearchRequestContext searchRequestContext, SearchQuery searchQuery) { SearchContext context = null; - Map facetQueries = solrResultSet.getFacetQueries(); + Map facetQueries = resultSet.getFacetQueries(); List facets = new ArrayList<>(); List facetResults = null; SpellCheckContext spellCheckContext = null; @@ -330,7 +326,7 @@ public class ResultMapper } //Field Facets - Map>> facetFields = solrResultSet.getFieldFacets(); + Map>> facetFields = resultSet.getFieldFacets(); if(FacetFormat.V2 == searchQuery.getFacetFormat()) { facets.addAll(getFacetBucketsForFacetFieldsAsFacets(facetFields, searchQuery)); @@ -340,28 +336,29 @@ public class ResultMapper ffcs.addAll(getFacetBucketsForFacetFields(facetFields, searchQuery)); } - Map>> facetInterval = solrResultSet.getFacetIntervals(); + Map>> facetInterval = resultSet.getFacetIntervals(); facets.addAll(getGenericFacetsForIntervals(facetInterval, searchQuery)); - Map>> facetRanges = solrResultSet.getFacetRanges(); + Map>> facetRanges = resultSet.getFacetRanges(); facets.addAll(RangeResultMapper.getGenericFacetsForRanges(facetRanges, searchQuery.getFacetRanges())); - List stats = getFieldStats(searchRequestContext, solrResultSet.getStats()); - List pimped = getPivots(searchRequestContext, solrResultSet.getPivotFacets(), stats); + List stats = getFieldStats(searchRequestContext, resultSet.getStats()); + List pimped = getPivots(searchRequestContext, resultSet.getPivotFacets(), stats); facets.addAll(pimped); facets.addAll(stats); //Spelling - SpellCheckResult spell = solrResultSet.getSpellCheckResult(); + SpellCheckResult spell = resultSet.getSpellCheckResult(); if (spell != null && spell.getResultName() != null && !spell.getResults().isEmpty()) { spellCheckContext = new SpellCheckContext(spell.getResultName(),spell.getResults()); } //Put it all together - context = new SearchContext(solrResultSet.getLastIndexedTxId(), facets, facetResults, ffcs, spellCheckContext, searchRequestContext.includeRequest()?searchQuery:null); + context = new SearchContext(resultSet.getLastIndexedTxId(), facets, facetResults, ffcs, spellCheckContext, searchRequestContext.includeRequest()?searchQuery:null); return isNullContext(context)?null:context; } + public static boolean hasGroup(SearchQuery searchQuery) { if(searchQuery != null && searchQuery.getFacetQueries() != null) @@ -618,26 +615,32 @@ public class ResultMapper } /** - * Gets SolrJSONResultSet class if there is one. - * @param results - * @return + * Tries to see if the input {@link ResultSet} or one of the wrapped {@link ResultSet} + * is an instance of {@link SearchEngineResultSet}. + * Since some concrete ResultSet implements the decorator patterns, the code + * assumes (in those cases) a nested structure with a maximum of 3 levels. + * Probably the code could be generalised better in order to scan a decorator + * chain with an unlimited depth, but that would require a change in the ResultSet interface. */ - protected SolrJSONResultSet findSolrResultSet(ResultSet results) + protected Optional toSearchEngineResultSet(ResultSet results) { - ResultSet theResultSet = results; - if (results instanceof FilteringResultSet) { - theResultSet = ((FilteringResultSet) results).getUnFilteredResultSet(); + // 1st level + results = ((FilteringResultSet) results).getUnFilteredResultSet(); + + // 2nd level + if (results instanceof FilteringResultSet) + { + results = ((FilteringResultSet) results).getUnFilteredResultSet(); + } } - if (theResultSet instanceof SolrJSONResultSet) - { - return (SolrJSONResultSet) theResultSet; - } - - return null; + return results instanceof SearchEngineResultSet + ? of(results).map(SearchEngineResultSet.class::cast) + : empty(); } + public CollectionWithPagingInfo toCollectionWithPagingInfo(JSONArray docs, SearchSQLQuery searchQuery) throws JSONException { if(docs == null ) diff --git a/remote-api/src/test/java/org/alfresco/rest/api/search/ResultMapperTests.java b/remote-api/src/test/java/org/alfresco/rest/api/search/ResultMapperTests.java index 7d52e9e9ea..5e5ca1110d 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/search/ResultMapperTests.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/search/ResultMapperTests.java @@ -52,6 +52,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.alfresco.repo.search.EmptyResultSet; +import org.alfresco.repo.search.SearchEngineResultSet; import org.alfresco.repo.search.impl.solr.SolrJSONResultSet; import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericBucket; import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse; @@ -303,7 +304,7 @@ public class ResultMapperTests SearchQuery searchQuery = helper.searchQueryFromJson(); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertEquals(6, searchContext.getFacetQueries().size()); assertEquals(0,searchContext.getFacetQueries().get(0).getCount()); @@ -437,7 +438,7 @@ public class ResultMapperTests SearchQuery searchQuery = helper.searchQueryFromJson(); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); //Facet intervals List intervalFacets = searchContext.getFacets().stream() @@ -477,7 +478,7 @@ public class ResultMapperTests SearchQuery searchQuery = helper.searchQueryFromJson(); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); //Numeric facet range List rangeFacets = searchContext.getFacets().stream() @@ -531,7 +532,7 @@ public class ResultMapperTests SearchQuery searchQuery = helper.extractFromJson(updatedJSON); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); //Numeric facet range List rangeFacets = searchContext.getFacets().stream() @@ -575,7 +576,7 @@ public class ResultMapperTests ResultSet results = mockResultset(expectedResponse); SearchQuery searchQuery = helper.extractFromJson(jsonQuery); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertEquals(null, searchContext.getFacetQueries()); assertEquals(1, searchContext.getFacets().size()); @@ -610,7 +611,7 @@ public class ResultMapperTests ResultSet results = mockResultset(expectedResponse); SearchQuery searchQuery = helper.extractFromJson(jsonQuery); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertEquals(null, searchContext.getFacetQueries()); assertEquals(2, searchContext.getFacets().size()); @@ -648,7 +649,7 @@ public class ResultMapperTests ResultSet results = mockResultset(expectedResponse); SearchQuery searchQuery = helper.extractFromJson(jsonQuery); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertTrue(searchContext.getFacets().isEmpty()); assertEquals(3,searchContext.getFacetQueries().size()); @@ -722,7 +723,7 @@ public class ResultMapperTests ResultSet results = mockResultset(expectedResponse); SearchQuery searchQuery = helper.extractFromJson(jsonQuery); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertEquals(null, searchContext.getFacetQueries()); assertEquals(1, searchContext.getFacets().size()); @@ -738,7 +739,7 @@ public class ResultMapperTests searchQuery = helper.extractFromJson(jsonQuery); results = mockResultset(expectedResponse); searchRequest = SearchRequestContext.from(searchQuery); - searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertEquals(3,searchContext.getFacetQueries().size()); assertEquals("small",searchContext.getFacetQueries().get(0).getLabel()); @@ -759,7 +760,7 @@ public class ResultMapperTests + "\"processedDenies\":true, \"lastIndexedTx\":34}"; results = mockResultset(expectedResponse); searchQuery = helper.extractFromJson(jsonQuery); - searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertFalse(searchContext.getFacetsFields().isEmpty()); assertTrue(searchContext.getFacets().isEmpty()); assertEquals("creator",searchContext.getFacetsFields().get(0).getLabel()); @@ -770,7 +771,7 @@ public class ResultMapperTests assertEquals("modifier",searchContext.getFacetsFields().get(1).getLabel()); jsonQuery = jsonQuery.replace("V1", "V2"); searchQuery = helper.extractFromJson(jsonQuery); - searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertTrue(searchContext.getFacetsFields().isEmpty()); assertFalse(searchContext.getFacets().isEmpty()); assertEquals("creator",searchContext.getFacets().get(0).getLabel()); @@ -835,7 +836,7 @@ public class ResultMapperTests ResultSet results = mockResultset(expectedResponse); SearchQuery searchQuery = helper.extractFromJson(jsonQuery); SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); + SearchContext searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertEquals(null, searchContext.getFacetQueries()); assertEquals(3, searchContext.getFacets().size()); diff --git a/repository/src/main/java/org/alfresco/repo/search/impl/JSONResult.java b/repository/src/main/java/org/alfresco/repo/search/SearchEngineResultMetadata.java similarity index 58% rename from repository/src/main/java/org/alfresco/repo/search/impl/JSONResult.java rename to repository/src/main/java/org/alfresco/repo/search/SearchEngineResultMetadata.java index 22306bed06..6561c1e09d 100644 --- a/repository/src/main/java/org/alfresco/repo/search/impl/JSONResult.java +++ b/repository/src/main/java/org/alfresco/repo/search/SearchEngineResultMetadata.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2021 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -23,16 +23,29 @@ * along with Alfresco. If not, see . * #L% */ -package org.alfresco.repo.search.impl; +package org.alfresco.repo.search; /** - * Json returned from Solr + * Additional metadata ops available for {@link org.alfresco.service.cmr.search.ResultSet} coming from a search engine. * * @author Gethin James * @since 5.0 + * @see SearchEngineResultSet */ -public interface JSONResult +public interface SearchEngineResultMetadata { - public Long getQueryTime(); - public long getNumberFound(); + /** + * Returns the query execution time, or put in other words, the amount of + * time the search engine spent for processing the request. + * + * @return the query execution time + */ + Long getQueryTime(); + + /** + * Total number of items matching a the current query execution. + * + * @return the number of items in the search index that matched a query execution. + */ + long getNumberFound(); } diff --git a/repository/src/main/java/org/alfresco/repo/search/SearchEngineResultSet.java b/repository/src/main/java/org/alfresco/repo/search/SearchEngineResultSet.java new file mode 100644 index 0000000000..788598e857 --- /dev/null +++ b/repository/src/main/java/org/alfresco/repo/search/SearchEngineResultSet.java @@ -0,0 +1,57 @@ +/* + * #%L + * Alfresco Data model classes + * %% + * Copyright (C) 2005 - 2021 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; + +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.Metric; +import org.alfresco.service.cmr.search.ResultSet; +import org.alfresco.util.Pair; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Supertype layer interface for all resultset coming from a search engine (e.g. Elasticsearch, Solr) + * This interface has been originally extracted from the Apache Solr ResultSet implementation, + * that's the reason why the naming used for denoting some things (e.g. facets) is tied to the Solr world. + */ +public interface SearchEngineResultSet extends ResultSet, SearchEngineResultMetadata +{ + Map>> getFieldFacets(); + + Map>> getFacetIntervals(); + + Map>> getFacetRanges(); + + List getPivotFacets(); + + Map> getStats(); + + long getLastIndexedTxId(); + + boolean getProcessedDenies(); +} diff --git a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrJSONResultSet.java b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrJSONResultSet.java index 4bf3db2395..814ad32a39 100644 --- a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrJSONResultSet.java +++ b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrJSONResultSet.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2021 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -38,8 +38,8 @@ import java.util.stream.Collectors; import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.search.QueryParserException; +import org.alfresco.repo.search.SearchEngineResultSet; import org.alfresco.repo.search.SimpleResultSetMetaData; -import org.alfresco.repo.search.impl.JSONResult; import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericBucket; import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse; import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse.FACET_TYPE; @@ -55,7 +55,6 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.search.LimitBy; import org.alfresco.service.cmr.search.PermissionEvaluationMode; import org.alfresco.service.cmr.search.RangeParameters; -import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.ResultSetMetaData; import org.alfresco.service.cmr.search.ResultSetRow; import org.alfresco.service.cmr.search.SearchParameters; @@ -68,10 +67,9 @@ import org.json.JSONException; import org.json.JSONObject; /** - * @author Andy + * Apache Solr {@link SearchEngineResultSet} implementation. */ -public class SolrJSONResultSet implements ResultSet, JSONResult -{ +public class SolrJSONResultSet implements SearchEngineResultSet { private static final Log logger = LogFactory.getLog(SolrJSONResultSet.class); private NodeService nodeService; @@ -730,6 +728,7 @@ public class SolrJSONResultSet implements ResultSet, JSONResult /** * @return the queryTime */ + @Override public Long getQueryTime() { return queryTime; @@ -739,6 +738,7 @@ public class SolrJSONResultSet implements ResultSet, JSONResult /** * @return the numberFound */ + @Override public long getNumberFound() { return numberFound.longValue(); @@ -758,26 +758,31 @@ public class SolrJSONResultSet implements ResultSet, JSONResult } } + @Override public Map>> getFieldFacets() { return Collections.unmodifiableMap(fieldFacets); } + @Override public Map>> getFacetIntervals() { return Collections.unmodifiableMap(facetIntervals); } + @Override public List getPivotFacets() { return pivotFacets; } + @Override public Map> getStats() { return Collections.unmodifiableMap(stats); } + @Override public long getLastIndexedTxId() { return lastIndexedTxId; @@ -801,11 +806,13 @@ public class SolrJSONResultSet implements ResultSet, JSONResult return this.spellCheckResult; } + @Override public boolean getProcessedDenies() { return processedDenies; } + @Override public Map>> getFacetRanges() { return facetRanges; diff --git a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrJsonProcessor.java b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrJsonProcessor.java index fb6627c1cf..e65772488f 100644 --- a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrJsonProcessor.java +++ b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrJsonProcessor.java @@ -25,7 +25,7 @@ */ package org.alfresco.repo.search.impl.solr; -import org.alfresco.repo.search.impl.JSONResult; +import org.alfresco.repo.search.SearchEngineResultMetadata; import org.json.JSONObject; /** @@ -34,7 +34,7 @@ import org.json.JSONObject; * @author Gethin James */ @FunctionalInterface -public interface SolrJsonProcessor +public interface SolrJsonProcessor { public T getResult(JSONObject json); } diff --git a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java index 234d5b5b0f..5faefe02dd 100644 --- a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java +++ b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java @@ -54,7 +54,7 @@ import org.alfresco.repo.index.shard.Floc; import org.alfresco.repo.index.shard.ShardRegistry; import org.alfresco.repo.search.QueryParserException; import org.alfresco.repo.search.impl.QueryParserUtils; -import org.alfresco.repo.search.impl.JSONResult; +import org.alfresco.repo.search.SearchEngineResultMetadata; import org.alfresco.repo.tenant.TenantService; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; @@ -1098,14 +1098,14 @@ public class SolrQueryHTTPClient extends AbstractSolrQueryHTTPClient implements } } - protected JSONResult postSolrQuery(HttpClient httpClient, String url, JSONObject body, SolrJsonProcessor jsonProcessor) + protected SearchEngineResultMetadata postSolrQuery(HttpClient httpClient, String url, JSONObject body, SolrJsonProcessor jsonProcessor) throws UnsupportedEncodingException, IOException, HttpException, URIException, JSONException { return postSolrQuery(httpClient, url, body, jsonProcessor, null); } - protected JSONResult postSolrQuery(HttpClient httpClient, String url, JSONObject body, SolrJsonProcessor jsonProcessor, String spellCheckParams) + protected SearchEngineResultMetadata postSolrQuery(HttpClient httpClient, String url, JSONObject body, SolrJsonProcessor jsonProcessor, String spellCheckParams) throws UnsupportedEncodingException, IOException, HttpException, URIException, JSONException { @@ -1120,7 +1120,7 @@ public class SolrQueryHTTPClient extends AbstractSolrQueryHTTPClient implements json.put("spellcheck", manager.getSpellCheckJsonValue()); } - JSONResult results = jsonProcessor.getResult(json); + SearchEngineResultMetadata results = jsonProcessor.getResult(json); if (s_logger.isDebugEnabled()) { diff --git a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrSQLHttpClient.java b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrSQLHttpClient.java index b147ab9659..a23ae3870f 100644 --- a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrSQLHttpClient.java +++ b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrSQLHttpClient.java @@ -37,7 +37,7 @@ import org.alfresco.repo.admin.RepositoryState; import org.alfresco.repo.index.shard.Floc; import org.alfresco.repo.index.shard.ShardRegistry; import org.alfresco.repo.search.QueryParserException; -import org.alfresco.repo.search.impl.JSONResult; +import org.alfresco.repo.search.SearchEngineResultMetadata; import org.alfresco.repo.tenant.TenantService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; @@ -222,7 +222,7 @@ public class SolrSQLHttpClient extends AbstractSolrQueryHTTPClient implements So SolrJsonProcessor jsonProcessor) throws IOException, JSONException { JSONObject json = postQuery(httpClient, url, body); - JSONResult results = jsonProcessor.getResult(json); + SearchEngineResultMetadata results = jsonProcessor.getResult(json); LOGGER.debug("Sent : {}", url); LOGGER.debug("with: {}", body); LOGGER.debug("Got: {} in {} ms", results.getNumberFound(), results.getQueryTime()); diff --git a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultSet.java b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultSet.java index 3cb25d97e9..66d521a7ed 100644 --- a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultSet.java +++ b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultSet.java @@ -30,7 +30,7 @@ import java.util.List; import java.util.Map; import org.alfresco.repo.search.SimpleResultSetMetaData; -import org.alfresco.repo.search.impl.JSONResult; +import org.alfresco.repo.search.SearchEngineResultMetadata; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.search.LimitBy; @@ -51,7 +51,7 @@ import org.json.JSONObject; * Pojo that parses and stores solr stream response. * @author Michael Suzuki */ -public class SolrSQLJSONResultSet implements ResultSet, JSONResult +public class SolrSQLJSONResultSet implements ResultSet, SearchEngineResultMetadata { private static final String SOLR_STREAM_EXCEPTION = "EXCEPTION"; private static Log logger = LogFactory.getLog(SolrSQLJSONResultSet.class); diff --git a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrStatsResult.java b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrStatsResult.java index ee8dc4c341..8553b1ba38 100644 --- a/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrStatsResult.java +++ b/repository/src/main/java/org/alfresco/repo/search/impl/solr/SolrStatsResult.java @@ -28,7 +28,7 @@ package org.alfresco.repo.search.impl.solr; import java.util.ArrayList; import java.util.List; -import org.alfresco.repo.search.impl.JSONResult; +import org.alfresco.repo.search.SearchEngineResultMetadata; import org.alfresco.service.cmr.search.StatsResultSet; import org.alfresco.service.cmr.search.StatsResultStat; import org.apache.commons.logging.Log; @@ -44,7 +44,7 @@ import org.springframework.util.StringUtils; * @author Gethin James * @since 5.0 */ -public class SolrStatsResult implements JSONResult, StatsResultSet +public class SolrStatsResult implements SearchEngineResultMetadata, StatsResultSet { private static final Log logger = LogFactory.getLog(SolrStatsResult.class); diff --git a/repository/src/test/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultSetTest.java b/repository/src/test/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultMetadataSetTest.java similarity index 98% rename from repository/src/test/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultSetTest.java rename to repository/src/test/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultMetadataSetTest.java index 3bb5749b24..225863b571 100644 --- a/repository/src/test/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultSetTest.java +++ b/repository/src/test/java/org/alfresco/repo/search/impl/solr/SolrSQLJSONResultMetadataSetTest.java @@ -35,7 +35,7 @@ import org.junit.Test; * @author Michael Suzuki * */ -public class SolrSQLJSONResultSetTest +public class SolrSQLJSONResultMetadataSetTest { @Test public void parseSQLResponse() throws JSONException