package models import ( "git.kirsle.net/apps/gophertype/pkg/console" ) // TaggedPost associates tags to their posts. type TaggedPost struct { ID uint `gorm:"primary_key"` Tag string PostID uint // 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 }