mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
[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:
@@ -2,7 +2,7 @@
|
|||||||
* #%L
|
* #%L
|
||||||
* Alfresco Remote API
|
* 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.
|
* This file is part of the Alfresco software.
|
||||||
* If the software was purchased under a paid Alfresco license, the terms of
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
@@ -26,6 +26,8 @@
|
|||||||
|
|
||||||
package org.alfresco.rest.api.search.impl;
|
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.DELETED;
|
||||||
import static org.alfresco.rest.api.search.impl.StoreMapper.HISTORY;
|
import static org.alfresco.rest.api.search.impl.StoreMapper.HISTORY;
|
||||||
import static org.alfresco.rest.api.search.impl.StoreMapper.LIVE_NODES;
|
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.Map.Entry;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.stream.Collectors;
|
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.GenericBucket;
|
||||||
import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse;
|
import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse;
|
||||||
import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse.FACET_TYPE;
|
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)
|
public CollectionWithPagingInfo<Node> toCollectionWithPagingInfo(Params params, SearchRequestContext searchRequestContext, SearchQuery searchQuery, ResultSet results)
|
||||||
{
|
{
|
||||||
SearchContext context = null;
|
List<Node> noderesults = new ArrayList<>();
|
||||||
Integer total = null;
|
|
||||||
List<Node> noderesults = new ArrayList<Node>();
|
|
||||||
Map<String, UserInfo> mapUserInfo = new HashMap<>(10);
|
Map<String, UserInfo> mapUserInfo = new HashMap<>(10);
|
||||||
Map<NodeRef, List<Pair<String, List<String>>>> hightLighting = results.getHighlighting();
|
Map<NodeRef, List<Pair<String, List<String>>>> highLighting = results.getHighlighting();
|
||||||
int notFound = 0;
|
final AtomicInteger unknownNodeRefsCount = new AtomicInteger();
|
||||||
boolean isHistory = searchRequestContext.getStores().contains(StoreMapper.HISTORY);
|
boolean isHistory = searchRequestContext.getStores().contains(StoreMapper.HISTORY);
|
||||||
|
|
||||||
for (ResultSetRow row:results)
|
for (ResultSetRow row:results)
|
||||||
@@ -169,7 +170,7 @@ public class ResultMapper
|
|||||||
{
|
{
|
||||||
float f = row.getScore();
|
float f = row.getScore();
|
||||||
List<HighlightEntry> highlightEntries = null;
|
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())
|
if (high != null && !high.isEmpty())
|
||||||
{
|
{
|
||||||
@@ -185,26 +186,21 @@ public class ResultMapper
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
logger.debug("Unknown noderef returned from search results "+row.getNodeRef());
|
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)
|
return CollectionWithPagingInfo.asPaged(params.getPaging(), noderesults, results.hasMore(), setTotal(results), null, context);
|
||||||
{
|
|
||||||
//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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds a node representation based on a ResultSetRow;
|
* Builds a node representation based on a ResultSetRow;
|
||||||
* @param searchRequestContext
|
*
|
||||||
* @param aRow
|
* @param aRow
|
||||||
* @param params
|
* @param params
|
||||||
* @param mapUserInfo
|
* @param mapUserInfo
|
||||||
@@ -285,14 +281,14 @@ public class ResultMapper
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses the results from Solr to set the Search Context
|
* Uses the results from Solr to set the Search Context
|
||||||
* @param SolrJSONResultSet
|
*
|
||||||
* @param searchQuery
|
* @param searchQuery
|
||||||
* @return SearchContext
|
* @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;
|
SearchContext context = null;
|
||||||
Map<String, Integer> facetQueries = solrResultSet.getFacetQueries();
|
Map<String, Integer> facetQueries = resultSet.getFacetQueries();
|
||||||
List<GenericFacetResponse> facets = new ArrayList<>();
|
List<GenericFacetResponse> facets = new ArrayList<>();
|
||||||
List<FacetQueryContext> facetResults = null;
|
List<FacetQueryContext> facetResults = null;
|
||||||
SpellCheckContext spellCheckContext = null;
|
SpellCheckContext spellCheckContext = null;
|
||||||
@@ -330,7 +326,7 @@ public class ResultMapper
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Field Facets
|
//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())
|
if(FacetFormat.V2 == searchQuery.getFacetFormat())
|
||||||
{
|
{
|
||||||
facets.addAll(getFacetBucketsForFacetFieldsAsFacets(facetFields, searchQuery));
|
facets.addAll(getFacetBucketsForFacetFieldsAsFacets(facetFields, searchQuery));
|
||||||
@@ -340,28 +336,29 @@ public class ResultMapper
|
|||||||
ffcs.addAll(getFacetBucketsForFacetFields(facetFields, searchQuery));
|
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));
|
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()));
|
facets.addAll(RangeResultMapper.getGenericFacetsForRanges(facetRanges, searchQuery.getFacetRanges()));
|
||||||
|
|
||||||
List<GenericFacetResponse> stats = getFieldStats(searchRequestContext, solrResultSet.getStats());
|
List<GenericFacetResponse> stats = getFieldStats(searchRequestContext, resultSet.getStats());
|
||||||
List<GenericFacetResponse> pimped = getPivots(searchRequestContext, solrResultSet.getPivotFacets(), stats);
|
List<GenericFacetResponse> pimped = getPivots(searchRequestContext, resultSet.getPivotFacets(), stats);
|
||||||
facets.addAll(pimped);
|
facets.addAll(pimped);
|
||||||
facets.addAll(stats);
|
facets.addAll(stats);
|
||||||
|
|
||||||
//Spelling
|
//Spelling
|
||||||
SpellCheckResult spell = solrResultSet.getSpellCheckResult();
|
SpellCheckResult spell = resultSet.getSpellCheckResult();
|
||||||
if (spell != null && spell.getResultName() != null && !spell.getResults().isEmpty())
|
if (spell != null && spell.getResultName() != null && !spell.getResults().isEmpty())
|
||||||
{
|
{
|
||||||
spellCheckContext = new SpellCheckContext(spell.getResultName(),spell.getResults());
|
spellCheckContext = new SpellCheckContext(spell.getResultName(),spell.getResults());
|
||||||
}
|
}
|
||||||
|
|
||||||
//Put it all together
|
//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;
|
return isNullContext(context)?null:context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasGroup(SearchQuery searchQuery)
|
public static boolean hasGroup(SearchQuery searchQuery)
|
||||||
{
|
{
|
||||||
if(searchQuery != null && searchQuery.getFacetQueries() != null)
|
if(searchQuery != null && searchQuery.getFacetQueries() != null)
|
||||||
@@ -618,26 +615,32 @@ public class ResultMapper
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets SolrJSONResultSet class if there is one.
|
* Tries to see if the input {@link ResultSet} or one of the wrapped {@link ResultSet}
|
||||||
* @param results
|
* is an instance of {@link SearchEngineResultSet}.
|
||||||
* @return
|
* 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)
|
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 results instanceof SearchEngineResultSet
|
||||||
{
|
? of(results).map(SearchEngineResultSet.class::cast)
|
||||||
return (SolrJSONResultSet) theResultSet;
|
: empty();
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CollectionWithPagingInfo<TupleList> toCollectionWithPagingInfo(JSONArray docs, SearchSQLQuery searchQuery) throws JSONException
|
public CollectionWithPagingInfo<TupleList> toCollectionWithPagingInfo(JSONArray docs, SearchSQLQuery searchQuery) throws JSONException
|
||||||
{
|
{
|
||||||
if(docs == null )
|
if(docs == null )
|
||||||
|
@@ -52,6 +52,7 @@ import java.util.stream.Collectors;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import org.alfresco.repo.search.EmptyResultSet;
|
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.SolrJSONResultSet;
|
||||||
import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericBucket;
|
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;
|
||||||
@@ -303,7 +304,7 @@ public class ResultMapperTests
|
|||||||
SearchQuery searchQuery = helper.searchQueryFromJson();
|
SearchQuery searchQuery = helper.searchQueryFromJson();
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
||||||
SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest);
|
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(34l, searchContext.getConsistency().getlastTxId());
|
||||||
assertEquals(6, searchContext.getFacetQueries().size());
|
assertEquals(6, searchContext.getFacetQueries().size());
|
||||||
assertEquals(0,searchContext.getFacetQueries().get(0).getCount());
|
assertEquals(0,searchContext.getFacetQueries().get(0).getCount());
|
||||||
@@ -437,7 +438,7 @@ public class ResultMapperTests
|
|||||||
SearchQuery searchQuery = helper.searchQueryFromJson();
|
SearchQuery searchQuery = helper.searchQueryFromJson();
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
||||||
SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest);
|
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
|
//Facet intervals
|
||||||
List<GenericFacetResponse> intervalFacets = searchContext.getFacets().stream()
|
List<GenericFacetResponse> intervalFacets = searchContext.getFacets().stream()
|
||||||
@@ -477,7 +478,7 @@ public class ResultMapperTests
|
|||||||
SearchQuery searchQuery = helper.searchQueryFromJson();
|
SearchQuery searchQuery = helper.searchQueryFromJson();
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
||||||
SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest);
|
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
|
//Numeric facet range
|
||||||
List<GenericFacetResponse> rangeFacets = searchContext.getFacets().stream()
|
List<GenericFacetResponse> rangeFacets = searchContext.getFacets().stream()
|
||||||
@@ -531,7 +532,7 @@ public class ResultMapperTests
|
|||||||
SearchQuery searchQuery = helper.extractFromJson(updatedJSON);
|
SearchQuery searchQuery = helper.extractFromJson(updatedJSON);
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
||||||
SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest);
|
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
|
//Numeric facet range
|
||||||
List<GenericFacetResponse> rangeFacets = searchContext.getFacets().stream()
|
List<GenericFacetResponse> rangeFacets = searchContext.getFacets().stream()
|
||||||
@@ -575,7 +576,7 @@ public class ResultMapperTests
|
|||||||
ResultSet results = mockResultset(expectedResponse);
|
ResultSet results = mockResultset(expectedResponse);
|
||||||
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
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(34l, searchContext.getConsistency().getlastTxId());
|
||||||
assertEquals(null, searchContext.getFacetQueries());
|
assertEquals(null, searchContext.getFacetQueries());
|
||||||
assertEquals(1, searchContext.getFacets().size());
|
assertEquals(1, searchContext.getFacets().size());
|
||||||
@@ -610,7 +611,7 @@ public class ResultMapperTests
|
|||||||
ResultSet results = mockResultset(expectedResponse);
|
ResultSet results = mockResultset(expectedResponse);
|
||||||
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
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(34l, searchContext.getConsistency().getlastTxId());
|
||||||
assertEquals(null, searchContext.getFacetQueries());
|
assertEquals(null, searchContext.getFacetQueries());
|
||||||
assertEquals(2, searchContext.getFacets().size());
|
assertEquals(2, searchContext.getFacets().size());
|
||||||
@@ -648,7 +649,7 @@ public class ResultMapperTests
|
|||||||
ResultSet results = mockResultset(expectedResponse);
|
ResultSet results = mockResultset(expectedResponse);
|
||||||
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
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(34l, searchContext.getConsistency().getlastTxId());
|
||||||
assertTrue(searchContext.getFacets().isEmpty());
|
assertTrue(searchContext.getFacets().isEmpty());
|
||||||
assertEquals(3,searchContext.getFacetQueries().size());
|
assertEquals(3,searchContext.getFacetQueries().size());
|
||||||
@@ -722,7 +723,7 @@ public class ResultMapperTests
|
|||||||
ResultSet results = mockResultset(expectedResponse);
|
ResultSet results = mockResultset(expectedResponse);
|
||||||
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
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(34l, searchContext.getConsistency().getlastTxId());
|
||||||
assertEquals(null, searchContext.getFacetQueries());
|
assertEquals(null, searchContext.getFacetQueries());
|
||||||
assertEquals(1, searchContext.getFacets().size());
|
assertEquals(1, searchContext.getFacets().size());
|
||||||
@@ -738,7 +739,7 @@ public class ResultMapperTests
|
|||||||
searchQuery = helper.extractFromJson(jsonQuery);
|
searchQuery = helper.extractFromJson(jsonQuery);
|
||||||
results = mockResultset(expectedResponse);
|
results = mockResultset(expectedResponse);
|
||||||
searchRequest = SearchRequestContext.from(searchQuery);
|
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(34l, searchContext.getConsistency().getlastTxId());
|
||||||
assertEquals(3,searchContext.getFacetQueries().size());
|
assertEquals(3,searchContext.getFacetQueries().size());
|
||||||
assertEquals("small",searchContext.getFacetQueries().get(0).getLabel());
|
assertEquals("small",searchContext.getFacetQueries().get(0).getLabel());
|
||||||
@@ -759,7 +760,7 @@ public class ResultMapperTests
|
|||||||
+ "\"processedDenies\":true, \"lastIndexedTx\":34}";
|
+ "\"processedDenies\":true, \"lastIndexedTx\":34}";
|
||||||
results = mockResultset(expectedResponse);
|
results = mockResultset(expectedResponse);
|
||||||
searchQuery = helper.extractFromJson(jsonQuery);
|
searchQuery = helper.extractFromJson(jsonQuery);
|
||||||
searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0);
|
searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery);
|
||||||
assertFalse(searchContext.getFacetsFields().isEmpty());
|
assertFalse(searchContext.getFacetsFields().isEmpty());
|
||||||
assertTrue(searchContext.getFacets().isEmpty());
|
assertTrue(searchContext.getFacets().isEmpty());
|
||||||
assertEquals("creator",searchContext.getFacetsFields().get(0).getLabel());
|
assertEquals("creator",searchContext.getFacetsFields().get(0).getLabel());
|
||||||
@@ -770,7 +771,7 @@ public class ResultMapperTests
|
|||||||
assertEquals("modifier",searchContext.getFacetsFields().get(1).getLabel());
|
assertEquals("modifier",searchContext.getFacetsFields().get(1).getLabel());
|
||||||
jsonQuery = jsonQuery.replace("V1", "V2");
|
jsonQuery = jsonQuery.replace("V1", "V2");
|
||||||
searchQuery = helper.extractFromJson(jsonQuery);
|
searchQuery = helper.extractFromJson(jsonQuery);
|
||||||
searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0);
|
searchContext = mapper.toSearchContext((SearchEngineResultSet) results, searchRequest, searchQuery);
|
||||||
assertTrue(searchContext.getFacetsFields().isEmpty());
|
assertTrue(searchContext.getFacetsFields().isEmpty());
|
||||||
assertFalse(searchContext.getFacets().isEmpty());
|
assertFalse(searchContext.getFacets().isEmpty());
|
||||||
assertEquals("creator",searchContext.getFacets().get(0).getLabel());
|
assertEquals("creator",searchContext.getFacets().get(0).getLabel());
|
||||||
@@ -835,7 +836,7 @@ public class ResultMapperTests
|
|||||||
ResultSet results = mockResultset(expectedResponse);
|
ResultSet results = mockResultset(expectedResponse);
|
||||||
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
SearchQuery searchQuery = helper.extractFromJson(jsonQuery);
|
||||||
SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery);
|
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(34l, searchContext.getConsistency().getlastTxId());
|
||||||
assertEquals(null, searchContext.getFacetQueries());
|
assertEquals(null, searchContext.getFacetQueries());
|
||||||
assertEquals(3, searchContext.getFacets().size());
|
assertEquals(3, searchContext.getFacets().size());
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
* #%L
|
* #%L
|
||||||
* Alfresco Repository
|
* Alfresco Repository
|
||||||
* %%
|
* %%
|
||||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
* Copyright (C) 2005 - 2021 Alfresco Software Limited
|
||||||
* %%
|
* %%
|
||||||
* This file is part of the Alfresco software.
|
* This file is part of the Alfresco software.
|
||||||
* If the software was purchased under a paid Alfresco license, the terms of
|
* 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/>.
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
* #L%
|
* #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
|
* @author Gethin James
|
||||||
* @since 5.0
|
* @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();
|
||||||
}
|
}
|
@@ -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();
|
||||||
|
}
|
@@ -2,7 +2,7 @@
|
|||||||
* #%L
|
* #%L
|
||||||
* Alfresco Repository
|
* Alfresco Repository
|
||||||
* %%
|
* %%
|
||||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
* Copyright (C) 2005 - 2021 Alfresco Software Limited
|
||||||
* %%
|
* %%
|
||||||
* This file is part of the Alfresco software.
|
* This file is part of the Alfresco software.
|
||||||
* If the software was purchased under a paid Alfresco license, the terms of
|
* 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.domain.node.NodeDAO;
|
||||||
import org.alfresco.repo.search.QueryParserException;
|
import org.alfresco.repo.search.QueryParserException;
|
||||||
|
import org.alfresco.repo.search.SearchEngineResultSet;
|
||||||
import org.alfresco.repo.search.SimpleResultSetMetaData;
|
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.GenericBucket;
|
||||||
import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse;
|
import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse;
|
||||||
import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse.FACET_TYPE;
|
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.LimitBy;
|
||||||
import org.alfresco.service.cmr.search.PermissionEvaluationMode;
|
import org.alfresco.service.cmr.search.PermissionEvaluationMode;
|
||||||
import org.alfresco.service.cmr.search.RangeParameters;
|
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.ResultSetMetaData;
|
||||||
import org.alfresco.service.cmr.search.ResultSetRow;
|
import org.alfresco.service.cmr.search.ResultSetRow;
|
||||||
import org.alfresco.service.cmr.search.SearchParameters;
|
import org.alfresco.service.cmr.search.SearchParameters;
|
||||||
@@ -68,10 +67,9 @@ import org.json.JSONException;
|
|||||||
import org.json.JSONObject;
|
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 static final Log logger = LogFactory.getLog(SolrJSONResultSet.class);
|
||||||
|
|
||||||
private NodeService nodeService;
|
private NodeService nodeService;
|
||||||
@@ -730,6 +728,7 @@ public class SolrJSONResultSet implements ResultSet, JSONResult
|
|||||||
/**
|
/**
|
||||||
* @return the queryTime
|
* @return the queryTime
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public Long getQueryTime()
|
public Long getQueryTime()
|
||||||
{
|
{
|
||||||
return queryTime;
|
return queryTime;
|
||||||
@@ -739,6 +738,7 @@ public class SolrJSONResultSet implements ResultSet, JSONResult
|
|||||||
/**
|
/**
|
||||||
* @return the numberFound
|
* @return the numberFound
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public long getNumberFound()
|
public long getNumberFound()
|
||||||
{
|
{
|
||||||
return numberFound.longValue();
|
return numberFound.longValue();
|
||||||
@@ -758,26 +758,31 @@ public class SolrJSONResultSet implements ResultSet, JSONResult
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<String, List<Pair<String, Integer>>> getFieldFacets()
|
public Map<String, List<Pair<String, Integer>>> getFieldFacets()
|
||||||
{
|
{
|
||||||
return Collections.unmodifiableMap(fieldFacets);
|
return Collections.unmodifiableMap(fieldFacets);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<String, List<Pair<String, Integer>>> getFacetIntervals()
|
public Map<String, List<Pair<String, Integer>>> getFacetIntervals()
|
||||||
{
|
{
|
||||||
return Collections.unmodifiableMap(facetIntervals);
|
return Collections.unmodifiableMap(facetIntervals);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<GenericFacetResponse> getPivotFacets()
|
public List<GenericFacetResponse> getPivotFacets()
|
||||||
{
|
{
|
||||||
return pivotFacets;
|
return pivotFacets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<String, Set<Metric>> getStats()
|
public Map<String, Set<Metric>> getStats()
|
||||||
{
|
{
|
||||||
return Collections.unmodifiableMap(stats);
|
return Collections.unmodifiableMap(stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public long getLastIndexedTxId()
|
public long getLastIndexedTxId()
|
||||||
{
|
{
|
||||||
return lastIndexedTxId;
|
return lastIndexedTxId;
|
||||||
@@ -801,11 +806,13 @@ public class SolrJSONResultSet implements ResultSet, JSONResult
|
|||||||
return this.spellCheckResult;
|
return this.spellCheckResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean getProcessedDenies()
|
public boolean getProcessedDenies()
|
||||||
{
|
{
|
||||||
return processedDenies;
|
return processedDenies;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<String,List<Map<String,String>>> getFacetRanges()
|
public Map<String,List<Map<String,String>>> getFacetRanges()
|
||||||
{
|
{
|
||||||
return facetRanges;
|
return facetRanges;
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.repo.search.impl.solr;
|
package org.alfresco.repo.search.impl.solr;
|
||||||
|
|
||||||
import org.alfresco.repo.search.impl.JSONResult;
|
import org.alfresco.repo.search.SearchEngineResultMetadata;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,7 +34,7 @@ import org.json.JSONObject;
|
|||||||
* @author Gethin James
|
* @author Gethin James
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface SolrJsonProcessor<T extends JSONResult>
|
public interface SolrJsonProcessor<T extends SearchEngineResultMetadata>
|
||||||
{
|
{
|
||||||
public T getResult(JSONObject json);
|
public T getResult(JSONObject json);
|
||||||
}
|
}
|
||||||
|
@@ -54,7 +54,7 @@ import org.alfresco.repo.index.shard.Floc;
|
|||||||
import org.alfresco.repo.index.shard.ShardRegistry;
|
import org.alfresco.repo.index.shard.ShardRegistry;
|
||||||
import org.alfresco.repo.search.QueryParserException;
|
import org.alfresco.repo.search.QueryParserException;
|
||||||
import org.alfresco.repo.search.impl.QueryParserUtils;
|
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.repo.tenant.TenantService;
|
||||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
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,
|
throws UnsupportedEncodingException, IOException, HttpException, URIException,
|
||||||
JSONException
|
JSONException
|
||||||
{
|
{
|
||||||
return postSolrQuery(httpClient, url, body, jsonProcessor, null);
|
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,
|
throws UnsupportedEncodingException, IOException, HttpException, URIException,
|
||||||
JSONException
|
JSONException
|
||||||
{
|
{
|
||||||
@@ -1120,7 +1120,7 @@ public class SolrQueryHTTPClient extends AbstractSolrQueryHTTPClient implements
|
|||||||
json.put("spellcheck", manager.getSpellCheckJsonValue());
|
json.put("spellcheck", manager.getSpellCheckJsonValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONResult results = jsonProcessor.getResult(json);
|
SearchEngineResultMetadata results = jsonProcessor.getResult(json);
|
||||||
|
|
||||||
if (s_logger.isDebugEnabled())
|
if (s_logger.isDebugEnabled())
|
||||||
{
|
{
|
||||||
|
@@ -37,7 +37,7 @@ import org.alfresco.repo.admin.RepositoryState;
|
|||||||
import org.alfresco.repo.index.shard.Floc;
|
import org.alfresco.repo.index.shard.Floc;
|
||||||
import org.alfresco.repo.index.shard.ShardRegistry;
|
import org.alfresco.repo.index.shard.ShardRegistry;
|
||||||
import org.alfresco.repo.search.QueryParserException;
|
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.repo.tenant.TenantService;
|
||||||
import org.alfresco.service.cmr.repository.StoreRef;
|
import org.alfresco.service.cmr.repository.StoreRef;
|
||||||
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
||||||
@@ -222,7 +222,7 @@ public class SolrSQLHttpClient extends AbstractSolrQueryHTTPClient implements So
|
|||||||
SolrJsonProcessor<?> jsonProcessor) throws IOException, JSONException
|
SolrJsonProcessor<?> jsonProcessor) throws IOException, JSONException
|
||||||
{
|
{
|
||||||
JSONObject json = postQuery(httpClient, url, body);
|
JSONObject json = postQuery(httpClient, url, body);
|
||||||
JSONResult results = jsonProcessor.getResult(json);
|
SearchEngineResultMetadata results = jsonProcessor.getResult(json);
|
||||||
LOGGER.debug("Sent : {}", url);
|
LOGGER.debug("Sent : {}", url);
|
||||||
LOGGER.debug("with: {}", body);
|
LOGGER.debug("with: {}", body);
|
||||||
LOGGER.debug("Got: {} in {} ms", results.getNumberFound(), results.getQueryTime());
|
LOGGER.debug("Got: {} in {} ms", results.getNumberFound(), results.getQueryTime());
|
||||||
|
@@ -30,7 +30,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.alfresco.repo.search.SimpleResultSetMetaData;
|
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.ChildAssociationRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.search.LimitBy;
|
import org.alfresco.service.cmr.search.LimitBy;
|
||||||
@@ -51,7 +51,7 @@ import org.json.JSONObject;
|
|||||||
* Pojo that parses and stores solr stream response.
|
* Pojo that parses and stores solr stream response.
|
||||||
* @author Michael Suzuki
|
* @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 final String SOLR_STREAM_EXCEPTION = "EXCEPTION";
|
||||||
private static Log logger = LogFactory.getLog(SolrSQLJSONResultSet.class);
|
private static Log logger = LogFactory.getLog(SolrSQLJSONResultSet.class);
|
||||||
|
@@ -28,7 +28,7 @@ package org.alfresco.repo.search.impl.solr;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
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.StatsResultSet;
|
||||||
import org.alfresco.service.cmr.search.StatsResultStat;
|
import org.alfresco.service.cmr.search.StatsResultStat;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
@@ -44,7 +44,7 @@ import org.springframework.util.StringUtils;
|
|||||||
* @author Gethin James
|
* @author Gethin James
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
*/
|
*/
|
||||||
public class SolrStatsResult implements JSONResult, StatsResultSet
|
public class SolrStatsResult implements SearchEngineResultMetadata, StatsResultSet
|
||||||
{
|
{
|
||||||
private static final Log logger = LogFactory.getLog(SolrStatsResult.class);
|
private static final Log logger = LogFactory.getLog(SolrStatsResult.class);
|
||||||
|
|
||||||
|
@@ -35,7 +35,7 @@ import org.junit.Test;
|
|||||||
* @author Michael Suzuki
|
* @author Michael Suzuki
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class SolrSQLJSONResultSetTest
|
public class SolrSQLJSONResultMetadataSetTest
|
||||||
{
|
{
|
||||||
@Test
|
@Test
|
||||||
public void parseSQLResponse() throws JSONException
|
public void parseSQLResponse() throws JSONException
|
Reference in New Issue
Block a user