2015-05-12 05:06:28 +00:00
package categories
import (
"database/sql"
_ "github.com/lib/pq"
"fmt"
2015-05-12 15:32:47 +00:00
"strings"
2015-05-12 05:06:28 +00:00
)
type Category struct {
Id int
Name string
Parent sql . NullInt64
Children [ ] * Category
}
var CategoriesTree [ ] * Category
var CategoriesFlat map [ int ] * Category
// Cavet: slight cheat. All parents must have Category_id < their children.
func LoadCategories ( db * sql . DB ) {
CategoriesTree = [ ] * Category { }
CategoriesFlat = make ( map [ int ] * Category )
2015-05-19 15:32:35 +00:00
rows , err := db . Query ( "select categories.id, categories.name, categories.parent_id from categories order by coalesce(parent_id, id), parent_id is not null" )
2015-05-12 05:06:28 +00:00
if err != nil {
fmt . Println ( "DB Error loading Categories:" , err )
return
}
2015-05-18 03:18:28 +00:00
defer rows . Close ( )
2015-05-12 05:06:28 +00:00
for rows . Next ( ) {
category := & Category { Children : [ ] * Category { } }
err = rows . Scan ( & category . Id , & category . Name , & category . Parent )
if err != nil {
fmt . Println ( "Categories DB Error: " , err )
}
2015-05-19 15:32:35 +00:00
2015-05-12 05:06:28 +00:00
CategoriesFlat [ category . Id ] = category
if category . Parent . Valid {
pid := int ( category . Parent . Int64 )
CategoriesFlat [ pid ] . Children = append ( CategoriesFlat [ pid ] . Children , category )
} else {
CategoriesTree = append ( CategoriesTree , category )
}
}
2015-05-12 15:32:47 +00:00
}
// get the number of parents a category has
func ( category * Category ) Depth ( ) int {
depth := 0
current := category
for current . Parent . Valid {
current = CategoriesFlat [ int ( current . Parent . Int64 ) ]
depth ++
}
return depth
}
2015-05-22 01:34:14 +00:00
// Helper function for templates (add form select list)
2015-05-12 15:32:47 +00:00
func ( category * Category ) ToString ( ) string {
return strings . Repeat ( "- " , category . Depth ( ) ) + category . Name
2015-05-12 05:06:28 +00:00
}