/** * Parse the results and return the candidate results */ private CandidateResults parseResults( final SearchResponse searchResponse, final ParsedQuery query, final int limit, final int from, boolean hasGeoSortPredicates ) { final SearchHits searchHits = searchResponse.getHits(); final SearchHit[] hits = searchHits.getHits(); if (logger.isTraceEnabled()) { logger.trace(" Hit count: {} Total hits: {}", hits.length, searchHits.getTotalHits()); } List<CandidateResult> candidates = new ArrayList<>( hits.length ); for ( SearchHit hit : hits ) { CandidateResult candidateResult; candidateResult = parseIndexDocId( hit, hasGeoSortPredicates ); candidates.add( candidateResult ); } final CandidateResults candidateResults = new CandidateResults( candidates, query.getSelectFieldMappings()); // >= seems odd. However if we get an overflow, we need to account for it. if ( hits.length >= limit ) { candidateResults.initializeOffset( from + limit ); } return candidateResults; }
/** * Build CandidateResults from direct query */ private CandidateResults buildCandidateResultsForDirectQuery(final List<Identifier> directIdentifiers, final ParsedQuery query, final SearchTypes searchTypes) { Preconditions.checkArgument(searchTypes.getTypes().length > 0, "Search type required"); String entityType = searchTypes.getTypes()[0]; List<CandidateResult> candidates = new ArrayList<>(directIdentifiers.size()); for (Identifier id : directIdentifiers) { CandidateResult candidateResult = null; if (id.isUUID()) { candidateResult = new CandidateResult(entityType, id.getUUID()); } else if (id.isName()) { candidateResult = new CandidateResult(entityType, id.getName()); } candidates.add(candidateResult); } return new CandidateResults(candidates, query.getSelectFieldMappings(), true); }
return new CandidateResults( candidates, Collections.EMPTY_SET);