annotate pkg/controllers/search.go @ 3678:8f58851927c0

client: make layer factory only return new layer config for individual maps instead of each time it is invoked. The purpose of the factory was to support multiple maps with individual layers. But returning a new config each time it is invoked leads to bugs that rely on the layer's state. Now this factory reuses the same objects it created before, per map.
author Markus Kottlaender <markus@intevation.de>
date Mon, 17 Jun 2019 17:31:35 +0200
parents db87f34805fb
children 1504856c9378
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1017
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
2 // without warranty, see README.md and license for details.
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
3 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
6 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
7 // Copyright (C) 2018 by via donau
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
9 // Software engineering by Intevation GmbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
10 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
11 // Author(s):
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
12 // * Sascha Wilde <sascha.wilde@intevation.de>
1337
53057ab27ff2 add headers for licensing to some middleware files
Fadi Abbud <fadi.abbud@intevation.de>
parents: 1109
diff changeset
13 // * Sascha Teichmann <sascha.teichmann@intevation.de>
1017
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 995
diff changeset
14
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
15 package controllers
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
16
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
17 import (
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
18 "database/sql"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
19 "net/http"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
20 "regexp"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
21 "strconv"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
22 "strings"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
23
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
24 "gemma.intevation.de/gemma/pkg/models"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
25 )
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
26
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
27 const (
749
802ecaae8410 Search back end: simply return emty array for empty result sets.
Sascha Wilde <wilde@intevation.de>
parents: 748
diff changeset
28 searchHectometreSQL = `SELECT COALESCE(json_agg(r),'[]')
784
5616c6bfb186 Search: show more human readable results for rkm.
Sascha Wilde <wilde@intevation.de>
parents: 751
diff changeset
29 FROM (SELECT (location_code).hectometre || ' rhm' AS name,
3584
7b15a6dd4ae5 search: replace commata via SQL
Thomas Junk <thomas.junk@intevation.de>
parents: 3579
diff changeset
30 replace(concat(location_code), ',','') AS locationcode,
1024
96ea805d44b9 back end: Added new field "type" to search results.
Sascha Wilde <wilde@intevation.de>
parents: 1017
diff changeset
31 ST_AsGeoJSON(geom)::json AS geom, 'rhm' AS type
995
e03fab882b47 Use distance_marks_virtual table for search.
Sascha Wilde <wilde@intevation.de>
parents: 784
diff changeset
32 FROM waterway.distance_marks_virtual
748
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
33 WHERE (location_code).hectometre = $1) r`
1050
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
34
1109
74a75a5ce770 Added geonames data and extended search for villages/cities.
Sascha Wilde <wilde@intevation.de>
parents: 1050
diff changeset
35 searchMostSQL = `SELECT search_most($1)::text`
1050
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
36
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
37 listBottlenecksSQL = `
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
38 SELECT COALESCE(json_agg(r),'[]')
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
39 FROM (
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
40 SELECT
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
41 objnam AS name,
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
42 ST_AsGeoJSON(ST_Centroid(area))::json AS geom,
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
43 'bottleneck' AS type
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
44 FROM waterway.bottlenecks
3666
db87f34805fb Align bottleneck validity at gauges
Tom Gottfried <tom@intevation.de>
parents: 3645
diff changeset
45 WHERE validity @> current_timestamp
1050
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
46 ORDER BY objnam) r
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
47 `
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
48 )
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
49
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
50 var rkmRegex = regexp.MustCompile(
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
51 "^[[:space:]]*([0-9]+)([,.]([0-9]))?[[:space:]]*$",
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
52 )
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
53
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
54 func searchFeature(
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
55 input interface{},
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
56 req *http.Request,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
57 db *sql.Conn,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
58 ) (jr JSONResult, err error) {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
59
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
60 s := input.(*models.SearchRequest)
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
61
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
62 if len(s.SearchString) == 0 {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
63 err = JSONError{http.StatusBadRequest,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
64 "error: empty search string"}
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
65 return
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
66 }
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
67
751
21dd10f26206 Some refactoring in search endpoint.
Sascha Wilde <wilde@intevation.de>
parents: 750
diff changeset
68 var result string
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
69
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
70 m := rkmRegex.FindStringSubmatch(s.SearchString)
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
71 if len(m) != 0 {
751
21dd10f26206 Some refactoring in search endpoint.
Sascha Wilde <wilde@intevation.de>
parents: 750
diff changeset
72 // Handle search for river kilometre:
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
73 var hectometre int
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
74 if hectometre, err = strconv.Atoi(m[1]); err != nil {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
75 return
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
76 }
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
77
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
78 hectometre *= 10
750
cf37bf6c28c6 Search: Fixed parsing of numbers w/o decimal.
Sascha Wilde <wilde@intevation.de>
parents: 749
diff changeset
79 if m[3] != "" {
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
80 var h int
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
81 if h, err = strconv.Atoi(m[3]); err != nil {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
82 return
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
83 }
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
84 hectometre += h
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
85 }
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
86
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
87 err = db.QueryRowContext(
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
88 req.Context(),
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
89 searchHectometreSQL,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
90 hectometre,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
91 ).Scan(&result)
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
92 } else {
751
21dd10f26206 Some refactoring in search endpoint.
Sascha Wilde <wilde@intevation.de>
parents: 750
diff changeset
93 // Hande search for bottlencks:
748
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
94 err = db.QueryRowContext(
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
95 req.Context(),
1109
74a75a5ce770 Added geonames data and extended search for villages/cities.
Sascha Wilde <wilde@intevation.de>
parents: 1050
diff changeset
96 searchMostSQL,
74a75a5ce770 Added geonames data and extended search for villages/cities.
Sascha Wilde <wilde@intevation.de>
parents: 1050
diff changeset
97 s.SearchString,
748
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
98 ).Scan(&result)
751
21dd10f26206 Some refactoring in search endpoint.
Sascha Wilde <wilde@intevation.de>
parents: 750
diff changeset
99 }
748
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
100
751
21dd10f26206 Some refactoring in search endpoint.
Sascha Wilde <wilde@intevation.de>
parents: 750
diff changeset
101 if err != nil {
21dd10f26206 Some refactoring in search endpoint.
Sascha Wilde <wilde@intevation.de>
parents: 750
diff changeset
102 return
21dd10f26206 Some refactoring in search endpoint.
Sascha Wilde <wilde@intevation.de>
parents: 750
diff changeset
103 }
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
104
751
21dd10f26206 Some refactoring in search endpoint.
Sascha Wilde <wilde@intevation.de>
parents: 750
diff changeset
105 jr.Result = strings.NewReader(result)
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
106 return
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
107 }
1050
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
108
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
109 func listBottlenecks(
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
110 _ interface{},
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
111 req *http.Request,
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
112 conn *sql.Conn,
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
113 ) (jr JSONResult, err error) {
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
114
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
115 var result string
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
116 err = conn.QueryRowContext(
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
117 req.Context(), listBottlenecksSQL).Scan(&result)
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
118
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
119 switch {
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
120 case err == sql.ErrNoRows:
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
121 err = JSONError{
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
122 Code: http.StatusNotFound,
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
123 Message: "Cannot find any bottleneck.",
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
124 }
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
125 return
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
126 case err != nil:
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
127 return
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
128 }
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
129
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
130 jr = JSONResult{Result: strings.NewReader(result)}
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
131 return
146245d2198f List all bottlenecks via GET /api/bottlenecks
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1024
diff changeset
132 }