|
6 | 6 | AggregatedUserGroupStatData, |
7 | 7 | AggregatedUserStatData, |
8 | 8 | ) |
9 | | -from apps.existing_database.models import Result |
| 9 | +from apps.existing_database.models import MappingSession |
10 | 10 | from django.core.management.base import BaseCommand |
11 | 11 | from django.db import connection, models, transaction |
12 | 12 | from django.utils import timezone |
|
22 | 22 | swipes |
23 | 23 | ) |
24 | 24 | ( |
25 | | - -- Retrieve used tasks |
26 | | - WITH used_tasks as ( |
| 25 | + -- Retrieve used task groups |
| 26 | + WITH used_task_groups as ( |
27 | 27 | SELECT |
28 | | - project_id, group_id, task_id |
29 | | - FROM results R |
30 | | - INNER JOIN tasks T USING (project_id, group_id, task_id) |
| 28 | + MS.project_id, MS.group_id |
| 29 | + FROM mapping_sessions MS |
31 | 30 | WHERE |
32 | | - R.timestamp >= %(from_date)s and R.timestamp < %(until_date)s |
33 | | - GROUP BY project_id, group_id, task_id |
| 31 | + MS.start_time >= %(from_date)s and MS.start_time < %(until_date)s |
| 32 | + GROUP BY project_id, group_id -- To get unique |
34 | 33 | ), |
35 | | - -- Calculated task area. |
36 | | - task_data as ( |
| 34 | + -- Calculated area by task_groups |
| 35 | + task_group_data as ( |
37 | 36 | SELECT |
38 | 37 | project_id, |
39 | 38 | group_id, |
40 | | - task_id, |
41 | | - ST_Area(geom::geography(GEOMETRY,4326)) / 1000000 as area -- sqkm |
42 | | - FROM used_tasks |
43 | | - INNER JOIN tasks T USING (project_id, group_id, task_id) |
| 39 | + SUM( |
| 40 | + ST_Area(geom::geography(GEOMETRY,4326)) / 1000000 |
| 41 | + ) as total_task_group_area -- sqkm |
| 42 | + FROM tasks T |
| 43 | + INNER JOIN used_task_groups UG USING (project_id, group_id) |
| 44 | + GROUP BY project_id, group_id |
44 | 45 | ), |
45 | | - -- Aggregate data by group |
| 46 | + -- Aggregate data by user |
46 | 47 | user_data as ( |
47 | 48 | SELECT |
48 | | - R.project_id, |
49 | | - R.group_id, |
50 | | - R.user_id, |
51 | | - MAX(R.timestamp::date) as timestamp_date, |
52 | | - MIN(R.start_time) as start_time, |
53 | | - MAX(R.end_time) as end_time, |
54 | | - COUNT(DISTINCT R.task_id) as task_count, |
55 | | - SUM(T.area) as area_swiped |
56 | | - From results R |
57 | | - INNER JOIN task_data T USING (project_id, group_id, task_id) |
| 49 | + MS.project_id, |
| 50 | + MS.group_id, |
| 51 | + MS.user_id, |
| 52 | + MS.start_time::date as timestamp_date, |
| 53 | + MS.start_time, |
| 54 | + MS.end_time, |
| 55 | + MS.items_count as task_count, |
| 56 | + TG.total_task_group_area as area_swiped |
| 57 | + FROM mapping_sessions MS |
| 58 | + INNER JOIN task_group_data TG USING (project_id, group_id) |
58 | 59 | WHERE |
59 | | - R.timestamp >= %(from_date)s and R.timestamp < %(until_date)s |
60 | | - GROUP BY R.project_id, R.group_id, R.user_id |
| 60 | + MS.start_time >= %(from_date)s and MS.start_time < %(until_date)s |
61 | 61 | ), |
62 | | - -- Aggregate group data |
| 62 | + -- Additional aggregate by timestamp_date |
63 | 63 | user_agg_data as ( |
64 | 64 | SELECT |
65 | 65 | project_id, |
|
102 | 102 | swipes |
103 | 103 | ) |
104 | 104 | ( |
105 | | - -- Retrieve used tasks |
106 | | - WITH used_tasks as ( |
| 105 | + -- Retrieve used task groups |
| 106 | + WITH used_task_groups as ( |
107 | 107 | SELECT |
108 | | - project_id, group_id, task_id |
109 | | - From results_user_groups ug |
110 | | - INNER JOIN results R USING (project_id, group_id, user_id) |
111 | | - INNER JOIN tasks T USING (project_id, group_id, task_id) |
| 108 | + MS.project_id, MS.group_id |
| 109 | + From mapping_sessions_user_groups MSUR |
| 110 | + INNER JOIN mapping_sessions MS USING (mapping_session_id) |
112 | 111 | WHERE |
113 | | - R.timestamp >= %(from_date)s and R.timestamp < %(until_date)s |
114 | | - GROUP BY project_id, group_id, task_id |
| 112 | + MS.start_time >= %(from_date)s and MS.start_time < %(until_date)s |
| 113 | + GROUP BY project_id, group_id -- To get unique |
115 | 114 | ), |
116 | | - -- Calculated task area. |
117 | | - task_data as ( |
| 115 | + -- Calculated area by task_groups |
| 116 | + task_group_data as ( |
118 | 117 | SELECT |
119 | 118 | project_id, |
120 | 119 | group_id, |
121 | | - task_id, |
122 | | - ST_Area(geom::geography(GEOMETRY,4326)) / 1000000 as area -- sqkm |
123 | | - FROM used_tasks |
124 | | - INNER JOIN tasks T USING (project_id, group_id, task_id) |
| 120 | + SUM( |
| 121 | + ST_Area(geom::geography(GEOMETRY,4326)) / 1000000 |
| 122 | + ) as total_task_group_area -- sqkm |
| 123 | + FROM tasks T |
| 124 | + INNER JOIN used_task_groups UG USING (project_id, group_id) |
| 125 | + GROUP BY project_id, group_id |
125 | 126 | ), |
126 | | - -- Aggregate data by group |
| 127 | + -- Aggregate data by user-group |
127 | 128 | user_group_data as ( |
128 | 129 | SELECT |
129 | | - ug.project_id, |
130 | | - ug.group_id, |
131 | | - ug.user_id, |
132 | | - ug.user_group_id, |
133 | | - MAX(R.timestamp::date) as timestamp_date, |
134 | | - MIN(R.start_time) as start_time, |
135 | | - MAX(R.end_time) as end_time, |
136 | | - COUNT(DISTINCT R.task_id) as task_count, |
137 | | - SUM(T.area) as area_swiped |
138 | | - From results_user_groups ug |
139 | | - INNER JOIN results R USING (project_id, group_id, user_id) |
140 | | - INNER JOIN task_data T USING (task_id) |
| 130 | + MS.project_id, |
| 131 | + MS.group_id, |
| 132 | + MS.user_id, |
| 133 | + MSUR.user_group_id, |
| 134 | + MS.start_time::date as timestamp_date, |
| 135 | + MS.start_time as start_time, |
| 136 | + MS.end_time as end_time, |
| 137 | + MS.items_count as task_count, |
| 138 | + TG.total_task_group_area as area_swiped |
| 139 | + From mapping_sessions_user_groups MSUR |
| 140 | + INNER JOIN mapping_sessions MS USING (mapping_session_id) |
| 141 | + INNER JOIN task_group_data TG USING (project_id, group_id) |
141 | 142 | WHERE |
142 | | - R.timestamp >= %(from_date)s and R.timestamp < %(until_date)s |
143 | | - GROUP BY ug.project_id, ug.group_id, ug.user_id, ug.user_group_id |
| 143 | + MS.start_time >= %(from_date)s and MS.start_time < %(until_date)s |
144 | 144 | ), |
145 | | - -- Aggregate group data |
| 145 | + -- Additional aggregate by timestamp_date |
146 | 146 | user_group_agg_data as ( |
147 | 147 | SELECT |
148 | 148 | project_id, |
@@ -188,8 +188,8 @@ def _track(self, tracker_type, label, sql): |
188 | 188 | from_date = datetime.datetime.strptime(tracker.value, "%Y-%m-%d").date() |
189 | 189 | else: |
190 | 190 | self.stdout.write(f"{label.title()} Last tracker data not found.") |
191 | | - timestamp_min = Result.objects.aggregate( |
192 | | - timestamp_min=models.Min("timestamp") |
| 191 | + timestamp_min = MappingSession.objects.aggregate( |
| 192 | + timestamp_min=models.Min("start_time") |
193 | 193 | )["timestamp_min"] |
194 | 194 | if timestamp_min: |
195 | 195 | self.stdout.write(f"Using min timestamp from database {timestamp_min}") |
|
0 commit comments