slowly getting rid of global index
parent
5ce9a530f8
commit
dbb2c86f5a
@ -0,0 +1,77 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/rand"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Galaxy is a collection of systems
|
||||||
|
type Galaxy struct {
|
||||||
|
systems map[int]*System
|
||||||
|
names map[string]int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGalaxy() *Galaxy {
|
||||||
|
g := &Galaxy{
|
||||||
|
systems: make(map[int]*System),
|
||||||
|
names: make(map[string]int),
|
||||||
|
}
|
||||||
|
g.indexSystems()
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Galaxy) indexSystems() {
|
||||||
|
rows, err := db.Query(`select * from planets`)
|
||||||
|
if err != nil {
|
||||||
|
log_error("unable to select all planets: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
for rows.Next() {
|
||||||
|
s := System{}
|
||||||
|
if err := rows.Scan(&s.id, &s.name, &s.x, &s.y, &s.z, &s.planets); err != nil {
|
||||||
|
log_info("unable to scan planet row: %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
g.systems[s.id] = &s
|
||||||
|
g.names[s.name] = s.id
|
||||||
|
s.money = int64(rand.NormFloat64()*options.moneySigma + options.moneyMean)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSystem gets a system by either ID or name. If the provided string
|
||||||
|
// contains an integer, we assume the lookup is intended to be by ID.
|
||||||
|
func (g *Galaxy) GetSystem(s string) *System {
|
||||||
|
id, err := strconv.Atoi(s)
|
||||||
|
if err == nil {
|
||||||
|
return g.GetSystemByID(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return g.GetSystemByName(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Galaxy) GetSystemByID(id int) *System {
|
||||||
|
return g.systems[id]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Galaxy) GetSystemByName(name string) *System {
|
||||||
|
id := g.SystemID(name)
|
||||||
|
if id == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return g.GetSystemByID(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Galaxy) SystemID(name string) int { return g.names[name] }
|
||||||
|
|
||||||
|
// Neighborhood generates the neighborhood for a given system.
|
||||||
|
func (g *Galaxy) Neighborhood(sys *System) Neighborhood {
|
||||||
|
neighbors := make(Neighborhood, 0, len(g.systems))
|
||||||
|
for id, sys2 := range g.systems {
|
||||||
|
neighbors = append(neighbors, Neighbor{id: id, distance: sys.DistanceTo(sys2)})
|
||||||
|
}
|
||||||
|
sort.Sort(neighbors)
|
||||||
|
return neighbors
|
||||||
|
}
|
Loading…
Reference in New Issue