Skip to content

Commit 587c82c

Browse files
committed
add label filter for entities geojson, fixes getodk/central#1525
1 parent 81569da commit 587c82c

File tree

4 files changed

+23
-7
lines changed

4 files changed

+23
-7
lines changed

lib/model/query/entities.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1110,5 +1110,5 @@ module.exports = {
11101110
getAll, getAllDefs, del,
11111111
createEntitiesFromPendingSubmissions,
11121112
resolveConflict, restore, purge, getEntitiesState,
1113-
getAllCreators, deleteByIds, restoreByIds
1113+
getAllCreators, deleteByIds, restoreByIds, searchClause
11141114
};

lib/model/query/geo-extracts.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
const { sql } = require('slonik');
1111
const { arrayHasElements } = require('../../util/util');
12+
const { searchClause } = require('./entities');
1213

1314

1415
const stateFilterToQueryFragments = (field, states, pgType = 'text') => {
@@ -183,21 +184,22 @@ const getSubmissionFeatureCollectionGeoJson = (formPK, IDs, fieldPaths, submitte
183184
};
184185

185186

186-
const getEntityFeatureCollectionGeoJson = (datasetPK, IDs, creatorIds, TSTZRange, conflictStates, deleted, limit) => ({ db }) => {
187+
const getEntityFeatureCollectionGeoJson = (datasetPK, IDs, creatorIds, TSTZRange, conflictStates, deleted, limit, search) => ({ db }) => {
187188

188189
const idFilter = arrayHasElements(IDs) ? sql`AND e.uuid = ANY(${sql.array(IDs, 'text')})` : sql``; // TODO: this should be a uuid[] array once/if the entities."uuid" column is converted from varchar(255) to uuid
189190
const creatorFilter = arrayHasElements(creatorIds) ? sql`AND e."creatorId" = ANY(${sql.array(creatorIds, 'int4')})` : sql``;
190191
const TSTZRangeFilter = arrayHasElements(TSTZRange) ? sql`AND e."createdAt" <@ tstzrange(${TSTZRange[0]}, ${TSTZRange[1]}, ${TSTZRange[2]})` : sql``;
191192
const conflictStatusFilter = arrayHasElements(conflictStates) ? sql`AND ${stateFilterToQueryFragments(['e', 'conflict'], conflictStates, 'conflictType')}` : sql``;
192193
const deletedFilter = deleted ? sql`IS NOT NULL` : sql`IS NULL`;
193194
const queryLimit = limit ? sql`LIMIT ${limit}` : sql``;
195+
const searchFilter = searchClause(search);
194196

195197

196198
return db.oneFirst(sql`
197199
WITH extracted AS (
198200
SELECT
199201
e.uuid,
200-
odk2geojson_ducktyped(ed.data ->> 'geometry') AS geojsoned
202+
odk2geojson_ducktyped(entity_defs.data ->> 'geometry') AS geojsoned
201203
FROM
202204
datasets ds
203205
INNER JOIN ds_properties dsprops ON (
@@ -214,12 +216,13 @@ const getEntityFeatureCollectionGeoJson = (datasetPK, IDs, creatorIds, TSTZRange
214216
${TSTZRangeFilter}
215217
${conflictStatusFilter}
216218
)
217-
INNER JOIN entity_defs ed ON (
218-
ed."entityId" = e.id
219+
INNER JOIN entity_defs ON (
220+
entity_defs."entityId" = e.id
219221
AND
220-
ed.current
222+
entity_defs.current
221223
AND
222-
(ed.data ? 'geometry' AND (ed.data ->> 'geometry' ~ '\\d')) -- there's an index on this expression
224+
(entity_defs.data ? 'geometry' AND (entity_defs.data ->> 'geometry' ~ '\\d')) -- there's an index on this expression
225+
AND ${searchFilter}
223226
)
224227
${queryLimit}
225228
),

lib/resources/geo-extracts.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ module.exports = (service, endpoint) => {
6969
Sanitize.getEntityConflictStates(query.conflict, 'conflict'),
7070
isTrue(query.deleted),
7171
Number.parseInt(query.limit, 10) || null,
72+
Sanitize.queryParamToArray(query.$search)[0],
7273
).then(json);
7374
}));
7475

test/integration/api/geodata.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,18 @@ describe('api: entities-geodata', () => {
803803
}));
804804

805805

806+
it('Attribute label filter does its job', testService(async (service, { db }) => {
807+
const { asAlice } = await setupGeoEntities(service, db);
808+
809+
await asAlice.get(`/v1/projects/1/datasets/geofun/entities.geojson?$search=a`)
810+
.expect(200)
811+
.then((resp) => {
812+
resp.body.features.length.should.equal(1);
813+
});
814+
815+
}));
816+
817+
806818
it('conflict status filter does its job', testService(async (service, { db }) => {
807819
const { asAlice } = await setupGeoEntities(service, db);
808820

0 commit comments

Comments
 (0)