|
22 | 22 | import com.fasterxml.jackson.core.JsonGenerationException;
|
23 | 23 | import com.fasterxml.jackson.core.JsonGenerator;
|
24 | 24 | import com.fasterxml.jackson.core.JsonParseException;
|
25 |
| - |
26 | 25 | import org.apache.lucene.util.BytesRef;
|
27 | 26 | import org.apache.lucene.util.Constants;
|
28 | 27 | import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|
51 | 50 | import java.io.IOException;
|
52 | 51 | import java.math.BigInteger;
|
53 | 52 | import java.nio.file.Path;
|
| 53 | +import java.time.DayOfWeek; |
| 54 | +import java.time.Duration; |
| 55 | +import java.time.LocalDate; |
| 56 | +import java.time.LocalDateTime; |
| 57 | +import java.time.LocalTime; |
| 58 | +import java.time.Month; |
| 59 | +import java.time.MonthDay; |
| 60 | +import java.time.OffsetDateTime; |
| 61 | +import java.time.OffsetTime; |
| 62 | +import java.time.Period; |
| 63 | +import java.time.Year; |
| 64 | +import java.time.ZoneOffset; |
| 65 | +import java.time.ZonedDateTime; |
54 | 66 | import java.util.ArrayList;
|
55 | 67 | import java.util.Arrays;
|
56 | 68 | import java.util.Calendar;
|
@@ -459,6 +471,116 @@ public void testCalendar() throws Exception {
|
459 | 471 | .endObject());
|
460 | 472 | }
|
461 | 473 |
|
| 474 | + public void testJavaTime() throws Exception { |
| 475 | + final ZonedDateTime d1 = ZonedDateTime.of(2016, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC); |
| 476 | + |
| 477 | + // ZonedDateTime |
| 478 | + assertResult("{'date':null}", () -> builder().startObject().timeField("date", (ZonedDateTime) null).endObject()); |
| 479 | + assertResult("{'date':null}", () -> builder().startObject().field("date").timeValue((ZonedDateTime) null).endObject()); |
| 480 | + assertResult("{'date':null}", () -> builder().startObject().field("date", (ZonedDateTime) null).endObject()); |
| 481 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", () -> builder().startObject().timeField("d1", d1).endObject()); |
| 482 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", () -> builder().startObject().field("d1").timeValue(d1).endObject()); |
| 483 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", () -> builder().startObject().field("d1", d1).endObject()); |
| 484 | + |
| 485 | + // Instant |
| 486 | + assertResult("{'date':null}", () -> builder().startObject().timeField("date", (java.time.Instant) null).endObject()); |
| 487 | + assertResult("{'date':null}", () -> builder().startObject().field("date").timeValue((java.time.Instant) null).endObject()); |
| 488 | + assertResult("{'date':null}", () -> builder().startObject().field("date", (java.time.Instant) null).endObject()); |
| 489 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", () -> builder().startObject().timeField("d1", d1.toInstant()).endObject()); |
| 490 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", () -> builder().startObject().field("d1").timeValue(d1.toInstant()).endObject()); |
| 491 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", () -> builder().startObject().field("d1", d1.toInstant()).endObject()); |
| 492 | + |
| 493 | + // LocalDateTime (no time zone) |
| 494 | + assertResult("{'date':null}", () -> builder().startObject().timeField("date", (LocalDateTime) null).endObject()); |
| 495 | + assertResult("{'date':null}", () -> builder().startObject().field("date").timeValue((LocalDateTime) null).endObject()); |
| 496 | + assertResult("{'date':null}", () -> builder().startObject().field("date", (LocalDateTime) null).endObject()); |
| 497 | + assertResult("{'d1':'2016-01-01T00:00:00.000'}", |
| 498 | + () -> builder().startObject().timeField("d1", d1.toLocalDateTime()).endObject()); |
| 499 | + assertResult("{'d1':'2016-01-01T00:00:00.000'}", |
| 500 | + () -> builder().startObject().field("d1").timeValue(d1.toLocalDateTime()).endObject()); |
| 501 | + assertResult("{'d1':'2016-01-01T00:00:00.000'}", () -> builder().startObject().field("d1", d1.toLocalDateTime()).endObject()); |
| 502 | + |
| 503 | + // LocalDate (no time, no time zone) |
| 504 | + assertResult("{'date':null}", () -> builder().startObject().timeField("date", (LocalDate) null).endObject()); |
| 505 | + assertResult("{'date':null}", () -> builder().startObject().field("date").timeValue((LocalDate) null).endObject()); |
| 506 | + assertResult("{'date':null}", () -> builder().startObject().field("date", (LocalDate) null).endObject()); |
| 507 | + assertResult("{'d1':'2016-01-01'}", () -> builder().startObject().timeField("d1", d1.toLocalDate()).endObject()); |
| 508 | + assertResult("{'d1':'2016-01-01'}", () -> builder().startObject().field("d1").timeValue(d1.toLocalDate()).endObject()); |
| 509 | + assertResult("{'d1':'2016-01-01'}", () -> builder().startObject().field("d1", d1.toLocalDate()).endObject()); |
| 510 | + |
| 511 | + // LocalTime (no date, no time zone) |
| 512 | + assertResult("{'date':null}", () -> builder().startObject().timeField("date", (LocalTime) null).endObject()); |
| 513 | + assertResult("{'date':null}", () -> builder().startObject().field("date").timeValue((LocalTime) null).endObject()); |
| 514 | + assertResult("{'date':null}", () -> builder().startObject().field("date", (LocalTime) null).endObject()); |
| 515 | + assertResult("{'d1':'00:00:00.000'}", () -> builder().startObject().timeField("d1", d1.toLocalTime()).endObject()); |
| 516 | + assertResult("{'d1':'00:00:00.000'}", () -> builder().startObject().field("d1").timeValue(d1.toLocalTime()).endObject()); |
| 517 | + assertResult("{'d1':'00:00:00.000'}", () -> builder().startObject().field("d1", d1.toLocalTime()).endObject()); |
| 518 | + final ZonedDateTime d2 = ZonedDateTime.of(2016, 1, 1, 7, 59, 23, 123_000_000, ZoneOffset.UTC); |
| 519 | + assertResult("{'d1':'07:59:23.123'}", () -> builder().startObject().timeField("d1", d2.toLocalTime()).endObject()); |
| 520 | + assertResult("{'d1':'07:59:23.123'}", () -> builder().startObject().field("d1").timeValue(d2.toLocalTime()).endObject()); |
| 521 | + assertResult("{'d1':'07:59:23.123'}", () -> builder().startObject().field("d1", d2.toLocalTime()).endObject()); |
| 522 | + |
| 523 | + // OffsetDateTime |
| 524 | + assertResult("{'date':null}", () -> builder().startObject().timeField("date", (OffsetDateTime) null).endObject()); |
| 525 | + assertResult("{'date':null}", () -> builder().startObject().field("date").timeValue((OffsetDateTime) null).endObject()); |
| 526 | + assertResult("{'date':null}", () -> builder().startObject().field("date", (OffsetDateTime) null).endObject()); |
| 527 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", () -> builder().startObject().field("d1", d1.toOffsetDateTime()).endObject()); |
| 528 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", |
| 529 | + () -> builder().startObject().timeField("d1", d1.toOffsetDateTime()).endObject()); |
| 530 | + assertResult("{'d1':'2016-01-01T00:00:00.000Z'}", |
| 531 | + () -> builder().startObject().field("d1").timeValue(d1.toOffsetDateTime()).endObject()); |
| 532 | + // also test with a date that has a real offset |
| 533 | + OffsetDateTime offsetDateTime = d1.withZoneSameLocal(ZoneOffset.ofHours(5)).toOffsetDateTime(); |
| 534 | + assertResult("{'d1':'2016-01-01T00:00:00.000+05:00'}", () -> builder().startObject().field("d1", offsetDateTime).endObject()); |
| 535 | + assertResult("{'d1':'2016-01-01T00:00:00.000+05:00'}", () -> builder().startObject().timeField("d1", offsetDateTime).endObject()); |
| 536 | + assertResult("{'d1':'2016-01-01T00:00:00.000+05:00'}", |
| 537 | + () -> builder().startObject().field("d1").timeValue(offsetDateTime).endObject()); |
| 538 | + |
| 539 | + // OffsetTime |
| 540 | + assertResult("{'date':null}", () -> builder().startObject().timeField("date", (OffsetTime) null).endObject()); |
| 541 | + assertResult("{'date':null}", () -> builder().startObject().field("date").timeValue((OffsetTime) null).endObject()); |
| 542 | + assertResult("{'date':null}", () -> builder().startObject().field("date", (OffsetTime) null).endObject()); |
| 543 | + final OffsetTime offsetTime = d2.toOffsetDateTime().toOffsetTime(); |
| 544 | + assertResult("{'o':'07:59:23.123Z'}", () -> builder().startObject().timeField("o", offsetTime).endObject()); |
| 545 | + assertResult("{'o':'07:59:23.123Z'}", () -> builder().startObject().field("o").timeValue(offsetTime).endObject()); |
| 546 | + assertResult("{'o':'07:59:23.123Z'}", () -> builder().startObject().field("o", offsetTime).endObject()); |
| 547 | + // also test with a date that has a real offset |
| 548 | + final OffsetTime zonedOffsetTime = offsetTime.withOffsetSameLocal(ZoneOffset.ofHours(5)); |
| 549 | + assertResult("{'o':'07:59:23.123+05:00'}", () -> builder().startObject().timeField("o", zonedOffsetTime).endObject()); |
| 550 | + assertResult("{'o':'07:59:23.123+05:00'}", () -> builder().startObject().field("o").timeValue(zonedOffsetTime).endObject()); |
| 551 | + assertResult("{'o':'07:59:23.123+05:00'}", () -> builder().startObject().field("o", zonedOffsetTime).endObject()); |
| 552 | + |
| 553 | + // DayOfWeek enum, not a real time value, but might be used in scripts |
| 554 | + assertResult("{'dayOfWeek':null}", () -> builder().startObject().field("dayOfWeek", (DayOfWeek) null).endObject()); |
| 555 | + DayOfWeek dayOfWeek = randomFrom(DayOfWeek.values()); |
| 556 | + assertResult("{'dayOfWeek':'" + dayOfWeek + "'}", () -> builder().startObject().field("dayOfWeek", dayOfWeek).endObject()); |
| 557 | + |
| 558 | + // Month |
| 559 | + Month month = randomFrom(Month.values()); |
| 560 | + assertResult("{'m':null}", () -> builder().startObject().field("m", (Month) null).endObject()); |
| 561 | + assertResult("{'m':'" + month + "'}", () -> builder().startObject().field("m", month).endObject()); |
| 562 | + |
| 563 | + // MonthDay |
| 564 | + MonthDay monthDay = MonthDay.of(month, randomIntBetween(1, 28)); |
| 565 | + assertResult("{'m':null}", () -> builder().startObject().field("m", (MonthDay) null).endObject()); |
| 566 | + assertResult("{'m':'" + monthDay + "'}", () -> builder().startObject().field("m", monthDay).endObject()); |
| 567 | + |
| 568 | + // Year |
| 569 | + Year year = Year.of(randomIntBetween(0, 2300)); |
| 570 | + assertResult("{'y':null}", () -> builder().startObject().field("y", (Year) null).endObject()); |
| 571 | + assertResult("{'y':'" + year + "'}", () -> builder().startObject().field("y", year).endObject()); |
| 572 | + |
| 573 | + // Duration |
| 574 | + Duration duration = Duration.ofSeconds(randomInt(100000)); |
| 575 | + assertResult("{'d':null}", () -> builder().startObject().field("d", (Duration) null).endObject()); |
| 576 | + assertResult("{'d':'" + duration + "'}", () -> builder().startObject().field("d", duration).endObject()); |
| 577 | + |
| 578 | + // Period |
| 579 | + Period period = Period.ofDays(randomInt(1000)); |
| 580 | + assertResult("{'p':null}", () -> builder().startObject().field("p", (Period) null).endObject()); |
| 581 | + assertResult("{'p':'" + period + "'}", () -> builder().startObject().field("p", period).endObject()); |
| 582 | + } |
| 583 | + |
462 | 584 | public void testGeoPoint() throws Exception {
|
463 | 585 | assertResult("{'geo':null}", () -> builder().startObject().field("geo", (GeoPoint) null).endObject());
|
464 | 586 | assertResult("{'geo':{'lat':52.4267578125,'lon':13.271484375}}", () -> builder()
|
|
0 commit comments