<?xml version="1.0" encoding="UTF-8"?>
<changelog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <changeset id="DS-5539_backfill_released_content_2:1" author="ssavva" run-always="true">
        <cypherquery>
            <![CDATA[
                CALL apoc.periodic.iterate(
                    "
                        MATCH (p:Product:Orchard)
                        WHERE 
                            (
                                p.saleStartDate < date()
                                OR
                                p.preorderDate <= date()
                                OR
                                (
                                    p.createdAt < datetime()
                                    AND (
                                        p.saleStartDate < date()
                                        OR
                                        p.preorderDate < date()
                                    )
                                )
                            )
                            AND p.deletions = false
                            AND (p.releaseStatus = 'in_content')
                            AND p.notForDistribution in ['N', 'SMEAnalyticsDummy', 'SwitchboardDummy']
                        MATCH (lsr:LabelSoundRecording)<-[:IS_PLACEMENT_OF]-(t:Track:Orchard)<-[:INCLUDES]-(p)
                        USING JOIN ON p
                        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}$'
                        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/DS-5539_backfill_released_content_2:1',
                                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/DS-5539_backfill_released_content_2:1',
                                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/DS-5539_backfill_released_content_2:1'
                            ON MATCH SET
                                r.lastModifiedAt = datetime(),
                                r.lastModifiedBy = 'database/DS-5539_backfill_released_content_2:1'
                        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/DS-5539_backfill_released_content_2:1'
                            CREATE (pc)-[dhas:DELETED_HAS_SOUND_RECORDING]->(lsr)
                            SET
                                dhas.deletedAt = datetime(),
                                has.deletedBy = 'database/DS-5539_backfill_released_content_2:1'
                            DELETE h
                    ",
                    {batchSize:100, iterateList:true, parallel:false}
                )
                YIELD total, errorMessages
                RETURN total, errorMessages;
            ]]>
        </cypherquery>
    </changeset>
    <changeset id="DS-5539_backfill_released_content_2:2" author="ssavva" run-always="true">
        <cypherquery>
            <![CDATA[
                CALL apoc.periodic.iterate(
                    "
                        MATCH (lsr:LabelSoundRecording)<-[:IS_PLACEMENT_OF]-(t:Track:Orchard)<-[:INCLUDES]-(p:Product:Orchard)
                                <-[:INCLUDES]-(pr:Project)-[:BELONGS_TO]->(:Vendor)<-[:HAS_LABEL]-(cp:CompanyBrand)
                        USING SCAN cp:CompanyBrand
                        WHERE
                            cp.name = 'awal'
                            AND (
                                p.saleStartDate < date()
                                OR
                                p.preorderDate < date()
                            )
                            AND p.deletions = false
                            AND p.notForDistribution in ['N', 'SMEAnalyticsDummy', 'SwitchboardDummy']
                            AND 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}$'
                        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/DS-5539_backfill_released_content_2:2',
                                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/DS-5539_backfill_released_content_2:2',
                                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/DS-5539_backfill_released_content_2:2'
                            ON MATCH SET
                                r.lastModifiedAt = datetime(),
                                r.lastModifiedBy = 'database/DS-5539_backfill_released_content_2:2'
                        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/DS-5539_backfill_released_content_2:2'
                            CREATE (pc)-[dhas:DELETED_HAS_SOUND_RECORDING]->(lsr)
                            SET
                                dhas.deletedAt = datetime(),
                                has.deletedBy = 'database/DS-5539_backfill_released_content_2:2'
                            DELETE h
                    ",
                    {batchSize:100, iterateList:true, parallel:false}
                )
                YIELD total, errorMessages
                RETURN total, errorMessages;
            ]]>
        </cypherquery>
    </changeset>
</changelog>
