@@ -200,13 +200,7 @@ async def build_gadm_geostore(
200
200
region_id : str | None = None ,
201
201
subregion_id : str | None = None ,
202
202
) -> AdminGeostore :
203
- dv : Tuple [str , str ] = await admin_params_to_dataset_version (
204
- admin_provider , admin_version
205
- )
206
- dataset , version = dv
207
-
208
- src_table : Table = db .table (version )
209
- src_table .schema = dataset
203
+ src_table = await get_versioned_dataset (admin_provider , admin_version )
210
204
211
205
columns_etc : List [Column | Label ] = [
212
206
db .column ("adm_level" ),
@@ -231,16 +225,43 @@ async def build_gadm_geostore(
231
225
)
232
226
)
233
227
228
+ sql : Select = db .select (columns_etc ).select_from (src_table )
229
+
230
+ sql = await add_where_clauses (adm_level , admin_provider , admin_version , country_id , region_id , sql , subregion_id )
231
+
232
+ row = await get_first_row (sql )
233
+ if row is None :
234
+ raise RecordNotFoundError (
235
+ f"Admin boundary not found in { admin_provider } version { admin_version } "
236
+ )
237
+
238
+ if row .geojson is None :
239
+ raise GeometryIsNullError (
240
+ "GeoJSON is None, try reducing or eliminating simplification."
241
+ )
242
+
243
+ return await form_admin_geostore (
244
+ adm_level = adm_level ,
245
+ admin_version = admin_version ,
246
+ area = float (row .gfw_area__ha ),
247
+ bbox = [float (val ) for val in row .gfw_bbox ],
248
+ name = str (row .name ),
249
+ geojson = json .loads (row .geojson ),
250
+ geostore_id = str (row .gfw_geostore_id ),
251
+ level_id = str (row .level_id ),
252
+ simplify = simplify ,
253
+ )
254
+
255
+
256
+ async def add_where_clauses (adm_level , admin_provider , admin_version , country_id , region_id , sql , subregion_id ):
234
257
where_clauses : List [TextClause ] = [
235
258
db .text ("adm_level=:adm_level" ).bindparams (adm_level = str (adm_level ))
236
259
]
237
-
238
260
# gid_0 is just a three-character value, but all more specific ids are
239
261
# followed by an underscore (which has to be escaped because normally in
240
262
# SQL an underscore is a wildcard) and a revision number (for which we
241
263
# use an UN-escaped underscore).
242
264
level_id_pattern : str = country_id
243
-
244
265
if adm_level == 0 : # Special-case to avoid slow LIKE
245
266
where_clauses .append (
246
267
db .text ("gid_0=:level_id_pattern" ).bindparams (
@@ -265,34 +286,19 @@ async def build_gadm_geostore(
265
286
level_id_pattern = level_id_pattern
266
287
)
267
288
)
268
-
269
- sql : Select = db .select (columns_etc ).select_from (src_table )
270
-
271
289
for clause in where_clauses :
272
290
sql = sql .where (clause )
291
+ return sql
273
292
274
- row = await get_first_row (sql )
275
- if row is None :
276
- raise RecordNotFoundError (
277
- f"Admin boundary not found in { admin_provider } version { admin_version } "
278
- )
279
-
280
- if row .geojson is None :
281
- raise GeometryIsNullError (
282
- "GeoJSON is None, try reducing or eliminating simplification."
283
- )
284
293
285
- return await form_admin_geostore (
286
- adm_level = adm_level ,
287
- admin_version = admin_version ,
288
- area = float (row .gfw_area__ha ),
289
- bbox = [float (val ) for val in row .gfw_bbox ],
290
- name = str (row .name ),
291
- geojson = json .loads (row .geojson ),
292
- geostore_id = str (row .gfw_geostore_id ),
293
- level_id = str (row .level_id ),
294
- simplify = simplify ,
294
+ async def get_versioned_dataset (admin_provider , admin_version ):
295
+ dv : Tuple [str , str ] = await admin_params_to_dataset_version (
296
+ admin_provider , admin_version
295
297
)
298
+ dataset , version = dv
299
+ src_table : Table = db .table (version )
300
+ src_table .schema = dataset
301
+ return src_table
296
302
297
303
298
304
async def get_gadm_geostore (
0 commit comments