From 7ec1e1332e7d04e74451acef18b41f389722b698 Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Fri, 19 Jan 2024 12:57:29 +0000 Subject: [performance] overhaul struct (+ result) caching library for simplicity, performance and multiple-result lookups (#2535) * rewrite cache library as codeberg.org/gruf/go-structr, implement in gotosocial * use actual go-structr release version (not just commit hash) * revert go toolchain changes (damn you go for auto changing this) * fix go mod woes * ensure %w is used in calls to errs.Appendf() * fix error checking * fix possible panic * remove unnecessary start/stop functions, move to main Cache{} struct, add note regarding which caches require start/stop * fix copy-paste artifact... :innocent: * fix all comment copy-paste artifacts * remove dropID() function, now we can just use slices.DeleteFunc() * use util.Deduplicate() instead of collate(), move collate to util * move orderByIDs() to util package and "generify" * add a util.DeleteIf() function, use this to delete entries on failed population * use slices.DeleteFunc() instead of util.DeleteIf() (i had the logic mixed up in my head somehow lol) * add note about how collate differs from deduplicate --- internal/typeutils/internaltoas.go | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) (limited to 'internal/typeutils/internaltoas.go') diff --git a/internal/typeutils/internaltoas.go b/internal/typeutils/internaltoas.go index c88fd2e11..dc25babaa 100644 --- a/internal/typeutils/internaltoas.go +++ b/internal/typeutils/internaltoas.go @@ -491,7 +491,7 @@ func (c *Converter) StatusToAS(ctx context.Context, s *gtsmodel.Status) (ap.Stat // tag -- mentions mentions := s.Mentions - if len(s.MentionIDs) > len(mentions) { + if len(s.MentionIDs) != len(mentions) { mentions, err = c.state.DB.GetMentions(ctx, s.MentionIDs) if err != nil { return nil, gtserror.Newf("error getting mentions: %w", err) @@ -507,14 +507,10 @@ func (c *Converter) StatusToAS(ctx context.Context, s *gtsmodel.Status) (ap.Stat // tag -- emojis emojis := s.Emojis - if len(s.EmojiIDs) > len(emojis) { - emojis = []*gtsmodel.Emoji{} - for _, emojiID := range s.EmojiIDs { - emoji, err := c.state.DB.GetEmojiByID(ctx, emojiID) - if err != nil { - return nil, gtserror.Newf("error getting emoji %s from database: %w", emojiID, err) - } - emojis = append(emojis, emoji) + if len(s.EmojiIDs) != len(emojis) { + emojis, err = c.state.DB.GetEmojisByIDs(ctx, s.EmojiIDs) + if err != nil { + return nil, gtserror.Newf("error getting emojis from database: %w", err) } } for _, emoji := range emojis { @@ -527,7 +523,7 @@ func (c *Converter) StatusToAS(ctx context.Context, s *gtsmodel.Status) (ap.Stat // tag -- hashtags hashtags := s.Tags - if len(s.TagIDs) > len(hashtags) { + if len(s.TagIDs) != len(hashtags) { hashtags, err = c.state.DB.GetTags(ctx, s.TagIDs) if err != nil { return nil, gtserror.Newf("error getting tags: %w", err) @@ -623,14 +619,10 @@ func (c *Converter) StatusToAS(ctx context.Context, s *gtsmodel.Status) (ap.Stat // attachments attachmentProp := streams.NewActivityStreamsAttachmentProperty() attachments := s.Attachments - if len(s.AttachmentIDs) > len(attachments) { - attachments = []*gtsmodel.MediaAttachment{} - for _, attachmentID := range s.AttachmentIDs { - attachment, err := c.state.DB.GetAttachmentByID(ctx, attachmentID) - if err != nil { - return nil, gtserror.Newf("error getting attachment %s from database: %w", attachmentID, err) - } - attachments = append(attachments, attachment) + if len(s.AttachmentIDs) != len(attachments) { + attachments, err = c.state.DB.GetAttachmentsByIDs(ctx, s.AttachmentIDs) + if err != nil { + return nil, gtserror.Newf("error getting attachments from database: %w", err) } } for _, a := range attachments { -- cgit v1.2.3