Skip to content

Commit 36c0bab

Browse files
committed
Tune sorting of parses and add tests
1 parent 55ee111 commit 36c0bab

9 files changed

+3773
-3487
lines changed

datetime/datetime.go

+9-11
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ import (
99
)
1010

1111
var parseDateMode string
12-
var parseYear int
13-
var parseTimeZone *TimeZone
14-
var parseTimeZoneAbbrev string
12+
var parseDTTZ *DateTimeTZ
1513

1614
// A DateTimeTZs represents a sequence of date and time ranges. It's the
1715
// expected result of parsing a string for datetimes.
@@ -138,15 +136,15 @@ func (dttz *DateTimeTZ) String() string {
138136

139137
func NewDateTimeTZ(date *Date, time *Time, timeZone *TimeZone) *DateTimeTZ {
140138
// fmt.Printf("NewDateTime(date: %#v, time: %#v, timeZone: %#v)\n", date, time, timeZone)
141-
if timeZone == nil {
142-
timeZone = parseTimeZone
139+
if timeZone == nil && parseDTTZ != nil {
140+
timeZone = parseDTTZ.TimeZone
143141
}
144142
return &DateTimeTZ{Date: date, Time: time, TimeZone: timeZone}
145143
}
146144

147145
func NewDateTimeTZWithDate(date *Date, timeZone *TimeZone) *DateTimeTZ {
148-
if timeZone == nil {
149-
timeZone = parseTimeZone
146+
if timeZone == nil && parseDTTZ != nil {
147+
timeZone = parseDTTZ.TimeZone
150148
}
151149
return &DateTimeTZ{Date: date, TimeZone: timeZone}
152150
}
@@ -411,11 +409,11 @@ var ordinals = map[string]bool{
411409

412410
func fixYear(yearAny any, year int) (int, bool) {
413411
// fmt.Printf("fixYear(yearAny: %#v, year: %d), parseYear: %d\n", yearAny, year, parseYear)
414-
if parseYear != 0 && year == -1 {
415-
return parseYear, true
412+
if parseDTTZ.Date != nil && parseDTTZ.Date.Year != 0 && year == -1 {
413+
return parseDTTZ.Date.Year, true
416414
}
417-
if parseYear != 0 && year >= 0 && year <= 99 {
418-
return 100*(parseYear/100) + year, true
415+
if parseDTTZ.Date != nil && parseDTTZ.Date.Year != 0 && year >= 0 && year <= 99 {
416+
return 100*(parseDTTZ.Date.Year/100) + year, true
419417
}
420418
if yearAny == nil {
421419
return 0, true

datetime/parse.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -41,30 +41,36 @@ var timezoneTZ = timezone.New()
4141
var cache = map[string]*DateTimeTZRanges{}
4242
var cacheMutex sync.RWMutex
4343

44-
func Parse(year int, dateMode string, timeZone *TimeZone, in string) (*DateTimeTZRanges, error) {
44+
func Parse(refDTTZ *DateTimeTZ, dateMode string, in string) (*DateTimeTZRanges, error) {
4545
// fmt.Printf("datetime.Parse(year: %d, dateMode: %q, timeZone: %#v, in: %q)\n", year, dateMode, timeZone, in)
4646
defer func() {
4747
if err := recover(); err != nil {
4848
slog.Warn("in Parse(), got a panic trying to extract", "in", in, "err", err)
4949
}
5050
}()
5151

52-
key := fmt.Sprintf("%d %q %#v %q", year, dateMode, timeZone, in)
52+
key := fmt.Sprintf("%q %q %q", refDTTZ.String(), dateMode, in)
5353
cacheMutex.RLock()
5454
r, found := cache[key]
5555
cacheMutex.RUnlock()
5656
if found {
5757
return r, nil
5858
}
5959

60-
parseYear = year
60+
parseDTTZ = refDTTZ
61+
if parseDTTZ == nil {
62+
// Set this so we don't get null pointer references for year and time zone.
63+
parseDTTZ = &DateTimeTZ{}
64+
}
65+
66+
// parseYear = year
6167
// if parseYear == 0 {
6268
// parseYear = time.Now().Year()
6369
// }
64-
debugf("parseYear: %d\n", parseYear)
70+
debugf("parseDTTZ: %q\n", parseDTTZ.String())
6571

6672
if dateMode == "" {
67-
if timeZone != nil && strings.HasPrefix(timeZone.Name, "America/") {
73+
if refDTTZ != nil && refDTTZ.TimeZone != nil && strings.HasPrefix(refDTTZ.TimeZone.Name, "America/") {
6874
dateMode = "na"
6975
} else {
7076
dateMode = "rest"
@@ -73,8 +79,8 @@ func Parse(year int, dateMode string, timeZone *TimeZone, in string) (*DateTimeT
7379
parseDateMode = dateMode
7480
debugf("parseDateMode: %q\n", parseDateMode)
7581

76-
parseTimeZone = timeZone
77-
debugf("parseTimeZone: %q\n", parseTimeZone)
82+
// parseTimeZone = timeZone
83+
// debugf("parseTimeZone: %q\n", parseTimeZone)
7884

7985
g := &glr.Grammar{
8086
Rules: datetimeRules,

datetime/parse_glr.go

+702-652
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

datetime/parse_lex.go

+8
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ func (l *datetimeLexer) Lex(lval *yySymType) int {
134134
return CALENDAR
135135
case "date":
136136
return DATE
137+
case "dates":
138+
return DATES
137139
case "from":
138140
return FROM
139141
case "google":
@@ -150,14 +152,20 @@ func (l *datetimeLexer) Lex(lval *yySymType) int {
150152
return OF
151153
case "on":
152154
return ON
155+
case "part":
156+
return PART
153157
case "pm":
154158
return PM
159+
case "save":
160+
return SAVE
155161
case "through":
156162
return THROUGH
157163
case "t":
158164
return T
159165
case "th":
160166
return TH
167+
case "the":
168+
return THE
161169
case "till":
162170
return TILL
163171
case "time":

datetime/parse_test.go

+135-63
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)