From 25cf9b0ad81405d95240d991ad198b1c57c96a93 Mon Sep 17 00:00:00 2001 From: Will Date: Sat, 9 May 2026 16:56:42 +0100 Subject: [PATCH] appview/db/repos: calculate the fork count of a repo Signed-off-by: Will --- appview/db/repos.go | 43 ++++++++++++++++++++++++++++++++++++++++++ appview/models/repo.go | 1 + 2 files changed, 44 insertions(+) diff --git a/appview/db/repos.go b/appview/db/repos.go index 487303ab..c68df9e8 100644 --- a/appview/db/repos.go +++ b/appview/db/repos.go @@ -370,6 +370,49 @@ func GetReposPaginated(e Execer, page pagination.Page, filters ...orm.Filter) ([ return nil, fmt.Errorf("failed to execute pulls-count query: %w", err) } + // get forks + forksInClause := strings.TrimSuffix(strings.Repeat("?, ", len(repoMap)), ", ") + forkArgs := make([]any, len(repoMap)) + repoDidMap := make(map[string]syntax.ATURI) + i = 0 + for aturi, r := range repoMap { + forkArgs[i] = r.RepoDid + repoDidMap[r.RepoDid] = aturi + i++ + } + + forksCountQuery := fmt.Sprintf( + `select source, count(1) from repos where source in (%s) group by source`, + forksInClause, + ) + + rows, err = e.Query(forksCountQuery, forkArgs...) + if err != nil { + return nil, fmt.Errorf("failed to execute fork-count query: %w", err) + } + defer rows.Close() + + for rows.Next() { + var repodid string + var count int + if err := rows.Scan(&repodid, &count); err != nil { + log.Println("err", "err", err) + continue + } + + atURI, ok := repoDidMap[repodid] + if !ok { + continue + } + + if r, ok := repoMap[atURI]; ok { + r.RepoStats.ForkCount = count + } + } + if err = rows.Err(); err != nil { + return nil, fmt.Errorf("failed to execute fork-count query: %w", err) + } + var repos []models.Repo for _, r := range repoMap { repos = append(repos, *r) diff --git a/appview/models/repo.go b/appview/models/repo.go index 1e46fcd9..02755523 100644 --- a/appview/models/repo.go +++ b/appview/models/repo.go @@ -104,6 +104,7 @@ type RepoStats struct { StarCount int IssueCount IssueCount PullCount PullCount + ForkCount int } type IssueCount struct { -- 2.51.2