1515import org .elasticsearch .geometry .utils .WellKnownText ;
1616import org .elasticsearch .index .mapper .Mapper ;
1717import org .elasticsearch .index .mapper .ObjectMapper ;
18+ import org .elasticsearch .script .field .Field ;
1819import org .elasticsearch .test .ESTestCase ;
1920
2021import java .time .Instant ;
2122import java .time .ZoneId ;
2223import java .time .ZoneOffset ;
2324import java .time .format .DateTimeFormatter ;
2425import java .util .HashMap ;
26+ import java .util .List ;
2527import java .util .Locale ;
2628import java .util .Map ;
2729import java .util .function .Supplier ;
@@ -37,17 +39,19 @@ public DataSourceResponse.LeafMappingParametersGenerator handle(DataSourceReques
3739 }
3840
3941 return new DataSourceResponse .LeafMappingParametersGenerator (switch (fieldType ) {
40- case KEYWORD -> keywordMapping (request );
42+ case KEYWORD -> keywordMapping (false , request );
4143 case LONG , INTEGER , SHORT , BYTE , DOUBLE , FLOAT , HALF_FLOAT , UNSIGNED_LONG -> numberMapping (fieldType );
4244 case SCALED_FLOAT -> scaledFloatMapping ();
4345 case COUNTED_KEYWORD -> countedKeywordMapping ();
4446 case BOOLEAN -> booleanMapping ();
4547 case DATE -> dateMapping ();
4648 case GEO_POINT -> geoPointMapping ();
47- case TEXT -> textMapping (request );
49+ case TEXT -> textMapping (false , request );
4850 case IP -> ipMapping ();
4951 case CONSTANT_KEYWORD -> constantKeywordMapping ();
50- case WILDCARD -> wildcardMapping ();
52+ case WILDCARD -> wildcardMapping (false , request );
53+ case MATCH_ONLY_TEXT -> matchOnlyTextMapping (false , request );
54+ case PATTERNED_TEXT -> patternedTextMapping (false , request );
5155 });
5256 }
5357
@@ -77,7 +81,7 @@ private Supplier<Map<String, Object>> numberMapping(FieldType fieldType) {
7781 };
7882 }
7983
80- private Supplier <Map <String , Object >> keywordMapping (DataSourceRequest .LeafMappingParametersGenerator request ) {
84+ private Supplier <Map <String , Object >> keywordMapping (boolean hasParent , DataSourceRequest .LeafMappingParametersGenerator request ) {
8185 return () -> {
8286 var mapping = commonMappingParameters ();
8387
@@ -96,12 +100,15 @@ private Supplier<Map<String, Object>> keywordMapping(DataSourceRequest.LeafMappi
96100 }
97101 }
98102
99- if (ESTestCase .randomDouble () <= 0.2 ) {
103+ if (ESTestCase .randomDouble () <= 0.3 ) {
100104 mapping .put ("ignore_above" , ESTestCase .randomIntBetween (1 , 100 ));
101105 }
102106 if (ESTestCase .randomDouble () <= 0.2 ) {
103107 mapping .put ("null_value" , ESTestCase .randomAlphaOfLengthBetween (0 , 10 ));
104108 }
109+ if (hasParent == false && ESTestCase .randomDouble () <= 0.2 ) {
110+ mapping .put ("fields" , stringSubField (FieldType .KEYWORD , request ));
111+ }
105112
106113 return mapping ;
107114 };
@@ -196,19 +203,15 @@ private Supplier<Map<String, Object>> geoPointMapping() {
196203 };
197204 }
198205
199- private Supplier <Map <String , Object >> textMapping (DataSourceRequest .LeafMappingParametersGenerator request ) {
206+ private Supplier <Map <String , Object >> textMapping (boolean hasParent , DataSourceRequest .LeafMappingParametersGenerator request ) {
200207 return () -> {
201208 var mapping = new HashMap <String , Object >();
202209
203210 mapping .put ("store" , ESTestCase .randomBoolean ());
204211 mapping .put ("index" , ESTestCase .randomBoolean ());
205212
206- if (ESTestCase .randomDouble () <= 0.1 ) {
207- var keywordMultiFieldMapping = keywordMapping (request ).get ();
208- keywordMultiFieldMapping .put ("type" , "keyword" );
209- keywordMultiFieldMapping .remove ("copy_to" );
210-
211- mapping .put ("fields" , Map .of ("kwd" , keywordMultiFieldMapping ));
213+ if (hasParent == false && ESTestCase .randomDouble () <= 0.2 ) {
214+ mapping .put ("fields" , stringSubField (FieldType .TEXT , request ));
212215 }
213216
214217 return mapping ;
@@ -243,17 +246,69 @@ private Supplier<Map<String, Object>> constantKeywordMapping() {
243246 };
244247 }
245248
246- private Supplier <Map <String , Object >> wildcardMapping () {
249+ private Supplier <Map <String , Object >> wildcardMapping (boolean hasParent , DataSourceRequest . LeafMappingParametersGenerator request ) {
247250 return () -> {
248251 var mapping = new HashMap <String , Object >();
249252
250- if (ESTestCase .randomDouble () <= 0.2 ) {
253+ if (ESTestCase .randomDouble () <= 0.3 ) {
251254 mapping .put ("ignore_above" , ESTestCase .randomIntBetween (1 , 100 ));
252255 }
253256 if (ESTestCase .randomDouble () <= 0.2 ) {
254257 mapping .put ("null_value" , ESTestCase .randomAlphaOfLengthBetween (0 , 10 ));
255258 }
259+ if (hasParent == false && ESTestCase .randomDouble () <= 0.2 ) {
260+ mapping .put ("fields" , stringSubField (FieldType .PATTERNED_TEXT , request ));
261+ }
262+ return mapping ;
263+ };
264+ }
256265
266+ private Supplier <Map <String , Object >> stringSubField (FieldType parent , DataSourceRequest .LeafMappingParametersGenerator request ) {
267+ /**
268+ * text -> keyword, wildcard
269+ * match_only_text -> keyword, wildcard
270+ * patterned_text -> keyword, wildcard
271+ * keyword -> text, match_only_text, patterned_tet, wildcard
272+ * wildcard -> keyword, text, match_only_text, patterned_text
273+ *
274+ */
275+ return () -> {
276+ var subFields = new HashMap <FieldType , Supplier <Map <String , Object >>>();
277+ subFields .put (FieldType .KEYWORD , () -> {
278+ var mapping = keywordMapping (true , request ).get ();
279+ mapping .remove ("copy_to" );
280+ return mapping ;
281+ });
282+ subFields .put (FieldType .TEXT , () -> wildcardMapping (true , request ).get ());
283+ subFields .put (FieldType .MATCH_ONLY_TEXT , () -> matchOnlyTextMapping (true , request ).get ());
284+ subFields .put (FieldType .WILDCARD , () -> wildcardMapping (true , request ).get ());
285+ subFields .put (FieldType .PATTERNED_TEXT , () -> matchOnlyTextMapping (true , request ).get ());
286+
287+ var options = subFields .entrySet ().stream ().filter (e -> e .getKey ().equals (parent ) == false ).toList ();
288+ var child = ESTestCase .randomFrom (options );
289+ FieldType childType = child .getKey ();
290+ var childValue = child .getValue ().get ();
291+ childValue .put ("type" , childType .toString ());
292+ return Map .of ("subfield_" + childType , childValue );
293+ };
294+ }
295+
296+ private Supplier <Map <String , Object >> matchOnlyTextMapping (boolean hasParent , DataSourceRequest .LeafMappingParametersGenerator request ) {
297+ return () -> {
298+ var mapping = new HashMap <String , Object >();
299+ if (hasParent == false && ESTestCase .randomDouble () <= 0.2 ) {
300+ mapping .put ("fields" , stringSubField (FieldType .MATCH_ONLY_TEXT , request ));
301+ }
302+ return mapping ;
303+ };
304+ }
305+
306+ private Supplier <Map <String , Object >> patternedTextMapping (boolean hasParent , DataSourceRequest .LeafMappingParametersGenerator request ) {
307+ return () -> {
308+ var mapping = new HashMap <String , Object >();
309+ if (hasParent == false && ESTestCase .randomDouble () <= 0.2 ) {
310+ mapping .put ("fields" , stringSubField (FieldType .PATTERNED_TEXT , request ));
311+ }
257312 return mapping ;
258313 };
259314 }
0 commit comments