<?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="10101-3" author="pdumoulin">
        <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
        <![CDATA[
            DROP PROCEDURE IF EXISTS sp_create_delivery_batch;;

            CREATE DEFINER='theorchard_dd'@'127.0.0.1' PROCEDURE sp_create_delivery_batch(IN dms_id INT, IN remote_dir VARCHAR(255), IN ord_type VARCHAR(50), IN num_per_batch INT)
            BEGIN
                DECLARE batch_id INT;
                DECLARE eqd_id INT;
                DECLARE prio_id INT;
                DECLARE last_prio_id INT DEFAULT 0;
                DECLARE done INT DEFAULT 0;
                DECLARE encoded_jobs CURSOR FOR
                    SELECT eqd.encoding_queue_detail_id, jp.priority
                    FROM encoding_queue_detail eqd
                    INNER JOIN encoding_queue eq ON eqd.encoding_queue_id = eq.encoding_queue_id
                    INNER JOIN job_priority jp ON jp.encoding_queue_detail_id = eqd.encoding_queue_detail_id
                    WHERE eqd.status = 'encoded'
                        AND eq.encoder_id IN (17,18,23)
                        AND eqd.dms_master_master_id = dms_id
                        AND eq.encoding_order_type = ord_type
                    ORDER BY jp.priority, eqd.encoding_queue_detail_id
                    LIMIT num_per_batch;
                DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
                DECLARE EXIT HANDLER FOR SQLEXCEPTION
                BEGIN
                    ROLLBACK;
                    RESIGNAL;
                END;
                 
                START TRANSACTION;
                
                INSERT INTO delivery_batch (dms_master_master_id, remote_folder, `status`, order_type)
                VALUES (dms_id, remote_dir, 'in-flight', ord_type);
                SET batch_id = LAST_INSERT_ID();
                
                OPEN encoded_jobs;
                IF FOUND_ROWS() < 1 THEN
                    SELECT 0 AS batch_id;
                    ROLLBACK;
                END IF;
                
                oj: LOOP
                    FETCH encoded_jobs INTO eqd_id, prio_id;
                    IF done THEN
                        LEAVE oj;
                    END IF;
                    IF last_prio_id = 0 THEN
                        SET last_prio_id = prio_id;
                    ELSEIF last_prio_id <> prio_id THEN
                        LEAVE oj;
                    END IF;
                    UPDATE encoding_queue_detail
                    SET status = 'ready_to_deliver'
                    WHERE encoding_queue_detail_id = eqd_id AND status = 'encoded';
                
                    IF ROW_COUNT() > 0 THEN
                        INSERT INTO delivery_batch_detail (delivery_batch_id, encoding_queue_detail_id) VALUES (batch_id, eqd_id);
                    END IF;
                END LOOP oj;
                CLOSE encoded_jobs;
                
                UPDATE delivery_batch SET status = 'open', priority = last_prio_id WHERE status = 'in-flight' AND delivery_batch_id = batch_id;
                IF ROW_COUNT() > 0 THEN
                    SELECT batch_id;
                    COMMIT;
                ELSE
                    SELECT 0 AS batch_id;
                    ROLLBACK;
                END IF;
            END;;
            GRANT EXECUTE ON PROCEDURE direct_delivery.sp_create_delivery_batch TO 'lambda-rdy-dlvr'@'%';;
        ]]>
        </sql>
        <rollback>
            <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
            <![CDATA[
                DROP PROCEDURE IF EXISTS sp_create_delivery_batch;;

                CREATE DEFINER='theorchard_dd'@'127.0.0.1' PROCEDURE sp_create_delivery_batch(IN dms_id INT, IN remote_dir VARCHAR(255), IN ord_type VARCHAR(50), IN num_per_batch INT)
                BEGIN
                    DECLARE batch_id INT;
                    DECLARE eqd_id INT;
                    DECLARE prio_id INT;
                    DECLARE last_prio_id INT DEFAULT 0;
                    DECLARE done INT DEFAULT 0;
                    DECLARE encoded_jobs CURSOR FOR
                        SELECT eqd.encoding_queue_detail_id, jp.priority
                        FROM encoding_queue_detail eqd
                        INNER JOIN encoding_queue eq ON eqd.encoding_queue_id = eq.encoding_queue_id
                        INNER JOIN job_priority jp ON jp.encoding_queue_detail_id = eqd.encoding_queue_detail_id
                        WHERE eqd.status = 'encoded'
                            AND eq.encoder_id IN (17,18,23)
                            AND eqd.dms_master_master_id = dms_id
                            AND eq.encoding_order_type = ord_type
                        ORDER BY jp.priority
                        LIMIT num_per_batch;
                    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
                    DECLARE EXIT HANDLER FOR SQLEXCEPTION
                    BEGIN
                        ROLLBACK;
                        RESIGNAL;
                    END;
                     
                    START TRANSACTION;
                    
                    INSERT INTO delivery_batch (dms_master_master_id, remote_folder, `status`, order_type)
                    VALUES (dms_id, remote_dir, 'in-flight', ord_type);
                    SET batch_id = LAST_INSERT_ID();
                    
                    OPEN encoded_jobs;
                    IF FOUND_ROWS() < 1 THEN
                        SELECT 0 AS batch_id;
                        ROLLBACK;
                    END IF;
                    
                    oj: LOOP
                        FETCH encoded_jobs INTO eqd_id, prio_id;
                        IF done THEN
                            LEAVE oj;
                        END IF;
                        IF last_prio_id = 0 THEN
                            SET last_prio_id = prio_id;
                        ELSEIF last_prio_id <> prio_id THEN
                            LEAVE oj;
                        END IF;
                        UPDATE encoding_queue_detail
                        SET status = 'ready_to_deliver'
                        WHERE encoding_queue_detail_id = eqd_id AND status = 'encoded';
                    
                        IF ROW_COUNT() > 0 THEN
                            INSERT INTO delivery_batch_detail (delivery_batch_id, encoding_queue_detail_id) VALUES (batch_id, eqd_id);
                        END IF;
                    END LOOP oj;
                    CLOSE encoded_jobs;
                    
                    UPDATE delivery_batch SET status = 'open', priority = last_prio_id WHERE status = 'in-flight' AND delivery_batch_id = batch_id;
                    IF ROW_COUNT() > 0 THEN
                        SELECT batch_id;
                        COMMIT;
                    ELSE
                        SELECT 0 AS batch_id;
                        ROLLBACK;
                    END IF;
                END;;
                GRANT EXECUTE ON PROCEDURE direct_delivery.sp_create_delivery_batch TO 'lambda-rdy-dlvr'@'%';;
            ]]>
            </sql>
        </rollback>
    </changeSet>
</databaseChangeLog>
