aboutsummaryrefslogtreecommitdiff
path: root/syncapi/storage/postgres
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2022-04-26 10:53:17 +0200
committerGitHub <noreply@github.com>2022-04-26 10:53:17 +0200
commite8be2b234f616c8422372665c845d9a7a1af245f (patch)
treee7b058caf5ffebf9a7c589a0c45997e1b2b89490 /syncapi/storage/postgres
parentfeac9db43fc459f1efa10424dfc96f8d54b55c64 (diff)
Add heroes to the room summary (#2373)
* Implement room summary heroes * Add passing tests * Move MembershipCount to addRoomSummary * Add comments, close Statement
Diffstat (limited to 'syncapi/storage/postgres')
-rw-r--r--syncapi/storage/postgres/memberships_table.go38
1 files changed, 31 insertions, 7 deletions
diff --git a/syncapi/storage/postgres/memberships_table.go b/syncapi/storage/postgres/memberships_table.go
index 39fa656c..8c049977 100644
--- a/syncapi/storage/postgres/memberships_table.go
+++ b/syncapi/storage/postgres/memberships_table.go
@@ -19,6 +19,8 @@ import (
"database/sql"
"fmt"
+ "github.com/lib/pq"
+ "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"
@@ -61,9 +63,13 @@ const selectMembershipCountSQL = "" +
" SELECT DISTINCT ON (room_id, user_id) room_id, user_id, membership FROM syncapi_memberships WHERE room_id = $1 AND stream_pos <= $2 ORDER BY room_id, user_id, stream_pos DESC" +
") t WHERE t.membership = $3"
+const selectHeroesSQL = "" +
+ "SELECT user_id FROM syncapi_memberships WHERE room_id = $1 AND user_id != $2 AND membership = ANY($3) LIMIT 5"
+
type membershipsStatements struct {
upsertMembershipStmt *sql.Stmt
selectMembershipCountStmt *sql.Stmt
+ selectHeroesStmt *sql.Stmt
}
func NewPostgresMembershipsTable(db *sql.DB) (tables.Memberships, error) {
@@ -72,13 +78,11 @@ func NewPostgresMembershipsTable(db *sql.DB) (tables.Memberships, error) {
if err != nil {
return nil, err
}
- if s.upsertMembershipStmt, err = db.Prepare(upsertMembershipSQL); err != nil {
- return nil, err
- }
- if s.selectMembershipCountStmt, err = db.Prepare(selectMembershipCountSQL); err != nil {
- return nil, err
- }
- return s, nil
+ return s, sqlutil.StatementList{
+ {&s.upsertMembershipStmt, upsertMembershipSQL},
+ {&s.selectMembershipCountStmt, selectMembershipCountSQL},
+ {&s.selectHeroesStmt, selectHeroesSQL},
+ }.Prepare(db)
}
func (s *membershipsStatements) UpsertMembership(
@@ -108,3 +112,23 @@ func (s *membershipsStatements) SelectMembershipCount(
err = stmt.QueryRowContext(ctx, roomID, pos, membership).Scan(&count)
return
}
+
+func (s *membershipsStatements) SelectHeroes(
+ ctx context.Context, txn *sql.Tx, roomID, userID string, memberships []string,
+) (heroes []string, err error) {
+ stmt := sqlutil.TxStmt(txn, s.selectHeroesStmt)
+ var rows *sql.Rows
+ rows, err = stmt.QueryContext(ctx, roomID, userID, pq.StringArray(memberships))
+ if err != nil {
+ return
+ }
+ defer internal.CloseAndLogIfError(ctx, rows, "SelectHeroes: rows.close() failed")
+ var hero string
+ for rows.Next() {
+ if err = rows.Scan(&hero); err != nil {
+ return
+ }
+ heroes = append(heroes, hero)
+ }
+ return heroes, rows.Err()
+}