summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2022-11-18 17:28:33 +0000
committerLibravatar GitHub <noreply@github.com>2022-11-18 18:28:33 +0100
commitdccc2eee81c0c9ca4496bcb326812268c22ee732 (patch)
tree4ab70910dc5f3557b0f0fe312d7c475a6dd96c91
parent[performance] don't use relations to select notification structs, use caches ... (diff)
downloadgotosocial-dccc2eee81c0c9ca4496bcb326812268c22ee732.tar.xz
[performance] replace status query relationals with separate calls in order to rely on caches more (#1073)
Signed-off-by: kim <grufwub@gmail.com> Signed-off-by: kim <grufwub@gmail.com>
-rw-r--r--internal/db/bundb/bundb.go2
-rw-r--r--internal/db/bundb/status.go58
2 files changed, 50 insertions, 10 deletions
diff --git a/internal/db/bundb/bundb.go b/internal/db/bundb/bundb.go
index de6749ca4..44b0b1807 100644
--- a/internal/db/bundb/bundb.go
+++ b/internal/db/bundb/bundb.go
@@ -174,6 +174,8 @@ func NewBunDBService(ctx context.Context) (db.DB, error) {
account.status = status
admin.users = user
status.accounts = account
+ status.emojis = emoji
+ status.mentions = mention
timeline.status = status
// Initialize db structs
diff --git a/internal/db/bundb/status.go b/internal/db/bundb/status.go
index b4ae40607..e01bb7bf2 100644
--- a/internal/db/bundb/status.go
+++ b/internal/db/bundb/status.go
@@ -36,6 +36,8 @@ type statusDB struct {
conn *DBConn
cache *result.Cache[*gtsmodel.Status]
accounts *accountDB
+ emojis *emojiDB
+ mentions *mentionDB
}
func (s *statusDB) init() {
@@ -61,11 +63,6 @@ func (s *statusDB) newStatusQ(status interface{}) *bun.SelectQuery {
Model(status).
Relation("Attachments").
Relation("Tags").
- Relation("Mentions").
- Relation("Emojis").
- Relation("Account").
- Relation("InReplyToAccount").
- Relation("BoostOfAccount").
Relation("CreatedWithApplication")
}
@@ -121,10 +118,21 @@ func (s *statusDB) getStatus(ctx context.Context, lookup string, dbQuery func(*g
return nil, s.conn.ProcessError(err)
}
- // If there is boosted, fetch from DB also
+ if status.InReplyToID != "" {
+ // Also load in-reply-to status
+ status.InReplyTo = &gtsmodel.Status{}
+ err := s.conn.NewSelect().Model(status.InReplyTo).
+ Where("? = ?", bun.Ident("status.id"), status.InReplyToID).
+ Scan(ctx)
+ if err != nil {
+ return nil, s.conn.ProcessError(err)
+ }
+ }
+
if status.BoostOfID != "" {
+ // Also load original boosted status
status.BoostOf = &gtsmodel.Status{}
- err := s.newStatusQ(status.BoostOf).
+ err := s.conn.NewSelect().Model(status.BoostOf).
Where("? = ?", bun.Ident("status.id"), status.BoostOfID).
Scan(ctx)
if err != nil {
@@ -140,13 +148,43 @@ func (s *statusDB) getStatus(ctx context.Context, lookup string, dbQuery func(*g
}
// Set the status author account
- author, err := s.accounts.GetAccountByID(ctx, status.AccountID)
+ status.Account, err = s.accounts.GetAccountByID(ctx, status.AccountID)
if err != nil {
return nil, err
}
- // Return the prepared status
- status.Account = author
+ if id := status.BoostOfAccountID; id != "" {
+ // Set boost of status' author account
+ status.BoostOfAccount, err = s.accounts.GetAccountByID(ctx, id)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ if id := status.InReplyToAccountID; id != "" {
+ // Set in-reply-to status' author account
+ status.InReplyToAccount, err = s.accounts.GetAccountByID(ctx, id)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ if len(status.EmojiIDs) > 0 {
+ // Fetch status emojis
+ status.Emojis, err = s.emojis.emojisFromIDs(ctx, status.EmojiIDs)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ if len(status.MentionIDs) > 0 {
+ // Fetch status mentions
+ status.Mentions, err = s.mentions.GetMentions(ctx, status.MentionIDs)
+ if err != nil {
+ return nil, err
+ }
+ }
+
return status, nil
}