<?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="DS-2686_fix_triggers_merged_to_1:1" author="borisuvarov">
        <query>
            <![CDATA[
                CALL apoc.trigger.add(
                    'publish-GlobalParticipant',
                    '
                        UNWIND apoc.trigger.nodesByLabel({assignedNodeProperties},"GlobalParticipant") AS gp
                            OPTIONAL MATCH (gp)-[mt:MERGED_TO]->(:GlobalParticipant)
                            WITH gp, mt
                            WHERE mt IS NULL
                            OPTIONAL MATCH (pp:PublicParticipant)<-[:REPRESENTS]-(gp)
                            OPTIONAL MATCH (apss)<-[:HAS_AGGREGATED_PARTICIPANT_SOCIAL_STAT]-(pp)
                            WITH DISTINCT gp {
                                id: COALESCE(gp.id, "gp_id_not_set"),
                                .name,
                                .countryCode,
                                .imageUrl,
                                hasPublicData: pp is not null,
                                stats:
                                    apss {
                                        .followers,
                                        .monthlyListeners,
                                        .views,
                                        .popularity
                                    }
                                ,
                                socialAccountIds: {
                                    spotify: gp.spotifyId,
                                    appleMusic: gp.appleMusicId,
                                    chartmetric: gp.chartmetricId
                                }
                            } AS nestedDoc
                            CALL streams.publish("streams.trigger.musicGraph.GlobalParticipant.elasticSearch", nestedDoc) return nestedDoc
                    '
                    , {phase:'after'}
                );
            ]]>
        </query>
    </changeset>
    <changeset id="DS-2686_fix_triggers_merged_to_1:2" author="borisuvarov">
        <query>
            <![CDATA[
                CALL apoc.trigger.add(
                    'publish-GlobalSoundRecording',
                    '
                        UNWIND apoc.trigger.nodesByLabel({assignedNodeProperties},"GlobalSoundRecording") AS gsr
                            OPTIONAL MATCH (priv_lsr:LabelSoundRecording)<-[:REPRESENTS]-(gsr)
                            OPTIONAL MATCH (priv_gp: GlobalParticipant)-[:REPRESENTS]->(priv_lp: LabelParticipant)-[priv_pi:PARTICIPATED_IN]->(t:Track)-[:IS_PLACEMENT_OF]->(priv_lsr)
                                WHERE priv_pi.participated_as IN ["performer", "remixer", "featuring"]
                            OPTIONAL MATCH (priv_gp)-[priv_mt:MERGED_TO]->(:GlobalParticipant)
                            WITH gsr, priv_lsr, priv_gp, priv_lp, priv_pi, t, priv_mt
                                WHERE priv_mt IS NULL
                            OPTIONAL MATCH (gsr)-[:REPRESENTS]->(psr:PublicSoundRecording)<-[pub_pi:PARTICIPATED_IN]-(pub_pp:PublicParticipant)<-[:REPRESENTS]-(pub_gp:GlobalParticipant)
                            OPTIONAL MATCH (pub_gp)-[pub_mt:MERGED_TO]->(:GlobalParticipant)
                            WITH gsr, priv_lsr, priv_gp, priv_lp, priv_pi, t, priv_mt, pub_mt, psr, pub_pi, pub_pp, pub_gp
                                WHERE pub_mt IS NULL
                            OPTIONAL MATCH (psr)<-[:IS_PLACEMENT_OF]-(pub_t:PublicTrack)
                            OPTIONAL MATCH (pub_pp)-[:HAS_AGGREGATED_PARTICIPANT_SOCIAL_STAT]->(pub_ss:AggregatedParticipantSocialStat)
                            OPTIONAL MATCH (priv_gp)-[:REPRESENTS]->(priv_pp:PublicParticipant)-[:HAS_AGGREGATED_PARTICIPANT_SOCIAL_STAT]->(priv_ss:AggregatedParticipantSocialStat)
                            WITH DISTINCT gsr {
                                id: COALESCE(gsr.id, "gsr_id_not_set"),
                                .isrc,
                                .name,
                                .releaseDate,
                                .imageUrl,
                                popularity: gsr.spotifyPopularity,
                                .imprint,
                                .types,
                                hasPublicData: ANY( x IN COLLECT( DISTINCT pub_pp ) WHERE x IS NOT NULL ),
                                socialAccountIds : {
                                    spotify: apoc.coll.toSet(FILTER( n IN (EXTRACT( n IN COLLECT(DISTINCT pub_t) | n.spotifyId)) WHERE n IS NOT NULL)),
                                    appleMusic: apoc.coll.toSet(FILTER( n IN (EXTRACT( n IN COLLECT(DISTINCT pub_t) | n.appleMusicId)) WHERE n IS NOT NULL))
                                },
                                globalParticipants: apoc.coll.toSet(
                                    apoc.coll.flatten([
                                        COLLECT (DISTINCT pub_gp {
                                          .id,
                                          .name,
                                          .imageUrl,
                                          .countryCode,
                                          stats: pub_ss {
                                              .followers,
                                              .monthlyListeners,
                                              .views,
                                              .popularity
                                          },
                                          socialAccountIds: {
                                              spotify: pub_gp.spotifyId,
                                              appleMusic: pub_gp.appleMusicId,
                                              chartmetric: pub_gp.chartmetricId
                                          }
                                        }),
                                        COLLECT (DISTINCT priv_gp {
                                            .id,
                                            .name,
                                            .imageUrl,
                                            .countryCode,
                                            stats: priv_ss {
                                                .followers,
                                                .monthlyListeners,
                                                .views,
                                                .popularity
                                            },
                                            socialAccountIds: {
                                                spotify: priv_gp.spotifyId,
                                                appleMusic: priv_gp.appleMusicId,
                                                chartmetric: priv_gp.chartmetricId
                                            }
                                        })
                                    ])
                                )
                            } AS nestedDoc
                            CALL streams.publish("streams.trigger.musicGraph.GlobalSoundRecording.elasticSearch", nestedDoc) return nestedDoc
                    '
                    , {phase:'after'}
                );
            ]]>
        </query>
    </changeset>
</changelog>
