private ParsedQuery innerParse(QueryParseContext parseContext, XContentParser parser) throws IOException, QueryParsingException { XContentParser originalParser = parseContext.parser(); parseContext.reset(parser); try { parseContext.parseFieldMatcher(parseFieldMatcher); Query query = parseContext.parseInnerQuery(); if (query == null) { query = Queries.newMatchNoDocsQuery(); } return new ParsedQuery(query, parseContext.copyNamedQueries()); } finally { parseContext.reset(originalParser); } }
/** * Parses an inner filter, returning null if the filter should be ignored. */ @Nullable public ParsedQuery parseInnerFilter(XContentParser parser) throws IOException { QueryParseContext context = cache.get(); XContentParser originalParser = context.parser(); context.reset(parser); try { Query filter = context.parseInnerFilter(); if (filter == null) { return null; } return new ParsedQuery(filter, context.copyNamedQueries()); } finally { context.reset(originalParser); } }
private ParseResult parseSubSearchContext(SearchContext searchContext, QueryParseContext parseContext, XContentParser parser) throws Exception { ParsedQuery query = null; Map<String, InnerHitsContext.BaseInnerHits> childInnerHits = null; SubSearchContext subSearchContext = new SubSearchContext(searchContext); String fieldName = null; XContentParser.Token token; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { fieldName = parser.currentName(); } else if (token == XContentParser.Token.START_OBJECT) { if ("query".equals(fieldName)) { Query q = searchContext.queryParserService().parseInnerQuery(parseContext); query = new ParsedQuery(q, parseContext.copyNamedQueries()); } else if ("inner_hits".equals(fieldName)) { childInnerHits = parseInnerHits(parser, parseContext, searchContext); } else { parseCommonInnerHitOptions(parser, token, fieldName, subSearchContext, sortParseElement, sourceParseElement, highlighterParseElement, scriptFieldsParseElement, fieldDataFieldsParseElement); } } else { parseCommonInnerHitOptions(parser, token, fieldName, subSearchContext, sortParseElement, sourceParseElement, highlighterParseElement, scriptFieldsParseElement, fieldDataFieldsParseElement); } } if (query == null) { query = ParsedQuery.parsedMatchAllQuery(); } return new ParseResult(subSearchContext, query, childInnerHits); }
ParsedQuery parsedQuery = new ParsedQuery(innerQuery, parseContext.copyNamedQueries()); InnerHitsContext.ParentChildInnerHits parentChildInnerHits = new InnerHitsContext.ParentChildInnerHits(innerHits.getSubSearchContext(), parsedQuery, null, parseContext.mapperService(), parentDocMapper); String name = innerHits.getName() != null ? innerHits.getName() : parentType;
@Nullable public ToParentBlockJoinQuery build() throws IOException { Query innerQuery; if (queryFound) { innerQuery = getInnerQuery(); } else if (filterFound) { Query innerFilter = getInnerFilter(); if (innerFilter != null) { innerQuery = new ConstantScoreQuery(getInnerFilter()); } else { innerQuery = null; } } else { throw new QueryParsingException(parseContext, "[nested] requires either 'query' or 'filter' field"); } if (innerHits != null) { ParsedQuery parsedQuery = new ParsedQuery(innerQuery, parseContext.copyNamedQueries()); InnerHitsContext.NestedInnerHits nestedInnerHits = new InnerHitsContext.NestedInnerHits(innerHits.getSubSearchContext(), parsedQuery, null, getParentObjectMapper(), nestedObjectMapper); String name = innerHits.getName() != null ? innerHits.getName() : path; parseContext.addInnerHits(name, nestedInnerHits); } if (innerQuery != null) { return new ToParentBlockJoinQuery(Queries.filtered(innerQuery, childFilter), parentFilter, scoreMode); } else { return null; } }
ParsedQuery parsedQuery = new ParsedQuery(innerQuery, parseContext.copyNamedQueries()); InnerHitsContext.ParentChildInnerHits parentChildInnerHits = new InnerHitsContext.ParentChildInnerHits(innerHits.getSubSearchContext(), parsedQuery, null, parseContext.mapperService(), childDocMapper); String name = innerHits.getName() != null ? innerHits.getName() : childType;