Mercurial > gemma
changeset 445:37742dd72fdb
Use a sorted slice for published layers to get rid of extra sorting.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 21 Aug 2018 17:55:58 +0200 |
parents | c315885825e5 |
children | 659c04feb2dc |
files | pkg/models/pubservices.go |
diffstat | 1 files changed, 20 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- 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 }