package tags import ( "database/sql" _ "github.com/lib/pq" "fmt" ) type Tag struct { Id int Name string Parent sql.NullInt64 Children []*Tag } var Tags []*Tag func LoadTags(db *sql.DB) { Tags = []*Tag{} //rows, err := db.Query("select tags.tag_id, tags.name, tags.parent_id, array_agg(distinct(parent_of.tag_id)) as children from tags left join tags as parent_of on parent_of.parent_id=tags.tag_id group by tags.tag_id") rows, err := db.Query("select tags.tag_id, tags.name, tags.parent_id from tags order by tag_id,tags.parent_id desc") if err != nil { fmt.Println("DB Error loading tags:", err) return } var flatMap map[int]*Tag = make(map[int]*Tag) for rows.Next() { tag := &Tag{Children: []*Tag{}} err = rows.Scan(&tag.Id, &tag.Name, &tag.Parent) if err != nil { fmt.Println("tags DB Error: ", err) } flatMap[tag.Id] = tag if tag.Parent.Valid { pid := int(tag.Parent.Int64) flatMap[pid].Children = append(flatMap[pid].Children, tag) } else { Tags = append(Tags, tag) } } }