@@ -2274,4 +2274,312 @@ public void testDynamicFalseAllowTemplatesDottedFieldNameObject() throws Excepti
2274
2274
assertEquals (2 , docWithTemplate .rootDoc ().getFields ("foo.bar.baz.a" ).length );
2275
2275
}
2276
2276
2277
+ public void testDynamicFalseAllowTemplatesWithEmbeddedObject () throws Exception {
2278
+ DocumentMapper mapper = createDocumentMapper (topMapping (b -> b .field ("dynamic" , "false_allow_templates" )));
2279
+ ParsedDocument doc = mapper .parse (source (b -> b .field ("embedded_field" , "value" )));
2280
+ assertEquals (0 , doc .rootDoc ().getFields ("embedded_field" ).length );
2281
+
2282
+ DocumentMapper mapperWithTemplate = createDocumentMapper (topMapping (b -> {
2283
+ b .field ("dynamic" , "false_allow_templates" );
2284
+ b .startArray ("dynamic_templates" );
2285
+ {
2286
+ b .startObject ();
2287
+ {
2288
+ b .startObject ("embedded_template" );
2289
+ {
2290
+ b .field ("match" , "embedded_*" );
2291
+ b .field ("match_mapping_type" , "string" );
2292
+ b .startObject ("mapping" ).field ("type" , "keyword" ).endObject ();
2293
+ }
2294
+ b .endObject ();
2295
+ }
2296
+ b .endObject ();
2297
+ }
2298
+ b .endArray ();
2299
+ }));
2300
+ ParsedDocument docWithTemplate = mapperWithTemplate .parse (source (b -> b .field ("embedded_field" , "value" )));
2301
+ assertEquals (2 , docWithTemplate .rootDoc ().getFields ("embedded_field" ).length );
2302
+ }
2303
+
2304
+ public void testDynamicFalseAllowTemplatesWithDateDetection () throws Exception {
2305
+ DocumentMapper mapper = createDocumentMapper (topMapping (b -> {
2306
+ b .field ("dynamic" , "false_allow_templates" );
2307
+ b .startArray ("dynamic_date_formats" ).value ("yyyy-MM-dd" ).endArray ();
2308
+ }));
2309
+ ParsedDocument doc = mapper .parse (source (b -> b .field ("date_field" , "2023-12-25" )));
2310
+ assertEquals (0 , doc .rootDoc ().getFields ("date_field" ).length );
2311
+
2312
+ DocumentMapper mapperWithTemplate = createDocumentMapper (topMapping (b -> {
2313
+ b .field ("dynamic" , "false_allow_templates" );
2314
+ b .startArray ("dynamic_date_formats" ).value ("yyyy-MM-dd" ).endArray ();
2315
+ b .startArray ("dynamic_templates" );
2316
+ {
2317
+ b .startObject ();
2318
+ {
2319
+ b .startObject ("date_template" );
2320
+ {
2321
+ b .field ("match" , "date_*" );
2322
+ b .field ("match_mapping_type" , "date" );
2323
+ b .startObject ("mapping" ).field ("type" , "date" ).endObject ();
2324
+ }
2325
+ b .endObject ();
2326
+ }
2327
+ b .endObject ();
2328
+ }
2329
+ b .endArray ();
2330
+ }));
2331
+ ParsedDocument docWithTemplate = mapperWithTemplate .parse (source (b -> b .field ("date_field" , "2023-12-25" )));
2332
+ assertEquals (2 , docWithTemplate .rootDoc ().getFields ("date_field" ).length );
2333
+ }
2334
+
2335
+ public void testDynamicFalseAllowTemplatesWithNumericDetection () throws Exception {
2336
+ DocumentMapper mapper = createDocumentMapper (topMapping (b -> b .field ("dynamic" , "false_allow_templates" )));
2337
+ ParsedDocument doc = mapper .parse (source (b -> b .field ("numeric_field" , "123" )));
2338
+ assertEquals (0 , doc .rootDoc ().getFields ("numeric_field" ).length );
2339
+
2340
+ DocumentMapper mapperWithTemplate = createDocumentMapper (topMapping (b -> {
2341
+ b .field ("dynamic" , "false_allow_templates" );
2342
+ b .startArray ("dynamic_templates" );
2343
+ {
2344
+ b .startObject ();
2345
+ {
2346
+ b .startObject ("numeric_template" );
2347
+ {
2348
+ b .field ("match" , "numeric_*" );
2349
+ b .field ("match_mapping_type" , "long" );
2350
+ b .startObject ("mapping" ).field ("type" , "long" ).endObject ();
2351
+ }
2352
+ b .endObject ();
2353
+ }
2354
+ b .endObject ();
2355
+ }
2356
+ b .endArray ();
2357
+ }));
2358
+ ParsedDocument docWithTemplate = mapperWithTemplate .parse (source (b -> b .field ("numeric_field" , "123" )));
2359
+ assertEquals (0 , docWithTemplate .rootDoc ().getFields ("numeric_field" ).length );
2360
+ }
2361
+
2362
+ public void testDynamicFalseAllowTemplatesWithFloatDetection () throws Exception {
2363
+ DocumentMapper mapper = createDocumentMapper (topMapping (b -> b .field ("dynamic" , "false_allow_templates" )));
2364
+ ParsedDocument doc = mapper .parse (source (b -> b .field ("float_field" , "123.45" )));
2365
+ assertEquals (0 , doc .rootDoc ().getFields ("float_field" ).length );
2366
+
2367
+ DocumentMapper mapperWithTemplate = createDocumentMapper (topMapping (b -> {
2368
+ b .field ("dynamic" , "false_allow_templates" );
2369
+ b .startArray ("dynamic_templates" );
2370
+ {
2371
+ b .startObject ();
2372
+ {
2373
+ b .startObject ("float_template" );
2374
+ {
2375
+ b .field ("match" , "float_*" );
2376
+ b .field ("match_mapping_type" , "double" );
2377
+ b .startObject ("mapping" ).field ("type" , "float" ).endObject ();
2378
+ }
2379
+ b .endObject ();
2380
+ }
2381
+ b .endObject ();
2382
+ }
2383
+ b .endArray ();
2384
+ }));
2385
+ ParsedDocument docWithTemplate = mapperWithTemplate .parse (source (b -> b .field ("float_field" , "123.45" )));
2386
+ assertEquals (0 , docWithTemplate .rootDoc ().getFields ("float_field" ).length );
2387
+ }
2388
+
2389
+ public void testDynamicFalseAllowTemplatesWithBooleanDetection () throws Exception {
2390
+ DocumentMapper mapper = createDocumentMapper (topMapping (b -> b .field ("dynamic" , "false_allow_templates" )));
2391
+ ParsedDocument doc = mapper .parse (source (b -> b .field ("bool_field" , true )));
2392
+ assertEquals (0 , doc .rootDoc ().getFields ("bool_field" ).length );
2393
+
2394
+ DocumentMapper mapperWithTemplate = createDocumentMapper (topMapping (b -> {
2395
+ b .field ("dynamic" , "false_allow_templates" );
2396
+ b .startArray ("dynamic_templates" );
2397
+ {
2398
+ b .startObject ();
2399
+ {
2400
+ b .startObject ("boolean_template" );
2401
+ {
2402
+ b .field ("match" , "bool_*" );
2403
+ b .field ("match_mapping_type" , "boolean" );
2404
+ b .startObject ("mapping" ).field ("type" , "boolean" ).endObject ();
2405
+ }
2406
+ b .endObject ();
2407
+ }
2408
+ b .endObject ();
2409
+ }
2410
+ b .endArray ();
2411
+ }));
2412
+ ParsedDocument docWithTemplate = mapperWithTemplate .parse (source (b -> b .field ("bool_field" , true )));
2413
+ assertEquals (2 , docWithTemplate .rootDoc ().getFields ("bool_field" ).length );
2414
+ }
2415
+
2416
+ public void testDynamicFalseAllowTemplatesWithBigInteger () throws Exception {
2417
+ DocumentMapper mapper = createDocumentMapper (topMapping (b -> b .field ("dynamic" , "false_allow_templates" )));
2418
+ BigInteger bigInt = BigInteger .valueOf (Long .MAX_VALUE ).add (BigInteger .ONE );
2419
+ ParsedDocument doc = mapper .parse (source (b -> b .field ("bigint_field" , bigInt )));
2420
+ assertEquals (0 , doc .rootDoc ().getFields ("bigint_field" ).length );
2421
+
2422
+ DocumentMapper mapperWithTemplate = createDocumentMapper (topMapping (b -> {
2423
+ b .field ("dynamic" , "false_allow_templates" );
2424
+ b .startArray ("dynamic_templates" );
2425
+ {
2426
+ b .startObject ();
2427
+ {
2428
+ b .startObject ("bigint_template" );
2429
+ {
2430
+ b .field ("match" , "bigint_*" );
2431
+ b .field ("match_mapping_type" , "long" );
2432
+ b .startObject ("mapping" ).field ("type" , "keyword" ).endObject ();
2433
+ }
2434
+ b .endObject ();
2435
+ }
2436
+ b .endObject ();
2437
+ }
2438
+ b .endArray ();
2439
+ }));
2440
+ ParsedDocument docWithTemplate = mapperWithTemplate .parse (source (b -> b .field ("bigint_field" , bigInt )));
2441
+ assertEquals (2 , docWithTemplate .rootDoc ().getFields ("bigint_field" ).length );
2442
+ }
2443
+
2444
+ public void testDynamicFalseAllowTemplatesWithBigDecimal () throws Exception {
2445
+ DocumentMapper mapper = createDocumentMapper (topMapping (b -> b .field ("dynamic" , "false_allow_templates" )));
2446
+ BigDecimal bigDecimal = BigDecimal .valueOf (Double .MAX_VALUE ).add (BigDecimal .valueOf (10.1 ));
2447
+ ParsedDocument doc = mapper .parse (source (b -> b .field ("bigdecimal_field" , bigDecimal )));
2448
+ assertEquals (0 , doc .rootDoc ().getFields ("bigdecimal_field" ).length );
2449
+
2450
+ DocumentMapper mapperWithTemplate = createDocumentMapper (topMapping (b -> {
2451
+ b .field ("dynamic" , "false_allow_templates" );
2452
+ b .startArray ("dynamic_templates" );
2453
+ {
2454
+ b .startObject ();
2455
+ {
2456
+ b .startObject ("bigdecimal_template" );
2457
+ {
2458
+ b .field ("match" , "bigdecimal_*" );
2459
+ b .field ("match_mapping_type" , "double" );
2460
+ b .startObject ("mapping" ).field ("type" , "keyword" ).endObject ();
2461
+ }
2462
+ b .endObject ();
2463
+ }
2464
+ b .endObject ();
2465
+ }
2466
+ b .endArray ();
2467
+ }));
2468
+ ParsedDocument docWithTemplate = mapperWithTemplate .parse (source (b -> b .field ("bigdecimal_field" , bigDecimal )));
2469
+ assertEquals (2 , docWithTemplate .rootDoc ().getFields ("bigdecimal_field" ).length );
2470
+ }
2471
+
2472
+ public void testDynamicFalseAllowTemplatesWithCopyTo () throws Exception {
2473
+ DocumentMapper mapperWithDynamic = createDocumentMapper (topMapping (b -> {
2474
+ b .field ("dynamic" , "false_allow_templates" );
2475
+ b .startArray ("dynamic_templates" );
2476
+ {
2477
+ b .startObject ();
2478
+ {
2479
+ b .startObject ("target_template" );
2480
+ {
2481
+ b .field ("match" , "target_*" );
2482
+ b .field ("match_mapping_type" , "string" );
2483
+ b .startObject ("mapping" ).field ("type" , "keyword" ).endObject ();
2484
+ }
2485
+ b .endObject ();
2486
+ }
2487
+ b .endObject ();
2488
+ }
2489
+ b .endArray ();
2490
+ }));
2491
+
2492
+ MapperService mapperService = createMapperService (mapping (b -> {
2493
+ b .startObject ("source_field" );
2494
+ {
2495
+ b .field ("type" , "text" );
2496
+ b .field ("copy_to" , "target_field" );
2497
+ }
2498
+ b .endObject ();
2499
+ }));
2500
+
2501
+ ParsedDocument parsedDoc = mapperWithDynamic .parse (source (b -> b .field ("source_field" , "test value" )));
2502
+ if (parsedDoc .dynamicMappingsUpdate () != null ) {
2503
+ merge (mapperService , dynamicMapping (parsedDoc .dynamicMappingsUpdate ()));
2504
+ }
2505
+
2506
+ ParsedDocument doc = mapperService .documentMapper ().parse (source (b -> b .field ("source_field" , "test value" )));
2507
+ assertEquals (1 , doc .rootDoc ().getFields ("source_field" ).length );
2508
+ assertEquals (1 , doc .rootDoc ().getFields ("target_field" ).length );
2509
+ }
2510
+
2511
+ public void testDynamicFalseAllowTemplatesWithNestedCopyTo () throws Exception {
2512
+ DocumentMapper mapperWithDynamic = createDocumentMapper (topMapping (b -> {
2513
+ b .field ("dynamic" , "false_allow_templates" );
2514
+ b .startArray ("dynamic_templates" );
2515
+ {
2516
+ b .startObject ();
2517
+ {
2518
+ b .startObject ("nested_template" );
2519
+ {
2520
+ b .field ("match" , "nested" );
2521
+ b .field ("match_mapping_type" , "object" );
2522
+ b .startObject ("mapping" ).field ("type" , "object" ).endObject ();
2523
+ }
2524
+ b .endObject ();
2525
+ }
2526
+ b .endObject ();
2527
+ }
2528
+ {
2529
+ b .startObject ();
2530
+ {
2531
+ b .startObject ("target_template" );
2532
+ {
2533
+ b .field ("match" , "target_*" );
2534
+ b .field ("match_mapping_type" , "string" );
2535
+ b .startObject ("mapping" ).field ("type" , "keyword" ).endObject ();
2536
+ }
2537
+ b .endObject ();
2538
+ }
2539
+ b .endObject ();
2540
+ }
2541
+ b .endArray ();
2542
+ }));
2543
+
2544
+ MapperService mapperService = createMapperService (mapping (b -> {
2545
+ b .startObject ("nested" );
2546
+ {
2547
+ b .field ("type" , "object" );
2548
+ b .startObject ("properties" );
2549
+ {
2550
+ b .startObject ("source_field" );
2551
+ {
2552
+ b .field ("type" , "text" );
2553
+ b .field ("copy_to" , "nested.target_field" );
2554
+ }
2555
+ b .endObject ();
2556
+ }
2557
+ b .endObject ();
2558
+ }
2559
+ b .endObject ();
2560
+ }));
2561
+
2562
+ ParsedDocument parsedDoc = mapperWithDynamic .parse (source (b -> {
2563
+ b .startObject ("nested" );
2564
+ {
2565
+ b .field ("source_field" , "test value" );
2566
+ }
2567
+ b .endObject ();
2568
+ }));
2569
+ if (parsedDoc .dynamicMappingsUpdate () != null ) {
2570
+ merge (mapperService , dynamicMapping (parsedDoc .dynamicMappingsUpdate ()));
2571
+ }
2572
+
2573
+ ParsedDocument doc = mapperService .documentMapper ().parse (source (b -> {
2574
+ b .startObject ("nested" );
2575
+ {
2576
+ b .field ("source_field" , "test value" );
2577
+ }
2578
+ b .endObject ();
2579
+ }));
2580
+ assertEquals (1 , doc .rootDoc ().getFields ("nested.source_field" ).length );
2581
+ // Copying to a field that is not in the mapping should not create a field in the document
2582
+ assertEquals (0 , doc .rootDoc ().getFields ("nested.target_field" ).length );
2583
+ }
2584
+
2277
2585
}
0 commit comments