<?xml version="1.0" encoding="UTF-8"?>
<changelog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.liquigraph.org/schema/1.0/liquigraph.xsd">
    <changeset id="ARTARCH_backfill_missing_participant_identifier:5" author="gaguirre" run-on-change="true">
        <query>
            CALL apoc.log.info("Starting run of participant_identifier at %s", [datetime()]);
        </query>
        <query>
            <![CDATA[
                CALL apoc.periodic.iterate(
                    "
                        WITH 'mysql_artrelations' as url_alias,
                        '
                            SELECT id, vendor_id, subaccount_id, orchard_artist_name, store_id, store_artist_id, created_at
                            FROM participant_identifier
                            WHERE created_at >= \"2020-10-26\"
                        ' as sql
                        CALL apoc.load.jdbc(url_alias, sql)
                        YIELD row
                        RETURN row
                    ",
                    "
                        MERGE (pi:ParticipantIdentifier {id: toInteger(row.id)})
                            SET pi.vendorId = toInteger(row.vendor_id),
                                pi.subaccountId = toInteger(row.subaccount_id),
                                pi.name = row.orchard_artist_name,
                                pi.storeId = toInteger(row.store_id),
                                pi.storeArtistId = row.store_artist_id,
                                pi.updated_at = datetime()
                        WITH *, trim(row.store_artist_id) as store_artist_id_trimmed
                        MERGE (i:IncrementId {nodeName: 'LabelParticipant'})
                            ON CREATE SET i.id = 1
                            ON MATCH SET i.id = i.id + 1
                        MERGE (lp:LabelParticipant:Orchard {
                            name: row.orchard_artist_name,
                            vendorId: toInteger(row.vendor_id),
                            subaccountId: toInteger(row.subaccount_id)
                        })
                            ON CREATE SET
                                lp.id = i.id,
                                lp.uuid = apoc.create.uuid(),
                                lp.createdAt = datetime(),
                                lp.modifiedAt = datetime()
                        MERGE (lp)-[cf:CREATED_FROM]->(pi)
                            ON CREATE SET cf.created_at = datetime()
                        WITH *
                        FOREACH (store IN CASE WHEN row.store_id = 1 THEN [1] ELSE [] END |
                            SET lp.appleMusicId = CASE WHEN store_artist_id_trimmed = '' THEN NULL ELSE toInteger(store_artist_id_trimmed) END
                        )
                        FOREACH (store IN CASE WHEN row.store_id = 286 AND store_artist_id_trimmed =~ '[a-zA-Z0-9]+' THEN [1] ELSE [] END |
                            SET lp.spotifyId = store_artist_id_trimmed
                            MERGE (gp:GlobalParticipant {spotifyId: store_artist_id_trimmed})
                                ON CREATE SET
                                    gp.id = apoc.create.uuid(),
                                    gp.createdAt = datetime(),
                                    gp.name = lp.name
                            MERGE (gp)-[:REPRESENTS]->(lp)
                        )
                        WITH *
                        OPTIONAL MATCH (pi)<-[:CREATED_FROM]-(lp)-[oldR:REPRESENTS]-(oldGp:GlobalParticipant) WHERE pi.storeId = 286 AND oldGp.spotifyId <> store_artist_id_trimmed
                        DELETE oldR
                        MERGE (v:Vendor:Label {id: lp.vendorId})
                        MERGE (v)-[:HAS_LABEL_PARTICIPANT]->(lp)
                        FOREACH (hasSubAccount IN
                                        CASE WHEN lp.subaccountId <> 0 THEN [1] ELSE [] END |
                            MERGE (sa:SubAccount:Subaccount:Label {id: lp.subaccountId})
                            MERGE (sa)-[:HAS_LABEL_PARTICIPANT]->(lp)
                        )
                    ",
                    {batchSize:1000, iterateList:true, parallel:false}
                );
            ]]>
        </query>
        <query>
            CALL apoc.log.info("Finished participant_identifier ingest at %s", [datetime()]);
        </query>
    </changeset>
</changelog>
