[SEARCH-2677] Extract SearchEngineResultSet and SearchEngineResultMetadata interfaces (#286)

* [SEARCH-2677] Extract SearchEngineResultSet and SearchEngineResultMetadata interfaces

* [SEARCH-2677] Scan the ResultSet decorator chain for a maximum of 3 nested levels
This commit is contained in:
Andrea Gazzarini
2021-02-19 12:09:40 +01:00
committed by GitHub
parent de18900d90
commit 1ff90242b0
11 changed files with 161 additions and 80 deletions

View File

@@ -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<Node> toCollectionWithPagingInfo(Params params, SearchRequestContext searchRequestContext, SearchQuery searchQuery, ResultSet results)
{
SearchContext context = null;
Integer total = null;
List<Node> noderesults = new ArrayList<Node>();
List<Node> noderesults = new ArrayList<>();
Map<String, UserInfo> mapUserInfo = new HashMap<>(10);
Map<NodeRef, List<Pair<String, List<String>>>> hightLighting = results.getHighlighting();
int notFound = 0;
Map<NodeRef, List<Pair<String, List<String>>>> 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<HighlightEntry> highlightEntries = null;
List<Pair<String, List<String>>> high = hightLighting.get(row.getNodeRef());
List<Pair<String, List<String>>> 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<String, Integer> facetQueries = solrResultSet.getFacetQueries();
Map<String, Integer> facetQueries = resultSet.getFacetQueries();
List<GenericFacetResponse> facets = new ArrayList<>();
List<FacetQueryContext> facetResults = null;
SpellCheckContext spellCheckContext = null;
@@ -330,7 +326,7 @@ public class ResultMapper
}
//Field Facets
Map<String, List<Pair<String, Integer>>> facetFields = solrResultSet.getFieldFacets();
Map<String, List<Pair<String, Integer>>> 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<String, List<Pair<String, Integer>>> facetInterval = solrResultSet.getFacetIntervals();
Map<String, List<Pair<String, Integer>>> facetInterval = resultSet.getFacetIntervals();
facets.addAll(getGenericFacetsForIntervals(facetInterval, searchQuery));
Map<String,List<Map<String,String>>> facetRanges = solrResultSet.getFacetRanges();
Map<String,List<Map<String,String>>> facetRanges = resultSet.getFacetRanges();
facets.addAll(RangeResultMapper.getGenericFacetsForRanges(facetRanges, searchQuery.getFacetRanges()));
List<GenericFacetResponse> stats = getFieldStats(searchRequestContext, solrResultSet.getStats());
List<GenericFacetResponse> pimped = getPivots(searchRequestContext, solrResultSet.getPivotFacets(), stats);
List<GenericFacetResponse> stats = getFieldStats(searchRequestContext, resultSet.getStats());
List<GenericFacetResponse> 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<SearchEngineResultSet> 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<TupleList> toCollectionWithPagingInfo(JSONArray docs, SearchSQLQuery searchQuery) throws JSONException
{
if(docs == null )

View File

@@ -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<GenericFacetResponse> 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<GenericFacetResponse> 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<GenericFacetResponse> 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());

View File

@@ -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 <http://www.gnu.org/licenses/>.
* #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();
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
* #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<String, List<Pair<String, Integer>>> getFieldFacets();
Map<String, List<Pair<String, Integer>>> getFacetIntervals();
Map<String, List<Map<String, String>>> getFacetRanges();
List<GenericFacetResponse> getPivotFacets();
Map<String, Set<Metric>> getStats();
long getLastIndexedTxId();
boolean getProcessedDenies();
}

View File

@@ -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<String, List<Pair<String, Integer>>> getFieldFacets()
{
return Collections.unmodifiableMap(fieldFacets);
}
@Override
public Map<String, List<Pair<String, Integer>>> getFacetIntervals()
{
return Collections.unmodifiableMap(facetIntervals);
}
@Override
public List<GenericFacetResponse> getPivotFacets()
{
return pivotFacets;
}
@Override
public Map<String, Set<Metric>> 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<String,List<Map<String,String>>> getFacetRanges()
{
return facetRanges;

View File

@@ -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<T extends JSONResult>
public interface SolrJsonProcessor<T extends SearchEngineResultMetadata>
{
public T getResult(JSONObject json);
}

View File

@@ -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())
{

View File

@@ -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());

View File

@@ -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);

View File

@@ -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);

View File

@@ -35,7 +35,7 @@ import org.junit.Test;
* @author Michael Suzuki
*
*/
public class SolrSQLJSONResultSetTest
public class SolrSQLJSONResultMetadataSetTest
{
@Test
public void parseSQLResponse() throws JSONException