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
 }