···470 id integer primary key autoincrement,
471 name text unique
472 );
0000473 `)
474 if err != nil {
475 return nil, err
···470 id integer primary key autoincrement,
471 name text unique
472 );
473+474+ -- indexes for better star query performance
475+ create index if not exists idx_stars_created on stars(created);
476+ create index if not exists idx_stars_repo_at_created on stars(repo_at, created);
477 `)
478 if err != nil {
479 return nil, err
+72-3
appview/db/star.go
···47// Get a star record
48func GetStar(e Execer, starredByDid string, repoAt syntax.ATURI) (*Star, error) {
49 query := `
50- select starred_by_did, repo_at, created, rkey
51 from stars
52 where starred_by_did = ? and repo_at = ?`
53 row := e.QueryRow(query, starredByDid, repoAt)
···119 }
120121 repoQuery := fmt.Sprintf(
122- `select starred_by_did, repo_at, created, rkey
123 from stars
124 %s
125 order by created desc
···187 var stars []Star
188189 rows, err := e.Query(`
190- select
191 s.starred_by_did,
192 s.repo_at,
193 s.rkey,
···244245 return stars, nil
246}
000000000000000000000000000000000000000000000000000000000000000000000
···47// Get a star record
48func GetStar(e Execer, starredByDid string, repoAt syntax.ATURI) (*Star, error) {
49 query := `
50+ select starred_by_did, repo_at, created, rkey
51 from stars
52 where starred_by_did = ? and repo_at = ?`
53 row := e.QueryRow(query, starredByDid, repoAt)
···119 }
120121 repoQuery := fmt.Sprintf(
122+ `select starred_by_did, repo_at, created, rkey
123 from stars
124 %s
125 order by created desc
···187 var stars []Star
188189 rows, err := e.Query(`
190+ select
191 s.starred_by_did,
192 s.repo_at,
193 s.rkey,
···244245 return stars, nil
246}
247+248+// GetTopStarredReposLastWeek returns the top 8 most starred repositories from the last week
249+func GetTopStarredReposLastWeek(e Execer) ([]Repo, error) {
250+ // first, get the top repo URIs by star count from the last week
251+ query := `
252+ with recent_starred_repos as (
253+ select distinct repo_at
254+ from stars
255+ where created >= datetime('now', '-7 days')
256+ ),
257+ repo_star_counts as (
258+ select
259+ s.repo_at,
260+ count(*) as star_count
261+ from stars s
262+ join recent_starred_repos rsr on s.repo_at = rsr.repo_at
263+ group by s.repo_at
264+ )
265+ select rsc.repo_at
266+ from repo_star_counts rsc
267+ order by rsc.star_count desc
268+ limit 8
269+ `
270+271+ rows, err := e.Query(query)
272+ if err != nil {
273+ return nil, err
274+ }
275+ defer rows.Close()
276+277+ var repoUris []string
278+ for rows.Next() {
279+ var repoUri string
280+ err := rows.Scan(&repoUri)
281+ if err != nil {
282+ return nil, err
283+ }
284+ repoUris = append(repoUris, repoUri)
285+ }
286+287+ if err := rows.Err(); err != nil {
288+ return nil, err
289+ }
290+291+ if len(repoUris) == 0 {
292+ return []Repo{}, nil
293+ }
294+295+ // get full repo data
296+ repos, err := GetRepos(e, 0, FilterIn("at_uri", repoUris))
297+ if err != nil {
298+ return nil, err
299+ }
300+301+ // sort repos by the original trending order
302+ repoMap := make(map[string]Repo)
303+ for _, repo := range repos {
304+ repoMap[repo.RepoAt().String()] = repo
305+ }
306+307+ orderedRepos := make([]Repo, 0, len(repoUris))
308+ for _, uri := range repoUris {
309+ if repo, exists := repoMap[uri]; exists {
310+ orderedRepos = append(orderedRepos, repo)
311+ }
312+ }
313+314+ return orderedRepos, nil
315+}