Skip to content

Commit 8413b53

Browse files
committed
🎨 refactor(Geostore): extract helper methods from build_gadm_geostore
First, make the change easy.
1 parent 0a85d07 commit 8413b53

File tree

1 file changed

+38
-32
lines changed

1 file changed

+38
-32
lines changed

app/crud/geostore.py

+38-32
Original file line numberDiff line numberDiff line change
@@ -200,13 +200,7 @@ async def build_gadm_geostore(
200200
region_id: str | None = None,
201201
subregion_id: str | None = None,
202202
) -> 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)
210204

211205
columns_etc: List[Column | Label] = [
212206
db.column("adm_level"),
@@ -231,16 +225,43 @@ async def build_gadm_geostore(
231225
)
232226
)
233227

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):
234257
where_clauses: List[TextClause] = [
235258
db.text("adm_level=:adm_level").bindparams(adm_level=str(adm_level))
236259
]
237-
238260
# gid_0 is just a three-character value, but all more specific ids are
239261
# followed by an underscore (which has to be escaped because normally in
240262
# SQL an underscore is a wildcard) and a revision number (for which we
241263
# use an UN-escaped underscore).
242264
level_id_pattern: str = country_id
243-
244265
if adm_level == 0: # Special-case to avoid slow LIKE
245266
where_clauses.append(
246267
db.text("gid_0=:level_id_pattern").bindparams(
@@ -265,34 +286,19 @@ async def build_gadm_geostore(
265286
level_id_pattern=level_id_pattern
266287
)
267288
)
268-
269-
sql: Select = db.select(columns_etc).select_from(src_table)
270-
271289
for clause in where_clauses:
272290
sql = sql.where(clause)
291+
return sql
273292

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-
)
284293

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
295297
)
298+
dataset, version = dv
299+
src_table: Table = db.table(version)
300+
src_table.schema = dataset
301+
return src_table
296302

297303

298304
async def get_gadm_geostore(

0 commit comments

Comments
 (0)