Skip to content

Commit 9380369

Browse files
authored
Merge pull request #869 from mapswipe/fix/footprint-calculation-fix
Fix footprint time threshold calculation logic
2 parents ec64f11 + 1b4c03a commit 9380369

File tree

3 files changed

+103
-12
lines changed

3 files changed

+103
-12
lines changed

django/apps/aggregated/management/commands/update_aggregated_data.py

+67-10
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,62 @@
1919
# |1|00:00:00.208768|00:00:01.398161|00:00:28.951521|
2020
# |2|00:00:01.330297|00:00:06.076814|00:00:03.481192|
2121
# |3|00:00:02.092967|00:00:11.271081|00:00:06.045881|
22-
UPDATE_PROJECT_GROUP_DATA = f"""
22+
23+
UPDATE_PROJECT_GROUP_DATA_USING_PROJECT_ID = f"""
24+
WITH to_calculate_groups AS (
25+
SELECT
26+
project_id,
27+
group_id
28+
FROM groups
29+
WHERE
30+
(project_id, group_id) in (
31+
SELECT
32+
MS.project_id,
33+
MS.group_id
34+
FROM mapping_sessions MS
35+
WHERE
36+
project_id = %(project_id)s
37+
GROUP BY MS.project_id, MS.group_id
38+
) AND
39+
(
40+
total_area is NULL OR time_spent_max_allowed is NULL
41+
)
42+
),
43+
groups_data AS (
44+
SELECT
45+
T.project_id,
46+
T.group_id,
47+
SUM( -- sqkm
48+
ST_Area(T.geom::geography(GEOMETRY,4326)) / 1000000
49+
) as total_task_group_area,
50+
(
51+
CASE
52+
-- Using 95_percent value of existing data for each project_type
53+
WHEN P.project_type = {Project.Type.BUILD_AREA.value} THEN 1.4
54+
WHEN P.project_type = {Project.Type.COMPLETENESS.value} THEN 1.4
55+
WHEN P.project_type = {Project.Type.CHANGE_DETECTION.value} THEN 11.2
56+
-- FOOTPRINT: Not calculated right now
57+
WHEN P.project_type = {Project.Type.FOOTPRINT.value} THEN 6.1
58+
ELSE 1
59+
END
60+
) * COUNT(*) as time_spent_max_allowed
61+
FROM tasks T
62+
INNER JOIN to_calculate_groups G USING (project_id, group_id)
63+
INNER JOIN projects P USING (project_id)
64+
GROUP BY project_id, P.project_type, group_id
65+
)
66+
UPDATE groups G
67+
SET
68+
total_area = GD.total_task_group_area,
69+
time_spent_max_allowed = GD.time_spent_max_allowed
70+
FROM groups_data GD
71+
WHERE
72+
G.project_id = GD.project_id AND
73+
G.group_id = GD.group_id;
74+
"""
75+
76+
77+
UPDATE_PROJECT_GROUP_DATA_USING_TIME_RANGE = f"""
2378
WITH to_calculate_groups AS (
2479
SELECT
2580
project_id,
@@ -73,11 +128,17 @@
73128
G.group_id = GD.group_id;
74129
"""
75130

76-
TASK_GROUP_METADATA_QUERY = """
131+
TASK_GROUP_METADATA_QUERY = f"""
77132
SELECT
78133
G.project_id,
79134
G.group_id,
80-
G.total_area as total_task_group_area,
135+
(
136+
CASE
137+
-- Hide area for Footprint
138+
WHEN P.project_type = {Project.Type.FOOTPRINT.value} THEN 0
139+
ELSE G.total_area
140+
END
141+
) as total_task_group_area,
81142
G.time_spent_max_allowed
82143
FROM groups G
83144
INNER JOIN used_task_groups UG USING (project_id, group_id)
@@ -106,9 +167,7 @@
106167
FROM mapping_sessions MS
107168
INNER JOIN projects P USING (project_id)
108169
WHERE
109-
-- Skip for footprint type missions
110-
P.project_type != {Project.Type.FOOTPRINT.value}
111-
AND MS.start_time >= %(from_date)s
170+
MS.start_time >= %(from_date)s
112171
AND MS.start_time < %(until_date)s
113172
GROUP BY project_id, project_type, group_id -- To get unique
114173
),
@@ -185,9 +244,7 @@
185244
INNER JOIN mapping_sessions MS USING (mapping_session_id)
186245
INNER JOIN projects P USING (project_id)
187246
WHERE
188-
-- Skip for footprint type missions
189-
P.project_type != {Project.Type.FOOTPRINT.value}
190-
AND MS.start_time >= %(from_date)s
247+
MS.start_time >= %(from_date)s
191248
AND MS.start_time < %(until_date)s
192249
GROUP BY project_id, project_type, group_id -- To get unique
193250
),
@@ -288,7 +345,7 @@ def _track(self, tracker_type, label, sql):
288345
)
289346
with transaction.atomic():
290347
with connection.cursor() as cursor:
291-
cursor.execute(UPDATE_PROJECT_GROUP_DATA, params)
348+
cursor.execute(UPDATE_PROJECT_GROUP_DATA_USING_TIME_RANGE, params)
292349
self.stdout.write(
293350
self.style.SUCCESS(
294351
f"Successfull. Runtime: {time.time() - start_time} seconds"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import time
2+
3+
from apps.existing_database.models import Project
4+
from django.core.management.base import BaseCommand
5+
from django.db import connection, transaction
6+
7+
from .update_aggregated_data import UPDATE_PROJECT_GROUP_DATA_USING_PROJECT_ID
8+
9+
10+
class Command(BaseCommand):
11+
def handle(self, **_):
12+
project_qs = Project.objects.all()
13+
total_projects = project_qs.count()
14+
self.stdout.write(f"Total projects: {total_projects}")
15+
for index, project_id in enumerate(
16+
project_qs.values_list("project_id", flat=True),
17+
start=1,
18+
):
19+
self.stdout.write(
20+
"Running calculation for project ID "
21+
f"({index}/{total_projects}): {project_id}"
22+
)
23+
with transaction.atomic():
24+
start_time = time.time()
25+
with connection.cursor() as cursor:
26+
cursor.execute(
27+
UPDATE_PROJECT_GROUP_DATA_USING_PROJECT_ID,
28+
dict(project_id=project_id),
29+
)
30+
self.stdout.write(
31+
self.style.SUCCESS(
32+
f"- Successfull. Runtime: {time.time() - start_time} seconds"
33+
)
34+
)

docker-compose.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ x-django: &base_django
3030
DJANGO_DB_NAME: '${POSTGRES_DB}'
3131
DJANGO_DB_USER: '${POSTGRES_USER}'
3232
DJANGO_DB_PWD: '${POSTGRES_PASSWORD}'
33-
DJANGO_DB_HOST: 'postgres'
33+
DJANGO_DB_HOST: '${POSTGRES_HOST:-postgres}'
3434
DJANGO_DB_PORT: 5432
3535
DJANGO_STATIC_ROOT: '/assets/static/'
3636
DJANGO_MEDIA_ROOT: '/assets/media/'
@@ -62,7 +62,7 @@ x-mapswipe-workers: &base_mapswipe_workers
6262
POSTGRES_PASSWORD: '${POSTGRES_PASSWORD}'
6363
POSTGRES_USER: '${POSTGRES_USER}'
6464
POSTGRES_DB: '${POSTGRES_DB}'
65-
POSTGRES_HOST: 'postgres'
65+
POSTGRES_HOST: '${POSTGRES_HOST:-postgres}'
6666
POSTGRES_PORT: 5432
6767
PGDATA: '/var/lib/postgresql/mapswipe'
6868
IMAGE_BING_API_KEY: '${IMAGE_BING_API_KEY}'

0 commit comments

Comments
 (0)