From 29a7c92756cc6dce6a0b79b474679ea19b2792d2 Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 8 Aug 2022 18:37:28 +0000 Subject: [PATCH 1/3] track trigger runs on update --- .../alembic/trigger_sql/drop_triggers.sql | 1 + .../alembic/trigger_sql/handle_track.sql | 2 +- .../5ad06b152315_trigger_handle_updates.py | 40 +++++++++++++++++++ .../models/test_aggregate_counters.py | 19 +++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 discovery-provider/alembic/trigger_sql/drop_triggers.sql create mode 100644 discovery-provider/alembic/versions/5ad06b152315_trigger_handle_updates.py diff --git a/discovery-provider/alembic/trigger_sql/drop_triggers.sql b/discovery-provider/alembic/trigger_sql/drop_triggers.sql new file mode 100644 index 00000000000..4d35d186479 --- /dev/null +++ b/discovery-provider/alembic/trigger_sql/drop_triggers.sql @@ -0,0 +1 @@ +drop trigger on_track on tracks; diff --git a/discovery-provider/alembic/trigger_sql/handle_track.sql b/discovery-provider/alembic/trigger_sql/handle_track.sql index 3a9a4833b02..a9d01b185bf 100644 --- a/discovery-provider/alembic/trigger_sql/handle_track.sql +++ b/discovery-provider/alembic/trigger_sql/handle_track.sql @@ -53,7 +53,7 @@ $$ language plpgsql; do $$ begin create trigger on_track - after insert on tracks + after insert or update on tracks for each row execute procedure handle_track(); exception when others then null; diff --git a/discovery-provider/alembic/versions/5ad06b152315_trigger_handle_updates.py b/discovery-provider/alembic/versions/5ad06b152315_trigger_handle_updates.py new file mode 100644 index 00000000000..c83d0c4d541 --- /dev/null +++ b/discovery-provider/alembic/versions/5ad06b152315_trigger_handle_updates.py @@ -0,0 +1,40 @@ +"""trigger handle updates + +Revision ID: 5ad06b152315 +Revises: 9931f7fd118f +Create Date: 2022-08-08 14:41:24.920944 + +""" +import sqlalchemy as sa +from alembic import op +from src.utils.alembic_helpers import build_sql + +# revision identifiers, used by Alembic. +revision = "5ad06b152315" +down_revision = "9931f7fd118f" +branch_labels = None +depends_on = None + + +up_files = [ + "drop_triggers.sql", + "handle_follow.sql", + "handle_playlist.sql", + "handle_repost.sql", + "handle_save.sql", + "handle_track.sql", + "handle_user.sql", +] + + +def upgrade(): + sql = build_sql(up_files) + connection = op.get_bind() + connection.execute(sql) + + +def downgrade(): + print("fuuu") + sql = build_sql(up_files) + connection = op.get_bind() + connection.execute(sql) diff --git a/discovery-provider/integration_tests/models/test_aggregate_counters.py b/discovery-provider/integration_tests/models/test_aggregate_counters.py index 5526d84e425..cd8f8c2f221 100644 --- a/discovery-provider/integration_tests/models/test_aggregate_counters.py +++ b/discovery-provider/integration_tests/models/test_aggregate_counters.py @@ -4,6 +4,7 @@ from integration_tests.utils import populate_mock_db from src.models.playlists.aggregate_playlist import AggregatePlaylist from src.models.tracks.aggregate_track import AggregateTrack +from src.models.tracks.track import Track from src.models.users.aggregate_user import AggregateUser from src.utils.db_session import get_db @@ -127,6 +128,24 @@ def test_aggregate_counters(app): agg_tracks[1], AggregateTrack(track_id=2, repost_count=0, save_count=0) ) + # is_unlisted is update in place + track: Track = ( + session.query(Track) + .filter(Track.track_id == 2) + .filter(Track.is_current == True) + .first() + ) + track.is_unlisted = True + session.add(track) + session.flush() + assert track.is_unlisted == True + + # check that agg_user track count is updated + # must call refresh to avoid sqlalchemy object cache + owner_agg: AggregateUser = session.query(AggregateUser).get(track.owner_id) + session.refresh(owner_agg) + assert owner_agg.track_count == 1 + # playlists agg_playlists: List[AggregatePlaylist] = ( session.query(AggregatePlaylist) From 89211f03d45b88e6d5eabedf25c0b96c2e953e2f Mon Sep 17 00:00:00 2001 From: Steve Perkins Date: Wed, 17 Aug 2022 14:14:30 +0000 Subject: [PATCH 2/3] cleanup track update trigger migration --- .../alembic/trigger_sql/drop_triggers.sql | 1 - .../5ad06b152315_trigger_handle_updates.py | 40 ----------------- .../5d3f95470222_track_trigger_update.py | 44 +++++++++++++++++++ 3 files changed, 44 insertions(+), 41 deletions(-) delete mode 100644 discovery-provider/alembic/trigger_sql/drop_triggers.sql delete mode 100644 discovery-provider/alembic/versions/5ad06b152315_trigger_handle_updates.py create mode 100644 discovery-provider/alembic/versions/5d3f95470222_track_trigger_update.py diff --git a/discovery-provider/alembic/trigger_sql/drop_triggers.sql b/discovery-provider/alembic/trigger_sql/drop_triggers.sql deleted file mode 100644 index 4d35d186479..00000000000 --- a/discovery-provider/alembic/trigger_sql/drop_triggers.sql +++ /dev/null @@ -1 +0,0 @@ -drop trigger on_track on tracks; diff --git a/discovery-provider/alembic/versions/5ad06b152315_trigger_handle_updates.py b/discovery-provider/alembic/versions/5ad06b152315_trigger_handle_updates.py deleted file mode 100644 index c83d0c4d541..00000000000 --- a/discovery-provider/alembic/versions/5ad06b152315_trigger_handle_updates.py +++ /dev/null @@ -1,40 +0,0 @@ -"""trigger handle updates - -Revision ID: 5ad06b152315 -Revises: 9931f7fd118f -Create Date: 2022-08-08 14:41:24.920944 - -""" -import sqlalchemy as sa -from alembic import op -from src.utils.alembic_helpers import build_sql - -# revision identifiers, used by Alembic. -revision = "5ad06b152315" -down_revision = "9931f7fd118f" -branch_labels = None -depends_on = None - - -up_files = [ - "drop_triggers.sql", - "handle_follow.sql", - "handle_playlist.sql", - "handle_repost.sql", - "handle_save.sql", - "handle_track.sql", - "handle_user.sql", -] - - -def upgrade(): - sql = build_sql(up_files) - connection = op.get_bind() - connection.execute(sql) - - -def downgrade(): - print("fuuu") - sql = build_sql(up_files) - connection = op.get_bind() - connection.execute(sql) diff --git a/discovery-provider/alembic/versions/5d3f95470222_track_trigger_update.py b/discovery-provider/alembic/versions/5d3f95470222_track_trigger_update.py new file mode 100644 index 00000000000..1d2e587ad2f --- /dev/null +++ b/discovery-provider/alembic/versions/5d3f95470222_track_trigger_update.py @@ -0,0 +1,44 @@ +"""track trigger update + +Revision ID: 5d3f95470222 +Revises: f1e86fba0357 +Create Date: 2022-08-17 14:06:25.596816 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '5d3f95470222' +down_revision = 'f1e86fba0357' +branch_labels = None +depends_on = None + +def upgrade(): + connection = op.get_bind() + connection.execute(sa.text(''' + begin; + + drop trigger on_track on tracks; + + create trigger on_track + after insert or update on tracks + for each row execute procedure handle_track(); + + commit; + ''')) + + +def downgrade(): + connection = op.get_bind() + connection.execute(sa.text(''' + begin; + + drop trigger on_track on tracks; + + create trigger on_track + after insert or update on tracks + for each row execute procedure handle_track(); + + commit; + ''')) From c6d05bbc2c28c43f7ca9243d424879379036bf1b Mon Sep 17 00:00:00 2001 From: Steve Perkins Date: Wed, 17 Aug 2022 14:53:38 +0000 Subject: [PATCH 3/3] trigger track trigger for all unlisted tracks --- .../versions/5d3f95470222_track_trigger_update.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/discovery-provider/alembic/versions/5d3f95470222_track_trigger_update.py b/discovery-provider/alembic/versions/5d3f95470222_track_trigger_update.py index 1d2e587ad2f..867809e6c4d 100644 --- a/discovery-provider/alembic/versions/5d3f95470222_track_trigger_update.py +++ b/discovery-provider/alembic/versions/5d3f95470222_track_trigger_update.py @@ -19,12 +19,17 @@ def upgrade(): connection.execute(sa.text(''' begin; - drop trigger on_track on tracks; + drop trigger if exists on_track on tracks; create trigger on_track after insert or update on tracks for each row execute procedure handle_track(); + -- trigger trigger for unlisted tracks + update tracks + set is_unlisted=is_unlisted + where is_current=true and is_unlisted=true; + commit; ''')) @@ -34,7 +39,7 @@ def downgrade(): connection.execute(sa.text(''' begin; - drop trigger on_track on tracks; + drop trigger if exists on_track on tracks; create trigger on_track after insert or update on tracks