annotate pkg/controllers/search.go @ 748:3cb012d4d9ef

Added search for bottlenecks As we only implement search for rkm an and bottlenecks for now, this is the default if the search string is not a (potential) rkm number.
author Sascha Wilde <wilde@intevation.de>
date Mon, 24 Sep 2018 16:19:31 +0200
parents 6fe6839f5ce6
children 802ecaae8410
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
1 package controllers
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
2
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
3 import (
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
4 "database/sql"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
5 "fmt"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
6 "net/http"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
7 "regexp"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
8 "strconv"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
9 "strings"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
10
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
11 "gemma.intevation.de/gemma/pkg/models"
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
12 )
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
13
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
14 const (
744
6fe6839f5ce6 Make search return an array of features, including name.
Sascha Wilde <wilde@intevation.de>
parents: 743
diff changeset
15 searchHectometreSQL = `SELECT json_agg(r)
6fe6839f5ce6 Make search return an array of features, including name.
Sascha Wilde <wilde@intevation.de>
parents: 743
diff changeset
16 FROM (SELECT location_code::text AS name,
6fe6839f5ce6 Make search return an array of features, including name.
Sascha Wilde <wilde@intevation.de>
parents: 743
diff changeset
17 ST_AsGeoJSON(geom)::json AS geom
6fe6839f5ce6 Make search return an array of features, including name.
Sascha Wilde <wilde@intevation.de>
parents: 743
diff changeset
18 FROM waterway.distance_marks
748
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
19 WHERE (location_code).hectometre = $1) r`
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
20 searchBottleneckSQL = `SELECT json_agg(r)
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
21 FROM (SELECT objnam AS name,
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
22 ST_AsGeoJSON(ST_Centroid(area))::json AS geom
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
23 FROM waterway.bottlenecks
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
24 WHERE objnam ILIKE $1) r`
743
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 var rkmRegex = regexp.MustCompile(
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
28 "^[[:space:]]*([0-9]+)([,.]([0-9]))?[[:space:]]*$",
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
29 )
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
30
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
31 func searchFeature(
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
32 input interface{},
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
33 req *http.Request,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
34 db *sql.Conn,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
35 ) (jr JSONResult, err error) {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
36
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
37 s := input.(*models.SearchRequest)
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
38
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
39 if len(s.SearchString) == 0 {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
40 err = JSONError{http.StatusBadRequest,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
41 "error: empty search string"}
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
42 return
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
43 }
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
44
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
45 // Handle search for river kilometre:
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
46
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
47 m := rkmRegex.FindStringSubmatch(s.SearchString)
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
48 if len(m) != 0 {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
49 var hectometre int
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
50 if hectometre, err = strconv.Atoi(m[1]); err != nil {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
51 return
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 hectometre *= 10
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
55 if len(m) == 4 {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
56 var h int
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
57 if h, err = strconv.Atoi(m[3]); err != nil {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
58 return
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 hectometre += h
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
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
63 var result string
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
64
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
65 err = db.QueryRowContext(
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
66 req.Context(),
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
67 searchHectometreSQL,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
68 hectometre,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
69 ).Scan(&result)
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
70
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
71 switch {
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
72 case err == sql.ErrNoRows:
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
73 err = JSONError{
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
74 Code: http.StatusNotFound,
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
75 Message: fmt.Sprintf("Cannot find river hectometre %d.",
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
76 hectometre),
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 return
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
79 case err != nil:
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
80 return
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
81 }
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
82
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
83 jr.Result = strings.NewReader(result)
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
84 } else {
748
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
85 var result string
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
86
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
87 err = db.QueryRowContext(
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
88 req.Context(),
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
89 searchBottleneckSQL,
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
90 "%"+s.SearchString+"%",
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
91 ).Scan(&result)
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
92
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
93 switch {
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
94 case err == sql.ErrNoRows:
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
95 err = JSONError{
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
96 Code: http.StatusNotFound,
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
97 Message: fmt.Sprintf("No Results for %s.",
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
98 s.SearchString),
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
99 }
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
100 return
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
101 case err != nil:
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
102 return
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
103 }
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
104
748
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
105 jr.Result = strings.NewReader(result)
3cb012d4d9ef Added search for bottlenecks
Sascha Wilde <wilde@intevation.de>
parents: 744
diff changeset
106
743
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
107 }
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
108
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
109 return
fdff2de616ad Added search function for river kilometer.
Sascha Wilde <wilde@intevation.de>
parents:
diff changeset
110 }