[performance] convert enum strings to ints (#3558)

* convert statuses.visibility and notifications.notification_type columns from type string -> int for performance / space savings

* fix test trying to compare string to int

* fix instance count query using string literal instead of gtsmodel const type

* ensure a default value is always set

* also migrate the account settings and sin bin status tables

* initialize maps outside loops and place into singular enum mapping creation func

* use int16 for enum types

* update sinbinstatus creation to be from a snapshot at initial creation

* add snapshot of poll type at creation time
This commit is contained in:
kim
2024-11-25 13:48:59 +00:00
committed by GitHub
parent 934e895ec0
commit cac9d65029
32 changed files with 940 additions and 91 deletions

View File

@ -18,11 +18,13 @@
package util
import (
"errors"
"fmt"
"strconv"
"strings"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
)
const (
@ -216,6 +218,51 @@ func ParseInteractionReblogs(value string, defaultValue bool) (bool, gtserror.Wi
return parseBool(value, defaultValue, InteractionReblogsKey)
}
func ParseNotificationType(value string) (gtsmodel.NotificationType, gtserror.WithCode) {
switch strings.ToLower(value) {
case "follow":
return gtsmodel.NotificationFollow, nil
case "follow_request":
return gtsmodel.NotificationFollowRequest, nil
case "mention":
return gtsmodel.NotificationMention, nil
case "reblog":
return gtsmodel.NotificationReblog, nil
case "favourite":
return gtsmodel.NotificationFave, nil
case "poll":
return gtsmodel.NotificationPoll, nil
case "status":
return gtsmodel.NotificationStatus, nil
case "admin.sign_up":
return gtsmodel.NotificationSignup, nil
case "pending.favourite":
return gtsmodel.NotificationPendingFave, nil
case "pending.reply":
return gtsmodel.NotificationPendingReply, nil
case "pending.reblog":
return gtsmodel.NotificationPendingReblog, nil
default:
text := fmt.Sprintf("unrecognized notification type %s", value)
return 0, gtserror.NewErrorBadRequest(errors.New(text), text)
}
}
func ParseNotificationTypes(values []string) ([]gtsmodel.NotificationType, gtserror.WithCode) {
if len(values) == 0 {
return nil, nil
}
ntypes := make([]gtsmodel.NotificationType, len(values))
for i, value := range values {
ntype, errWithCode := ParseNotificationType(value)
if errWithCode != nil {
return nil, errWithCode
}
ntypes[i] = ntype
}
return ntypes, nil
}
/*
Parse functions for *REQUIRED* parameters.
*/