Skip to content

Commit 2051585

Browse files
authored
Convert int/int64 timestamps to time.Time (#786)
1 parent 83ef3eb commit 2051585

24 files changed

+227
-237
lines changed

common/archiver/filestore/queryParser.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838

3939
"go.temporal.io/server/common"
4040
"go.temporal.io/server/common/convert"
41+
"go.temporal.io/server/common/primitives/timestamp"
4142
)
4243

4344
type (
@@ -49,8 +50,8 @@ type (
4950
queryParser struct{}
5051

5152
parsedQuery struct {
52-
earliestCloseTime int64
53-
latestCloseTime int64
53+
earliestCloseTime time.Time
54+
latestCloseTime time.Time
5455
workflowID *string
5556
runID *string
5657
workflowTypeName *string
@@ -87,8 +88,8 @@ func (p *queryParser) Parse(query string) (*parsedQuery, error) {
8788
}
8889
whereExpr := stmt.(*sqlparser.Select).Where.Expr
8990
parsedQuery := &parsedQuery{
90-
earliestCloseTime: 0,
91-
latestCloseTime: time.Now().UnixNano(),
91+
earliestCloseTime: time.Time{},
92+
latestCloseTime: time.Now().UTC(),
9293
}
9394
if err := p.convertWhereExpr(whereExpr, parsedQuery); err != nil {
9495
return nil, err
@@ -196,7 +197,7 @@ func (p *queryParser) convertComparisonExpr(compExpr *sqlparser.ComparisonExpr,
196197
}
197198
parsedQuery.status = &status
198199
case CloseTime:
199-
timestamp, err := convertToTimestamp(valStr)
200+
timestamp, err := convertToTime(valStr)
200201
if err != nil {
201202
return err
202203
}
@@ -208,7 +209,7 @@ func (p *queryParser) convertComparisonExpr(compExpr *sqlparser.ComparisonExpr,
208209
return nil
209210
}
210211

211-
func (p *queryParser) convertCloseTime(timestamp int64, op string, parsedQuery *parsedQuery) error {
212+
func (p *queryParser) convertCloseTime(timestamp time.Time, op string, parsedQuery *parsedQuery) error {
212213
switch op {
213214
case "=":
214215
if err := p.convertCloseTime(timestamp, ">=", parsedQuery); err != nil {
@@ -218,33 +219,33 @@ func (p *queryParser) convertCloseTime(timestamp int64, op string, parsedQuery *
218219
return err
219220
}
220221
case "<":
221-
parsedQuery.latestCloseTime = common.MinInt64(parsedQuery.latestCloseTime, timestamp-1)
222+
parsedQuery.latestCloseTime = common.MinTime(parsedQuery.latestCloseTime, timestamp.Add(-1*time.Nanosecond))
222223
case "<=":
223-
parsedQuery.latestCloseTime = common.MinInt64(parsedQuery.latestCloseTime, timestamp)
224+
parsedQuery.latestCloseTime = common.MinTime(parsedQuery.latestCloseTime, timestamp)
224225
case ">":
225-
parsedQuery.earliestCloseTime = common.MaxInt64(parsedQuery.earliestCloseTime, timestamp+1)
226+
parsedQuery.earliestCloseTime = common.MaxTime(parsedQuery.earliestCloseTime, timestamp.Add(1*time.Nanosecond))
226227
case ">=":
227-
parsedQuery.earliestCloseTime = common.MaxInt64(parsedQuery.earliestCloseTime, timestamp)
228+
parsedQuery.earliestCloseTime = common.MaxTime(parsedQuery.earliestCloseTime, timestamp)
228229
default:
229230
return fmt.Errorf("operator %s is not supported for close time", op)
230231
}
231232
return nil
232233
}
233234

234-
func convertToTimestamp(timeStr string) (int64, error) {
235-
timestamp, err := strconv.ParseInt(timeStr, 10, 64)
235+
func convertToTime(timeStr string) (time.Time, error) {
236+
ts, err := strconv.ParseInt(timeStr, 10, 64)
236237
if err == nil {
237-
return timestamp, nil
238+
return timestamp.UnixOrZeroTime(ts), nil
238239
}
239240
timestampStr, err := extractStringValue(timeStr)
240241
if err != nil {
241-
return 0, err
242+
return time.Time{}, err
242243
}
243244
parsedTime, err := time.Parse(defaultDateTimeFormat, timestampStr)
244245
if err != nil {
245-
return 0, err
246+
return time.Time{}, err
246247
}
247-
return parsedTime.UnixNano(), nil
248+
return parsedTime, nil
248249
}
249250

250251
func convertStatusStr(statusStr string) (enumspb.WorkflowExecutionStatus, error) {

common/archiver/filestore/queryParser_test.go

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ package filestore
2626

2727
import (
2828
"testing"
29+
"time"
2930

3031
"github.com/stretchr/testify/require"
3132
"github.com/stretchr/testify/suite"
@@ -260,32 +261,32 @@ func (s *queryParserSuite) TestParseCloseTime() {
260261
query: "CloseTime <= 1000",
261262
expectErr: false,
262263
parsedQuery: &parsedQuery{
263-
earliestCloseTime: 0,
264-
latestCloseTime: 1000,
264+
earliestCloseTime: time.Time{},
265+
latestCloseTime: time.Unix(0, 1000),
265266
},
266267
},
267268
{
268269
query: "CloseTime < 2000 and CloseTime <= 1000 and CloseTime > 300",
269270
expectErr: false,
270271
parsedQuery: &parsedQuery{
271-
earliestCloseTime: 301,
272-
latestCloseTime: 1000,
272+
earliestCloseTime: time.Unix(0, 301),
273+
latestCloseTime: time.Unix(0, 1000),
273274
},
274275
},
275276
{
276277
query: "CloseTime = 2000 and (CloseTime > 1000 and CloseTime <= 9999)",
277278
expectErr: false,
278279
parsedQuery: &parsedQuery{
279-
earliestCloseTime: 2000,
280-
latestCloseTime: 2000,
280+
earliestCloseTime: time.Unix(0, 2000),
281+
latestCloseTime: time.Unix(0, 2000),
281282
},
282283
},
283284
{
284285
query: "CloseTime <= \"2019-01-01T11:11:11Z\" and CloseTime >= 1000000",
285286
expectErr: false,
286287
parsedQuery: &parsedQuery{
287-
earliestCloseTime: 1000000,
288-
latestCloseTime: 1546341071000000000,
288+
earliestCloseTime: time.Unix(0, 1000000),
289+
latestCloseTime: time.Date(2019, 01, 01, 11, 11, 11, 0, time.UTC),
289290
},
290291
},
291292
{
@@ -302,17 +303,17 @@ func (s *queryParserSuite) TestParseCloseTime() {
302303
},
303304
}
304305

305-
for _, tc := range testCases {
306+
for i, tc := range testCases {
306307
parsedQuery, err := s.parser.Parse(tc.query)
307308
if tc.expectErr {
308309
s.Error(err)
309310
continue
310311
}
311-
s.NoError(err)
312-
s.Equal(tc.parsedQuery.emptyResult, parsedQuery.emptyResult)
312+
s.NoError(err, "case %d", i)
313+
s.Equal(tc.parsedQuery.emptyResult, parsedQuery.emptyResult, "case %d", i)
313314
if !tc.parsedQuery.emptyResult {
314-
s.Equal(tc.parsedQuery.earliestCloseTime, parsedQuery.earliestCloseTime)
315-
s.Equal(tc.parsedQuery.latestCloseTime, parsedQuery.latestCloseTime)
315+
s.True(tc.parsedQuery.earliestCloseTime.Equal(parsedQuery.earliestCloseTime), "case %d", i)
316+
s.True(tc.parsedQuery.latestCloseTime.Equal(parsedQuery.latestCloseTime), "case %d", i)
316317
}
317318
}
318319
}
@@ -327,17 +328,17 @@ func (s *queryParserSuite) TestParse() {
327328
query: "CloseTime <= \"2019-01-01T11:11:11Z\" and WorkflowId = 'random workflowID'",
328329
expectErr: false,
329330
parsedQuery: &parsedQuery{
330-
earliestCloseTime: 0,
331-
latestCloseTime: 1546341071000000000,
331+
earliestCloseTime: time.Time{},
332+
latestCloseTime: time.Date(2019, 01, 01, 11, 11, 11, 0, time.UTC),
332333
workflowID: convert.StringPtr("random workflowID"),
333334
},
334335
},
335336
{
336337
query: "CloseTime > 1999 and CloseTime < 10000 and RunId = 'random runID' and ExecutionStatus = 'Failed'",
337338
expectErr: false,
338339
parsedQuery: &parsedQuery{
339-
earliestCloseTime: 2000,
340-
latestCloseTime: 9999,
340+
earliestCloseTime: time.Unix(0, 2000).UTC(),
341+
latestCloseTime: time.Unix(0, 9999).UTC(),
341342
runID: convert.StringPtr("random runID"),
342343
status: toWorkflowExecutionStatusPtr(enumspb.WORKFLOW_EXECUTION_STATUS_FAILED),
343344
},
@@ -351,16 +352,16 @@ func (s *queryParserSuite) TestParse() {
351352
},
352353
}
353354

354-
for _, tc := range testCases {
355+
for i, tc := range testCases {
355356
parsedQuery, err := s.parser.Parse(tc.query)
356357
if tc.expectErr {
357358
s.Error(err)
358359
continue
359360
}
360-
s.NoError(err)
361-
s.Equal(tc.parsedQuery.emptyResult, parsedQuery.emptyResult)
361+
s.NoError(err, "case %d", i)
362+
s.Equal(tc.parsedQuery.emptyResult, parsedQuery.emptyResult, "case %d", i)
362363
if !tc.parsedQuery.emptyResult {
363-
s.Equal(tc.parsedQuery, parsedQuery)
364+
s.Equal(tc.parsedQuery, parsedQuery, "case %d", i)
364365
}
365366
}
366367
}

common/archiver/filestore/visibilityArchiver.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"sort"
3333
"strconv"
3434
"strings"
35+
"time"
3536

3637
commonpb "go.temporal.io/api/common/v1"
3738
"go.temporal.io/api/serviceerror"
@@ -40,6 +41,7 @@ import (
4041
archiverspb "go.temporal.io/server/api/archiver/v1"
4142
"go.temporal.io/server/common/archiver"
4243
"go.temporal.io/server/common/log/tag"
44+
"go.temporal.io/server/common/primitives/timestamp"
4345
"go.temporal.io/server/common/service/config"
4446
)
4547

@@ -56,7 +58,7 @@ type (
5658
}
5759

5860
queryVisibilityToken struct {
59-
LastCloseTime int64
61+
LastCloseTime time.Time
6062
LastRunID string
6163
}
6264

@@ -215,7 +217,7 @@ func (v *visibilityArchiver) query(
215217
return nil, serviceerror.NewInternal(err.Error())
216218
}
217219

218-
if record.CloseTime.UnixNano() < request.parsedQuery.earliestCloseTime {
220+
if record.CloseTime.Before(request.parsedQuery.earliestCloseTime) {
219221
break
220222
}
221223

@@ -224,7 +226,7 @@ func (v *visibilityArchiver) query(
224226
if len(response.Executions) == request.pageSize {
225227
if idx != len(files) {
226228
newToken := &queryVisibilityToken{
227-
LastCloseTime: record.CloseTime.UnixNano(),
229+
LastCloseTime: timestamp.TimeValue(record.CloseTime),
228230
LastRunID: record.GetRunId(),
229231
}
230232
encodedToken, err := serializeToken(newToken)
@@ -251,7 +253,7 @@ func (v *visibilityArchiver) ValidateURI(URI archiver.URI) error {
251253

252254
type parsedVisFilename struct {
253255
name string
254-
closeTime int64
256+
closeTime time.Time
255257
hashedRunID string
256258
}
257259

@@ -273,26 +275,26 @@ func sortAndFilterFiles(filenames []string, token *queryVisibilityToken) ([]stri
273275
}
274276
parsedFilenames = append(parsedFilenames, &parsedVisFilename{
275277
name: name,
276-
closeTime: closeTime,
278+
closeTime: timestamp.UnixOrZeroTime(closeTime),
277279
hashedRunID: pieces[1],
278280
})
279281
}
280282

281283
sort.Slice(parsedFilenames, func(i, j int) bool {
282-
if parsedFilenames[i].closeTime == parsedFilenames[j].closeTime {
284+
if parsedFilenames[i].closeTime.Equal(parsedFilenames[j].closeTime) {
283285
return parsedFilenames[i].hashedRunID > parsedFilenames[j].hashedRunID
284286
}
285-
return parsedFilenames[i].closeTime > parsedFilenames[j].closeTime
287+
return parsedFilenames[i].closeTime.After(parsedFilenames[j].closeTime)
286288
})
287289

288290
startIdx := 0
289291
if token != nil {
290292
LastHashedRunID := hash(token.LastRunID)
291293
startIdx = sort.Search(len(parsedFilenames), func(i int) bool {
292-
if parsedFilenames[i].closeTime == token.LastCloseTime {
294+
if parsedFilenames[i].closeTime.Equal(token.LastCloseTime) {
293295
return parsedFilenames[i].hashedRunID < LastHashedRunID
294296
}
295-
return parsedFilenames[i].closeTime < token.LastCloseTime
297+
return parsedFilenames[i].closeTime.Before(token.LastCloseTime)
296298
})
297299
}
298300

@@ -308,7 +310,7 @@ func sortAndFilterFiles(filenames []string, token *queryVisibilityToken) ([]stri
308310
}
309311

310312
func matchQuery(record *archiverspb.ArchiveVisibilityRequest, query *parsedQuery) bool {
311-
if record.CloseTime.UnixNano() < query.earliestCloseTime || record.CloseTime.UnixNano() > query.latestCloseTime {
313+
if record.CloseTime.Before(query.earliestCloseTime) || record.CloseTime.After(query.latestCloseTime) {
312314
return false
313315
}
314316
if query.workflowID != nil && record.GetWorkflowId() != *query.workflowID {

0 commit comments

Comments
 (0)