From d4ff664f742879c6c2734b2aba2266b4e87f8f95 Mon Sep 17 00:00:00 2001 From: Tobias Reisinger Date: Tue, 11 Jun 2024 14:10:25 +0200 Subject: [PATCH] Add relay view to faster load controller_uid --- ...90be8091daa97b0af548b6ebf60cdc03dfba.json} | Bin 702 -> 807 bytes ...b3255a5426d54901f4f3aa96ad152b05ffd0.json} | Bin 876 -> 896 bytes ...f5cdd699bfe7600389e37ca980b6fad12bb5.json} | Bin 783 -> 827 bytes ...085677c09be8be903804120c2d52579afdbb.json} | Bin 678 -> 794 bytes ...b9bbb0e6c203b721d29cf9149f60bfdd93465.json | Bin 735 -> 0 bytes ...a27f690020f89958dfc8dd6044a31afdb31d.json} | Bin 717 -> 851 bytes ...e63322d3bb1579e52d0f053307e24bd039ef9.json | Bin 0 -> 996 bytes ...4ca2ef93958f9975c585c6de3c437782995d.json} | Bin 691 -> 816 bytes ...552812362c3141738b60bc63d673a7f552506.json | Bin 0 -> 287 bytes .../20240611000000_add_relays_view.down.sql | 1 + .../20240611000000_add_relays_view.up.sql | 8 +++++ src/db/controllers.rs | 2 +- src/db/junction_relay_schedule.rs | 4 +-- src/db/relays.rs | 32 ++++++++++++------ src/models/controller.rs | 4 +-- src/models/relay.rs | 22 ++++-------- 16 files changed, 42 insertions(+), 31 deletions(-) rename .sqlx/{query-c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2.json => query-2b5ac2227f48be1483f4097da6f890be8091daa97b0af548b6ebf60cdc03dfba.json} (70%) rename .sqlx/{query-2551c285e3e223311cff8e32022d8b11e95d56b2f166326301a0b6722fc1fd44.json => query-493ad91be9ce523e9d0f03f5caa9b3255a5426d54901f4f3aa96ad152b05ffd0.json} (63%) rename .sqlx/{query-e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f.json => query-4a99db9678cf8d1bdb082c4a13a1f5cdd699bfe7600389e37ca980b6fad12bb5.json} (68%) rename .sqlx/{query-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.json => query-5056b625241d9cbe63d98e00ac39085677c09be8be903804120c2d52579afdbb.json} (71%) delete mode 100644 .sqlx/query-5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465.json rename .sqlx/{query-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.json => query-9224ad423f2c86f3d95f2b0b7d99a27f690020f89958dfc8dd6044a31afdb31d.json} (66%) create mode 100644 .sqlx/query-adbce2c94ac0b54d0826b28f99fe63322d3bb1579e52d0f053307e24bd039ef9.json rename .sqlx/{query-4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111.json => query-d57c388bf6c26fe6cadad35d0f254ca2ef93958f9975c585c6de3c437782995d.json} (69%) create mode 100644 .sqlx/query-f85f0a96bb98d20e47677b0679d552812362c3141738b60bc63d673a7f552506.json create mode 100644 migrations/20240611000000_add_relays_view.down.sql create mode 100644 migrations/20240611000000_add_relays_view.up.sql diff --git a/.sqlx/query-c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2.json b/.sqlx/query-2b5ac2227f48be1483f4097da6f890be8091daa97b0af548b6ebf60cdc03dfba.json similarity index 70% rename from .sqlx/query-c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2.json rename to .sqlx/query-2b5ac2227f48be1483f4097da6f890be8091daa97b0af548b6ebf60cdc03dfba.json index 10fe1a36ac951c19efe15b9d67c9523383221b7b..5b01214d67aed9ba27a7bcc2ef560018b2135b24 100644 GIT binary patch delta 137 zcmdnTx}0r-F@ITnQEEl$;nLOE=EbFiOEJrM&@ZI7D=gwCKkqNCI*(~DT!uj7M2D{ osTKy7hAD}OmgY$YiD{-lHD;+vX=Vn=Dai)LDQQWGN?f&E06Ib{-~a#s delta 112 zcmZ3^wvTm!u|!d7PGV)TLb!)(kgGy+eqKpYeojtmQT#@y1&ov3nJOlqVG?&qwlpy| zPfIgMHa0LcNis6COi4~MGBh?YNlQvhF*GtVHczrlPBODhO*BhPG%>R<{%;GL4md1%GmWD~GmdUB6M#ia@DF$f<#%ZR>iHVj;#zv;5iKZq- iW+|p7mIj7tCTYe%VY9>(LsO$91Jks$6ayu$S}p)IC_Gq zl*G!73uiG-Ucgi_S(RDb#mLmuFxkk$G}SoO$jI2(&@eeI%_7y<$iT=b#UjbjFxApD l#nddxD9zB!%-G1x*uXH+Aj!BRdIj3$#eGD@&G<>V(#HfCy^+{?r}c?*-ci%FuTWlEBznYl%Bnnj9XQc9A6 zg;BCeqM>o3VVY@jN{X4KWl~zIxtW21v4v%-v3YW$rG-I~Sz2O>p;1zjsS;N$7XZ;+ BG;9C> delta 215 zcmdnZ*3ULUr@kmPC$UmbOTjJ3-&X<5DOPX{hOiVo{rp^m6ukUB{S>lF^O8$4^Yh|M z64Mp@QTcjceeszo3bqi9dO&8lhii~4iZ(rgt1psChMH>JB diff --git a/.sqlx/query-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.json b/.sqlx/query-5056b625241d9cbe63d98e00ac39085677c09be8be903804120c2d52579afdbb.json similarity index 71% rename from .sqlx/query-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.json rename to .sqlx/query-5056b625241d9cbe63d98e00ac39085677c09be8be903804120c2d52579afdbb.json index c4ec08d2018529aad439bf793baad37af1945866..fa990c62c4555ff4e27fb606786e6e5808d91a6a 100644 GIT binary patch delta 112 zcmZ3+I*V>MWmh|!HCJC5!FtzTA6&yi=~uYs$B0keF)EK11o@);BtwU>6QS~2Wor-641 zz?rb58?Rxu-C(+c zau9-0VZwCT)kJjM+5Yo0`s&;2p)KjQCc1cm<2p!anna6)Vpg*>#w26`_GwBf^*OEr bKcq=8XF*!k={!nn&DD&hVT5BeIZb{5`#-Yk diff --git a/.sqlx/query-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.json b/.sqlx/query-9224ad423f2c86f3d95f2b0b7d99a27f690020f89958dfc8dd6044a31afdb31d.json similarity index 66% rename from .sqlx/query-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.json rename to .sqlx/query-9224ad423f2c86f3d95f2b0b7d99a27f690020f89958dfc8dd6044a31afdb31d.json index 94419bd3f023b55d3557d0e840af795b0a075adb..80fbca70770e707b10e1971601d52b8f8b153311 100644 GIT binary patch delta 152 zcmX@hdYNs4u|!#XQEE>B$=yxfx3*&Xr&^ znViok!QzyYpEUU+W8-9RCf>s+% delta 123 zcmcc2c9wO5v2syrPGV)TLb!)(kgGy+eqKpYeojtmQG8~Kf~|tRf}@{{!p5v6jFXF* zDklG65_d^5F|;r>O*Jz%O-wd1urxKbOiMH~PEJZRNj5aHFf}kXNj5b%PO>mdH8!*~ bPDwPjv@|s{FiS~IH8C_YG&NS@s^tOzqUa=B diff --git a/.sqlx/query-adbce2c94ac0b54d0826b28f99fe63322d3bb1579e52d0f053307e24bd039ef9.json b/.sqlx/query-adbce2c94ac0b54d0826b28f99fe63322d3bb1579e52d0f053307e24bd039ef9.json new file mode 100644 index 0000000000000000000000000000000000000000..a91e2ae8aa570ff59e0fc2f188aeec1959eac752 GIT binary patch literal 996 zcmb_bVN1g>5dFSi5%N)FbZs}SAc9(Pq8nC0M5QFn)kU*Z(^MVee>X{&;a~*?TWHC< zd+%NDlFuGOn9*F4Ip95nuP)EI2E1+I*9O$Wf$4dAbdBC}1%fQ<{uVmPrWdO<8c!x^ zhR&wr33_T|p?M|S)VwZcz#0Mf@?P6_+L_UJ+Bs)ve$?|Yk;e&9*d z?AX+Gc-zT)2Y6;=(QcPPT_{d%8$QkUO#_NbG;>)S;LZVP8E`@0G0q&_Vun&F#w8Jk z64)NL57vtp$hj;l+s(1mqZluPUp}j~wE5U8yT6aGX%Bv&YueZFp?@Xa%qghNg@;|@ zzb?F}q*j#>pv*uvn?(O<(sa4RT`q^BqN_f+Q9QJ%_=PBQ6*MS2c0UxH@yD4qz`*4$ zhlXV%1fjy77=J)YB5Lrie_6Cen6DGZGg8m&VIhnb5Ee;HihvGd7VL&28t#@!Qo<;T g!jMIj4u(4k3_})_!7z$~9SCE}f+&G9!M(5EH@A8UP5=M^ literal 0 HcmV?d00001 diff --git a/.sqlx/query-4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111.json b/.sqlx/query-d57c388bf6c26fe6cadad35d0f254ca2ef93958f9975c585c6de3c437782995d.json similarity index 69% rename from .sqlx/query-4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111.json rename to .sqlx/query-d57c388bf6c26fe6cadad35d0f254ca2ef93958f9975c585c6de3c437782995d.json index 78e4867549385aed979bdb130a6db8f67772bb03..00d044d152144c6ff87b8747ab66dc02faa35f50 100644 GIT binary patch delta 136 zcmdnYx`Aziu|!#XQEEg_7PGV)TLb!)(kgLK*?*)vL1DGl%Uu6<^F-bEuF|bHA1JbExi54j- zmPW?O#z}@I=4qCe#>uIcsV2#ZX~~ubMg}HH247xV6b0ZtPjTf5qzq0>?4(Q8fdL6omC!B-A^)X`h=Bro893Pf_3sX!Xkc1!Oy+2Aq747DGbip zaPG_!em=I}>lzmCDa5yY^%*NC}ioDEn#&gZGRVG-e TI8~Z6!v&L~!E-@5Ngl}`3G+;R literal 0 HcmV?d00001 diff --git a/migrations/20240611000000_add_relays_view.down.sql b/migrations/20240611000000_add_relays_view.down.sql new file mode 100644 index 0000000..093f473 --- /dev/null +++ b/migrations/20240611000000_add_relays_view.down.sql @@ -0,0 +1 @@ +DROP VIEW v_relays; \ No newline at end of file diff --git a/migrations/20240611000000_add_relays_view.up.sql b/migrations/20240611000000_add_relays_view.up.sql new file mode 100644 index 0000000..b8fab88 --- /dev/null +++ b/migrations/20240611000000_add_relays_view.up.sql @@ -0,0 +1,8 @@ +CREATE VIEW v_relays +AS +SELECT + relays.*, + controllers.uid AS controller_uid +FROM + relays +INNER JOIN controllers ON controllers.id = relays.controller_id; diff --git a/src/db/controllers.rs b/src/db/controllers.rs index bf0a1f0..ade379e 100644 --- a/src/db/controllers.rs +++ b/src/db/controllers.rs @@ -158,7 +158,7 @@ impl DbController { ) -> Result, DatabaseError> { sqlx::query_as!( DbRelay, - "SELECT * FROM relays WHERE controller_id = ?", + "SELECT * FROM v_relays WHERE v_relays.controller_id = ?", self.id ) .fetch_all(conn.deref_mut()) diff --git a/src/db/junction_relay_schedule.rs b/src/db/junction_relay_schedule.rs index b8e0611..74dc98e 100644 --- a/src/db/junction_relay_schedule.rs +++ b/src/db/junction_relay_schedule.rs @@ -50,8 +50,8 @@ impl DbJunctionRelaySchedule { ) -> Result, DatabaseError> { sqlx::query_as!( DbRelay, - r#"SELECT relays.* FROM relays INNER JOIN junction_relay_schedule - ON junction_relay_schedule.relay_id = relays.id + r#"SELECT v_relays.* FROM v_relays INNER JOIN junction_relay_schedule + ON junction_relay_schedule.relay_id = v_relays.id WHERE junction_relay_schedule.schedule_id = ? ORDER BY junction_relay_schedule.weekday"#, schedule.id diff --git a/src/db/relays.rs b/src/db/relays.rs index 8fe39e6..ef62382 100644 --- a/src/db/relays.rs +++ b/src/db/relays.rs @@ -6,6 +6,7 @@ use sqlx::Sqlite; use crate::db::{DbController, DbJunctionTag, DbTag}; use crate::errors::DatabaseError; +use crate::types::EmgauwaUid; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DbRelay { @@ -13,13 +14,15 @@ pub struct DbRelay { pub id: i64, pub name: String, pub number: i64, + #[serde(rename = "controller_id")] + pub controller_uid: EmgauwaUid, #[serde(skip)] pub controller_id: i64, } impl DbRelay { pub async fn get_all(conn: &mut PoolConnection) -> Result, DatabaseError> { - sqlx::query_as!(DbRelay, "SELECT * FROM relays") + sqlx::query_as!(DbRelay, "SELECT * FROM v_relays") .fetch_all(conn.deref_mut()) .await .map_err(DatabaseError::from) @@ -29,7 +32,7 @@ impl DbRelay { conn: &mut PoolConnection, id: i64, ) -> Result, DatabaseError> { - sqlx::query_as!(DbRelay, "SELECT * FROM relays WHERE id = ?", id) + sqlx::query_as!(DbRelay, "SELECT * FROM v_relays WHERE v_relays.id = ?", id) .fetch_optional(conn.deref_mut()) .await .map_err(DatabaseError::from) @@ -42,7 +45,7 @@ impl DbRelay { ) -> Result, DatabaseError> { sqlx::query_as!( DbRelay, - "SELECT * FROM relays WHERE controller_id = ? AND number = ?", + "SELECT * FROM v_relays WHERE v_relays.controller_id = ? AND v_relays.number = ?", controller.id, number ) @@ -70,7 +73,7 @@ impl DbRelay { conn: &mut PoolConnection, tag: &DbTag, ) -> Result, DatabaseError> { - sqlx::query_as!(DbRelay, "SELECT relay.* FROM relays AS relay INNER JOIN junction_tag ON junction_tag.relay_id = relay.id WHERE junction_tag.tag_id = ?", tag.id) + sqlx::query_as!(DbRelay, "SELECT v_relays.* FROM v_relays INNER JOIN junction_tag ON junction_tag.relay_id = v_relays.id WHERE junction_tag.tag_id = ?", tag.id) .fetch_all(conn.deref_mut()) .await .map_err(DatabaseError::from) @@ -82,16 +85,25 @@ impl DbRelay { new_number: i64, new_controller: &DbController, ) -> Result { - sqlx::query_as!( - DbRelay, - "INSERT INTO relays (name, number, controller_id) VALUES (?, ?, ?) RETURNING *", + let result = sqlx::query!( + "INSERT INTO relays (name, number, controller_id) VALUES (?, ?, ?)", new_name, new_number, new_controller.id, ) - .fetch_optional(conn.deref_mut()) - .await? - .ok_or(DatabaseError::InsertGetError) + .execute(conn.deref_mut()) + .await?; + + let last_insert_id = result.last_insert_rowid(); + + sqlx::query_as!( + DbRelay, + "SELECT * FROM v_relays WHERE id = ?", + last_insert_id + ) + .fetch_one(conn.deref_mut()) + .await + .map_err(DatabaseError::from) } pub async fn delete(&self, conn: &mut PoolConnection) -> Result<(), DatabaseError> { diff --git a/src/models/controller.rs b/src/models/controller.rs index 6bb04e3..753749a 100644 --- a/src/models/controller.rs +++ b/src/models/controller.rs @@ -9,7 +9,7 @@ use sqlx::Sqlite; use crate::db::DbController; use crate::errors::{DatabaseError, EmgauwaError}; -use crate::models::{convert_db_list_cache, FromDbModel, Relay}; +use crate::models::{convert_db_list, FromDbModel, Relay}; use crate::types::{EmgauwaNow, RelayState, RelayStates}; #[derive(Serialize, Deserialize, Debug, Clone, MessageResponse)] @@ -28,7 +28,7 @@ impl FromDbModel for Controller { db_model: Self::DbModel, ) -> Result { let relays_db = block_on(db_model.get_relays(conn))?; - let cache = convert_db_list_cache(conn, relays_db, db_model.clone())?; + let cache = convert_db_list(conn, relays_db)?; Self::from_db_model_cache(conn, db_model, cache) } diff --git a/src/models/relay.rs b/src/models/relay.rs index b67c4d3..5cb97d1 100644 --- a/src/models/relay.rs +++ b/src/models/relay.rs @@ -6,18 +6,16 @@ use serde_derive::{Deserialize, Serialize}; use sqlx::pool::PoolConnection; use sqlx::Sqlite; -use crate::db::{DbController, DbJunctionRelaySchedule, DbRelay, DbSchedule}; +use crate::db::{DbJunctionRelaySchedule, DbRelay, DbSchedule}; use crate::errors::DatabaseError; use crate::models::FromDbModel; -use crate::types::{EmgauwaUid, RelayState}; +use crate::types::RelayState; use crate::utils; #[derive(Serialize, Deserialize, Debug, Clone)] pub struct Relay { #[serde(flatten)] pub r: DbRelay, - pub controller: DbController, - pub controller_id: EmgauwaUid, pub schedules: Vec, pub active_schedule: Option, pub override_schedule: Option, @@ -27,32 +25,27 @@ pub struct Relay { // for internal use only. #[serde(skip)] pub pulsing: Option, - #[serde( - skip, - default = "utils::default_weekday", - )] + #[serde(skip, default = "utils::default_weekday")] pub override_schedule_weekday: Weekday, } impl FromDbModel for Relay { type DbModel = DbRelay; - type DbModelCache = DbController; + type DbModelCache = (); fn from_db_model( conn: &mut PoolConnection, db_model: Self::DbModel, ) -> Result { - let cache = block_on(db_model.get_controller(conn))?; - Self::from_db_model_cache(conn, db_model, cache) + Self::from_db_model_cache(conn, db_model, ()) } fn from_db_model_cache( conn: &mut PoolConnection, db_model: Self::DbModel, - cache: Self::DbModelCache, + _cache: Self::DbModelCache, ) -> Result { let tags = block_on(db_model.get_tags(conn))?; - let controller_id = cache.uid.clone(); let schedules = block_on(DbJunctionRelaySchedule::get_schedules(conn, &db_model))?; @@ -60,8 +53,6 @@ impl FromDbModel for Relay { Ok(Relay { r: db_model, - controller: cache, - controller_id, schedules, active_schedule: None, override_schedule: None, @@ -136,5 +127,4 @@ impl Relay { self.apply_state(&stated_relay.into()); } } - }