1111import org .elasticsearch .client .Response ;
1212import org .elasticsearch .client .ResponseException ;
1313import org .elasticsearch .client .RestClient ;
14+ import org .elasticsearch .common .Strings ;
1415import org .elasticsearch .common .settings .Settings ;
1516import org .elasticsearch .common .time .DateFormatter ;
1617import org .elasticsearch .common .time .FormatNames ;
1718import org .elasticsearch .common .xcontent .XContentHelper ;
1819import org .elasticsearch .datageneration .matchers .MatchResult ;
1920import org .elasticsearch .datageneration .matchers .Matcher ;
21+ import org .elasticsearch .datageneration .matchers .source .SourceTransforms ;
22+ import org .elasticsearch .datageneration .queries .QueryGenerator ;
23+ import org .elasticsearch .index .query .QueryBuilder ;
2024import org .elasticsearch .index .query .QueryBuilders ;
2125import org .elasticsearch .search .aggregations .AggregationBuilders ;
2226import org .elasticsearch .search .aggregations .bucket .histogram .DateHistogramInterval ;
3741import java .util .Comparator ;
3842import java .util .List ;
3943import java .util .Map ;
44+ import java .util .Objects ;
4045import java .util .TreeMap ;
4146
4247import static org .hamcrest .Matchers .equalTo ;
@@ -132,12 +137,52 @@ public void testMatchAllQuery() throws IOException {
132137 final MatchResult matchResult = Matcher .matchSource ()
133138 .mappings (dataGenerationHelper .mapping ().lookup (), getContenderMappings (), getBaselineMappings ())
134139 .settings (getContenderSettings (), getBaselineSettings ())
135- .expected (getQueryHits (queryBaseline (searchSourceBuilder )))
140+ .expected (getQueryHits (queryBaseline (searchSourceBuilder ), true ))
136141 .ignoringSort (true )
137- .isEqualTo (getQueryHits (queryContender (searchSourceBuilder )));
142+ .isEqualTo (getQueryHits (queryContender (searchSourceBuilder ), true ));
138143 assertTrue (matchResult .getMessage (), matchResult .isMatch ());
139144 }
140145
146+ public void testRandomQueries () throws IOException {
147+ int numberOfDocuments = ESTestCase .randomIntBetween (10 , 50 );
148+ final List <XContentBuilder > documents = generateDocuments (numberOfDocuments );
149+ var mappingLookup = dataGenerationHelper .mapping ().lookup ();
150+ final List <Map <String , List <Object >>> docsNormalized = documents .stream ().map (d -> {
151+ var document = XContentHelper .convertToMap (XContentType .JSON .xContent (), Strings .toString (d ), true );
152+ return SourceTransforms .normalize (document , mappingLookup );
153+ }).toList ();
154+
155+ indexDocuments (documents );
156+
157+ QueryGenerator queryGenerator = new QueryGenerator (dataGenerationHelper .mapping ());
158+ Map <String , String > fieldsTypes = dataGenerationHelper .getTemplateFieldTypes ();
159+ for (var e : fieldsTypes .entrySet ()) {
160+ var path = e .getKey ();
161+ var type = e .getValue ();
162+ var docsWithFields = docsNormalized .stream ().filter (d -> d .containsKey (path )).toList ();
163+ if (docsWithFields .isEmpty () == false ) {
164+ var doc = randomFrom (docsWithFields );
165+ List <Object > values = doc .get (path ).stream ().filter (Objects ::nonNull ).toList ();
166+ if (values .isEmpty () == false ) {
167+ Object value = randomFrom (values );
168+ List <QueryBuilder > queries = queryGenerator .generateQueries (type , path , value );
169+ for (var query : queries ) {
170+ logger .info ("Querying for field [{}] with value [{}]" , path , value );
171+
172+ final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder ().query (query ).size (numberOfDocuments );
173+ final MatchResult matchResult = Matcher .matchSource ()
174+ .mappings (dataGenerationHelper .mapping ().lookup (), getContenderMappings (), getBaselineMappings ())
175+ .settings (getContenderSettings (), getBaselineSettings ())
176+ .expected (getQueryHits (queryBaseline (searchSourceBuilder ), false ))
177+ .ignoringSort (true )
178+ .isEqualTo (getQueryHits (queryContender (searchSourceBuilder ), false ));
179+ assertTrue (matchResult .getMessage (), matchResult .isMatch ());
180+ }
181+ }
182+ }
183+ }
184+ }
185+
141186 public void testTermsQuery () throws IOException {
142187 int numberOfDocuments = ESTestCase .randomIntBetween (20 , 80 );
143188 final List <XContentBuilder > documents = generateDocuments (numberOfDocuments );
@@ -150,9 +195,9 @@ public void testTermsQuery() throws IOException {
150195 final MatchResult matchResult = Matcher .matchSource ()
151196 .mappings (dataGenerationHelper .mapping ().lookup (), getContenderMappings (), getBaselineMappings ())
152197 .settings (getContenderSettings (), getBaselineSettings ())
153- .expected (getQueryHits (queryBaseline (searchSourceBuilder )))
198+ .expected (getQueryHits (queryBaseline (searchSourceBuilder ), true ))
154199 .ignoringSort (true )
155- .isEqualTo (getQueryHits (queryContender (searchSourceBuilder )));
200+ .isEqualTo (getQueryHits (queryContender (searchSourceBuilder ), true ));
156201 assertTrue (matchResult .getMessage (), matchResult .isMatch ());
157202 }
158203
@@ -291,12 +336,15 @@ protected XContentBuilder generateDocument(final Instant timestamp) throws IOExc
291336 }
292337
293338 @ SuppressWarnings ("unchecked" )
294- private static List <Map <String , Object >> getQueryHits (final Response response ) throws IOException {
339+ private static List <Map <String , Object >> getQueryHits (final Response response , final boolean requireResults ) throws IOException {
295340 final Map <String , Object > map = XContentHelper .convertToMap (XContentType .JSON .xContent (), response .getEntity ().getContent (), true );
296341 final Map <String , Object > hitsMap = (Map <String , Object >) map .get ("hits" );
297342
298343 final List <Map <String , Object >> hitsList = (List <Map <String , Object >>) hitsMap .get ("hits" );
299- assertThat (hitsList .size (), greaterThan (0 ));
344+
345+ if (requireResults ) {
346+ assertThat (hitsList .size (), greaterThan (0 ));
347+ }
300348
301349 return hitsList .stream ()
302350 .sorted (Comparator .comparing ((Map <String , Object > hit ) -> ((String ) hit .get ("_id" ))))
0 commit comments