From cc107f91c31eda615b1355a41c5c12d463756ad1 Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Thu, 28 Aug 2025 09:46:42 +0100 Subject: [PATCH] appview/db: add db helpers to count entries Change-Id: xwoxumswnrqqolmqtuuxyrpktqsqplxn Signed-off-by: oppiliappan --- appview/db/follow.go | 8 ++-- appview/db/repos.go | 89 ++++++++++++------------------------------- appview/db/star.go | 26 +++++++++++++ appview/db/strings.go | 24 ++++++++++++ 4 files changed, 79 insertions(+), 68 deletions(-) diff --git a/appview/db/follow.go b/appview/db/follow.go index b28d57de..67c1f283 100644 --- a/appview/db/follow.go +++ b/appview/db/follow.go @@ -56,12 +56,12 @@ func DeleteFollowByRkey(e Execer, userDid, rkey string) error { } type FollowStats struct { - Followers int - Following int + Followers int64 + Following int64 } func GetFollowerFollowingCount(e Execer, did string) (FollowStats, error) { - followers, following := 0, 0 + var followers, following int64 err := e.QueryRow( `SELECT COUNT(CASE WHEN subject_did = ? THEN 1 END) AS followers, @@ -122,7 +122,7 @@ func GetFollowerFollowingCounts(e Execer, dids []string) (map[string]FollowStats for rows.Next() { var did string - var followers, following int + var followers, following int64 if err := rows.Scan(&did, &followers, &following); err != nil { return nil, err } diff --git a/appview/db/repos.go b/appview/db/repos.go index bca27aca..d240469c 100644 --- a/appview/db/repos.go +++ b/appview/db/repos.go @@ -2,6 +2,7 @@ package db import ( "database/sql" + "errors" "fmt" "log" "slices" @@ -38,40 +39,6 @@ func (r Repo) DidSlashRepo() string { return p } -func GetAllRepos(e Execer, limit int) ([]Repo, error) { - var repos []Repo - - rows, err := e.Query( - `select did, name, knot, rkey, description, created, source - from repos - order by created desc - limit ? - `, - limit, - ) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - var repo Repo - err := scanRepo( - rows, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &repo.Description, &repo.Created, &repo.Source, - ) - if err != nil { - return nil, err - } - repos = append(repos, repo) - } - - if err := rows.Err(); err != nil { - return nil, err - } - - return repos, nil -} - func GetRepos(e Execer, limit int, filters ...filter) ([]Repo, error) { repoMap := make(map[syntax.ATURI]*Repo) @@ -318,6 +285,30 @@ func GetRepos(e Execer, limit int, filters ...filter) ([]Repo, error) { return repos, nil } +func CountRepos(e Execer, filters ...filter) (int64, error) { + var conditions []string + var args []any + for _, filter := range filters { + conditions = append(conditions, filter.Condition()) + args = append(args, filter.Arg()...) + } + + whereClause := "" + if conditions != nil { + whereClause = " where " + strings.Join(conditions, " and ") + } + + repoQuery := fmt.Sprintf(`select count(1) from repos %s`, whereClause) + var count int64 + err := e.QueryRow(repoQuery, args...).Scan(&count) + + if !errors.Is(err, sql.ErrNoRows) && err != nil { + return 0, err + } + + return count, nil +} + func GetAllReposByDid(e Execer, did string) ([]Repo, error) { var repos []Repo @@ -570,33 +561,3 @@ type RepoStats struct { IssueCount IssueCount PullCount PullCount } - -func scanRepo(rows *sql.Rows, did, name, knot, rkey, description *string, created *time.Time, source *string) error { - var createdAt string - var nullableDescription sql.NullString - var nullableSource sql.NullString - if err := rows.Scan(did, name, knot, rkey, &nullableDescription, &createdAt, &nullableSource); err != nil { - return err - } - - if nullableDescription.Valid { - *description = nullableDescription.String - } else { - *description = "" - } - - createdAtTime, err := time.Parse(time.RFC3339, createdAt) - if err != nil { - *created = time.Now() - } else { - *created = createdAtTime - } - - if nullableSource.Valid { - *source = nullableSource.String - } else { - *source = "" - } - - return nil -} diff --git a/appview/db/star.go b/appview/db/star.go index 64812704..ce0934d8 100644 --- a/appview/db/star.go +++ b/appview/db/star.go @@ -1,6 +1,8 @@ package db import ( + "database/sql" + "errors" "fmt" "log" "strings" @@ -183,6 +185,30 @@ func GetStars(e Execer, limit int, filters ...filter) ([]Star, error) { return stars, nil } +func CountStars(e Execer, filters ...filter) (int64, error) { + var conditions []string + var args []any + for _, filter := range filters { + conditions = append(conditions, filter.Condition()) + args = append(args, filter.Arg()...) + } + + whereClause := "" + if conditions != nil { + whereClause = " where " + strings.Join(conditions, " and ") + } + + repoQuery := fmt.Sprintf(`select count(1) from stars %s`, whereClause) + var count int64 + err := e.QueryRow(repoQuery, args...).Scan(&count) + + if !errors.Is(err, sql.ErrNoRows) && err != nil { + return 0, err + } + + return count, nil +} + func GetAllStars(e Execer, limit int) ([]Star, error) { var stars []Star diff --git a/appview/db/strings.go b/appview/db/strings.go index b87271ca..5f47ecff 100644 --- a/appview/db/strings.go +++ b/appview/db/strings.go @@ -206,6 +206,30 @@ func GetStrings(e Execer, limit int, filters ...filter) ([]String, error) { return all, nil } +func CountStrings(e Execer, filters ...filter) (int64, error) { + var conditions []string + var args []any + for _, filter := range filters { + conditions = append(conditions, filter.Condition()) + args = append(args, filter.Arg()...) + } + + whereClause := "" + if conditions != nil { + whereClause = " where " + strings.Join(conditions, " and ") + } + + repoQuery := fmt.Sprintf(`select count(1) from strings %s`, whereClause) + var count int64 + err := e.QueryRow(repoQuery, args...).Scan(&count) + + if !errors.Is(err, sql.ErrNoRows) && err != nil { + return 0, err + } + + return count, nil +} + func DeleteString(e Execer, filters ...filter) error { var conditions []string var args []any -- 2.43.0