From 3cceed11b28b5f42a653d85ed779d652fd8c26ad Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:10:13 +0200 Subject: [feature/performance] Store account stats in separate table (#2831) * [feature/performance] Store account stats in separate table, get stats from remote * test account stats * add some missing increment / decrement calls * change stats function signatures * rejig logging a bit * use lock when updating stats --- internal/gtsmodel/account.go | 1 + internal/gtsmodel/accountstats.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 internal/gtsmodel/accountstats.go (limited to 'internal/gtsmodel') diff --git a/internal/gtsmodel/account.go b/internal/gtsmodel/account.go index 3bbcb37e3..79a35e561 100644 --- a/internal/gtsmodel/account.go +++ b/internal/gtsmodel/account.go @@ -80,6 +80,7 @@ type Account struct { SuspendedAt time.Time `bun:"type:timestamptz,nullzero"` // When was this account suspended (eg., don't allow it to log in/post, don't accept media/posts from this account) SuspensionOrigin string `bun:"type:CHAR(26),nullzero"` // id of the database entry that caused this account to become suspended -- can be an account ID or a domain block ID Settings *AccountSettings `bun:"-"` // gtsmodel.AccountSettings for this account. + Stats *AccountStats `bun:"-"` // gtsmodel.AccountStats for this account. } // IsLocal returns whether account is a local user account. diff --git a/internal/gtsmodel/accountstats.go b/internal/gtsmodel/accountstats.go new file mode 100644 index 000000000..92b50d5e3 --- /dev/null +++ b/internal/gtsmodel/accountstats.go @@ -0,0 +1,33 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package gtsmodel + +import "time" + +// AccountStats models statistics +// for a remote or local account. +type AccountStats struct { + AccountID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // AccountID of this AccountStats. + RegeneratedAt time.Time `bun:"type:timestamptz,nullzero"` // Time this stats model was last regenerated (ie., created from scratch using COUNTs). + FollowersCount *int `bun:",nullzero,notnull"` // Number of accounts following AccountID. + FollowingCount *int `bun:",nullzero,notnull"` // Number of accounts followed by AccountID. + FollowRequestsCount *int `bun:",nullzero,notnull"` // Number of pending follow requests aimed at AccountID. + StatusesCount *int `bun:",nullzero,notnull"` // Number of statuses created by AccountID. + StatusesPinnedCount *int `bun:",nullzero,notnull"` // Number of statuses pinned by AccountID. + LastStatusAt time.Time `bun:"type:timestamptz,nullzero"` // Time of most recent status created by AccountID. +} -- cgit v1.2.3