From 50b88f01270754f40d2921b3ca3376fd6a9ee931 Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Fri, 16 Jan 2026 14:37:06 +0900 Subject: [PATCH] appview: remove `Get{Issue,Pull}IDs` methods prepare for PR page pagination Signed-off-by: Seongmin Lee --- appview/db/issues.go | 56 ----------------------------- appview/db/pulls.go | 80 +++++++----------------------------------- appview/pulls/pulls.go | 43 ++++++++++++++--------- appview/repo/feed.go | 6 ++-- 4 files changed, 41 insertions(+), 144 deletions(-) diff --git a/appview/db/issues.go b/appview/db/issues.go index 6fd7e97c..7ab3f6aa 100644 --- a/appview/db/issues.go +++ b/appview/db/issues.go @@ -295,62 +295,6 @@ func GetIssues(e Execer, filters ...orm.Filter) ([]models.Issue, error) { return GetIssuesPaginated(e, pagination.Page{}, filters...) } -// GetIssueIDs gets list of all existing issue's IDs -func GetIssueIDs(e Execer, opts models.IssueSearchOptions) ([]int64, error) { - var ids []int64 - - var filters []orm.Filter - openValue := 0 - if opts.IsOpen { - openValue = 1 - } - filters = append(filters, orm.FilterEq("open", openValue)) - if opts.RepoAt != "" { - filters = append(filters, orm.FilterEq("repo_at", opts.RepoAt)) - } - - 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 ") - } - query := fmt.Sprintf( - ` - select - id - from - issues - %s - limit ? offset ?`, - whereClause, - ) - args = append(args, opts.Page.Limit, opts.Page.Offset) - rows, err := e.Query(query, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - var id int64 - err := rows.Scan(&id) - if err != nil { - return nil, err - } - - ids = append(ids, id) - } - - return ids, nil -} - func AddIssueComment(tx *sql.Tx, c models.IssueComment) (int64, error) { result, err := tx.Exec( `insert into issue_comments ( diff --git a/appview/db/pulls.go b/appview/db/pulls.go index dc5ed3ce..a4a78a27 100644 --- a/appview/db/pulls.go +++ b/appview/db/pulls.go @@ -13,6 +13,7 @@ import ( "github.com/bluesky-social/indigo/atproto/syntax" "tangled.org/core/appview/models" + "tangled.org/core/appview/pagination" "tangled.org/core/orm" ) @@ -119,7 +120,7 @@ func NextPullId(e Execer, repoAt syntax.ATURI) (int, error) { return pullId - 1, err } -func GetPullsWithLimit(e Execer, limit int, filters ...orm.Filter) ([]*models.Pull, error) { +func GetPullsPaginated(e Execer, page pagination.Page, filters ...orm.Filter) ([]*models.Pull, error) { pulls := make(map[syntax.ATURI]*models.Pull) var conditions []string @@ -133,9 +134,13 @@ func GetPullsWithLimit(e Execer, limit int, filters ...orm.Filter) ([]*models.Pu if conditions != nil { whereClause = " where " + strings.Join(conditions, " and ") } - limitClause := "" - if limit != 0 { - limitClause = fmt.Sprintf(" limit %d ", limit) + pageClause := "" + if page.Limit != 0 { + pageClause = fmt.Sprintf( + " limit %d offset %d ", + page.Limit, + page.Offset, + ) } query := fmt.Sprintf(` @@ -161,7 +166,7 @@ func GetPullsWithLimit(e Execer, limit int, filters ...orm.Filter) ([]*models.Pu order by created desc %s - `, whereClause, limitClause) + `, whereClause, pageClause) rows, err := e.Query(query, args...) if err != nil { @@ -297,72 +302,11 @@ func GetPullsWithLimit(e Execer, limit int, filters ...orm.Filter) ([]*models.Pu } func GetPulls(e Execer, filters ...orm.Filter) ([]*models.Pull, error) { - return GetPullsWithLimit(e, 0, filters...) -} - -func GetPullIDs(e Execer, opts models.PullSearchOptions) ([]int64, error) { - var ids []int64 - - var filters []orm.Filter - filters = append(filters, orm.FilterEq("state", opts.State)) - if opts.RepoAt != "" { - filters = append(filters, orm.FilterEq("repo_at", opts.RepoAt)) - } - - 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 ") - } - pageClause := "" - if opts.Page.Limit != 0 { - pageClause = fmt.Sprintf( - " limit %d offset %d ", - opts.Page.Limit, - opts.Page.Offset, - ) - } - - query := fmt.Sprintf( - ` - select - id - from - pulls - %s - %s`, - whereClause, - pageClause, - ) - args = append(args, opts.Page.Limit, opts.Page.Offset) - rows, err := e.Query(query, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - var id int64 - err := rows.Scan(&id) - if err != nil { - return nil, err - } - - ids = append(ids, id) - } - - return ids, nil + return GetPullsPaginated(e, pagination.Page{}, filters...) } func GetPull(e Execer, repoAt syntax.ATURI, pullId int) (*models.Pull, error) { - pulls, err := GetPullsWithLimit(e, 1, orm.FilterEq("repo_at", repoAt), orm.FilterEq("pull_id", pullId)) + pulls, err := GetPullsPaginated(e, pagination.Page{Limit: 1}, orm.FilterEq("repo_at", repoAt), orm.FilterEq("pull_id", pullId)) if err != nil { return nil, err } diff --git a/appview/pulls/pulls.go b/appview/pulls/pulls.go index 38012309..52df44a5 100644 --- a/appview/pulls/pulls.go +++ b/appview/pulls/pulls.go @@ -29,6 +29,7 @@ import ( "tangled.org/core/appview/pages" "tangled.org/core/appview/pages/markup" "tangled.org/core/appview/pages/repoinfo" + "tangled.org/core/appview/pagination" "tangled.org/core/appview/reporesolver" "tangled.org/core/appview/validator" "tangled.org/core/appview/xrpcclient" @@ -574,12 +575,16 @@ func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) { keyword := params.Get("q") - var ids []int64 + page := pagination.Page{ + Limit: 99999, + } + + var pulls []*models.Pull searchOpts := models.PullSearchOptions{ Keyword: keyword, RepoAt: f.RepoAt().String(), State: state, - // Page: page, + Page: page, } l.Debug("searching with", "searchOpts", searchOpts) if keyword != "" { @@ -588,25 +593,29 @@ func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) { l.Error("failed to search for pulls", "err", err) return } - ids = res.Hits - l.Debug("searched pulls with indexer", "count", len(ids)) + l.Debug("searched pulls with indexer", "count", len(res.Hits)) + + pulls, err = db.GetPulls( + s.db, + orm.FilterIn("id", res.Hits), + ) + if err != nil { + log.Println("failed to get pulls", err) + s.pages.Notice(w, "pulls", "Failed to load pulls. Try again later.") + return + } } else { - ids, err = db.GetPullIDs(s.db, searchOpts) + pulls, err = db.GetPullsPaginated( + s.db, + page, + orm.FilterEq("repo_at", f.RepoAt()), + orm.FilterEq("state", searchOpts.State), + ) if err != nil { - l.Error("failed to get all pull ids", "err", err) + log.Println("failed to get pulls", err) + s.pages.Notice(w, "pulls", "Failed to load pulls. Try again later.") return } - l.Debug("indexed all pulls from the db", "count", len(ids)) - } - - pulls, err := db.GetPulls( - s.db, - orm.FilterIn("id", ids), - ) - if err != nil { - log.Println("failed to get pulls", err) - s.pages.Notice(w, "pulls", "Failed to load pulls. Try again later.") - return } for _, p := range pulls { diff --git a/appview/repo/feed.go b/appview/repo/feed.go index c2d55279..7c06cb2e 100644 --- a/appview/repo/feed.go +++ b/appview/repo/feed.go @@ -19,16 +19,16 @@ import ( ) func (rp *Repo) getRepoFeed(ctx context.Context, repo *models.Repo, ownerSlashRepo string) (*feeds.Feed, error) { - const feedLimitPerType = 100 + feedPagePerType := pagination.Page{Limit: 100} - pulls, err := db.GetPullsWithLimit(rp.db, feedLimitPerType, orm.FilterEq("repo_at", repo.RepoAt())) + pulls, err := db.GetPullsPaginated(rp.db, feedPagePerType, orm.FilterEq("repo_at", repo.RepoAt())) if err != nil { return nil, err } issues, err := db.GetIssuesPaginated( rp.db, - pagination.Page{Limit: feedLimitPerType}, + feedPagePerType, orm.FilterEq("repo_at", repo.RepoAt()), ) if err != nil { -- 2.51.2