<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
    <changeSet id="101" author="jian">
        <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
        <![CDATA[
            USE art_relations;;

            DROP TRIGGER IF EXISTS after_insert_release;;

            CREATE DEFINER = 'theorchard'@'10.10.%' TRIGGER after_insert_release AFTER INSERT ON releases FOR EACH ROW 
            BEGIN
                CALL cloudsearch.sp_upsert_release(NEW.release_id);
            END;;

            
            DROP TRIGGER IF EXISTS after_insert_track;;

            CREATE DEFINER = 'theorchard'@'10.10.%' TRIGGER after_insert_track AFTER INSERT ON track FOR EACH ROW 
            BEGIN
                CALL cloudsearch.sp_upsert_release(NEW.release_id);
            END;;

            
            DROP TRIGGER IF EXISTS after_update_artist;;

            CREATE DEFINER = 'theorchard'@'10.10.%' TRIGGER after_update_artist AFTER UPDATE ON artist_info FOR EACH ROW 
            BEGIN
                IF (
                    NEW.name != OLD.name 
                    OR (ISNULL(NEW.name) AND NOT ISNULL(OLD.name))
                    OR (not ISNULL(NEW.name) AND ISNULL(OLD.name))
                )
                OR (
                    NEW.url != OLD.url 
                    OR (ISNULL(NEW.url) AND NOT ISNULL(OLD.url))
                    OR (NOT ISNULL(NEW.url) AND ISNULL(OLD.url))
                )
                OR (
                    NEW.myspace_url != OLD.myspace_url 
                    OR (ISNULL(NEW.myspace_url) AND NOT ISNULL(OLD.myspace_url))
                    OR (NOT ISNULL(NEW.myspace_url) AND ISNULL(OLD.myspace_url))
                )
                OR (
                    NEW.vendor_id != OLD.vendor_id 
                    OR (ISNULL(NEW.vendor_id) AND NOT ISNULL(OLD.vendor_id))
                    OR (NOT ISNULL(NEW.vendor_id) AND ISNULL(OLD.vendor_id))
                )
                THEN
                    CALL cloudsearch.sp_upsert_artist(NEW.artist_id);
                    CALL art_relations.sp_cloudsearch_upsert_releases_by_artist_id(NEW.artist_id);
                END IF;
            END;;

            
            DROP TRIGGER IF EXISTS after_update_release;;

            CREATE DEFINER = 'theorchard'@'10.10.%' TRIGGER after_update_release AFTER UPDATE ON releases FOR EACH ROW 
            BEGIN
                CALL cloudsearch.sp_upsert_release(NEW.release_id);
            END;;

            
            DROP TRIGGER IF EXISTS after_update_track;;

            CREATE DEFINER = 'theorchard'@'10.10.%' TRIGGER after_update_track AFTER UPDATE ON track FOR EACH ROW 
            BEGIN
                IF (
                    NEW.track_name != OLD.track_name
                    OR (ISNULL(NEW.track_name) AND NOT ISNULL(OLD.track_name))
                    OR (not ISNULL(NEW.track_name) AND ISNULL(OLD.track_name))
                )
                OR (
                    NEW.isrc != OLD.isrc
                    OR (ISNULL(NEW.isrc) AND NOT ISNULL(OLD.isrc))
                    OR (NOT ISNULL(NEW.isrc) AND ISNULL(OLD.isrc))
                )
                THEN
                    CALL cloudsearch.sp_upsert_release(NEW.release_id);
                END IF;
            END;;
            

            DROP TRIGGER IF EXISTS after_update_vendor;;

            CREATE DEFINER = 'theorchard'@'10.10.%' TRIGGER after_update_vendor AFTER UPDATE ON vendor FOR EACH ROW 
            BEGIN
                IF (
                    NEW.company != OLD.company 
                    OR (ISNULL(NEW.company) AND NOT ISNULL(OLD.company))
                    OR (not ISNULL(NEW.company) AND ISNULL(OLD.company))
                )
                THEN
                    CALL art_relations.sp_cloudsearch_upsert_releases_by_vendor_id(NEW.vendor_id);
                END IF;
            END;;


            DROP PROCEDURE IF EXISTS  sp_cloudsearch_upsert_releases_by_artist_id;;

            CREATE DEFINER='theorchard'@'10.10.%' PROCEDURE sp_cloudsearch_upsert_releases_by_artist_id(IN artistId INT)
            BEGIN
                DECLARE releaseId INT DEFAULT 0;
                DECLARE done INT DEFAULT 0;
                DECLARE releaseCursor CURSOR FOR
                SELECT release_id FROM art_relations.releases WHERE artist_id = artistId;
                DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

                OPEN releaseCursor;
                oj: LOOP
                    IF done THEN
                        LEAVE oj;
                    END IF;

                    FETCH releaseCursor INTO releaseId;
                    CALL cloudsearch.sp_upsert_release(releaseId);
                END LOOP oj;
                CLOSE releaseCursor;
            END;;
            
            
            DROP PROCEDURE IF EXISTS sp_cloudsearch_upsert_releases_by_vendor_id;;

            CREATE DEFINER='theorchard'@'10.10.%' PROCEDURE sp_cloudsearch_upsert_releases_by_vendor_id(IN vendorId INT)
            BEGIN
                DECLARE releaseId INT DEFAULT 0;
                DECLARE done INT DEFAULT 0;
                DECLARE releaseCursor CURSOR FOR
                SELECT r.release_id 
                FROM art_relations.releases r
                INNER JOIN artist_info a ON r.artist_id = a.artist_id
                INNER JOIN vendor v ON v.vendor_id = a.vendor_id
                WHERE v.vendor_id = vendorId;
                DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
                
                OPEN releaseCursor;
                oj: LOOP
                    IF done THEN
                        LEAVE oj;
                    END IF;
                
                    FETCH releaseCursor INTO releaseId;
                    CALL cloudsearch.sp_upsert_release(releaseId);
                END LOOP oj;
                CLOSE releaseCursor;
            END;;
        ]]>
        </sql>
        <rollback>
            <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
            <![CDATA[
                USE art_relations;;
                
                DROP TRIGGER IF EXISTS after_insert_release;;
                DROP TRIGGER IF EXISTS after_insert_track;;
                DROP TRIGGER IF EXISTS after_update_artist;;
                DROP TRIGGER IF EXISTS after_update_release;;
                DROP TRIGGER IF EXISTS after_update_track;;
                DROP TRIGGER IF EXISTS after_update_vendor;;
                
                DROP PROCEDURE IF EXISTS  sp_cloudsearch_upsert_releases_by_artist_id;;
                DROP PROCEDURE IF EXISTS sp_cloudsearch_upsert_releases_by_vendor_id;;
            ]]>
            </sql>
        </rollback>
    </changeSet>
</databaseChangeLog>
