From c74716cc3aa64701078950180cac7f87de016b48 Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Mon, 14 Jul 2025 15:16:41 +0200 Subject: [PATCH] refactor: move sql into own file --- ...e1c59660250aa5d1074d4da9c0589d0a6bb3.json} | 4 +- .../read_all_by_timerange_and_area.sql | 38 +++++++++++++++ db/src/models/export_event_row.rs | 47 +++---------------- web/src/endpoints/export/get_events_data.rs | 2 +- 4 files changed, 48 insertions(+), 43 deletions(-) rename db/.sqlx/{query-366b4004828057e3ab47704c4856ea4e41c92af0a388862f77c37ea611a5d193.json => query-8a9f517c18b13e6cbf47404d69c2e1c59660250aa5d1074d4da9c0589d0a6bb3.json} (64%) create mode 100644 db/sql/export_event_row/read_all_by_timerange_and_area.sql diff --git a/db/.sqlx/query-366b4004828057e3ab47704c4856ea4e41c92af0a388862f77c37ea611a5d193.json b/db/.sqlx/query-8a9f517c18b13e6cbf47404d69c2e1c59660250aa5d1074d4da9c0589d0a6bb3.json similarity index 64% rename from db/.sqlx/query-366b4004828057e3ab47704c4856ea4e41c92af0a388862f77c37ea611a5d193.json rename to db/.sqlx/query-8a9f517c18b13e6cbf47404d69c2e1c59660250aa5d1074d4da9c0589d0a6bb3.json index 18600d1f..997e93be 100644 --- a/db/.sqlx/query-366b4004828057e3ab47704c4856ea4e41c92af0a388862f77c37ea611a5d193.json +++ b/db/.sqlx/query-8a9f517c18b13e6cbf47404d69c2e1c59660250aa5d1074d4da9c0589d0a6bb3.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "select\n\tevent.starttimestamp,\n\tevent.endtimestamp,\n\tevent.amountofposten,\n event.voluntaryfuehrungsassistent,\n event.voluntarywachhabender,\n\tlocation.name as locationName,\n\tevent.name as eventName,\n\tarray (\n\tselect\n\t\trow (user_.name, assignment.function) ::simpleAssignment\n\tfrom\n\t\tassignment\n\tjoin availability on\n\t\tassignment.availabilityid = availability.id\n\tjoin user_ on\n\t\tavailability.userid = user_.id\n\twhere\n\t\tassignment.eventId = event.id) as \"assignments: Vec\",\n\t\tarray (\n\tselect\n\t\tvehicle.station || ' ' || vehicle.radiocallname\n\tfrom\n\t\tvehicleassignment\n\tjoin vehicle on\n\t\tvehicleassignment.vehicleId = vehicle.id\n\twhere\n\t\tvehicleassignment.eventId = event.id) as vehicles\nfrom\n\tevent\njoin location on\n\tevent.locationId = location.id\n where event.starttimestamp::date >= $1 and event.starttimestamp::date <= $2 and location.areaId = $3\n order by event.starttimestamp", + "query": "SELECT\n event.starttimestamp,\n event.endtimestamp,\n event.amountofposten,\n event.voluntaryfuehrungsassistent,\n event.voluntarywachhabender,\n location.name AS locationName,\n event.name AS eventName,\n array (\n SELECT\n row (user_.name, assignment.function) ::simpleAssignment\n FROM\n assignment\n JOIN availability on\n assignment.availabilityid = availability.id\n JOIN user_ on\n availability.userid = user_.id\n WHERE\n assignment.eventId = event.id) AS \"assignments: Vec\",\n array (\n SELECT\n vehicle.station || ' ' || vehicle.radiocallname\n FROM\n vehicleassignment\n JOIN vehicle on\n vehicleassignment.vehicleId = vehicle.id\n WHERE\n vehicleassignment.eventId = event.id) AS vehicles\n FROM\n event\n JOIN location on\n event.locationId = location.id\n WHERE\n event.starttimestamp::date >= $1\n AND event.starttimestamp::date <= $2\n AND location.areaId = $3\n ORDER BY\n event.starttimestamp\n", "describe": { "columns": [ { @@ -102,5 +102,5 @@ null ] }, - "hash": "366b4004828057e3ab47704c4856ea4e41c92af0a388862f77c37ea611a5d193" + "hash": "8a9f517c18b13e6cbf47404d69c2e1c59660250aa5d1074d4da9c0589d0a6bb3" } diff --git a/db/sql/export_event_row/read_all_by_timerange_and_area.sql b/db/sql/export_event_row/read_all_by_timerange_and_area.sql new file mode 100644 index 00000000..3dff6a74 --- /dev/null +++ b/db/sql/export_event_row/read_all_by_timerange_and_area.sql @@ -0,0 +1,38 @@ +SELECT + event.starttimestamp, + event.endtimestamp, + event.amountofposten, + event.voluntaryfuehrungsassistent, + event.voluntarywachhabender, + location.name AS locationName, + event.name AS eventName, + array ( + SELECT + row (user_.name, assignment.function) ::simpleAssignment + FROM + assignment + JOIN availability on + assignment.availabilityid = availability.id + JOIN user_ on + availability.userid = user_.id + WHERE + assignment.eventId = event.id) AS "assignments: Vec", + array ( + SELECT + vehicle.station || ' ' || vehicle.radiocallname + FROM + vehicleassignment + JOIN vehicle on + vehicleassignment.vehicleId = vehicle.id + WHERE + vehicleassignment.eventId = event.id) AS vehicles + FROM + event + JOIN location on + event.locationId = location.id + WHERE + event.starttimestamp::date >= $1 + AND event.starttimestamp::date <= $2 + AND location.areaId = $3 + ORDER BY + event.starttimestamp diff --git a/db/src/models/export_event_row.rs b/db/src/models/export_event_row.rs index c3d3e9a7..a5404d8c 100644 --- a/db/src/models/export_event_row.rs +++ b/db/src/models/export_event_row.rs @@ -2,7 +2,7 @@ use chrono::{NaiveDate, NaiveDateTime}; use sqlx::{ PgPool, postgres::{PgHasArrayType, PgTypeInfo}, - query, + query_file, }; use super::{Function, Result}; @@ -33,49 +33,16 @@ impl PgHasArrayType for SimpleAssignment { } impl ExportEventRow { - pub async fn read_all_for_timerange_and_area( + pub async fn read_all_by_timerange_and_area( pool: &PgPool, time: (NaiveDate, NaiveDate), area: i32, ) -> Result> { - let rows = query!( - "select - event.starttimestamp, - event.endtimestamp, - event.amountofposten, - event.voluntaryfuehrungsassistent, - event.voluntarywachhabender, - location.name as locationName, - event.name as eventName, - array ( - select - row (user_.name, assignment.function) ::simpleAssignment - from - assignment - join availability on - assignment.availabilityid = availability.id - join user_ on - availability.userid = user_.id - where - assignment.eventId = event.id) as \"assignments: Vec\", - array ( - select - vehicle.station || ' ' || vehicle.radiocallname - from - vehicleassignment - join vehicle on - vehicleassignment.vehicleId = vehicle.id - where - vehicleassignment.eventId = event.id) as vehicles -from - event -join location on - event.locationId = location.id - where event.starttimestamp::date >= $1 and event.starttimestamp::date <= $2 and location.areaId = $3 - order by event.starttimestamp", - time.0, - time.1, - area + let rows = query_file!( + "sql/export_event_row/read_all_by_timerange_and_area.sql", + time.0, + time.1, + area ) .fetch_all(pool) .await?; diff --git a/web/src/endpoints/export/get_events_data.rs b/web/src/endpoints/export/get_events_data.rs index e87e79f4..eb47be33 100644 --- a/web/src/endpoints/export/get_events_data.rs +++ b/web/src/endpoints/export/get_events_data.rs @@ -134,7 +134,7 @@ pub async fn get( let area = query.area.unwrap_or(user.area_id); - let rows_to_export = ExportEventRow::read_all_for_timerange_and_area( + let rows_to_export = ExportEventRow::read_all_by_timerange_and_area( pool.get_ref(), (query.start, query.end), area,