Skip to content

Commit 9fb5c1e

Browse files
author
matthias_schaub
committed
Delete chunks of data in case of exceding max write limit during deletion.
1 parent 98d1737 commit 9fb5c1e

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

mapswipe_workers/mapswipe_workers/firebase_to_postgres/delete_project.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,51 @@
22
Delete projects.
33
"""
44

5+
from firebase_admin import exceptions
6+
57
from mapswipe_workers import auth
68
from mapswipe_workers.definitions import logger
79

810

11+
def chunks(data, size=250):
12+
"""Yield successive n-sized chunks from list."""
13+
for i in range(0, len(data), size):
14+
yield data[i : i + size]
15+
16+
917
def delete_project(project_ids: list) -> None:
1018
"""
11-
Deletes projects.
12-
13-
Deletes project, groups, tasks and results from Firebase and Postgres
19+
Deletes project, groups, tasks and results from Firebase and Postgres.
1420
"""
1521
for project_id in project_ids:
1622
logger.info(
1723
f"Delete project, groups, tasks and results of project: {project_id}"
1824
)
1925

2026
fb_db = auth.firebaseDB()
21-
fb_db.reference(f"v2/results/{project_id}").delete()
22-
fb_db.reference(f"v2/tasks/{project_id}").delete()
27+
28+
ref = fb_db.reference(f"v2/results/{project_id}")
29+
try:
30+
ref.delete()
31+
except exceptions.InvalidArgumentError:
32+
# Data to write exceeds the maximum size that can be modified
33+
# with a single request. Delete chunks of data instead.
34+
childs = ref.get(shallow=True)
35+
for chunk in chunks(list(childs.keys())):
36+
ref.update({key: None for key in chunk})
37+
ref.delete()
38+
39+
ref = fb_db.reference(f"v2/tasks/{project_id}")
40+
try:
41+
ref.delete()
42+
except exceptions.InvalidArgumentError:
43+
# Data to write exceeds the maximum size that can be modified
44+
# with a single request. Delete chunks of data instead.
45+
childs = ref.get(shallow=True)
46+
for chunk in chunks(list(childs.keys())):
47+
ref.update({key: None for key in chunk})
48+
ref.delete()
49+
2350
fb_db.reference(f"v2/groups/{project_id}").delete()
2451
fb_db.reference(f"v2/projects/{project_id}").delete()
2552

0 commit comments

Comments
 (0)