11package db
22
3+ import "database/sql"
4+
35type TrendingTag struct {
46 Tag string `json:"tag"`
57 Count int `json:"count"`
@@ -9,51 +11,145 @@ func (db *DB) GetTrendingTags(limit int) ([]TrendingTag, error) {
911 var query string
1012 if db .driver == "postgres" {
1113 query = `
12- SELECT
13- value as tag,
14- COUNT(*) as count
15- FROM annotations, json_array_elements_text(tags_json::json) as value
16- WHERE tags_json IS NOT NULL
17- AND tags_json != ''
18- AND tags_json != '[]'
19- AND created_at > NOW() - INTERVAL '7 days'
14+ SELECT tag, SUM(cnt) as count FROM (
15+ SELECT value as tag, COUNT(*) as cnt
16+ FROM annotations, json_array_elements_text(tags_json::json) as value
17+ WHERE tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
18+ AND created_at > NOW() - INTERVAL '14 days'
19+ GROUP BY tag
20+ UNION ALL
21+ SELECT value as tag, COUNT(*) as cnt
22+ FROM highlights, json_array_elements_text(tags_json::json) as value
23+ WHERE tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
24+ AND created_at > NOW() - INTERVAL '14 days'
25+ GROUP BY tag
26+ UNION ALL
27+ SELECT value as tag, COUNT(*) as cnt
28+ FROM bookmarks, json_array_elements_text(tags_json::json) as value
29+ WHERE tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
30+ AND created_at > NOW() - INTERVAL '14 days'
31+ GROUP BY tag
32+ ) combined
2033 GROUP BY tag
21- HAVING COUNT(* ) > 2
22- ORDER BY COUNT(*) DESC
34+ HAVING SUM(cnt ) >= 2
35+ ORDER BY count DESC
2336 LIMIT $1
2437 `
25- rows , err := db .Query (query , limit )
26- if err != nil {
38+ } else {
39+ query = `
40+ SELECT tag, SUM(cnt) as count FROM (
41+ SELECT json_each.value as tag, COUNT(*) as cnt
42+ FROM annotations, json_each(annotations.tags_json)
43+ WHERE tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
44+ AND created_at > datetime('now', '-14 days')
45+ GROUP BY tag
46+ UNION ALL
47+ SELECT json_each.value as tag, COUNT(*) as cnt
48+ FROM highlights, json_each(highlights.tags_json)
49+ WHERE tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
50+ AND created_at > datetime('now', '-14 days')
51+ GROUP BY tag
52+ UNION ALL
53+ SELECT json_each.value as tag, COUNT(*) as cnt
54+ FROM bookmarks, json_each(bookmarks.tags_json)
55+ WHERE tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
56+ AND created_at > datetime('now', '-14 days')
57+ GROUP BY tag
58+ ) combined
59+ GROUP BY tag
60+ HAVING SUM(cnt) >= 2
61+ ORDER BY count DESC
62+ LIMIT ?
63+ `
64+ }
65+
66+ var rows * sql.Rows
67+ var err error
68+ if db .driver == "postgres" {
69+ rows , err = db .Query (query , limit )
70+ } else {
71+ rows , err = db .Query (db .Rebind (query ), limit )
72+ }
73+ if err != nil {
74+ return nil , err
75+ }
76+ defer rows .Close ()
77+
78+ var tags []TrendingTag
79+ for rows .Next () {
80+ var t TrendingTag
81+ if err := rows .Scan (& t .Tag , & t .Count ); err != nil {
2782 return nil , err
2883 }
29- defer rows .Close ()
84+ tags = append (tags , t )
85+ }
3086
31- var tags []TrendingTag
32- for rows .Next () {
33- var t TrendingTag
34- if err := rows .Scan (& t .Tag , & t .Count ); err != nil {
35- return nil , err
36- }
37- tags = append (tags , t )
38- }
39- return tags , nil
87+ if err = rows .Err (); err != nil {
88+ return nil , err
89+ }
90+
91+ if tags == nil {
92+ return []TrendingTag {}, nil
93+ }
94+
95+ return tags , nil
96+ }
97+
98+ func (db * DB ) GetUserTags (did string , limit int ) ([]TrendingTag , error ) {
99+ var query string
100+ if db .driver == "postgres" {
101+ query = `
102+ SELECT tag, SUM(cnt) as count FROM (
103+ SELECT value as tag, COUNT(*) as cnt
104+ FROM annotations, json_array_elements_text(tags_json::json) as value
105+ WHERE author_did = $1 AND tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
106+ GROUP BY tag
107+ UNION ALL
108+ SELECT value as tag, COUNT(*) as cnt
109+ FROM highlights, json_array_elements_text(tags_json::json) as value
110+ WHERE author_did = $1 AND tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
111+ GROUP BY tag
112+ UNION ALL
113+ SELECT value as tag, COUNT(*) as cnt
114+ FROM bookmarks, json_array_elements_text(tags_json::json) as value
115+ WHERE author_did = $1 AND tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
116+ GROUP BY tag
117+ ) combined
118+ GROUP BY tag
119+ ORDER BY count DESC
120+ LIMIT $2
121+ `
122+ } else {
123+ query = `
124+ SELECT tag, SUM(cnt) as count FROM (
125+ SELECT json_each.value as tag, COUNT(*) as cnt
126+ FROM annotations, json_each(annotations.tags_json)
127+ WHERE author_did = ? AND tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
128+ GROUP BY tag
129+ UNION ALL
130+ SELECT json_each.value as tag, COUNT(*) as cnt
131+ FROM highlights, json_each(highlights.tags_json)
132+ WHERE author_did = ? AND tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
133+ GROUP BY tag
134+ UNION ALL
135+ SELECT json_each.value as tag, COUNT(*) as cnt
136+ FROM bookmarks, json_each(bookmarks.tags_json)
137+ WHERE author_did = ? AND tags_json IS NOT NULL AND tags_json != '' AND tags_json != '[]'
138+ GROUP BY tag
139+ ) combined
140+ GROUP BY tag
141+ ORDER BY count DESC
142+ LIMIT ?
143+ `
40144 }
41145
42- query = `
43- SELECT
44- json_each.value as tag,
45- COUNT(*) as count
46- FROM annotations, json_each(annotations.tags_json)
47- WHERE tags_json IS NOT NULL
48- AND tags_json != ''
49- AND tags_json != '[]'
50- AND created_at > datetime('now', '-7 days')
51- GROUP BY tag
52- HAVING count > 2
53- ORDER BY count DESC
54- LIMIT ?
55- `
56- rows , err := db .Query (db .Rebind (query ), limit )
146+ var rows * sql.Rows
147+ var err error
148+ if db .driver == "postgres" {
149+ rows , err = db .Query (query , did , limit )
150+ } else {
151+ rows , err = db .Query (db .Rebind (query ), did , did , did , limit )
152+ }
57153 if err != nil {
58154 return nil , err
59155 }
0 commit comments