Skip to content

Commit d9b4909

Browse files
authored
Merge pull request #15 from CatalystCode/filter-by-name
Add query parameter to filter results by name
2 parents 15d7a86 + 64b5782 commit d9b4909

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

controllers/features.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ exports.getByBoundingBox = function(req, res) {
7474
west: parseFloat(req.params.west),
7575
south: parseFloat(req.params.south),
7676
east: parseFloat(req.params.east),
77+
filter_name: req.query.filter_name,
7778
include: req.query.include
7879
};
7980

services/features.js

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,25 @@ function buildQueryColumns(query) {
122122
return queryColumns;
123123
}
124124

125+
function addQueryPredicates(sql, query) {
126+
if (query.layer) {
127+
sql += ` AND layer = ${escapeSql(query.layer)}`;
128+
}
129+
130+
if (query.filter_name) {
131+
sql += ` AND strpos(lower(name), lower(${escapeSql(query.filter_name)})) > 0`;
132+
}
133+
134+
return sql;
135+
}
136+
125137
function getByBoundingBox(query, callback) {
126138
let boundingBoxQuery = `SELECT ${buildQueryColumns(query)} FROM features WHERE ST_Intersects(hull, ST_MakeEnvelope(
127139
${query.west}, ${query.south},
128140
${query.east}, ${query.north}, 4326
129141
))`;
130142

131-
if (query.layer) {
132-
boundingBoxQuery += ` AND layer=${escapeSql(query.layer)}`;
133-
}
143+
boundingBoxQuery = addQueryPredicates(boundingBoxQuery, query);
134144

135145
return executeQuery(boundingBoxQuery, callback);
136146
}
@@ -140,24 +150,20 @@ function getByPoint(query, callback) {
140150
'POINT(${query.longitude} ${query.latitude})', 4326)
141151
)`;
142152

143-
if (query.layer) {
144-
pointQuery += ` AND layer=${escapeSql(query.layer)}`;
145-
}
153+
pointQuery = addQueryPredicates(pointQuery, query);
146154

147155
return executeQuery(pointQuery, callback);
148156
}
149157

150158
function getByName(query, callback) {
151159
const names = query.name.constructor === Array ? query.name : [query.name];
152160

153-
let namesDisjunction = names.map(function(name) {
161+
let namesDisjunction = `(${names.map(function(name) {
154162
return `lower(name) = ${escapeSql(name.toLowerCase())}`;
155-
}).join(" OR ");
163+
}).join(" OR ")})`;
156164
let nameQuery = `SELECT ${buildQueryColumns(query)} FROM features WHERE ${namesDisjunction}`;
157165

158-
if (query.layer) {
159-
nameQuery += ` AND layer=${escapeSql(query.layer)}`;
160-
}
166+
nameQuery = addQueryPredicates(nameQuery, query);
161167

162168
executeQuery(nameQuery, callback);
163169
}

0 commit comments

Comments
 (0)