Skip to content

Commit f4e47bb

Browse files
committed
fixup! Allow multiple date formats for date fields
1 parent 9dabc62 commit f4e47bb

File tree

7 files changed

+33
-23
lines changed

7 files changed

+33
-23
lines changed

src/main/asciidoc/reference/elasticsearch-object-mapping.adoc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ See https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-type
6464
* `@GeoPoint`: marks a field as _geo_point_ datatype.
6565
Can be omitted if the field is an instance of the `GeoPoint` class.
6666

67-
NOTE: Properties that derive from `TemporalAccessor` or are of type `java.util.Date` must either have a `@Field` annotation of type `FieldType.Date` and a
68-
format different from `DateFormat.none` or a custom converter must be registered for this type. +
67+
NOTE: Properties that derive from `TemporalAccessor` or are of type `java.util.Date` must either have a `@Field` annotation of type `FieldType.Date`.
6968
If you are using a custom date format, you need to use _uuuu_ for the year instead of _yyyy_.
7069
This is due to a https://www.elastic.co/guide/en/elasticsearch/reference/current/migrate-to-java-time.html#java-time-migration-incompatible-date-formats[change in Elasticsearch 7].
7170

src/main/java/org/springframework/data/elasticsearch/annotations/DateFormat.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
*/
2828
public enum DateFormat {
2929
/**
30-
* @deprecated will be removed in a future version
30+
* @deprecated since 4.2, will be removed in a future version, use multiple formats in the @Field annotation.
3131
*/
3232
@Deprecated
3333
none(""), //

src/main/java/org/springframework/data/elasticsearch/annotations/Field.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868

6969
DateFormat[] format() default { DateFormat.date_optional_time, DateFormat.epoch_millis };
7070

71-
String pattern() default "";
71+
String[] pattern() default {};
7272

7373
boolean store() default false;
7474

src/main/java/org/springframework/data/elasticsearch/annotations/InnerField.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
DateFormat[] format() default { DateFormat.date_optional_time, DateFormat.epoch_millis };
4444

45-
String pattern() default "";
45+
String[] pattern() default {};
4646

4747
boolean store() default false;
4848

src/main/java/org/springframework/data/elasticsearch/core/index/MappingParameters.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ public final class MappingParameters {
8181
private final String analyzer;
8282
private final boolean coerce;
8383
@Nullable private final String[] copyTo;
84-
private final String datePattern;
84+
private final DateFormat[] dateFormats;
85+
private final String[] dateFormatPatterns;
8586
private final boolean docValues;
8687
private final boolean eagerGlobalOrdinals;
8788
private final boolean enabled;
8889
private final boolean fielddata;
89-
private final DateFormat[] format;
9090
@Nullable private final Integer ignoreAbove;
9191
private final boolean ignoreMalformed;
9292
private final boolean index;
@@ -132,8 +132,8 @@ private MappingParameters(Field field) {
132132
store = field.store();
133133
fielddata = field.fielddata();
134134
type = field.type();
135-
format = field.format();
136-
datePattern = field.pattern();
135+
dateFormats = field.format();
136+
dateFormatPatterns = field.pattern();
137137
analyzer = field.analyzer();
138138
searchAnalyzer = field.searchAnalyzer();
139139
normalizer = field.normalizer();
@@ -174,8 +174,8 @@ private MappingParameters(InnerField field) {
174174
store = field.store();
175175
fielddata = field.fielddata();
176176
type = field.type();
177-
format = field.format();
178-
datePattern = field.pattern();
177+
dateFormats = field.format();
178+
dateFormatPatterns = field.pattern();
179179
analyzer = field.analyzer();
180180
searchAnalyzer = field.searchAnalyzer();
181181
normalizer = field.normalizer();
@@ -229,16 +229,21 @@ public void writeTypeAndParametersTo(XContentBuilder builder) throws IOException
229229

230230
if (type != FieldType.Auto) {
231231
builder.field(FIELD_PARAM_TYPE, type.name().toLowerCase());
232-
if (type == FieldType.Date && format.length > 0) {
232+
233+
if (type == FieldType.Date && dateFormats.length > 0) {
233234
List<String> formats = new ArrayList<>();
234-
for (int i = 0; i < format.length; i++) {
235-
DateFormat dateFormat = format[i];
235+
236+
for (int i = 0; i < dateFormats.length; i++) {
237+
DateFormat dateFormat = dateFormats[i];
236238
if (dateFormat == DateFormat.custom) {
237-
formats.add(datePattern);
239+
for (int ii = 0; ii < dateFormatPatterns.length; ii++) {
240+
formats.add(dateFormatPatterns[ii]);
241+
}
238242
} else {
239243
formats.add(dateFormat.toString());
240244
}
241245
}
246+
242247
builder.field(FIELD_PARAM_FORMAT, String.join("||", formats));
243248
}
244249
}

src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ private void initDateConverter() {
161161

162162
if (dateFormats.length == 0) {
163163
LOGGER.warn(
164-
String.format("No DateFormat defined for property %s. Make sure you have a Converter registered for %s",
164+
String.format("Property %s is annotated with FieldType.%s but has no format defined. Make sure you have a converter registered for %s.",
165165
property, actualType.getSimpleName()));
166166
return;
167167
}
@@ -172,23 +172,30 @@ private void initDateConverter() {
172172
DateFormat dateFormat = dateFormats[i];
173173

174174
if (dateFormat == DateFormat.custom) {
175-
String pattern = field.pattern();
175+
String[] dateFormatPatterns = field.pattern();
176176

177-
if (!StringUtils.hasLength(pattern)) {
177+
if (dateFormatPatterns.length == 0) {
178178
throw new MappingException(String.format(
179-
"Property %s is annotated with FieldType.%s and a custom format but has no pattern defined", property,
179+
"Property %s is annotated with FieldType.%s and a custom format but has no pattern defined.", property,
180180
field.type().name()));
181181
}
182182

183-
converters.add(ElasticsearchDateConverter.of(pattern));
183+
for (int j = 0; j < dateFormatPatterns.length; j++) {
184+
String pattern = dateFormatPatterns[j];
185+
if (!StringUtils.hasText(pattern)) {
186+
throw new MappingException(
187+
String.format("Date pattern of property %s must not be empty", property, field.type().name()));
188+
}
189+
converters.add(ElasticsearchDateConverter.of(pattern));
190+
}
184191
} else {
185192

186193
switch (dateFormat) {
187194
case weekyear:
188195
case weekyear_week:
189196
case weekyear_week_day:
190-
LOGGER.warn("no Converter available for " + actualType.getName() + " and date format " + dateFormat.name()
191-
+ ". Use a custom converter instead");
197+
LOGGER.warn("No default converter available for " + actualType.getName() + " and date format "
198+
+ dateFormat.name() + ". Use a custom converter instead.");
192199
break;
193200
default:
194201
converters.add(ElasticsearchDateConverter.of(dateFormat));

src/test/java/org/springframework/data/elasticsearch/core/convert/ElasticsearchDateConverterUnitTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
/**
2424
* @author Peter-Josef Meisch
2525
* @author Tim te Beek
26-
* @author Sascha Woo
2726
*/
2827
class ElasticsearchDateConverterUnitTests {
2928

0 commit comments

Comments
 (0)