<?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-571_backfill_AI_RA:1" author="gaguirre" run-on-change="true">
        <query>
            CALL apoc.log.info("Starting run of artist_info ingest at %s", [datetime()]);
        </query>
        <query>
            <![CDATA[
                CALL apoc.periodic.iterate(
                    "
                        WITH 'mysql_artrelations' as url_alias,
                        '
                            SELECT ai.artist_id, ai.name, ai.vendor_id, v.is_distributor != \"Y\"
                            FROM artist_info ai
                            INNER JOIN vendor v ON ai.vendor_id = v.vendor_id
                            WHERE ai.vendor_id IS NOT NULL
                        ' as sql
                        CALL apoc.load.jdbc(url_alias, sql)
                        YIELD row
                        RETURN row
                    ",
                    "
                        MERGE (ai:ArtistInfo {id: toInteger(row.artist_id)})
                            SET ai.name = row.name,
                                ai.vendorId = toInteger(row.vendor_id),
                                ai.updated_at = datetime()
                        WITH ai, row
                        MERGE (v:Vendor:Label:Orchard {id: toInteger(ai.vendorId)})
                        MERGE (v)-[:HAS_ARTIST]->(ai)
                        FOREACH (notDistr IN CASE WHEN NOT row.is_distributor THEN [1] ELSE [] END |
                            MERGE (i:IncrementId {nodeName: 'LabelParticipant'})
                                ON CREATE SET i.id = 1
                                ON MATCH SET i.id = i.id + 1
                            MERGE (lp:LabelParticipant:Orchard {
                                normalizedName: toLower(trim(apoc.text.regreplace(ai.name, '[ ]+', ''))),
                                vendorId: toInteger(ai.vendorId),
                                subaccountId: 0
                            })
                                ON CREATE SET
                                    lp.id = i.id,
                                    lp.uuid = apoc.create.uuid(),
                                    lp.createdAt = datetime(),
                                    lp.modifiedAt = datetime(),
                                    lp.name = trim(apoc.text.regreplace(ai.name, '[ ]{2,}', ' '))
                                ON MATCH SET
                                    lp.name = CASE WHEN lp.name <> trim(apoc.text.regreplace(ai.name, '[ ]{2,}', ' ')) THEN trim(apoc.text.regreplace(ai.name, '[ ]{2,}', ' ')) ELSE lp.name END,
                                    lp.modifiedAt = datetime()
                            MERGE (lp)-[cf:CREATED_FROM]->(ai)
                                ON CREATE SET cf.created_at = datetime()
                            MERGE (v)-[:HAS_LABEL_PARTICIPANT]->(lp)
                        )
                        WITH ai
                        MATCH (ai)<-[:HAS_ARTIST]-(pr:Project)
                        WHERE pr.vendorId IS NOT NULL AND pr.subaccountId IS NOT NULL
                            AND NOT (pr)-[:CREATED_FOR_PARTICIPANT]->(:LabelParticipant)
                        MERGE (i:IncrementId {nodeName: 'LabelParticipant'})
                            ON CREATE SET i.id = 1
                            ON MATCH SET i.id = i.id + 1
                        MERGE (lp:LabelParticipant:Orchard {
                            vendorId: pr.vendorId,
                            subaccountId: pr.subaccountId,
                            normalizedName: toLower(trim(apoc.text.regreplace(ai.name, '[ ]+', '')))
                        })
                        ON CREATE SET
                            lp.id = i.id,
                            lp.uuid = apoc.create.uuid(),
                            lp.createdAt = datetime(),
                            lp.modifiedAt = datetime(),
                            lp.name = trim(apoc.text.regreplace(ai.name, '[ ]{2,}', ' '))
                        ON MATCH SET
                            lp.name = CASE WHEN lp.name <> trim(apoc.text.regreplace(ai.name, '[ ]{2,}', ' ')) THEN trim(apoc.text.regreplace(ai.name, '[ ]{2,}', ' ')) ELSE lp.name END,
                            lp.modifiedAt = datetime()
                        MERGE (pr)-[:CREATED_FOR_PARTICIPANT]->(lp)
                        WITH ai, COLLECT(lp) AS lps
                        OPTIONAL MATCH (ai)<-[rel:CREATED_FROM]-(other)
                        WHERE NOT other IN lps
                        DELETE rel
                    ",
                    {batchSize:1000}
                );
            ]]>
        </query>
        <query>
            CALL apoc.log.info("Finished artist_info ingest at %s", [datetime()]);
        </query>
    </changeset>
    <changeset id="ARTARCH-571_backfill_AI_RA:2" author="gaguirre" run-on-change="true">
        <query>
            CALL apoc.log.info("Starting run of release_artist ingest at %s", [datetime()]);
        </query>
        <query>
            <![CDATA[
                CALL apoc.periodic.iterate(
                    "
                        WITH 'mysql_artrelations' as url_alias,
                        '
                            SELECT ra.release_artist_id, ra.release_id, ra.artist_name, ra.role, p.vendor_id, p.subaccount_id
                            FROM release_artist ra
                            INNER JOIN releases r on ra.release_id = r.release_id
                            INNER JOIN project p on r.project_id = p.project_id
                            WHERE ra.release_id IS NOT NULL
                        ' as sql
                        CALL apoc.load.jdbc(url_alias, sql)
                        YIELD row
                        RETURN row
                    ",
                    "
                        MERGE (ra:ReleaseArtist {id: toInteger(row.release_artist_id)})
                            SET ra.productId = toInteger(row.release_id),
                                ra.name = row.artist_name,
                                ra.role = row.role,
                                ra.updated_at = datetime()
                        MERGE (p:Product:Orchard {id: ra.productId})
                        MERGE (p)-[:HAS_SOURCE_ARTIST]->(ra)
                        MERGE (i:IncrementId {nodeName: 'LabelParticipant'})
                          ON CREATE SET i.id = 1
                          ON MATCH SET i.id = i.id + 1
                        MERGE (
                          lp:LabelParticipant:Orchard {
                              normalizedName: toLower(trim(apoc.text.regreplace(ra.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(),
                                lp.name = trim(apoc.text.regreplace(ra.name, '[ ]{2,}', ' '))
                            ON MATCH SET
                                lp.name = trim(apoc.text.regreplace(ra.name, '[ ]{2,}', ' ')),
                                lp.modifiedAt = datetime()
                        MERGE (lp)-[:PARTICIPATED_IN {participated_as: ra.role}]->(p)
                        MERGE (lp)-[cf:CREATED_FROM]->(ra)
                          ON CREATE SET cf.created_at = datetime()
                        MERGE (v:Vendor:Label:Orchard {id: lp.vendorId})
                        MERGE (v)-[:HAS_LABEL_PARTICIPANT]->(lp)
                        FOREACH (hasSubAccount IN
                                        CASE WHEN NOT (lp.subaccountId = 0) THEN [1] ELSE [] END |
                            MERGE (sa:SubAccount:Subaccount:Label {id: lp.subaccountId})
                            MERGE (sa)-[:HAS_LABEL_PARTICIPANT]->(lp)
                        )
                        WITH ra, lp
                        OPTIONAL MATCH (ra)<-[rel:CREATED_FROM]-(other)
                        WHERE other <> lp
                        DELETE rel
                    ",
                    {batchSize:1000, iterateList: false}
                );
            ]]>
        </query>
        <query>
            CALL apoc.log.info("Finished release_artist ingest at %s", [datetime()]);
        </query>
    </changeset>
</changelog>
