* Can query blog posts by multiple tags now. * e.g. /tagged/blog,updates,-photos would query all posts that have tags "blog" OR "updates" but NOT show any post with tag "photos"
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package models
|
|
|
|
import (
|
|
"git.kirsle.net/apps/gophertype/pkg/console"
|
|
)
|
|
|
|
// TaggedPost associates tags to their posts.
|
|
type TaggedPost struct {
|
|
ID int `gorm:"primary_key"`
|
|
Tag string
|
|
PostID int // foreign key to Post
|
|
}
|
|
|
|
// SummarizeTags returns the list of all tags ordered by frequency used.
|
|
// public: true for public view, don't count tags on private posts.
|
|
func SummarizeTags(public bool) []TagSummary {
|
|
var result []TagSummary
|
|
|
|
query := DB.Table("tagged_posts").
|
|
Select("tagged_posts.tag, count(tagged_posts.post_id) AS count").
|
|
Joins("JOIN posts ON posts.id = tagged_posts.post_id").
|
|
Group("tagged_posts.tag").
|
|
Order("count desc")
|
|
|
|
if public {
|
|
query = query.Where("posts.privacy = ?", Public)
|
|
}
|
|
|
|
rows, err := query.Rows()
|
|
if err != nil {
|
|
console.Error("SummarizeTags: query.Rows: %s", err)
|
|
}
|
|
|
|
for rows.Next() {
|
|
var (
|
|
tagName string
|
|
count int
|
|
)
|
|
|
|
if err := rows.Scan(&tagName, &count); err != nil {
|
|
console.Error("SummarizeTags: rows.Scan: %s", err)
|
|
}
|
|
|
|
result = append(result, TagSummary{
|
|
Tag: tagName,
|
|
Count: count,
|
|
})
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// TagSummary holds the result for SummarizeTags
|
|
type TagSummary struct {
|
|
Tag string
|
|
Count int
|
|
}
|