mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-16 18:43:10 -06:00
Pagination probably works now
This commit is contained in:
parent
9907ffaf2c
commit
2a374fc272
|
|
@ -75,15 +75,9 @@ func Relations(req *http.Request, device *api.Device, syncDB storage.Database, r
|
||||||
var succeeded bool
|
var succeeded bool
|
||||||
defer sqlutil.EndTransactionWithCheck(snapshot, &succeeded, &err)
|
defer sqlutil.EndTransactionWithCheck(snapshot, &succeeded, &err)
|
||||||
|
|
||||||
if to == 0 {
|
|
||||||
if to, err = snapshot.MaxStreamPositionForRelations(req.Context()); err != nil {
|
|
||||||
return util.ErrorResponse(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res := &RelationsResponse{}
|
res := &RelationsResponse{}
|
||||||
res.Chunk, res.PrevBatch, res.NextBatch, err = snapshot.RelationsFor(
|
res.Chunk, res.PrevBatch, res.NextBatch, err = snapshot.RelationsFor(
|
||||||
req.Context(), roomID, eventID, relType, eventType, from, to, limit,
|
req.Context(), roomID, eventID, relType, eventType, from, to, dir == "b", limit,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return util.ErrorResponse(err)
|
return util.ErrorResponse(err)
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@ type DatabaseTransaction interface {
|
||||||
GetUserUnreadNotificationCountsForRooms(ctx context.Context, userID string, roomIDs map[string]string) (map[string]*eventutil.NotificationData, error)
|
GetUserUnreadNotificationCountsForRooms(ctx context.Context, userID string, roomIDs map[string]string) (map[string]*eventutil.NotificationData, error)
|
||||||
GetPresence(ctx context.Context, userID string) (*types.PresenceInternal, error)
|
GetPresence(ctx context.Context, userID string) (*types.PresenceInternal, error)
|
||||||
PresenceAfter(ctx context.Context, after types.StreamPosition, filter gomatrixserverlib.EventFilter) (map[string]*types.PresenceInternal, error)
|
PresenceAfter(ctx context.Context, after types.StreamPosition, filter gomatrixserverlib.EventFilter) (map[string]*types.PresenceInternal, error)
|
||||||
RelationsFor(ctx context.Context, roomID, eventID, relType, eventType string, from, to types.StreamPosition, limit int) (clientEvents []gomatrixserverlib.ClientEvent, prevBatch, nextBatch string, err error)
|
RelationsFor(ctx context.Context, roomID, eventID, relType, eventType string, from, to types.StreamPosition, backwards bool, limit int) (clientEvents []gomatrixserverlib.ClientEvent, prevBatch, nextBatch string, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Database interface {
|
type Database interface {
|
||||||
|
|
|
||||||
|
|
@ -50,12 +50,12 @@ const deleteRelationSQL = "" +
|
||||||
|
|
||||||
const selectRelationsInRangeSQL = "" +
|
const selectRelationsInRangeSQL = "" +
|
||||||
"SELECT id, room_id, child_event_id, rel_type FROM syncapi_relations" +
|
"SELECT id, room_id, child_event_id, rel_type FROM syncapi_relations" +
|
||||||
" WHERE room_id = $1 AND event_id = $2 AND id > $3 AND id <= $4" +
|
" WHERE room_id = $1 AND event_id = $2 AND id >= $3 AND id <= $4" +
|
||||||
" ORDER BY id DESC LIMIT $5"
|
" ORDER BY id DESC LIMIT $5"
|
||||||
|
|
||||||
const selectRelationsByTypeInRangeSQL = "" +
|
const selectRelationsByTypeInRangeSQL = "" +
|
||||||
"SELECT id, room_id, child_event_id, rel_type FROM syncapi_relations" +
|
"SELECT id, room_id, child_event_id, rel_type FROM syncapi_relations" +
|
||||||
" WHERE room_id = $1 AND event_id = $2 AND rel_type = $3 AND id > $4 AND id <= $5" +
|
" WHERE room_id = $1 AND event_id = $2 AND rel_type = $3 AND id >= $4 AND id <= $5" +
|
||||||
" ORDER BY id DESC LIMIT $6"
|
" ORDER BY id DESC LIMIT $6"
|
||||||
|
|
||||||
const selectMaxRelationIDSQL = "" +
|
const selectMaxRelationIDSQL = "" +
|
||||||
|
|
|
||||||
|
|
@ -595,7 +595,7 @@ func (d *DatabaseTransaction) MaxStreamPositionForRelations(ctx context.Context)
|
||||||
return types.StreamPosition(id), err
|
return types.StreamPosition(id), err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DatabaseTransaction) RelationsFor(ctx context.Context, roomID, eventID, relType, eventType string, from, to types.StreamPosition, limit int) (
|
func (d *DatabaseTransaction) RelationsFor(ctx context.Context, roomID, eventID, relType, eventType string, from, to types.StreamPosition, backwards bool, limit int) (
|
||||||
clientEvents []gomatrixserverlib.ClientEvent, prevBatch, nextBatch string, err error,
|
clientEvents []gomatrixserverlib.ClientEvent, prevBatch, nextBatch string, err error,
|
||||||
) {
|
) {
|
||||||
clientEvents = []gomatrixserverlib.ClientEvent{}
|
clientEvents = []gomatrixserverlib.ClientEvent{}
|
||||||
|
|
@ -603,7 +603,16 @@ func (d *DatabaseTransaction) RelationsFor(ctx context.Context, roomID, eventID,
|
||||||
r := types.Range{
|
r := types.Range{
|
||||||
From: from,
|
From: from,
|
||||||
To: to,
|
To: to,
|
||||||
Backwards: from > to,
|
Backwards: backwards,
|
||||||
|
}
|
||||||
|
if r.To == 0 && !backwards {
|
||||||
|
if r.To, err = d.MaxStreamPositionForRelations(ctx); err != nil {
|
||||||
|
return nil, "", "", fmt.Errorf("d.MaxStreamPositionForRelations: %w", err)
|
||||||
|
}
|
||||||
|
} else if r.From == 0 && backwards {
|
||||||
|
if r.From, err = d.MaxStreamPositionForRelations(ctx); err != nil {
|
||||||
|
return nil, "", "", fmt.Errorf("d.MaxStreamPositionForRelations: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// First up look up any relations from the database. We add one to the limit here
|
// First up look up any relations from the database. We add one to the limit here
|
||||||
|
|
@ -633,7 +642,7 @@ func (d *DatabaseTransaction) RelationsFor(ctx context.Context, roomID, eventID,
|
||||||
// Otherwise, let's try and work out what sensible prev_batch and next_batch values
|
// Otherwise, let's try and work out what sensible prev_batch and next_batch values
|
||||||
// could be.
|
// could be.
|
||||||
if from > 0 {
|
if from > 0 {
|
||||||
prevBatch = fmt.Sprintf("%d", entries[0].Position-1)
|
prevBatch = fmt.Sprintf("%d", r.Low()-1)
|
||||||
}
|
}
|
||||||
if len(entries) > limit {
|
if len(entries) > limit {
|
||||||
nextBatch = fmt.Sprintf("%d", entries[len(entries)-1].Position)
|
nextBatch = fmt.Sprintf("%d", entries[len(entries)-1].Position)
|
||||||
|
|
|
||||||
|
|
@ -48,12 +48,12 @@ const deleteRelationSQL = "" +
|
||||||
|
|
||||||
const selectRelationsInRangeSQL = "" +
|
const selectRelationsInRangeSQL = "" +
|
||||||
"SELECT id, room_id, child_event_id, rel_type FROM syncapi_relations" +
|
"SELECT id, room_id, child_event_id, rel_type FROM syncapi_relations" +
|
||||||
" WHERE room_id = $1 AND event_id = $2 AND id > $3 AND id <= $4" +
|
" WHERE room_id = $1 AND event_id = $2 AND id >= $3 AND id <= $4" +
|
||||||
" ORDER BY id DESC LIMIT $5"
|
" ORDER BY id DESC LIMIT $5"
|
||||||
|
|
||||||
const selectRelationsByTypeInRangeSQL = "" +
|
const selectRelationsByTypeInRangeSQL = "" +
|
||||||
"SELECT id, room_id, child_event_id, rel_type FROM syncapi_relations" +
|
"SELECT id, room_id, child_event_id, rel_type FROM syncapi_relations" +
|
||||||
" WHERE room_id = $1 AND event_id = $2 AND rel_type = $3 AND id > $4 AND id <= $5" +
|
" WHERE room_id = $1 AND event_id = $2 AND rel_type = $3 AND id >= $4 AND id <= $5" +
|
||||||
" ORDER BY id DESC LIMIT $6"
|
" ORDER BY id DESC LIMIT $6"
|
||||||
|
|
||||||
const selectMaxRelationIDSQL = "" +
|
const selectMaxRelationIDSQL = "" +
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue