/** * 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); }
if(parsedQuery.getSelectFieldMappings().size() < 1 && !parsedQuery.getOriginalQuery().toLowerCase().contains("where") && parsedQuery.getSortPredicates().size() > 0 ){
/** Test basic || expression */ @Test public void selectAll() throws RecognitionException { String queryString = "select * where a = 1 or b > 2"; ANTLRStringStream in = new ANTLRStringStream( queryString ); CpQueryFilterLexer lexer = new CpQueryFilterLexer( in ); TokenRewriteStream tokens = new TokenRewriteStream( lexer ); CpQueryFilterParser parser = new CpQueryFilterParser( tokens ); ParsedQuery query = parser.ql().parsedQuery; Collection<SelectFieldMapping> identifiers = query.getSelectFieldMappings(); assertEquals( 0, identifiers.size() ); }
@Test public void selectRename() throws RecognitionException { String queryString = "select {source:target} where a = 1 or b > 2"; ANTLRStringStream in = new ANTLRStringStream( queryString ); CpQueryFilterLexer lexer = new CpQueryFilterLexer( in ); TokenRewriteStream tokens = new TokenRewriteStream( lexer ); CpQueryFilterParser parser = new CpQueryFilterParser( tokens ); ParsedQuery query = parser.ql().parsedQuery; Collection<SelectFieldMapping> identifiers = query.getSelectFieldMappings(); final SelectFieldMapping fieldMapping = identifiers.iterator().next(); assertEquals( "source", fieldMapping.getSourceFieldName() ); assertEquals( "target", fieldMapping.getTargetFieldName() ); }
@Test public void selectField() throws RecognitionException { String queryString = "select c where a = 1 or b > 2"; ANTLRStringStream in = new ANTLRStringStream( queryString ); CpQueryFilterLexer lexer = new CpQueryFilterLexer( in ); TokenRewriteStream tokens = new TokenRewriteStream( lexer ); CpQueryFilterParser parser = new CpQueryFilterParser( tokens ); ParsedQuery query = parser.ql().parsedQuery; Collection<SelectFieldMapping> identifiers = query.getSelectFieldMappings(); final SelectFieldMapping fieldMapping = identifiers.iterator().next(); assertEquals( "c", fieldMapping.getSourceFieldName() ); assertEquals( "c", fieldMapping.getTargetFieldName() ); }