fix(releases): improve load time by 47x (#565)

* fix(releases): improve load time by 47x

* fix(releases): optimize stats query

* remove the *

* change nil to actual 0

* feat(releases): flip recent to orderby id

* fix(stats): make postgres compatible

* return the * to COUNT for pgsql

Co-authored-by: ze0s <43699394+zze0s@users.noreply.github.com>
Co-authored-by: ze0s <ze0s@riseup.net>
This commit is contained in:
Kyle Sanderson 2022-12-16 11:43:09 -08:00 committed by GitHub
parent 5260777b6b
commit 0f3ce7573e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -4,8 +4,8 @@ import (
"context" "context"
"database/sql" "database/sql"
"fmt" "fmt"
"strings"
"regexp" "regexp"
"strings"
"time" "time"
"github.com/autobrr/autobrr/internal/domain" "github.com/autobrr/autobrr/internal/domain"
@ -126,9 +126,9 @@ func (repo *ReleaseRepo) Find(ctx context.Context, params domain.ReleaseQueryPar
func (repo *ReleaseRepo) findReleases(ctx context.Context, tx *Tx, params domain.ReleaseQueryParams) ([]*domain.Release, int64, int64, error) { func (repo *ReleaseRepo) findReleases(ctx context.Context, tx *Tx, params domain.ReleaseQueryParams) ([]*domain.Release, int64, int64, error) {
queryBuilder := repo.db.squirrel. queryBuilder := repo.db.squirrel.
Select("r.id", "r.filter_status", "r.rejections", "r.indexer", "r.filter", "r.protocol", "r.title", "r.torrent_name", "r.size", "r.timestamp", "COUNT(*) OVER() AS total_count"). Select("r.id", "r.filter_status", "r.rejections", "r.indexer", "r.filter", "r.protocol", "r.title", "r.torrent_name", "r.size", "r.timestamp", "(SELECT COUNT(*) FROM release) AS total_count").
From("release r"). From("release r").
OrderBy("r.timestamp DESC") OrderBy("r.id DESC")
if params.Limit > 0 { if params.Limit > 0 {
queryBuilder = queryBuilder.Limit(params.Limit) queryBuilder = queryBuilder.Limit(params.Limit)
@ -268,7 +268,7 @@ func (repo *ReleaseRepo) findRecentReleases(ctx context.Context, tx *Tx) ([]*dom
queryBuilder := repo.db.squirrel. queryBuilder := repo.db.squirrel.
Select("r.id", "r.filter_status", "r.rejections", "r.indexer", "r.filter", "r.protocol", "r.title", "r.torrent_name", "r.size", "r.timestamp"). Select("r.id", "r.filter_status", "r.rejections", "r.indexer", "r.filter", "r.protocol", "r.title", "r.torrent_name", "r.size", "r.timestamp").
From("release r"). From("release r").
OrderBy("r.timestamp DESC"). OrderBy("r.id DESC").
Limit(10) Limit(10)
query, args, err := queryBuilder.ToSql() query, args, err := queryBuilder.ToSql()
@ -430,14 +430,20 @@ func (repo *ReleaseRepo) attachActionStatus(ctx context.Context, tx *Tx, release
func (repo *ReleaseRepo) Stats(ctx context.Context) (*domain.ReleaseStats, error) { func (repo *ReleaseRepo) Stats(ctx context.Context) (*domain.ReleaseStats, error) {
query := `SELECT COUNT(*) total, query := `SELECT *
COALESCE(SUM(CASE WHEN filter_status = 'FILTER_APPROVED' THEN 1 ELSE 0 END), 0) AS filtered_count, FROM (
COALESCE(SUM(CASE WHEN filter_status = 'FILTER_REJECTED' THEN 1 ELSE 0 END), 0) AS filter_rejected_count, SELECT
(SELECT COALESCE(SUM(CASE WHEN status = 'PUSH_APPROVED' THEN 1 ELSE 0 END), 0) COUNT(*) AS total,
FROM "release_action_status") AS push_approved_count, COUNT(CASE WHEN filter_status = 'FILTER_APPROVED' THEN 0 END) AS filtered_count,
(SELECT COALESCE(SUM(CASE WHEN status = 'PUSH_REJECTED' THEN 1 ELSE 0 END), 0) COUNT(CASE WHEN filter_status = 'FILTER_REJECTED' THEN 0 END) AS filter_rejected_count
FROM "release_action_status") AS push_rejected_count FROM release
FROM "release";` ) AS zoo
CROSS JOIN (
SELECT
COUNT(CASE WHEN status = 'PUSH_APPROVED' THEN 0 END) AS push_approved_count,
COUNT(CASE WHEN status = 'PUSH_REJECTED' THEN 0 END) AS push_rejected_count
FROM release_action_status
) AS foo`
row := repo.db.handler.QueryRowContext(ctx, query) row := repo.db.handler.QueryRowContext(ctx, query)
if err := row.Err(); err != nil { if err := row.Err(); err != nil {