Skip to content

Commit

Permalink
[performance] replace status query relationals with separate calls in…
Browse files Browse the repository at this point in the history
… order to rely on caches more (#1073)

Signed-off-by: kim <grufwub@gmail.com>

Signed-off-by: kim <grufwub@gmail.com>
  • Loading branch information
NyaaaWhatsUpDoc committed Nov 18, 2022
1 parent d98a48b commit dccc2ee
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 10 deletions.
2 changes: 2 additions & 0 deletions internal/db/bundb/bundb.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
58 changes: 48 additions & 10 deletions internal/db/bundb/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ type statusDB struct {
conn *DBConn
cache *result.Cache[*gtsmodel.Status]
accounts *accountDB
emojis *emojiDB
mentions *mentionDB
}

func (s *statusDB) init() {
Expand All @@ -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")
}

Expand Down Expand Up @@ -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 {
Expand All @@ -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
}

Expand Down

0 comments on commit dccc2ee

Please sign in to comment.