Skip to content

Commit e852304

Browse files
committed
Add bwc checks for older indices
1 parent eb72672 commit e852304

File tree

5 files changed

+47
-39
lines changed

5 files changed

+47
-39
lines changed

src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.lucene.util.BytesRefBuilder;
3434
import org.apache.lucene.util.NumericUtils;
3535
import org.apache.lucene.util.ToStringUtils;
36+
import org.elasticsearch.Version;
3637
import org.elasticsearch.action.fieldstats.FieldStats;
3738
import org.elasticsearch.common.Explicit;
3839
import org.elasticsearch.common.Nullable;
@@ -76,6 +77,7 @@ public class DateFieldMapper extends NumberFieldMapper {
7677
public static final String CONTENT_TYPE = "date";
7778

7879
public static class Defaults extends NumberFieldMapper.Defaults {
80+
public static final FormatDateTimeFormatter DATE_TIME_FORMATTER_BEFORE_2_0 = Joda.forPattern("dateOptionalTime", Locale.ROOT);
7981
public static final FormatDateTimeFormatter DATE_TIME_FORMATTER = Joda.forPattern("strictDateOptionalTime", Locale.ROOT);
8082

8183
public static final FieldType FIELD_TYPE = new FieldType(NumberFieldMapper.Defaults.FIELD_TYPE);
@@ -124,6 +126,10 @@ public Builder dateTimeFormatter(FormatDateTimeFormatter dateTimeFormatter) {
124126
@Override
125127
public DateFieldMapper build(BuilderContext context) {
126128
fieldType.setOmitNorms(fieldType.omitNorms() && boost == 1.0f);
129+
// index age check
130+
if (dateTimeFormatter.equals(Defaults.DATE_TIME_FORMATTER) && context.indexCreatedVersion().before(Version.V_2_0_0)) {
131+
dateTimeFormatter = Defaults.DATE_TIME_FORMATTER_BEFORE_2_0;
132+
}
127133
if (!locale.equals(dateTimeFormatter.locale())) {
128134
dateTimeFormatter = new FormatDateTimeFormatter(dateTimeFormatter.format(), dateTimeFormatter.parser(), dateTimeFormatter.printer(), locale);
129135
}

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,7 @@
3232
import org.elasticsearch.common.joda.Joda;
3333
import org.elasticsearch.common.settings.Settings;
3434
import org.elasticsearch.common.xcontent.XContentBuilder;
35-
import org.elasticsearch.index.mapper.Mapper;
36-
import org.elasticsearch.index.mapper.MapperParsingException;
37-
import org.elasticsearch.index.mapper.MergeMappingException;
38-
import org.elasticsearch.index.mapper.MergeResult;
39-
import org.elasticsearch.index.mapper.ParseContext;
40-
import org.elasticsearch.index.mapper.RootMapper;
35+
import org.elasticsearch.index.mapper.*;
4136
import org.elasticsearch.index.mapper.core.DateFieldMapper;
4237
import org.elasticsearch.index.mapper.core.LongFieldMapper;
4338
import org.elasticsearch.index.mapper.core.NumberFieldMapper;
@@ -78,6 +73,7 @@ public static class Defaults extends DateFieldMapper.Defaults {
7873
public static final EnabledAttributeMapper ENABLED = EnabledAttributeMapper.UNSET_DISABLED;
7974
public static final String PATH = null;
8075
public static final FormatDateTimeFormatter DATE_TIME_FORMATTER = Joda.forPattern(DEFAULT_DATE_TIME_FORMAT);
76+
public static final FormatDateTimeFormatter DATE_TIME_FORMATTER_BEFORE_2_0 = Joda.forPattern("dateOptionalTime");
8177
public static final String DEFAULT_TIMESTAMP = "now";
8278
}
8379

@@ -131,12 +127,24 @@ public TimestampFieldMapper build(BuilderContext context) {
131127
assert fieldType.stored();
132128
fieldType.setStored(false);
133129
}
130+
if (dateTimeFormatter.equals(Defaults.DATE_TIME_FORMATTER)) {
131+
dateTimeFormatter = getDateTimeFormatter(context.indexSettings());
132+
}
134133
return new TimestampFieldMapper(fieldType, docValues, enabledState, path, dateTimeFormatter, defaultTimestamp,
135134
ignoreMissing,
136135
ignoreMalformed(context), coerce(context), normsLoading, fieldDataSettings, context.indexSettings());
137136
}
138137
}
139138

139+
private static FormatDateTimeFormatter getDateTimeFormatter(Settings indexSettings) {
140+
Version indexCreated = Version.indexCreated(indexSettings);
141+
if (indexCreated.onOrAfter(Version.V_2_0_0)) {
142+
return Defaults.DATE_TIME_FORMATTER;
143+
} else {
144+
return Defaults.DATE_TIME_FORMATTER_BEFORE_2_0;
145+
}
146+
}
147+
140148
public static class TypeParser implements Mapper.TypeParser {
141149
@Override
142150
public Mapper.Builder parse(String name, Map<String, Object> node, ParserContext parserContext) throws MapperParsingException {
@@ -202,7 +210,7 @@ private static FieldType defaultFieldType(Settings settings) {
202210
private final Boolean ignoreMissing;
203211

204212
public TimestampFieldMapper(Settings indexSettings) {
205-
this(new FieldType(defaultFieldType(indexSettings)), null, Defaults.ENABLED, Defaults.PATH, Defaults.DATE_TIME_FORMATTER, Defaults.DEFAULT_TIMESTAMP,
213+
this(new FieldType(defaultFieldType(indexSettings)), null, Defaults.ENABLED, Defaults.PATH, getDateTimeFormatter(indexSettings), Defaults.DEFAULT_TIMESTAMP,
206214
null, Defaults.IGNORE_MALFORMED, Defaults.COERCE, null, null, indexSettings);
207215
}
208216

src/main/java/org/elasticsearch/index/mapper/object/RootObjectMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ protected ObjectMapper createMapper(String name, String fullPath, boolean enable
107107
dates = new FormatDateTimeFormatter[0];
108108
} else if (dynamicDateTimeFormatters.isEmpty()) {
109109
// add the default one
110+
// TODO: Does this need to have bwc compat as well?
110111
dates = Defaults.DYNAMIC_DATE_TIME_FORMATTERS;
111112
} else {
112113
dates = dynamicDateTimeFormatters.toArray(new FormatDateTimeFormatter[dynamicDateTimeFormatters.size()]);

src/test/java/org/elasticsearch/index/mapper/date/SimpleDateMappingTests.java

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.apache.lucene.index.IndexableField;
2626
import org.apache.lucene.search.NumericRangeQuery;
2727
import org.apache.lucene.util.Constants;
28+
import org.elasticsearch.Version;
29+
import org.elasticsearch.cluster.metadata.IndexMetaData;
2830
import org.elasticsearch.common.settings.Settings;
2931
import org.elasticsearch.common.unit.TimeValue;
3032
import org.elasticsearch.common.util.LocaleUtils;
@@ -33,13 +35,8 @@
3335
import org.elasticsearch.common.xcontent.XContentFactory;
3436
import org.elasticsearch.common.xcontent.json.JsonXContent;
3537
import org.elasticsearch.index.IndexService;
36-
import org.elasticsearch.index.mapper.DocumentMapper;
37-
import org.elasticsearch.index.mapper.FieldMapper;
38-
import org.elasticsearch.index.mapper.MapperParsingException;
39-
import org.elasticsearch.index.mapper.MergeResult;
40-
import org.elasticsearch.index.mapper.ParseContext;
38+
import org.elasticsearch.index.mapper.*;
4139
import org.elasticsearch.index.mapper.ParseContext.Document;
42-
import org.elasticsearch.index.mapper.ParsedDocument;
4340
import org.elasticsearch.index.mapper.core.DateFieldMapper;
4441
import org.elasticsearch.index.mapper.core.LongFieldMapper;
4542
import org.elasticsearch.index.mapper.core.StringFieldMapper;
@@ -51,21 +48,12 @@
5148
import org.junit.Before;
5249

5350
import java.io.IOException;
54-
import java.util.ArrayList;
55-
import java.util.Arrays;
56-
import java.util.List;
57-
import java.util.Locale;
58-
import java.util.Map;
51+
import java.util.*;
5952

6053
import static com.carrotsearch.randomizedtesting.RandomizedTest.systemPropertyAsBoolean;
6154
import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder;
6255
import static org.elasticsearch.index.mapper.string.SimpleStringMappingTests.docValuesType;
63-
import static org.hamcrest.Matchers.equalTo;
64-
import static org.hamcrest.Matchers.hasKey;
65-
import static org.hamcrest.Matchers.instanceOf;
66-
import static org.hamcrest.Matchers.is;
67-
import static org.hamcrest.Matchers.notNullValue;
68-
import static org.hamcrest.Matchers.nullValue;
56+
import static org.hamcrest.Matchers.*;
6957

7058
public class SimpleDateMappingTests extends ElasticsearchSingleNodeTest {
7159

@@ -439,4 +427,21 @@ public void testNumericResolution() throws Exception {
439427
.bytes());
440428
assertThat(getDateAsMillis(doc.rootDoc(), "date_field"), equalTo(44000L));
441429
}
430+
431+
public void testThatOlderIndicesAllowNonStrictDates() throws Exception {
432+
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
433+
.startObject("properties").startObject("date_field").field("type", "date").endObject().endObject()
434+
.endObject().endObject().string();
435+
436+
String indexName = "test-" + randomAsciiOfLength(10).toLowerCase(Locale.ROOT);
437+
IndexService index = createIndex(indexName, settingsBuilder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_1_5_2_ID).build());
438+
client().admin().indices().preparePutMapping(indexName).setType("type").setSource(mapping).get();
439+
DocumentMapper defaultMapper = index.mapperService().documentMapper("type");
440+
441+
defaultMapper.parse("type", "1", XContentFactory.jsonBuilder()
442+
.startObject()
443+
.field("date_field", "1-1-1T00:00:44.000Z")
444+
.endObject()
445+
.bytes());
446+
}
442447
}

src/test/java/org/elasticsearch/index/mapper/timestamp/TimestampMappingTests.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,7 @@
3737
import org.elasticsearch.common.xcontent.XContentBuilder;
3838
import org.elasticsearch.common.xcontent.XContentFactory;
3939
import org.elasticsearch.common.xcontent.json.JsonXContent;
40-
import org.elasticsearch.index.mapper.DocumentMapper;
41-
import org.elasticsearch.index.mapper.DocumentMapperParser;
42-
import org.elasticsearch.index.mapper.FieldMapper;
43-
import org.elasticsearch.index.mapper.MergeResult;
44-
import org.elasticsearch.index.mapper.ParsedDocument;
45-
import org.elasticsearch.index.mapper.SourceToParse;
40+
import org.elasticsearch.index.mapper.*;
4641
import org.elasticsearch.index.mapper.internal.TimestampFieldMapper;
4742
import org.elasticsearch.test.ElasticsearchSingleNodeTest;
4843
import org.junit.Test;
@@ -58,14 +53,7 @@
5853
import static org.elasticsearch.Version.V_2_0_0;
5954
import static org.elasticsearch.test.VersionUtils.randomVersion;
6055
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
61-
import static org.hamcrest.Matchers.containsString;
62-
import static org.hamcrest.Matchers.equalTo;
63-
import static org.hamcrest.Matchers.hasKey;
64-
import static org.hamcrest.Matchers.instanceOf;
65-
import static org.hamcrest.Matchers.is;
66-
import static org.hamcrest.Matchers.isIn;
67-
import static org.hamcrest.Matchers.lessThanOrEqualTo;
68-
import static org.hamcrest.Matchers.notNullValue;
56+
import static org.hamcrest.Matchers.*;
6957

7058
/**
7159
*/
@@ -114,7 +102,7 @@ public void testDefaultValues() throws Exception {
114102
assertThat(docMapper.timestampFieldMapper().fieldType().stored(), equalTo(version.onOrAfter(Version.V_2_0_0) ? true : false));
115103
assertThat(docMapper.timestampFieldMapper().fieldType().indexOptions(), equalTo(TimestampFieldMapper.Defaults.FIELD_TYPE.indexOptions()));
116104
assertThat(docMapper.timestampFieldMapper().path(), equalTo(TimestampFieldMapper.Defaults.PATH));
117-
assertThat(docMapper.timestampFieldMapper().dateTimeFormatter().format(), equalTo(TimestampFieldMapper.DEFAULT_DATE_TIME_FORMAT));
105+
assertThat(docMapper.timestampFieldMapper().dateTimeFormatter().format(), equalTo(version.onOrAfter(Version.V_2_0_0) ? TimestampFieldMapper.DEFAULT_DATE_TIME_FORMAT : "dateOptionalTime"));
118106
assertThat(docMapper.timestampFieldMapper().hasDocValues(), equalTo(false));
119107
assertAcked(client().admin().indices().prepareDelete("test").execute().get());
120108
}

0 commit comments

Comments
 (0)