+17
-34
pkg/mostliked/generator.go
+17
-34
pkg/mostliked/generator.go
···
5
5
"database/sql"
6
6
"log"
7
7
"strconv"
8
+
"strings"
9
+
"fmt"
8
10
9
11
appbsky "github.com/bluesky-social/indigo/api/bsky"
10
12
"github.com/edavis/bsky-feeds/pkg/feeds"
11
13
_ "github.com/mattn/go-sqlite3"
12
-
"github.com/sanggonlee/gosq"
13
14
)
14
15
15
16
type PostRow struct {
···
18
19
}
19
20
20
21
func getPosts(ctx context.Context, dbCnx *sql.DB, params feeds.FeedgenParams) ([]PostRow, error) {
21
-
q, err := gosq.Execute(`
22
-
SELECT posts.uri, likes
23
-
FROM posts LEFT JOIN langs ON posts.uri = langs.uri
24
-
WHERE 1=1
25
-
{{if .Langs}}
26
-
AND (
27
-
{{- range $index, $lang := .Langs }}
28
-
{{- if $index }} OR {{ end }} lang = ?
29
-
{{- end }}
30
-
)
31
-
{{end}}
32
-
{{if .Offset}}
33
-
AND likes < ?
34
-
{{end}}
35
-
ORDER BY likes DESC, create_ts DESC
36
-
LIMIT ?
37
-
`, params)
38
-
if err != nil {
39
-
log.Println("error in sql template:", err)
40
-
}
41
-
42
-
log.Println(q)
43
-
44
22
var queryParams []any
45
-
for _, lang := range params.Langs {
46
-
queryParams = append(queryParams, lang.String())
23
+
var query strings.Builder
24
+
fmt.Fprint(&query, "SELECT posts.uri, likes FROM posts LEFT JOIN langs ON posts.uri = langs.uri")
25
+
if len(params.Langs) > 0 {
26
+
fmt.Fprint(&query, " WHERE ")
27
+
for idx, lang := range params.Langs {
28
+
if idx > 0 {
29
+
fmt.Fprint(&query, " OR ")
30
+
}
31
+
fmt.Fprint(&query, " lang = ? ")
32
+
queryParams = append(queryParams, lang.String())
33
+
}
47
34
}
48
-
49
-
if params.Offset != "" {
50
-
queryParams = append(queryParams, params.Offset)
51
-
}
52
-
35
+
// TODO cursor/offset stuff
36
+
fmt.Fprint(&query, "ORDER BY likes DESC, create_ts DESC")
37
+
fmt.Fprint(&query, "LIMIT ?")
53
38
queryParams = append(queryParams, params.Limit)
54
39
55
-
log.Println(queryParams)
56
-
57
-
rows, err := dbCnx.QueryContext(ctx, q, queryParams...)
40
+
rows, err := dbCnx.QueryContext(ctx, q.String(), queryParams...)
58
41
if err != nil {
59
42
return nil, err
60
43
}