static QueryBuilder randomQuery(Random rand, int level) { if (level > MAX_LEVEL) { return MATCH_ALL; } int next = rand.nextInt(7); switch (next) { case 0: return randomBoolQuery(rand, level); case 1: return randomFilteredQuery(rand, level); case 2: return randomMatchAllQuery(rand, level); case 3: return randomQueryStringQuery(rand, level); case 4: return randomRawQueryStringQuery(rand, level); case 5: return randomTermQuery(rand, level); case 6: return randomConstantScoreQuery(rand, level); default: throw new IllegalArgumentException(); } }
static QueryBuilder randomQuery(Random rand) { return randomQuery(rand, 0); }
static QueryBuilder randomFilteredQuery(Random rand, int level) { FilteredQueryBuilder query = new FilteredQueryBuilder(); query.query(randomQuery(rand, level+1)); List<QueryBuilder> filters = new ArrayList<QueryBuilder> (); int numFilters = rand.nextInt(3); for (int i = 0; i < numFilters; i++) { filters.add(randomQuery(rand, level+1)); } query.filters(filters); return query; }
static QueryBuilder randomBoolQuery(Random rand, int level) { BoolQueryBuilder query = new BoolQueryBuilder(); int numMust = rand.nextInt(3); for (int i = 0; i < numMust; i++) { query.must(randomQuery(rand, level+1)); } int numShould = rand.nextInt(3); for (int i = 0; i < numShould; i++) { query.should(randomQuery(rand, level+1)); } int numFilter = rand.nextInt(3); for (int i = 0; i < numFilter; i++) { query.filter(randomQuery(rand, level+1)); } int numMustNot = rand.nextInt(3); for (int i = 0; i < numMustNot; i++) { query.mustNot(randomQuery(rand, level+1)); } return query; }
static QueryBuilder randomConstantScoreQuery(Random rand, int level) { return new ConstantScoreQueryBuilder().filter(randomQuery(rand, level+1)).boost(rand.nextFloat()); } }
static QueryBuilder randomRawQueryStringQuery(Random rand, int level) { QueryBuilder query = randomQuery(rand); FastByteArrayOutputStream out = new FastByteArrayOutputStream(256); Generator generator = new JacksonJsonGenerator(out); generator.writeBeginObject(); query.toJson(generator); generator.writeEndObject(); generator.close(); try { return new RawQueryBuilder(out.toString().trim(), false); } catch (IOException e) { throw new IllegalArgumentException("failed to parse raw query", e); } }
@Test public void testEquals() throws IOException { for (int i = 0; i < 20; i++) { QueryBuilder randomQuery = RandomQueryBuilders.randomQuery(random); String queryString = printQueryBuilder(randomQuery, false); RawQueryBuilder rawQuery = new RawQueryBuilder(queryString, false); String rawQueryString = printQueryBuilder(rawQuery, false); assertEquals(queryString, rawQueryString); if (randomQuery instanceof RawQueryBuilder) { assertEquals(randomQuery, rawQuery); } else { assertNotEquals(randomQuery, rawQuery); } } } }