package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) type Life struct { Apgcode string Population int FirstFound int LastFound int } type Sample struct { Apgcode string Id int Hash string } // Connect to database func dbConnect() (db *sql.DB) { if err != nil { panic(err) } return db } // Get Life record from census func SQLGetLife(code string) (*Life, error) { db := dbConnect() defer db.Close() var apgcode string var population, firstFound, lastFound int row := db.QueryRow("SELECT * FROM census WHERE apgcode=?", code) err := row.Scan(&apgcode, &population, &firstFound, &lastFound) if err != nil { return nil, err } var life = Life { apgcode, population, firstFound, lastFound, } return &life, nil } // Get array of Sample records order by id func SQLGetSamples(code string) ([]Sample, error) { db := dbConnect() defer db.Close() rows, err := db.Query("SELECT * FROM samples WHERE apgcode=? order by id", code) defer rows.Close() if err != nil { return nil, err } var samples []Sample var sample = Sample{} // Iterate over rows for rows.Next() { err = rows.Scan(&sample.Apgcode, &sample.Id, &sample.Hash) if err != nil { return nil, err } samples = append(samples, sample) } return samples, nil } type Genus struct { Name string Population int Species []Life } // Get array of lifes of a given genus func SQLGetGenus(code string) (*Genus, error) { db := dbConnect() defer db.Close() rows, err := db.Query("SELECT * FROM census WHERE apgcode LIKE ? ORDER BY population DESC, firstFound", code + "%") defer rows.Close() if err != nil { return nil, err } var genus = Genus { Name: code, } // Iterate over rows for rows.Next() { var life = Life{} err = rows.Scan(&life.Apgcode, &life.Population, &life.FirstFound, &life.LastFound) if err != nil { panic(err) } genus.Species = append(genus.Species, life) } // Get population of genus genus.Population = getPopulationOfCode(code + "%") return &genus, nil } type GenusProxy struct { Name string Count int } type Family struct { Name string Genera []GenusProxy } // Get array of genus in the family, each genus should have the count of unique species func SQLGetFamily(code string) (*Family, error) { db := dbConnect() defer db.Close() // Returns list of genera and their count of species below them, ordered by genus and formatted nicely // TLDR I'm a freaking god and here is my SQL to prove it rows, err := db.Query("SELECT SUBSTRING_INDEX(apgcode, \"_\", 1) AS a, COUNT(apgcode) FROM census WHERE apgcode LIKE ? GROUP BY a ORDER BY SUBSTR(a, LENGTH(?)-1, LENGTH(a)-(LENGTH(?)-1))", code + "%", code, code) defer rows.Close() if err != nil { panic(err) } var family = Family { Name: code, } for rows.Next() { var proxy GenusProxy rows.Scan(&proxy.Name, &proxy.Count) family.Genera = append(family.Genera, proxy) } return &family, nil } // Totals the population of species matching code func getPopulationOfCode(code string) (pop int) { db := dbConnect() defer db.Close() err := db.QueryRow("SELECT SUM(population) FROM census WHERE apgcode LIKE ?", code).Scan(&pop) if err != nil { return 0 } return pop } // Get the count of unique species of matching code func getCountOfCode(code string) (count int) { db := dbConnect() defer db.Close() err := db.QueryRow("SELECT COUNT(population) FROM census WHERE apgcode LIKE ?", code).Scan(&count) if err != nil { return 0 } return count }