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
|
|
}
|