<?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-353_sync_release_artist:1" author="savva" run-on-change="true">
        <query>
            // Create not synced records
            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
                        LEFT JOIN releases r ON ra.release_id = r.release_id
                        LEFT JOIN project p ON r.project_id = p.project_id
                        WHERE (r.release_id IS NULL OR p.project_id IS NULL)
                            OR ra.release_artist_id in (
                                5883869, 5941462, 5934596, 5930108, 5989880,
                                6002249, 6018310, 6018309, 6018352, 6018351,
                                6026006, 5972907, 5972906, 6169643
                            )
                    ' 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()
                ",
                {batchSize:1000}
            );
        </query>
    </changeset>
    <changeset id="ARTARCH-353_sync_release_artist:2" author="savva" run-on-change="true">
        <query>
            // Delete non-existing records
            CALL apoc.periodic.iterate(
                "
                    MATCH (ra:ReleaseArtist)
                    WHERE NOT EXISTS(ra.updated_at)
                    RETURN ra
                ",
                "
                    MATCH (ra)-[:CREATED_FROM]-(lp:LabelParticipant)
                    MATCH (lp)-[pi:PARTICIPATED_IN {participated_as: ra.role}]-
                        (p:Product {id: toInteger(ra.productId)})
                    OPTIONAL MATCH (lp)-[:CREATED_FROM]-(sameRa:ReleaseArtist {role: ra.role, productId: toInteger(ra.productId)})
                        WHERE NOT (sameRa.id = ra.id)
                    FOREACH (noDup IN CASE WHEN sameRa IS NULL THEN [1] ELSE [] END |
                        DETACH DELETE pi, ra
                    )
                    FOREACH (dup IN CASE WHEN sameRa IS NOT NULL THEN [1] ELSE [] END |
                        DETACH DELETE ra
                    )
                ",
                {batchSize:1000}
            );
        </query>
    </changeset>
    <changeset id="ARTARCH-353_sync_release_artist:3" author="savva" run-on-change="true">
        <query>
            // Connect release artists with products
            CALL apoc.periodic.iterate(
                "
                    MATCH (ra:ReleaseArtist)
                    WHERE EXISTS(ra.productId) AND NOT (ra)-[:HAS_SOURCE_ARTIST]-(:Product)
                    RETURN ra
                ",
                "
                    MERGE (p:Product:Orchard {id: ra.productId})
                    MERGE (p)-[:HAS_SOURCE_ARTIST]->(ra)
                ",
                {batchSize:1000}
            );
        </query>
    </changeset>
    <changeset id="ARTARCH-353_sync_release_artist:4" author="savva" run-on-change="true">
        <query>
            // Create label participants from  release artists if necessary
            CALL apoc.periodic.iterate(
                "
                    MATCH (ra:ReleaseArtist)-[:HAS_SOURCE_ARTIST]-(p:Product)--(pr:Project)
                    WHERE EXISTS(pr.vendorId) AND EXISTS(pr.subaccountId)
                        AND NOT (ra)-[:CREATED_FROM]-(:LabelParticipant)
                    RETURN ra, p, pr
                ",
                "
                    MERGE (i:IncrementId {nodeName: 'LabelParticipant'})
                        ON CREATE SET i.id = 1
                        ON MATCH SET i.id = i.id + 1
                    MERGE (
                        lp:LabelParticipant:Orchard {
                            name: trim(apoc.text.regreplace(ra.name, '[ ]{2,}', ' ')),
                            vendorId: pr.vendorId,
                            subaccountId: pr.subaccountId
                        }
                    )
                        ON CREATE SET
                            lp.id = i.id,
                            lp.uuid = apoc.create.uuid()
                    MERGE (lp)-[:PARTICIPATED_IN {participated_as: ra.role}]->(p)
                    MERGE (lp)-[cf:CREATED_FROM]->(ra)
                        ON CREATE SET cf.created_at = datetime()
                ",
                {batchSize:1000}
            );
        </query>
    </changeset>
</changelog>
