|
88 | 88 | import java.util.List; |
89 | 89 | import java.util.Map; |
90 | 90 | import java.util.Set; |
| 91 | +import java.util.stream.Collectors; |
91 | 92 |
|
92 | 93 | import static org.hamcrest.Matchers.containsString; |
93 | 94 | import static org.hamcrest.Matchers.equalTo; |
| 95 | +import static org.hamcrest.Matchers.in; |
94 | 96 | import static org.hamcrest.Matchers.instanceOf; |
| 97 | +import static org.hamcrest.Matchers.not; |
| 98 | +import static org.hamcrest.Matchers.nullValue; |
95 | 99 | import static org.hamcrest.core.Is.is; |
96 | 100 |
|
97 | 101 | public class TextFieldMapperTests extends MapperTestCase { |
@@ -451,6 +455,114 @@ public void testStoreParameterDefaultsSyntheticSourceTextFieldIsMultiFieldBwc() |
451 | 455 | assertThat(fieldType.stored(), is(true)); |
452 | 456 | } |
453 | 457 |
|
| 458 | + public void testDelegatesSyntheticSourceToKeywordMultiField() throws IOException { |
| 459 | + var indexSettingsBuilder = getIndexSettingsBuilder(); |
| 460 | + indexSettingsBuilder.put(IndexSettings.INDEX_MAPPER_SOURCE_MODE_SETTING.getKey(), "synthetic"); |
| 461 | + var indexSettings = indexSettingsBuilder.build(); |
| 462 | + |
| 463 | + var mapping = mapping(b -> { |
| 464 | + b.startObject("name"); |
| 465 | + b.field("type", "text"); |
| 466 | + b.field("store", false); |
| 467 | + b.startObject("fields"); |
| 468 | + b.startObject("keyword"); |
| 469 | + b.field("type", "keyword"); |
| 470 | + b.endObject(); |
| 471 | + b.endObject(); |
| 472 | + b.endObject(); |
| 473 | + }); |
| 474 | + DocumentMapper mapper = createMapperService(indexSettings, mapping).documentMapper(); |
| 475 | + |
| 476 | + var source = source(b -> b.field("name", "QUICK Brown fox")); |
| 477 | + ParsedDocument doc = mapper.parse(source); |
| 478 | + IndexableField textFallbackField = doc.rootDoc().getField("name._original"); |
| 479 | + assertThat(textFallbackField, nullValue()); |
| 480 | + IndexableFieldType keywordFieldType = doc.rootDoc().getField("name.keyword").fieldType(); |
| 481 | + assertThat(keywordFieldType.docValuesType(), not(is(DocValuesType.NONE))); |
| 482 | + |
| 483 | + Set<String> ignoredFields = doc.rootDoc() |
| 484 | + .getFields(IgnoredSourceFieldMapper.NAME) |
| 485 | + .stream() |
| 486 | + .flatMap(field -> IgnoredSourceFieldMapper.CoalescedIgnoredSourceEncoding.decode(field.binaryValue()).stream()) |
| 487 | + .map(IgnoredSourceFieldMapper.NameValue::name) |
| 488 | + .collect(Collectors.toSet()); |
| 489 | + assertThat("name", not(in(ignoredFields))); |
| 490 | + |
| 491 | + assertThat(syntheticSource(mapper, b -> b.field("name", "QUICK Brown fox")), equalTo("{\"name\":\"QUICK Brown fox\"}")); |
| 492 | + } |
| 493 | + |
| 494 | + public void testDoesNotDelegateSyntheticSourceForNormalizedKeywordMultiFieldWhenStoreOriginalValue() throws IOException { |
| 495 | + var indexSettingsBuilder = getIndexSettingsBuilder(); |
| 496 | + indexSettingsBuilder.put(IndexSettings.INDEX_MAPPER_SOURCE_MODE_SETTING.getKey(), "synthetic"); |
| 497 | + var indexSettings = indexSettingsBuilder.build(); |
| 498 | + |
| 499 | + var mapping = mapping(b -> { |
| 500 | + b.startObject("name"); |
| 501 | + b.field("type", "text"); |
| 502 | + b.field("store", false); |
| 503 | + b.startObject("fields"); |
| 504 | + b.startObject("keyword"); |
| 505 | + b.field("type", "keyword"); |
| 506 | + b.field("normalizer", "lowercase"); |
| 507 | + b.field("normalizer_skip_store_original_value", false); |
| 508 | + b.endObject(); |
| 509 | + b.endObject(); |
| 510 | + b.endObject(); |
| 511 | + }); |
| 512 | + DocumentMapper mapper = createMapperService(indexSettings, mapping).documentMapper(); |
| 513 | + |
| 514 | + var source = source(b -> b.field("name", "QUICK Brown fox")); |
| 515 | + ParsedDocument doc = mapper.parse(source); |
| 516 | + IndexableField textFallbackField = doc.rootDoc().getField("name._original"); |
| 517 | + assertThat(textFallbackField, nullValue()); |
| 518 | + |
| 519 | + Set<String> ignoredFields = doc.rootDoc() |
| 520 | + .getFields(IgnoredSourceFieldMapper.NAME) |
| 521 | + .stream() |
| 522 | + .flatMap(field -> IgnoredSourceFieldMapper.CoalescedIgnoredSourceEncoding.decode(field.binaryValue()).stream()) |
| 523 | + .map(IgnoredSourceFieldMapper.NameValue::name) |
| 524 | + .collect(Collectors.toSet()); |
| 525 | + assertThat("name", in(ignoredFields)); |
| 526 | + |
| 527 | + assertThat(syntheticSource(mapper, b -> b.field("name", "QUICK Brown fox")), equalTo("{\"name\":\"QUICK Brown fox\"}")); |
| 528 | + } |
| 529 | + |
| 530 | + public void testDelegatesSyntheticSourceForNormalizedKeywordMultiFieldWhenSkipStoreOriginalValue() throws IOException { |
| 531 | + var indexSettingsBuilder = getIndexSettingsBuilder(); |
| 532 | + indexSettingsBuilder.put(IndexSettings.INDEX_MAPPER_SOURCE_MODE_SETTING.getKey(), "synthetic"); |
| 533 | + var indexSettings = indexSettingsBuilder.build(); |
| 534 | + |
| 535 | + var mapping = mapping(b -> { |
| 536 | + b.startObject("name"); |
| 537 | + b.field("type", "text"); |
| 538 | + b.field("store", false); |
| 539 | + b.startObject("fields"); |
| 540 | + b.startObject("keyword"); |
| 541 | + b.field("type", "keyword"); |
| 542 | + b.field("normalizer", "lowercase"); |
| 543 | + b.field("normalizer_skip_store_original_value", true); |
| 544 | + b.endObject(); |
| 545 | + b.endObject(); |
| 546 | + b.endObject(); |
| 547 | + }); |
| 548 | + DocumentMapper mapper = createMapperService(indexSettings, mapping).documentMapper(); |
| 549 | + |
| 550 | + var source = source(b -> b.field("name", "QUICK Brown fox")); |
| 551 | + ParsedDocument doc = mapper.parse(source); |
| 552 | + IndexableField textFallbackField = doc.rootDoc().getField("name._original"); |
| 553 | + assertThat(textFallbackField, nullValue()); |
| 554 | + |
| 555 | + Set<String> ignoredFields = doc.rootDoc() |
| 556 | + .getFields(IgnoredSourceFieldMapper.NAME) |
| 557 | + .stream() |
| 558 | + .flatMap(field -> IgnoredSourceFieldMapper.CoalescedIgnoredSourceEncoding.decode(field.binaryValue()).stream()) |
| 559 | + .map(IgnoredSourceFieldMapper.NameValue::name) |
| 560 | + .collect(Collectors.toSet()); |
| 561 | + assertThat("name", not(in(ignoredFields))); |
| 562 | + |
| 563 | + assertThat(syntheticSource(mapper, b -> b.field("name", "QUICK Brown fox")), equalTo("{\"name\":\"quick brown fox\"}")); |
| 564 | + } |
| 565 | + |
454 | 566 | public void testBWCSerialization() throws IOException { |
455 | 567 | MapperService mapperService = createMapperService(fieldMapping(b -> { |
456 | 568 | b.field("type", "text"); |
|
0 commit comments