Rudimentary pagination of rooms in the rooms filter

This commit is contained in:
Neil Alexander 2021-04-28 14:29:17 +01:00
parent ce112cf21b
commit 10c41a7a18
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
8 changed files with 185 additions and 13 deletions

View file

@ -19,6 +19,7 @@ import (
"database/sql"
"fmt"
"github.com/matrix-org/dendrite/internal"
"github.com/matrix-org/dendrite/internal/sqlutil"
"github.com/matrix-org/dendrite/syncapi/storage/tables"
"github.com/matrix-org/dendrite/syncapi/types"
@ -62,9 +63,14 @@ const selectMembershipSQL = "" +
" ORDER BY stream_pos DESC" +
" LIMIT 1"
const selectMembershipsSQL = "" +
"SELECT room_id, membership FROM syncapi_memberships" +
" WHERE user_id = $1"
type membershipsStatements struct {
upsertMembershipStmt *sql.Stmt
selectMembershipStmt *sql.Stmt
upsertMembershipStmt *sql.Stmt
selectMembershipStmt *sql.Stmt
selectMembershipsStmt *sql.Stmt
}
func NewPostgresMembershipsTable(db *sql.DB) (tables.Memberships, error) {
@ -79,6 +85,9 @@ func NewPostgresMembershipsTable(db *sql.DB) (tables.Memberships, error) {
if s.selectMembershipStmt, err = db.Prepare(selectMembershipSQL); err != nil {
return nil, err
}
if s.selectMembershipsStmt, err = db.Prepare(selectMembershipsSQL); err != nil {
return nil, err
}
return s, nil
}
@ -109,3 +118,24 @@ func (s *membershipsStatements) SelectMembership(
err = stmt.QueryRowContext(ctx, roomID, userID, memberships).Scan(&eventID, &streamPos, &topologyPos)
return
}
func (s *membershipsStatements) SelectMemberships(
ctx context.Context, txn *sql.Tx, userID string,
) (map[string]string, error) {
var roomID, membership string
result := map[string]string{}
stmt := sqlutil.TxStmt(txn, s.selectMembershipsStmt)
rows, err := stmt.QueryContext(ctx, userID)
if err != nil {
return nil, fmt.Errorf("stmt.QueryContext: %w", err)
}
defer internal.CloseAndLogIfError(ctx, rows, "failed to close rows")
for rows.Next() {
err = rows.Scan(&roomID, &membership)
if err != nil {
return nil, fmt.Errorf("rows.Scan: %w", err)
}
result[roomID] = membership
}
return result, nil
}

View file

@ -19,6 +19,7 @@ import (
"context"
"database/sql"
"encoding/json"
"fmt"
"sort"
"github.com/matrix-org/dendrite/internal"
@ -127,19 +128,27 @@ const selectStateInRangeSQL = "" +
" ORDER BY id ASC" +
" LIMIT $8"
const bulkSelectMaxStreamPositionsSQL = "" +
"SELECT room_id, MAX(id) AS id FROM syncapi_output_room_events" +
" WHERE room_id = ANY($1)" +
" GROUP BY room_id" +
" ORDER BY id DESC" +
" OFFSET $2 LIMIT $3"
const deleteEventsForRoomSQL = "" +
"DELETE FROM syncapi_output_room_events WHERE room_id = $1"
type outputRoomEventsStatements struct {
insertEventStmt *sql.Stmt
selectEventsStmt *sql.Stmt
selectMaxEventIDStmt *sql.Stmt
selectRecentEventsStmt *sql.Stmt
selectRecentEventsForSyncStmt *sql.Stmt
selectEarlyEventsStmt *sql.Stmt
selectStateInRangeStmt *sql.Stmt
updateEventJSONStmt *sql.Stmt
deleteEventsForRoomStmt *sql.Stmt
insertEventStmt *sql.Stmt
selectEventsStmt *sql.Stmt
selectMaxEventIDStmt *sql.Stmt
selectRecentEventsStmt *sql.Stmt
selectRecentEventsForSyncStmt *sql.Stmt
selectEarlyEventsStmt *sql.Stmt
selectStateInRangeStmt *sql.Stmt
updateEventJSONStmt *sql.Stmt
deleteEventsForRoomStmt *sql.Stmt
bulkSelectMaxStreamPositionsStmt *sql.Stmt
}
func NewPostgresEventsTable(db *sql.DB) (tables.Events, error) {
@ -175,6 +184,9 @@ func NewPostgresEventsTable(db *sql.DB) (tables.Events, error) {
if s.deleteEventsForRoomStmt, err = db.Prepare(deleteEventsForRoomSQL); err != nil {
return nil, err
}
if s.bulkSelectMaxStreamPositionsStmt, err = db.Prepare(bulkSelectMaxStreamPositionsSQL); err != nil {
return nil, err
}
return s, nil
}
@ -435,6 +447,28 @@ func (s *outputRoomEventsStatements) DeleteEventsForRoom(
return err
}
func (s *outputRoomEventsStatements) BulkSelectMaxStreamPositions(
ctx context.Context, txn *sql.Tx, roomIDs []string, offset, count int,
) (map[string]types.StreamPosition, error) {
result := map[string]types.StreamPosition{}
stmt := sqlutil.TxStmt(txn, s.bulkSelectMaxStreamPositionsStmt)
rows, err := stmt.QueryContext(ctx, roomIDs, offset, count)
if err != nil {
return nil, fmt.Errorf("stmt.QueryContext: %w", err)
}
defer internal.CloseAndLogIfError(ctx, rows, "failed to close rows")
for rows.Next() {
var roomID string
var pos types.StreamPosition
err = rows.Scan(&roomID, &pos)
if err != nil {
return nil, fmt.Errorf("rows.Scan: %w", err)
}
result[roomID] = pos
}
return result, nil
}
func rowsToStreamEvents(rows *sql.Rows) ([]types.StreamEvent, error) {
var result []types.StreamEvent
for rows.Next() {