Skip to content

Commit 26e1b5f

Browse files
committed
Refactor cacheable cursor create time
1 parent f0ead1c commit 26e1b5f

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

server/core_channel.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
138138
userIDOne := stream.Subject.String()
139139
userIDTwo := stream.Subcontext.String()
140140
messages := make([]*api.ChannelMessage, 0, limit)
141-
createTimeNano := make(map[string]int64)
142141
var nextCursor, prevCursor *channelMessageListCursor
143142

144143
var dbID string
@@ -148,19 +147,23 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
148147
var dbContent string
149148
var dbCreateTime pgtype.Timestamptz
150149
var dbUpdateTime pgtype.Timestamptz
150+
var dbFirstCreateTimeNano int64
151+
var dbLastCreateTimeNano int64
151152
for rows.Next() {
152153
if len(messages) >= limit {
154+
dbLastCreateTimeNano = dbCreateTime.Time.UnixNano()
153155
nextCursor = &channelMessageListCursor{
154156
StreamMode: stream.Mode,
155157
StreamSubject: stream.Subject.String(),
156158
StreamSubcontext: stream.Subcontext.String(),
157159
StreamLabel: stream.Label,
158-
CreateTime: dbCreateTime.Time.UnixNano(),
160+
CreateTime: dbLastCreateTimeNano,
159161
Id: dbID,
160162
Forward: forward,
161163
IsNext: true,
162164
}
163165
break
166+
164167
}
165168

166169
err = rows.Scan(&dbID, &dbCode, &dbSenderID, &dbUsername, &dbContent, &dbCreateTime, &dbUpdateTime)
@@ -181,7 +184,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
181184
UpdateTime: &timestamppb.Timestamp{Seconds: dbUpdateTime.Time.Unix()},
182185
Persistent: &wrapperspb.BoolValue{Value: true},
183186
}
184-
createTimeNano[dbID] = dbCreateTime.Time.UnixNano()
185187
switch stream.Mode {
186188
case StreamModeChannel:
187189
message.RoomName = stream.Label
@@ -194,14 +196,17 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
194196

195197
messages = append(messages, message)
196198

199+
if dbFirstCreateTimeNano == 0 {
200+
dbFirstCreateTimeNano = dbCreateTime.Time.UnixNano()
201+
}
197202
// There can only be a previous page if this is a paginated listing.
198203
if incomingCursor != nil && prevCursor == nil {
199204
prevCursor = &channelMessageListCursor{
200205
StreamMode: stream.Mode,
201206
StreamSubject: stream.Subject.String(),
202207
StreamSubcontext: stream.Subcontext.String(),
203208
StreamLabel: stream.Label,
204-
CreateTime: dbCreateTime.Time.UnixNano(),
209+
CreateTime: dbFirstCreateTimeNano,
205210
Id: dbID,
206211
Forward: forward,
207212
IsNext: false,
@@ -210,6 +215,7 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
210215
}
211216
_ = rows.Close()
212217

218+
flipped := false
213219
if incomingCursor != nil && !incomingCursor.IsNext {
214220
// If this was a previous page listing, flip the results to their normal order and swap the cursors.
215221
nextCursor, prevCursor = prevCursor, nextCursor
@@ -223,17 +229,22 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
223229
for i, j := 0, len(messages)-1; i < j; i, j = i+1, j-1 {
224230
messages[i], messages[j] = messages[j], messages[i]
225231
}
232+
flipped = true
226233
}
227234

228235
var cacheableCursor *channelMessageListCursor
229236
if l := len(messages); l > 0 {
237+
createTime := dbLastCreateTimeNano
238+
if flipped {
239+
createTime = dbFirstCreateTimeNano
240+
}
230241
// There is at least 1 message returned by the listing, so use it as the foundation of a new cacheable cursor.
231242
cacheableCursor = &channelMessageListCursor{
232243
StreamMode: stream.Mode,
233244
StreamSubject: stream.Subject.String(),
234245
StreamSubcontext: stream.Subcontext.String(),
235246
StreamLabel: stream.Label,
236-
CreateTime: createTimeNano[messages[l-1].MessageId],
247+
CreateTime: createTime,
237248
Id: messages[l-1].MessageId,
238249
Forward: true,
239250
IsNext: true,
@@ -348,7 +359,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
348359
if start > 0 {
349360
// Check if there might be a prev cursor
350361
setPrevCursor = true
351-
firstRecords = firstRecords[:len(firstRecords)-1]
352362
}
353363

354364
records = records[start:end]

0 commit comments

Comments
 (0)