<?xml version="1.0" encoding="UTF-8"?>
<changelog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://www.liquigraph.org/schema/1.0/liquigraph.xsd">
    <changeset id="KDH_backfill_released_content.xml" author="ssavva" run-always="true">
        <query>
            <![CDATA[
                CALL apoc.periodic.iterate(
                "
                    MATCH (p:Product:Orchard)
                    WHERE
                        p.id >= 4800000
                        AND (
                            p.saleStartDate <= date()
                            OR
                            p.preorderDate <= date()
                        )
                    MATCH (lsr:LabelSoundRecording)<-[:IS_PLACEMENT_OF]-(t:Track:Orchard)<-[:INCLUDES]-(p)
                    <-[:INCLUDES]-(pr:Project)-[:BELONGS_TO]->(Vendor)<-[:HAS_LABEL]-(cp:CompanyBrand)
                    WHERE
                        NOT (lsr)<-[:REPRESENTS]-(:GlobalSoundRecording)
                        AND COALESCE(lsr.name, '') <> ''
                        AND lsr.isrc =~ '^[A-Za-z]{2}[-]?[0-9A-Za-z]{3}[-]?[0-9]{2}[-]?[0-9]{5}$'
                        AND p.deletions = false
                        AND (p.releaseStatus = 'in_content' OR cp.name = 'awal')
                        AND p.notForDistribution in ['N', 'SMEAnalyticsDummy', 'SwitchboardDummy']
                    WITH
                        lsr,
                        COLLECT(DISTINCT t.type) AS trackTypes,
                        COLLECT(DISTINCT p.releaseDate) AS releaseDates
                    RETURN lsr, trackTypes, HEAD(apoc.coll.sort(releaseDates)) AS releaseDate
                ",
                "
                    MERGE (n:GlobalSoundRecording {isrc: toUpper(lsr.isrc)})
                        ON CREATE SET
                            n.id = apoc.create.uuid(),
                            n.createdAt = datetime(),
                            n.createdBy = 'database/KDH_backfill_released_content',
                            n.name = CASE WHEN COALESCE(lsr.version, '') = '' THEN lsr.name ELSE lsr.name + ' - ' + lsr.version END,
                            n.types = trackTypes,
                            n.releaseDate = releaseDate
                        ON MATCH SET
                            n.name = CASE WHEN COALESCE(lsr.version, '') = '' THEN lsr.name ELSE lsr.name + ' - ' + lsr.version END,
                            n.lastModifiedAt = datetime(),
                            n.lastModifiedBy = 'database/KDH_backfill_released_content',
                            n.types = apoc.coll.sort(apoc.coll.union(n.types, trackTypes))
                    MERGE (n)-[r:REPRESENTS]->(lsr)
                        ON CREATE SET
                            r.createdAt = datetime(),
                            r.createdBy = 'database/KDH_backfill_released_content'
                        ON MATCH SET
                            r.lastModifiedAt = datetime(),
                            r.lastModifiedBy = 'database/KDH_backfill_released_content'
                    WITH
                        lsr, n
                    MATCH (pc:PublishingComposition)-[h:HAS_SOUND_RECORDING]->(lsr)
                        WITH DISTINCT pc, h, lsr, n
                        CREATE (pc)-[has:HAS_SOUND_RECORDING]->(n)
                        SET
                            has.createdAt = datetime(),
                            has.lastModifiedAt = datetime(),
                            has.createdBy = 'database/KDH_backfill_released_content'
                        CREATE (pc)-[dhas:DELETED_HAS_SOUND_RECORDING]->(lsr)
                        SET
                            dhas.deletedAt = datetime(),
                            has.deletedBy = 'database/KDH_backfill_released_content'
                        DELETE h
                ",
                {batchSize:100, iterateList:true, parallel:false}
            )
            YIELD total, failedOperations, errorMessages
            CALL apoc.util.validate(failedOperations > 0, "At least one sub-operation failed: %s", [reduce(all_errors = "", error IN keys(errorMessages) | all_errors + ", " + error)])
            RETURN total;
            ]]>
        </query>
    </changeset>
</changelog>
