<?xml version="1.0" encoding="UTF-8"?>
<changelog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:/var/app/InputFileSchema.xsd">
    <changeset
         id="MAINT-backfill_nmf_gsr_creation_from_orchard_rows:1"
         author="cbeesley"
         run-always="true"
         topic="event.snowflake.newmusicfriday.newtrack"
         snowflake-account="orchard"
     >
    <!-- Backfill NMF GSR creation events for ISRCs missed during the Spotify playlist stream
         sync failure (w/c 2026-05-18). Replicates the exact query from the JDBC source connector at
         terraform-infra/prod/kafka-infra/jdbc_source/snowflake/create_new_gsrs_from_nmf/query.sql
         with three differences: reads from TEMP_L_SPOTIFY_PLAYLIST_SONY instead of
         L_SPOTIFY_PLAYLIST_SONY, the 1-hour time filter is replaced with a failure-window filter
         (created_at >= 2026-05-18), and the GSR/PSR null guards are retained to ensure idempotency.
         The existing neo4j_cdc_sink/new_gsr_nmf Cypher sink processes events idempotently. -->
        <precondition>
            <sqlquery>
                <![CDATA[
                    WITH new_tracks AS (
                        SELECT DISTINCT
                            stm.isrc,
                            COALESCE(stm.track_name, cmt.name)          AS sound_recording_name,
                            COALESCE(stm.image_url, cmt.image_url)      AS sound_recording_image_url,
                            stm.track_id                                 AS spotify_track_id,
                            stm.track_name,
                            stm.image_url                                AS track_image_url,
                            stm.album_id                                 AS spotify_album_id,
                            sa.name                                      AS product_name,
                            sa.artwork_url                               AS product_image_url,
                            s.popularity_score,
                            sa.upc,
                            sa.release_date::TIMESTAMP                   AS release_date,
                            sa.label,
                            stm.created_at,
                            stm.artist_id                                AS spotify_artist_id,
                            COALESCE(stm.artist_name, gp.name, pp.name) AS artist_name,
                            gp.id                                        AS global_participant_id,
                            pp.id                                        AS public_participant_id
                        FROM FACTS.QA.TEMP_L_SPOTIFY_PLAYLIST_SONY AS stm
                            LEFT JOIN FACTS.QA.global_sound_recording gsr
                                ON gsr.isrc = stm.isrc
                            LEFT JOIN FACTS.QA.public_sound_recording psr
                                ON psr.isrc = stm.isrc
                            LEFT JOIN chartmetric.raw_data.spotify_playlist sp
                                ON stm.playlist_id = sp.playlist_id
                            LEFT JOIN chartmetric.analytics.spotify_playlist_stat_cache sc
                                ON sp.id = sc.id
                            LEFT JOIN chartmetric.raw_data.spotify s
                                ON stm.track_id = s.spotify_track_id
                            LEFT JOIN chartmetric.raw_data.cm_track cmt
                                ON UPPER(cmt.isrc) = UPPER(stm.isrc)
                            LEFT JOIN chartmetric.raw_data.spotify_album sa
                                ON stm.album_id = sa.spotify_album_id
                            LEFT JOIN FACTS.QA.global_participant gp
                                ON gp.spotify_id = stm.artist_id
                            LEFT JOIN FACTS.QA.public_participant pp
                                ON pp.spotify_id = stm.artist_id
                        WHERE gsr.id IS NULL
                          AND psr.id IS NULL
                          AND sc.new_music_friday = TRUE
                          AND stm.isrc IS NOT NULL
                          AND stm.track_id IS NOT NULL
                          AND stm.track_name IS NOT NULL
                          AND stm.created_at >= '2026-05-18'
                        QUALIFY RANK() OVER (
                            PARTITION BY stm.isrc
                            ORDER BY stm.created_at DESC
                        ) = 1
                    )
                    SELECT
                        isrc AS KEY,
                        OBJECT_CONSTRUCT(
                            'isrc',                      isrc,
                            'sound_recording_name',      sound_recording_name,
                            'sound_recording_image_url', sound_recording_image_url,
                            'track_image_url',           track_image_url,
                            'track_name',                track_name,
                            'spotify_track_id',          spotify_track_id,
                            'spotify_album_id',          spotify_album_id,
                            'product_name',              product_name,
                            'product_image_url',         product_image_url,
                            'popularity_score',          popularity_score,
                            'release_date',              release_date,
                            'upc',                       upc,
                            'label',                     label,
                            'public_participant_id',     public_participant_id,
                            'global_participant_id',     global_participant_id,
                            'spotify_artist_id',         spotify_artist_id,
                            'artist_name',               artist_name,
                            'last_modified_by',          'new_music_friday_tracks_ingest',
                            'created_by',                'new_music_friday_tracks_ingest'
                        ) AS VALUE
                    FROM new_tracks
                ]]>
            </sqlquery>
        </precondition>
    </changeset>

</changelog>
