# HG changeset patch # User Sascha L. Teichmann # Date 1534866958 -7200 # Node ID 37742dd72fdb0ffc638956c36b53d42cb7faeda6 # Parent c315885825e58ed235849034e6418eb6b1140beb Use a sorted slice for published layers to get rid of extra sorting. diff -r c315885825e5 -r 37742dd72fdb pkg/models/pubservices.go --- a/pkg/models/pubservices.go Tue Aug 21 17:43:37 2018 +0200 +++ b/pkg/models/pubservices.go Tue Aug 21 17:55:58 2018 +0200 @@ -10,23 +10,19 @@ ) type PubEntry struct { + Name string Style sql.NullString WMS bool WFS bool } -type NamedPubEntry struct { - PubEntry - Name string -} - type PubServices struct { - entries map[string]PubEntry + entries []PubEntry mu sync.Mutex } const selectPublishedServices = `SELECT name, style, as_wms, as_wfs -FROM sys_admin.published_services` +FROM sys_admin.published_services ORDER by name` var PublishedServices = &PubServices{} @@ -35,17 +31,19 @@ defer ps.mu.Unlock() if ps.entries == nil { - ps.entries = make(map[string]PubEntry) if err := ps.load(); err != nil { log.Printf("error: %v\n", err) return "", false } } - _, found := ps.entries[name] - if !found { - name = "" + + n := sort.Search(len(ps.entries), func(i int) bool { + return ps.entries[i].Name >= name + }) + if n == len(ps.entries) || ps.entries[n].Name != name { + return "", false } - return name, found + return name, true } func (ps *PubServices) load() error { @@ -57,14 +55,13 @@ defer rows.Close() for rows.Next() { var entry PubEntry - var key string if err := rows.Scan( - &key, &entry.Style, + &entry.Name, &entry.Style, &entry.WFS, &entry.WFS, ); err != nil { return err } - ps.entries[key] = entry + ps.entries = append(ps.entries, entry) } return rows.Err() }) @@ -77,28 +74,24 @@ ps.mu.Unlock() } -func PublishedWMS(_ string, entry PubEntry) bool { return entry.WMS } -func PublishedWFS(_ string, entry PubEntry) bool { return entry.WFS } +func PublishedWMS(entry PubEntry) bool { return entry.WMS } +func PublishedWFS(entry PubEntry) bool { return entry.WFS } -func (ps *PubServices) Filter(accept func(string, PubEntry) bool) []NamedPubEntry { +func (ps *PubServices) Filter(accept func(PubEntry) bool) []PubEntry { ps.mu.Lock() defer ps.mu.Unlock() if ps.entries == nil { - ps.entries = make(map[string]PubEntry) if err := ps.load(); err != nil { log.Printf("error: %v\n", err) return nil } } - var npe []NamedPubEntry - for k, v := range ps.entries { - if accept(k, v) { - npe = append(npe, NamedPubEntry{PubEntry: v, Name: k}) + pe := make([]PubEntry, 0, len(ps.entries)) + for _, e := range ps.entries { + if accept(e) { + pe = append(pe, e) } } - // To make output deterministic. - sort.Slice(npe, func(i, j int) bool { return npe[i].Name < npe[j].Name }) - - return npe + return pe }