Skip to content

Commit 485805c

Browse files
committed
continuing experiments
1 parent a07ea3d commit 485805c

File tree

6 files changed

+53
-12
lines changed

6 files changed

+53
-12
lines changed

schemas-analyze/src/main/java/org/cedar/schemas/analyze/DateInfo.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class DateInfo implements Comparable<DateInfo> {
2626
public final boolean indexable;
2727
public final String zoneSpecified;
2828
public final String utcDateTimeString;
29+
public final String endUtcDateTimeString;
2930
public final Long year;
3031
public Integer dayOfYear; // values 1 - 366 // TODO temp remove final from these fields, just to sanity check things
3132
public Integer dayOfMonth; // values 1 - 31
@@ -43,6 +44,7 @@ public DateInfo(String dateString, boolean start) {
4344
indexable = true;
4445
zoneSpecified = null;
4546
utcDateTimeString = null;
47+
endUtcDateTimeString = null;
4648
year = null;
4749
dayOfYear = null;
4850
dayOfMonth = null;
@@ -68,20 +70,21 @@ public DateInfo(String dateString, boolean start) {
6870
endDayOfMonth = ((YearMonth)parsedDate).lengthOfMonth();
6971
dayOfYear = ((YearMonth)parsedDate).atDay(1).getDayOfYear();
7072
endDayOfYear = ((YearMonth)parsedDate).atEndOfMonth().getDayOfYear();
71-
System.out.println("year month - setting endDayOf* fields..." + endDayOfMonth);
72-
System.out.println("year month - setting endDayOf* fields..." + dayOfYear);
73-
System.out.println("year month - setting endDayOf* fields..." + endDayOfYear);
73+
// endUtcDateTimeString = utcDateTimeString(((YearMonth)parsedDate).atEndOfMonth(), false);
7474
} else if (parsedDate != null && month == null && year != null) { // TODO or instanceof Year?
7575
dayOfMonth = 1;
7676
dayOfYear = 1;
7777
endDayOfYear = ((Year)parsedDate).length(); // number of days in the year, including leap years
7878
endDayOfMonth = 31;
7979
month = 1;
8080
endMonth = 12;
81+
82+
// endUtcDateTimeString = utcDateTimeString(((Year)parsedDate).atDay(endDayOfYear), false);
8183
} else {
8284
endMonth = month;
8385
endDayOfMonth = dayOfMonth;
8486
endDayOfYear = dayOfYear;
87+
// endUtcDateTimeString = utcDateTimeString;
8588
}
8689

8790
if (longDate != null && !indexable(longDate)) {
@@ -90,20 +93,23 @@ public DateInfo(String dateString, boolean start) {
9093
indexable = indexable(longDate);
9194
zoneSpecified = timezone(longDate);
9295
utcDateTimeString = utcDateTimeString(longDate, start);
96+
endUtcDateTimeString = utcDateTimeString(longDate, false);
9397
}
9498
else if (parsedDate != null) {
9599
descriptor = ValidDescriptor.VALID;
96100
precision = precision(parsedDate);
97101
indexable = true;
98102
zoneSpecified = timezone(parsedDate);
99103
utcDateTimeString = utcDateTimeString(parsedDate, start);
104+
endUtcDateTimeString = utcDateTimeString(parsedDate, false);
100105
}
101106
else {
102107
descriptor = ValidDescriptor.INVALID;
103108
precision = null;
104109
indexable = false;
105110
zoneSpecified = null;
106111
utcDateTimeString = null;
112+
endUtcDateTimeString = null;
107113
}
108114
}
109115

schemas-analyze/src/main/java/org/cedar/schemas/analyze/Temporal.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,16 @@ public static TemporalBoundingAnalysis analyzeBounding(Discovery metadata) {
9898
builder.setEndZoneSpecified(endInfo.zoneSpecified);
9999
builder.setEndUtcDateTimeString(endInfo.utcDateTimeString);
100100
builder.setEndYear(endInfo.year);
101-
builder.setEndDayOfYear(endInfo.dayOfYear);
102-
builder.setEndDayOfMonth(endInfo.dayOfMonth);
103-
builder.setEndMonth(endInfo.month);
101+
builder.setEndDayOfYear(endInfo.endDayOfYear == null ? endInfo.dayOfYear : endInfo.endDayOfYear);
102+
builder.setEndDayOfMonth(endInfo.endDayOfMonth == null ? endInfo.dayOfMonth : endInfo.endDayOfMonth);
103+
builder.setEndMonth(endInfo.endMonth == null ? endInfo.month : endInfo.endMonth);
104104

105105
builder.setInstantDescriptor(instantInfo.descriptor);
106106
builder.setInstantPrecision(instantInfo.precision);
107107
builder.setInstantIndexable(instantInfo.indexable);
108108
builder.setInstantZoneSpecified(instantInfo.zoneSpecified);
109109
builder.setInstantUtcDateTimeString(instantInfo.utcDateTimeString);
110+
builder.setInstantEndUtcDateTimeString(instantInfo.endUtcDateTimeString);
110111
builder.setInstantYear(instantInfo.year);
111112
builder.setInstantDayOfYear(instantInfo.dayOfYear);
112113
builder.setInstantDayOfMonth(instantInfo.dayOfMonth);

schemas-analyze/src/test/groovy/org/cedar/schemas/analyze/AnalyzersSpec.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class AnalyzersSpec extends Specification {
9393
instantIndexable : true,
9494
instantZoneSpecified : null,
9595
instantUtcDateTimeString: null,
96+
instantEndUtcDateTimeString: null,
9697
instantDayOfYear : null,
9798
instantDayOfMonth : null,
9899
instantYear : null,

schemas-analyze/src/test/groovy/org/cedar/schemas/analyze/TemporalSpec.groovy

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,29 @@ class TemporalSpec extends Specification {
1717

1818
final String analysisAvro = ClassLoader.systemClassLoader.getResourceAsStream('avro/psi/analysis.avsc').text
1919

20+
def "end date #description (#endDate) correctly extrapolates date"() {
21+
given:
22+
def bounding = TemporalBounding.newBuilder()
23+
.setEndDate(endDate)
24+
.build()
25+
def discovery = Discovery.newBuilder().setTemporalBounding(bounding).build()
26+
27+
when:
28+
def result = Temporal.analyzeBounding(discovery)
29+
30+
then:
31+
result.endMonth == month
32+
result.endDayOfMonth == dayOfMonth
33+
result.endDayOfYear == dayOfYear
34+
35+
where:
36+
description | endDate | month | dayOfMonth | dayOfYear
37+
"month precision" | '2003-02' | 2 | 28 | 59
38+
"month precision leap year" | '2004-02' | 2 | 29 | 60
39+
"year precision leap year" | '2004' | 12 | 31 | 366
40+
"year precision" | '2003' | 12 | 31 | 365
41+
}
42+
2043
def "instant #description (#instant) correctly extrapolates date range"() {
2144
given:
2245
def bounding = TemporalBounding.newBuilder()
@@ -28,21 +51,21 @@ class TemporalSpec extends Specification {
2851
def result = Temporal.analyzeBounding(discovery)
2952

3053
then:
31-
println("????"+result)
3254
result.instantMonth == month
3355
result.instantEndMonth == endMonth
3456
result.instantDayOfMonth == dayOfMonth
3557
result.instantEndDayOfMonth == endDayOfMonth
3658
result.instantDayOfYear == dayOfYear
3759
result.instantEndDayOfYear == endDayOfYear
60+
result.instantEndUtcDateTimeString == endString
3861

3962
where:
4063

41-
description | instant | year | dayOfYear | dayOfMonth | month | endYear | endDayOfYear | endDayOfMonth | endMonth
42-
"instant with month precision" | '2003-02' | 2003 | 32 | 1 | 2 | 2003 | 59 | 28 | 2
43-
"instant on leapyear with month precision" | '2004-02' | 2004 | 32 | 1 | 2 | 2004 | 60 | 29 | 2
44-
"instant with day precision" | '2001-06-22' | 2001 | 173 | 22 | 6 | 2001 | 173 | 22 | 6
45-
"instant with day precision on leapyear" | '2020-06-22' | 2020 | 174 | 22 | 6 | 2020 | 174 | 22 | 6
64+
description | instant | year | dayOfYear | dayOfMonth | month | endYear | endDayOfYear | endDayOfMonth | endMonth | endString
65+
"instant with month precision" | '2003-02' | 2003 | 32 | 1 | 2 | 2003 | 59 | 28 | 2 | '2003-02-28T23:59:59.999Z'
66+
"instant on leapyear with month precision" | '2004-02' | 2004 | 32 | 1 | 2 | 2004 | 60 | 29 | 2 | '2004-02-29T23:59:59.999Z'
67+
"instant with day precision" | '2001-06-22' | 2001 | 173 | 22 | 6 | 2001 | 173 | 22 | 6 | '2001-06-22T23:59:59.999Z'
68+
"instant with day precision on leapyear" | '2020-06-22' | 2020 | 174 | 22 | 6 | 2020 | 174 | 22 | 6 | '2020-06-22T23:59:59.999Z'
4669

4770
}
4871

schemas-core/src/main/resources/avro/psi/analysis.avsc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,15 @@
488488
"default": null,
489489
"doc": "If possible, a full ISO-8601 formatted date time string in the UTC time zone for the analyzed instant value"
490490
},
491+
{
492+
"name": "instantEndUtcDateTimeString",
493+
"type": [
494+
"null",
495+
"string"
496+
],
497+
"default": null,
498+
"doc": "If possible, a full ISO-8601 formatted date time string in the UTC time zone for the analyzed instant value. If instantPrecision does not include time, day, or month, the value is the assumed date time the instant ends, e.g. the last day of a month or year"
499+
},
491500
{
492501
"name": "instantYear",
493502
"type": [

schemas-core/src/test/resources/example-record-avro.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,7 @@
578578
},
579579
"instantZoneSpecified": null,
580580
"instantUtcDateTimeString": null,
581+
"instantEndUtcDateTimeString": null,
581582
"instantYear": null,
582583
"instantMonth": null,
583584
"instantDayOfMonth": null,

0 commit comments

Comments
 (0)