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