[openstreetmap/openstreetmap-website] Backfill enhanced changeset stats (PR #6347)
Tom Hughes
notifications at github.com
Tue Aug 26 19:26:35 UTC 2025
tomhughes left a comment (openstreetmap/openstreetmap-website#6347)
I've managed to avoid the need for multiple nested aggregations, which tests suggest is quite a bit more efficient, by doing this:
```sql
WITH total AS (
SELECT
changesets.id AS changeset_id,
SUM(CASE WHEN nodes.version = 1 THEN 1 ELSE 0 END) AS num_created_nodes,
SUM(CASE WHEN nodes.version > 1 AND nodes.visible THEN 1 ELSE 0 END) AS num_modified_nodes,
SUM(CASE WHEN nodes.version > 1 AND NOT nodes.visible THEN 1 ELSE 0 END) AS num_deleted_nodes,
SUM(CASE WHEN ways.version = 1 THEN 1 ELSE 0 END) AS num_created_ways,
SUM(CASE WHEN ways.version > 1 AND ways.visible THEN 1 ELSE 0 END) AS num_modified_ways,
SUM(CASE WHEN ways.version > 1 AND NOT ways.visible THEN 1 ELSE 0 END) AS num_deleted_ways,
SUM(CASE WHEN relations.version = 1 THEN 1 ELSE 0 END) AS num_created_relations,
SUM(CASE WHEN relations.version > 1 AND relations.visible THEN 1 ELSE 0 END) AS num_modified_relations,
SUM(CASE WHEN relations.version > 1 AND NOT relations.visible THEN 1 ELSE 0 END) AS num_deleted_relations
FROM changesets
LEFT OUTER JOIN nodes ON nodes.changeset_id = changesets.id
LEFT OUTER JOIN ways ON ways.changeset_id = changesets.id
LEFT OUTER JOIN relations ON relations.changeset_id = changesets.id
WHERE changesets.id = ANY($1::bigint[])
GROUP BY changesets.id
)
UPDATE changesets
SET num_created_nodes = total.num_created_nodes,
num_modified_nodes = total.num_modified_nodes,
num_deleted_nodes = total.num_deleted_nodes,
num_created_ways = total.num_created_ways,
num_modified_ways = total.num_modified_ways,
num_deleted_ways = total.num_deleted_ways,
num_created_relations = total.num_created_relations,
num_modified_relations = total.num_modified_relations,
num_deleted_relations = total.num_deleted_relations
FROM total
WHERE changesets.id = total.changeset_id;
```
I also got rid of the renaming of the CTE in the update but it didn't seem to serve any purpose.
In principle the CTE shouldn't need to access `changesets` but when I tried to replace that with an `unnest` of the array postgres decided to table scan `relations` instead of using the index which was very bad.
--
Reply to this email directly or view it on GitHub:
https://github.com/openstreetmap/openstreetmap-website/pull/6347#issuecomment-3225456094
You are receiving this because you are subscribed to this thread.
Message ID: <openstreetmap/openstreetmap-website/pull/6347/c3225456094 at github.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstreetmap.org/pipermail/rails-dev/attachments/20250826/f809e494/attachment.htm>
More information about the rails-dev
mailing list