@Override protected void doAssertLuceneQuery( HasChildQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { QueryBuilder innerQueryBuilder = queryBuilder.query(); if (innerQueryBuilder instanceof EmptyQueryBuilder) { assertNull(query); } else { assertThat(query, instanceOf(HasChildQueryBuilder.LateParsingQuery.class)); HasChildQueryBuilder.LateParsingQuery lpq = (HasChildQueryBuilder.LateParsingQuery) query; assertEquals(queryBuilder.minChildren(), lpq.getMinChildren()); assertEquals(queryBuilder.maxChildren(), lpq.getMaxChildren()); assertEquals(queryBuilder.scoreMode(), lpq.getScoreMode()); // WTF is this why do we have two? } if (queryBuilder.innerHit() != null) { assertNotNull(SearchContext.current()); if (query != null) { assertNotNull(SearchContext.current().innerHits()); assertEquals(1, SearchContext.current().innerHits().getInnerHits().size()); assertTrue( SearchContext.current().innerHits().getInnerHits().containsKey("inner_hits_name")); InnerHitsContext.BaseInnerHits innerHits = SearchContext.current().innerHits().getInnerHits().get("inner_hits_name"); assertEquals(innerHits.size(), 100); assertEquals(innerHits.sort().getSort().length, 1); assertEquals(innerHits.sort().getSort()[0].getField(), STRING_FIELD_NAME); } else { assertNull(SearchContext.current().innerHits()); } } }
static void assertLateParsingQuery(Query query, String type, String id) throws IOException { assertThat(query, instanceOf(HasChildQueryBuilder.LateParsingQuery.class)); HasChildQueryBuilder.LateParsingQuery lateParsingQuery = (HasChildQueryBuilder.LateParsingQuery) query; assertThat(lateParsingQuery.getInnerQuery(), instanceOf(BooleanQuery.class)); BooleanQuery booleanQuery = (BooleanQuery) lateParsingQuery.getInnerQuery(); assertThat(booleanQuery.clauses().size(), equalTo(2)); // check the inner ids query, we have to call rewrite to get to check the type it's executed // against assertThat(booleanQuery.clauses().get(0).getOccur(), equalTo(BooleanClause.Occur.MUST)); assertThat(booleanQuery.clauses().get(0).getQuery(), instanceOf(TermsQuery.class)); TermsQuery termsQuery = (TermsQuery) booleanQuery.clauses().get(0).getQuery(); Query rewrittenTermsQuery = termsQuery.rewrite(null); assertThat(rewrittenTermsQuery, instanceOf(ConstantScoreQuery.class)); ConstantScoreQuery constantScoreQuery = (ConstantScoreQuery) rewrittenTermsQuery; assertThat(constantScoreQuery.getQuery(), instanceOf(BooleanQuery.class)); BooleanQuery booleanTermsQuery = (BooleanQuery) constantScoreQuery.getQuery(); assertThat(booleanTermsQuery.clauses().size(), equalTo(1)); assertThat(booleanTermsQuery.clauses().get(0).getOccur(), equalTo(BooleanClause.Occur.SHOULD)); assertThat(booleanTermsQuery.clauses().get(0).getQuery(), instanceOf(TermQuery.class)); TermQuery termQuery = (TermQuery) booleanTermsQuery.clauses().get(0).getQuery(); assertThat(termQuery.getTerm().field(), equalTo(UidFieldMapper.NAME)); // we want to make sure that the inner ids query gets executed against the child type rather // than the main type we initially set to the context BytesRef[] ids = Uid.createUidsForTypesAndIds( Collections.singletonList(type), Collections.singletonList(id)); assertThat(termQuery.getTerm().bytes(), equalTo(ids[0])); // check the type filter assertThat(booleanQuery.clauses().get(1).getOccur(), equalTo(BooleanClause.Occur.FILTER)); assertThat(booleanQuery.clauses().get(1).getQuery(), instanceOf(ConstantScoreQuery.class)); ConstantScoreQuery typeConstantScoreQuery = (ConstantScoreQuery) booleanQuery.clauses().get(1).getQuery(); assertThat(typeConstantScoreQuery.getQuery(), instanceOf(TermQuery.class)); TermQuery typeTermQuery = (TermQuery) typeConstantScoreQuery.getQuery(); assertThat(typeTermQuery.getTerm().field(), equalTo(TypeFieldMapper.NAME)); assertThat(typeTermQuery.getTerm().text(), equalTo(type)); }