1010package  org .elasticsearch .datageneration .queries ;
1111
1212import  org .apache .lucene .search .join .ScoreMode ;
13+ import  org .elasticsearch .datageneration .Mapping ;
1314import  org .elasticsearch .index .query .QueryBuilder ;
1415import  org .elasticsearch .index .query .QueryBuilders ;
1516
2021
2122public  class  QueryGenerator  {
2223
23-     private  final  Map < String ,  Object >  mappingRaw ;
24+     private  final  Mapping   mapping ;
2425
25-     public  QueryGenerator (Map < String ,  Object >  mappingRaw ) {
26-         this .mappingRaw  = mappingRaw ;
26+     public  QueryGenerator (Mapping   mapping ) {
27+         this .mapping  = mapping ;
2728    }
2829
29-     public  List <QueryBuilder > generateQueries (String  type , String  path , Map < String ,  Object >  mapping ,  Object  value ) {
30+     public  List <QueryBuilder > generateQueries (String  type , String  path , Object  value ) {
3031        // This query generator cannot handle fields with periods in the name. 
3132        if  (path .equals ("host.name" )) {
3233            return  List .of ();
3334        }
35+         // Can handle dynamically mapped fields, but not runtime fields 
36+         if  (isRuntimeField (path )) {
37+             return  List .of ();
38+         }
3439        var  leafQueryGenerator  = LeafQueryGenerator .buildForType (type );
35-         var  leafQueries  = leafQueryGenerator .generate (mapping , path , value );
40+         var  fieldMapping  = mapping .lookup ().get (path );
41+         var  leafQueries  = leafQueryGenerator .generate (fieldMapping , path , value );
3642        return  leafQueries .stream ().map (q  -> wrapInNestedQuery (path , q )).toList ();
3743    }
3844
@@ -48,7 +54,7 @@ private QueryBuilder wrapInNestedQuery(String path, QueryBuilder leafQuery) {
4854
4955    @ SuppressWarnings ("unchecked" )
5056    private  List <String > getNestedPathPrefixes (String [] path ) {
51-         Map <String , Object > mapping  = mappingRaw ;
57+         Map <String , Object > mapping  = this . mapping . raw () ;
5258        mapping  = (Map <String , Object >) mapping .get ("_doc" );
5359        mapping  = (Map <String , Object >) mapping .get ("properties" );
5460
@@ -70,4 +76,23 @@ private List<String> getNestedPathPrefixes(String[] path) {
7076        }
7177        return  result ;
7278    }
79+ 
80+     @ SuppressWarnings ("unchecked" )
81+     private  boolean  isRuntimeField (String  path ) {
82+         String [] parts  = path .split ("\\ ." );
83+         var  topLevelMapping  = (Map <String , Object >) mapping .raw ().get ("_doc" );
84+         boolean  inRuntimeContext  = "runtime" .equals (topLevelMapping .get ("dynamic" ));
85+         for  (int  i  = 0 ; i  < parts .length  - 1 ; i ++) {
86+             var  pathToHere  = String .join ("." , Arrays .copyOfRange (parts , 0 , i  + 1 ));
87+             Map <String , Object > fieldMapping  = mapping .lookup ().get (pathToHere );
88+             if  (fieldMapping  == null ) {
89+                 break ;
90+             }
91+             if  (fieldMapping .containsKey ("dynamic" )) {
92+                 // lower down dynamic definitions override higher up behavior 
93+                 inRuntimeContext  = "runtime" .equals (fieldMapping .get ("dynamic" ));
94+             }
95+         }
96+         return  inRuntimeContext ;
97+     }
7398}
0 commit comments