]> git.ekhem.eu.org Git - gym.git/commitdiff
Store records as references to workouts_exercises instead of copying values.
authorJakub Czajka <jczajka@google.com>
Mon, 25 Dec 2023 09:28:59 +0000 (10:28 +0100)
committerJakub Czajka <jakub@ekhem.eu.org>
Sat, 6 Jan 2024 13:51:27 +0000 (14:51 +0100)
create.sql
insert.sh
record.sh

index 60346780aba6d7791257fa0208fd4761668126d3..7a7828c5dd77a8fcc09525fdda1b4f0e2110b726 100644 (file)
@@ -17,18 +17,6 @@ CREATE TABLE IF NOT EXISTS workouts (
     duration_min INTEGER NOT NULL
 );
 
-CREATE TABLE IF NOT EXISTS gyms_records (
-    gym_id INTEGER REFERENCES gyms (id),
-    exercise_id INTEGER REFERENCES exercises (id),
-    value VARCHAR(64) NOT NULL,
-    PRIMARY KEY (gym_id, exercise_id)
-);
-
-CREATE TABLE IF NOT EXISTS records (
-    exercise_id INTEGER PRIMARY KEY REFERENCES exercises (id),
-    value VARCHAR(64) NOT NULL
-);
-
 CREATE TABLE IF NOT EXISTS workouts_gyms (
     workout_id INTEGER PRIMARY KEY REFERENCES workouts (id),
     gym_id INTEGER REFERENCES gyms (id)
@@ -41,6 +29,22 @@ CREATE TABLE IF NOT EXISTS workouts_exercises (
     PRIMARY KEY (workout_id, exercise_id)
 );
 
+CREATE TABLE IF NOT EXISTS gyms_records (
+    gym_id INTEGER REFERENCES gyms (id),
+    exercise_id INTEGER REFERENCES exercises (id),
+    workout_id INTEGER,
+    PRIMARY KEY (gym_id, exercise_id),
+    FOREIGN KEY (workout_id, exercise_id)
+    REFERENCES workouts_exercises (workout_id, exercise_id)
+);
+
+CREATE TABLE IF NOT EXISTS records (
+    exercise_id INTEGER PRIMARY KEY REFERENCES exercises (id),
+    workout_id INTEGER,
+    FOREIGN KEY (workout_id, exercise_id)
+    REFERENCES workouts_exercises (workout_id, exercise_id)
+);
+
 DO $$
 BEGIN
     IF NOT EXISTS (SELECT * FROM pg_user WHERE usename = 'gym_tracker')
index 626c234693ee1c9b909b351a1836491f3e692f14..aba0fac3c464863cba63bdbf6ba9cbdc88fecd3a 100755 (executable)
--- a/insert.sh
+++ b/insert.sh
@@ -92,43 +92,41 @@ case ${RECORD_TYPE} in
 
     echo "${request_body}&" | while IFS='=' read -r -d '&' key val
     do
-      # $exercise, $exercise_id and $value retain their values between
-      # iterations.
+      # $exercise and $exercise_id retain their values between iterations.
       [ -n "${val}" ] && case ${key} in
         *_local_record)
           query_db "\
-          INSERT INTO gyms_records (gym_id, exercise_id, value)
-          VALUES ('${gym_id}', '${exercise_id}', '${value}')
+          INSERT INTO gyms_records (gym_id, exercise_id, workout_id)
+          VALUES ('${gym_id}', '${exercise_id}', '${id}')
           ON CONFLICT (gym_id, exercise_id)
-          DO UPDATE SET value='${value}'"
+          DO UPDATE SET workout_id=${id}"
 
           echo "Recorded new record for '${exercise}' (id=${exercise_id}) in\
- ${gym} (id=${gym_id}) (value=${value})."
+ ${gym} (id=${gym_id}) (workout_id=${id})."
         ;;
         *_global_record)
           query_db "\
-          INSERT INTO records (exercise_id, value)
-          VALUES ('${exercise_id}', '${value}')
+          INSERT INTO records (exercise_id, workout_id)
+          VALUES ('${exercise_id}', '${id}')
           ON CONFLICT (exercise_id)
-          DO UPDATE SET value='${value}'"
+          DO UPDATE SET workout_id=${id}"
 
           echo "Recorded new global record for '${exercise}'\
- (id=${exercise_id}) (value=${value})."
+ (id=${exercise_id}) (workout_id=${id})."
         ;;
         [0-9]*)
           exercise_id="${key}"
-          value="${val}"
 
           query_db "\
           INSERT INTO workouts_exercises (workout_id, exercise_id, value)
-          VALUES ('${id}', '${exercise_id}', '${value}')"
+          VALUES ('${id}', '${exercise_id}', '${val}')"
 
           exercise=$(query_db "\
           SELECT name
           FROM exercises
           WHERE id='${exercise_id}'")
           echo "Recorded exercise '${exercise}' (id=${exercise_id}) for workout\
- (id=${id}) (value=${value})."
+ (id=${id}) (value=${val})."
         ;;
       esac
     done
index 0f520a982e2a775aa33904f5801e011b0a1e87d8..641920f9f915c46e69ed1de0d7a9f91ab79d680d 100755 (executable)
--- a/record.sh
+++ b/record.sh
@@ -7,16 +7,21 @@
 exercises=$(/usr/bin/psql --user=gym_tracker  --dbname="${GYM_DB}" \
   --tuples-only --no-align --command="\
 WITH per_gym_records AS (
-  SELECT exercise_id, value
+  SELECT gyms_records.exercise_id, workouts_exercises.value
   FROM gyms_records INNER JOIN gyms
     ON gyms_records.gym_id = gyms.id
+  INNER JOIN workouts_exercises
+    ON gyms_records.exercise_id = workouts_exercises.exercise_id
+   AND gyms_records.workout_id = workouts_exercises.workout_id
   WHERE name = '${GYM}'
 ), records_all_exercises AS (
   SELECT *
   FROM per_gym_records
   UNION
-  SELECT *
-  FROM records
+  SELECT records.exercise_id, workouts_exercises.value
+  FROM records INNER JOIN workouts_exercises
+    ON records.exercise_id = workouts_exercises.exercise_id
+   AND records.workout_id = workouts_exercises.workout_id
   WHERE NOT EXISTS (
     SELECT * FROM
     per_gym_records