Skip to content

Commit 12e7cbe

Browse files
committed
Mappings: Lockdown _timestamp
This is a follow up to elastic#8143 and elastic#6730 for _timestamp. It removes support for `path`, as well as any field type settings, and enables docvalues for _timestamp, for 2.0. Users who need to adjust these settings can use a date field.
1 parent 2ebb44d commit 12e7cbe

File tree

14 files changed

+92
-225
lines changed

14 files changed

+92
-225
lines changed

core/src/main/java/org/elasticsearch/index/mapper/internal/TimestampFieldMapper.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,9 @@ public static class TypeParser implements Mapper.TypeParser {
161161
@Override
162162
public Mapper.Builder parse(String name, Map<String, Object> node, ParserContext parserContext) throws MapperParsingException {
163163
TimestampFieldMapper.Builder builder = timestamp();
164-
parseField(builder, builder.name, node, parserContext);
164+
if (parserContext.indexVersionCreated().before(Version.V_2_0_0)) {
165+
parseField(builder, builder.name, node, parserContext);
166+
}
165167
boolean defaultSet = false;
166168
Boolean ignoreMissing = null;
167169
for (Iterator<Map.Entry<String, Object>> iterator = node.entrySet().iterator(); iterator.hasNext();) {
@@ -172,7 +174,7 @@ public Mapper.Builder parse(String name, Map<String, Object> node, ParserContext
172174
EnabledAttributeMapper enabledState = nodeBooleanValue(fieldNode) ? EnabledAttributeMapper.ENABLED : EnabledAttributeMapper.DISABLED;
173175
builder.enabled(enabledState);
174176
iterator.remove();
175-
} else if (fieldName.equals("path")) {
177+
} else if (fieldName.equals("path") && parserContext.indexVersionCreated().before(Version.V_2_0_0)) {
176178
builder.path(fieldNode.toString());
177179
iterator.remove();
178180
} else if (fieldName.equals("format")) {
@@ -265,11 +267,6 @@ public MappedFieldType defaultFieldType() {
265267
return defaultFieldType;
266268
}
267269

268-
@Override
269-
public boolean defaultDocValues() {
270-
return false;
271-
}
272-
273270
public boolean enabled() {
274271
return this.enabledState.enabled;
275272
}
@@ -340,14 +337,16 @@ && defaultDocValues() == fieldType().hasDocValues()) {
340337
if (includeDefaults || enabledState != Defaults.ENABLED) {
341338
builder.field("enabled", enabledState.enabled);
342339
}
343-
if (includeDefaults || (indexed != indexedDefault) || (fieldType().tokenized() != Defaults.FIELD_TYPE.tokenized())) {
340+
if (indexCreatedBefore2x && (includeDefaults || (indexed != indexedDefault) || (fieldType().tokenized() != Defaults.FIELD_TYPE.tokenized()))) {
344341
builder.field("index", indexTokenizeOptionToString(indexed, fieldType().tokenized()));
345342
}
346-
if (includeDefaults || fieldType().stored() != Defaults.FIELD_TYPE.stored()) {
343+
if (indexCreatedBefore2x && (includeDefaults || fieldType().stored() != Defaults.PRE_20_FIELD_TYPE.stored())) {
347344
builder.field("store", fieldType().stored());
348345
}
349-
doXContentDocValues(builder, includeDefaults);
350-
if (includeDefaults || path != Defaults.PATH) {
346+
if (indexCreatedBefore2x) {
347+
doXContentDocValues(builder, includeDefaults);
348+
}
349+
if (indexCreatedBefore2x && (includeDefaults || path != Defaults.PATH)) {
351350
builder.field("path", path);
352351
}
353352
if (includeDefaults || !fieldType().dateTimeFormatter().format().equals(Defaults.DATE_TIME_FORMATTER.format())) {
@@ -359,10 +358,12 @@ && defaultDocValues() == fieldType().hasDocValues()) {
359358
if (includeDefaults || ignoreMissing != null) {
360359
builder.field("ignore_missing", ignoreMissing);
361360
}
362-
if (customFieldDataSettings != null) {
363-
builder.field("fielddata", (Map) customFieldDataSettings.getAsMap());
364-
} else if (includeDefaults) {
365-
builder.field("fielddata", (Map) fieldType().fieldDataType().getSettings().getAsMap());
361+
if (indexCreatedBefore2x) {
362+
if (customFieldDataSettings != null) {
363+
builder.field("fielddata", (Map) customFieldDataSettings.getAsMap());
364+
} else if (includeDefaults) {
365+
builder.field("fielddata", (Map) fieldType().fieldDataType().getSettings().getAsMap());
366+
}
366367
}
367368

368369
builder.endObject();

core/src/test/java/org/elasticsearch/document/BulkTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,8 @@ public void preParsingSourceDueToMappingShouldNotBreakCompleteBulkRequest() thro
570570
.endObject()
571571
.endObject()
572572
.endObject();
573-
assertAcked(prepareCreate("test").addMapping("type", builder));
573+
assertAcked(prepareCreate("test").addMapping("type", builder)
574+
.setSettings(IndexMetaData.SETTING_VERSION_CREATED, Version.V_1_4_2_ID));
574575

575576
String brokenBuildRequestData = "{\"index\": {\"_id\": \"1\"}}\n" +
576577
"{\"name\": \"Malformed}\n" +

core/src/test/java/org/elasticsearch/get/GetActionTests.java

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,28 +1051,32 @@ void indexSingleDocumentWithUngeneratedFieldsThatArePartOf_source(boolean stored
10511051
client().prepareIndex("test", "doc").setId("1").setSource(doc).setRouting("1").get();
10521052
}
10531053

1054-
1055-
@Test
1056-
public void testUngeneratedFieldsNotPartOfSourceUnstored() throws IOException {
1057-
indexSingleDocumentWithUngeneratedFieldsThatAreNeverPartOf_source(false, randomBoolean());
1058-
String[] fieldsList = {"_timestamp"};
1059-
String[] alwaysStoredFieldsList = {"_routing", "_size"};
1060-
// before refresh - document is only in translog
1061-
assertGetFieldsAlwaysNull(indexOrAlias(), "doc", "1", fieldsList, "1");
1062-
assertGetFieldsAlwaysWorks(indexOrAlias(), "doc", "1", alwaysStoredFieldsList, "1");
1063-
refresh();
1064-
//after refresh - document is in translog and also indexed
1065-
assertGetFieldsAlwaysNull(indexOrAlias(), "doc", "1", fieldsList, "1");
1066-
assertGetFieldsAlwaysWorks(indexOrAlias(), "doc", "1", alwaysStoredFieldsList, "1");
1067-
flush();
1068-
//after flush - document is in not anymore translog - only indexed
1069-
assertGetFieldsAlwaysNull(indexOrAlias(), "doc", "1", fieldsList, "1");
1070-
assertGetFieldsAlwaysWorks(indexOrAlias(), "doc", "1", alwaysStoredFieldsList, "1");
1071-
}
1072-
10731054
@Test
10741055
public void testUngeneratedFieldsNotPartOfSourceStored() throws IOException {
1075-
indexSingleDocumentWithUngeneratedFieldsThatAreNeverPartOf_source(true, randomBoolean());
1056+
String createIndexSource = "{\n" +
1057+
" \"settings\": {\n" +
1058+
" \"index.translog.disable_flush\": true,\n" +
1059+
" \"refresh_interval\": \"-1\"\n" +
1060+
" },\n" +
1061+
" \"mappings\": {\n" +
1062+
" \"parentdoc\": {},\n" +
1063+
" \"doc\": {\n" +
1064+
" \"_timestamp\": {\n" +
1065+
" \"enabled\": true\n" +
1066+
" },\n" +
1067+
" \"_size\": {\n" +
1068+
" \"enabled\": true\n" +
1069+
" }\n" +
1070+
" }\n" +
1071+
" }\n" +
1072+
"}";
1073+
1074+
assertAcked(prepareCreate("test").addAlias(new Alias("alias")).setSource(createIndexSource));
1075+
ensureGreen();
1076+
String doc = "{\n" +
1077+
" \"text\": \"some text.\"\n" +
1078+
"}\n";
1079+
client().prepareIndex("test", "doc").setId("1").setSource(doc).setRouting("1").get();
10761080
String[] fieldsList = {"_timestamp", "_size", "_routing"};
10771081
// before refresh - document is only in translog
10781082
assertGetFieldsAlwaysWorks(indexOrAlias(), "doc", "1", fieldsList, "1");
@@ -1084,36 +1088,6 @@ public void testUngeneratedFieldsNotPartOfSourceStored() throws IOException {
10841088
assertGetFieldsAlwaysWorks(indexOrAlias(), "doc", "1", fieldsList, "1");
10851089
}
10861090

1087-
void indexSingleDocumentWithUngeneratedFieldsThatAreNeverPartOf_source(boolean stored, boolean sourceEnabled) {
1088-
String storedString = stored ? "yes" : "no";
1089-
String createIndexSource = "{\n" +
1090-
" \"settings\": {\n" +
1091-
" \"index.translog.disable_flush\": true,\n" +
1092-
" \"refresh_interval\": \"-1\"\n" +
1093-
" },\n" +
1094-
" \"mappings\": {\n" +
1095-
" \"parentdoc\": {},\n" +
1096-
" \"doc\": {\n" +
1097-
" \"_timestamp\": {\n" +
1098-
" \"store\": \"" + storedString + "\",\n" +
1099-
" \"enabled\": true\n" +
1100-
" },\n" +
1101-
" \"_size\": {\n" +
1102-
" \"enabled\": true\n" +
1103-
" }\n" +
1104-
" }\n" +
1105-
" }\n" +
1106-
"}";
1107-
1108-
assertAcked(prepareCreate("test").addAlias(new Alias("alias")).setSource(createIndexSource));
1109-
ensureGreen();
1110-
String doc = "{\n" +
1111-
" \"text\": \"some text.\"\n" +
1112-
"}\n";
1113-
client().prepareIndex("test", "doc").setId("1").setSource(doc).setRouting("1").get();
1114-
}
1115-
1116-
11171091
@Test
11181092
public void testGeneratedStringFieldsUnstored() throws IOException {
11191093
indexSingleDocumentWithStringFieldsGeneratedFromText(false, randomBoolean());

0 commit comments

Comments
 (0)