2015-05-05 17:31:28 +02:00
package tags
import (
"database/sql"
_ "github.com/lib/pq"
2015-05-06 17:19:43 +02:00
"fmt"
2015-05-05 17:31:28 +02:00
)
type Tag struct {
2015-05-08 09:07:30 +02:00
Id int
2015-05-05 17:31:28 +02:00
Name string
2015-05-07 17:31:18 +02:00
Parent sql . NullInt64
2015-05-08 09:07:30 +02:00
Children [ ] * Tag
2015-05-05 17:31:28 +02:00
}
2015-05-08 09:07:30 +02:00
var Tags [ ] * Tag
2015-05-05 17:31:28 +02:00
2015-05-06 17:19:43 +02:00
func LoadTags ( db * sql . DB ) {
2015-05-08 09:07:30 +02:00
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" )
2015-05-07 17:31:18 +02:00
if err != nil {
fmt . Println ( "DB Error loading tags:" , err )
return
}
2015-05-08 09:07:30 +02:00
var flatMap map [ int ] * Tag = make ( map [ int ] * Tag )
2015-05-06 17:19:43 +02:00
for rows . Next ( ) {
2015-05-08 09:07:30 +02:00
tag := & Tag { Children : [ ] * Tag { } }
2015-05-06 17:19:43 +02:00
2015-05-08 09:07:30 +02:00
err = rows . Scan ( & tag . Id , & tag . Name , & tag . Parent )
2015-05-06 17:19:43 +02:00
if err != nil {
fmt . Println ( "tags DB Error: " , err )
}
2015-05-08 09:07:30 +02:00
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 )
}
2015-05-06 17:19:43 +02:00
}
2015-05-05 17:31:28 +02:00
}