in search-backend-indexer/src/main/java/org/apache/maven/search/backend/indexer/internal/IndexerCoreSearchBackendImpl.java [94:147]
public IndexerCoreSearchResponse search(SearchRequest searchRequest) throws IOException {
Paging paging = searchRequest.getPaging();
int totalHitsCount;
List<ArtifactInfo> artifactInfos = new ArrayList<>(paging.getPageSize());
List<Record> page = new ArrayList<>(paging.getPageSize());
// if GA present in query: doing flat, otherwise grouped search to mimic SMO
HashSet<Field> searchedFields = new HashSet<>();
Query query = toQuery(searchedFields, searchRequest.getQuery());
if (searchedFields.contains(MAVEN.SHA1)
|| (searchedFields.contains(MAVEN.GROUP_ID) && searchedFields.contains(MAVEN.ARTIFACT_ID))) {
if (!searchedFields.contains(MAVEN.CLASSIFIER)) {
query = new BooleanQuery.Builder()
.add(new BooleanClause(query, BooleanClause.Occur.MUST))
.add(
indexer.constructQuery(
org.apache.maven.index.MAVEN.CLASSIFIER,
new SourcedSearchExpression(org.apache.maven.index.Field.NOT_PRESENT)),
BooleanClause.Occur.MUST_NOT)
.build();
}
IteratorSearchRequest iteratorSearchRequest =
new IteratorSearchRequest(query, Collections.singletonList(indexingContext));
iteratorSearchRequest.setCount(paging.getPageSize());
iteratorSearchRequest.setStart(paging.getPageSize() * paging.getPageOffset());
try (IteratorSearchResponse iteratorSearchResponse = indexer.searchIterator(iteratorSearchRequest)) {
totalHitsCount = iteratorSearchResponse.getTotalHitsCount();
StreamSupport.stream(iteratorSearchResponse.iterator().spliterator(), false)
.sorted(ArtifactInfo.VERSION_COMPARATOR)
.forEach(ai -> {
artifactInfos.add(ai);
page.add(convert(ai, null));
});
}
return new IndexerCoreSearchResponseImpl(searchRequest, totalHitsCount, page, query, artifactInfos);
} else {
GroupedSearchRequest groupedSearchRequest =
new GroupedSearchRequest(query, new GAGrouping(), indexingContext);
try (GroupedSearchResponse groupedSearchResponse = indexer.searchGrouped(groupedSearchRequest)) {
totalHitsCount = groupedSearchResponse.getResults().size();
groupedSearchResponse.getResults().values().stream()
.skip((long) paging.getPageSize() * paging.getPageOffset())
.limit(paging.getPageSize())
.forEach(aig -> {
ArtifactInfo ai = aig.getArtifactInfos().iterator().next();
artifactInfos.add(ai);
page.add(convert(ai, aig.getArtifactInfos().size()));
});
}
return new IndexerCoreSearchResponseImpl(searchRequest, totalHitsCount, page, query, artifactInfos);
}
}