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)
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')
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
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