Skip to content

Commit fdf6eb9

Browse files
committed
Mapper: Date format - allow for multiple formats using '||' separator, closes #169.
1 parent 8df704e commit fdf6eb9

File tree

4 files changed

+61
-10
lines changed

4 files changed

+61
-10
lines changed

.idea/libraries/joda_time.xml

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/XContentObjectMapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ public static class Defaults {
5656
public static final FormatDateTimeFormatter[] DATE_TIME_FORMATTERS =
5757
new FormatDateTimeFormatter[]{
5858
XContentDateFieldMapper.Defaults.DATE_TIME_FORMATTER,
59-
Joda.forPattern("yyyy/MM/dd HH:mm:ss"),
60-
Joda.forPattern("yyyy/MM/dd")
59+
Joda.forPattern("yyyy/MM/dd HH:mm:ss||yyyy/MM/dd")
6160
};
6261
}
6362

modules/elasticsearch/src/main/java/org/elasticsearch/util/joda/Joda.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@
1919

2020
package org.elasticsearch.util.joda;
2121

22+
import org.elasticsearch.util.Strings;
2223
import org.joda.time.DateTimeZone;
23-
import org.joda.time.format.DateTimeFormat;
24-
import org.joda.time.format.DateTimeFormatter;
25-
import org.joda.time.format.ISODateTimeFormat;
24+
import org.joda.time.format.*;
2625

2726
/**
2827
* @author kimchy (shay.banon)
@@ -118,9 +117,19 @@ public static FormatDateTimeFormatter forPattern(String input) {
118117
} else if ("yearMonthDay".equals(input) || "year_month_day".equals(input)) {
119118
formatter = ISODateTimeFormat.yearMonthDay();
120119
} else {
121-
formatter = DateTimeFormat.forPattern(input);
120+
String[] formats = Strings.split(input, "||");
121+
if (formats == null || formats.length == 1) {
122+
formatter = DateTimeFormat.forPattern(input);
123+
} else {
124+
DateTimeParser[] parsers = new DateTimeParser[formats.length];
125+
for (int i = 0; i < formats.length; i++) {
126+
parsers[i] = DateTimeFormat.forPattern(formats[i]).withZone(DateTimeZone.UTC).getParser();
127+
}
128+
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder()
129+
.append(DateTimeFormat.forPattern(formats[0]).withZone(DateTimeZone.UTC).getPrinter(), parsers);
130+
formatter = builder.toFormatter();
131+
}
122132
}
123-
formatter.withZone(DateTimeZone.UTC);
124-
return new FormatDateTimeFormatter(input, formatter);
133+
return new FormatDateTimeFormatter(input, formatter.withZone(DateTimeZone.UTC));
125134
}
126135
}

modules/elasticsearch/src/test/java/org/elasticsearch/deps/joda/SimpleJodaTests.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.elasticsearch.util.joda.FormatDateTimeFormatter;
2323
import org.elasticsearch.util.joda.Joda;
2424
import org.joda.time.DateTimeZone;
25+
import org.joda.time.format.DateTimeFormat;
2526
import org.joda.time.format.DateTimeFormatter;
2627
import org.joda.time.format.ISODateTimeFormat;
2728
import org.testng.annotations.Test;
@@ -57,6 +58,30 @@ public class SimpleJodaTests {
5758
assertThat(millis, equalTo(0l));
5859
millis = formatter.parseMillis("1970-01-01");
5960
assertThat(millis, equalTo(0l));
61+
62+
millis = formatter.parseMillis("1970");
63+
assertThat(millis, equalTo(0l));
64+
65+
try {
66+
formatter.parseMillis("1970 kuku");
67+
assert false : "formatting should fail";
68+
} catch (IllegalArgumentException e) {
69+
// all is well
70+
}
71+
}
72+
73+
@Test public void testIsoVsCustom() {
74+
DateTimeFormatter formatter = ISODateTimeFormat.dateOptionalTimeParser().withZone(DateTimeZone.UTC);
75+
long millis = formatter.parseMillis("1970-01-01T00:00:00");
76+
assertThat(millis, equalTo(0l));
77+
78+
formatter = DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").withZone(DateTimeZone.UTC);
79+
millis = formatter.parseMillis("1970/01/01 00:00:00");
80+
assertThat(millis, equalTo(0l));
81+
82+
FormatDateTimeFormatter formatter2 = Joda.forPattern("yyyy/MM/dd HH:mm:ss");
83+
millis = formatter2.parser().parseMillis("1970/01/01 00:00:00");
84+
assertThat(millis, equalTo(0l));
6085
}
6186

6287
@Test public void testWriteAndParse() {
@@ -71,7 +96,23 @@ public class SimpleJodaTests {
7196
formatter.parser().parseMillis("01/2001");
7297

7398
formatter = Joda.forPattern("yyyy/MM/dd HH:mm:ss");
74-
long millis = formatter.parser().parseMillis("2001/01/01 00:00:00");
99+
long millis = formatter.parser().parseMillis("1970/01/01 00:00:00");
75100
formatter.printer().print(millis);
101+
102+
try {
103+
millis = formatter.parser().parseMillis("1970/01/01");
104+
assert false;
105+
} catch (IllegalArgumentException e) {
106+
// it really can't parse this one
107+
}
108+
}
109+
110+
@Test public void testMultipleFormats() {
111+
FormatDateTimeFormatter formatter = Joda.forPattern("yyyy/MM/dd HH:mm:ss||yyyy/MM/dd");
112+
long millis = formatter.parser().parseMillis("1970/01/01 00:00:00");
113+
millis = formatter.parser().parseMillis("1970/01/01");
114+
// System.out.println("" + millis);
115+
116+
System.out.println(formatter.printer().print(millis));
76117
}
77118
}

0 commit comments

Comments
 (0)