<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxl.job.admin.dao.XxlJobInfoDao">

    <resultMap id="XxlJobInfo" type="com.xxl.job.admin.core.model.XxlJobInfo">
        <result column="id" property="id"/>

        <result column="job_group" property="jobGroup"/>
        <result column="job_desc" property="jobDesc"/>

        <result column="add_time" property="addTime"/>
        <result column="update_time" property="updateTime"/>

        <result column="author" property="author"/>
        <result column="alarm_email" property="alarmEmail"/>

        <result column="schedule_type" property="scheduleType"/>
        <result column="schedule_conf" property="scheduleConf"/>
        <result column="misfire_strategy" property="misfireStrategy"/>

        <result column="executor_route_strategy" property="executorRouteStrategy"/>
        <result column="executor_handler" property="executorHandler"/>
        <result column="executor_param" property="executorParam"/>
        <result column="executor_block_strategy" property="executorBlockStrategy"/>
        <result column="executor_timeout" property="executorTimeout"/>
        <result column="executor_fail_retry_count" property="executorFailRetryCount"/>

        <result column="glue_type" property="glueType"/>
        <result column="glue_source" property="glueSource"/>
        <result column="glue_remark" property="glueRemark"/>
        <result column="glue_updatetime" property="glueUpdatetime"/>

        <result column="child_jobid" property="childJobId"/>

        <result column="trigger_status" property="triggerStatus"/>
        <result column="trigger_last_time" property="triggerLastTime"/>
        <result column="trigger_next_time" property="triggerNextTime"/>
    </resultMap>

    <sql id="Base_Column_List">
        t.id,
		t.job_group,
		t.job_desc,
		t.add_time,
		t.update_time,
		t.author,
		t.alarm_email,
		t.schedule_type,
		t.schedule_conf,
		t.misfire_strategy,
		t.executor_route_strategy,
		t.executor_handler,
		t.executor_param,
		t.executor_block_strategy,
		t.executor_timeout,
		t.executor_fail_retry_count,
		t.glue_type,
		t.glue_source,
		t.glue_remark,
		t.glue_updatetime,
		t.child_jobid,
		t.trigger_status,
		t.trigger_last_time,
		t.trigger_next_time
    </sql>

    <select id="pageList" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
        SELECT
        <include refid="Base_Column_List"/>
        FROM xxl_job_info AS t
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="jobGroup gt 0">
                AND t.job_group = #{jobGroup}
            </if>
            <if test="triggerStatus gte 0">
                AND t.trigger_status = #{triggerStatus}
            </if>
            <if test="jobDesc != null and jobDesc != ''">
                AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%')
            </if>
            <if test="executorHandler != null and executorHandler != ''">
                AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%')
            </if>
            <if test="author != null and author != ''">
                AND t.author like CONCAT(CONCAT('%', #{author}), '%')
            </if>
        </trim>
        ORDER BY id DESC
        LIMIT #{offset}, #{pagesize}
    </select>

    <select id="pageListCount" parameterType="java.util.HashMap" resultType="int">
        SELECT count(1)
        FROM xxl_job_info AS t
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="jobGroup gt 0">
                AND t.job_group = #{jobGroup}
            </if>
            <if test="triggerStatus gte 0">
                AND t.trigger_status = #{triggerStatus}
            </if>
            <if test="jobDesc != null and jobDesc != ''">
                AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%')
            </if>
            <if test="executorHandler != null and executorHandler != ''">
                AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%')
            </if>
            <if test="author != null and author != ''">
                AND t.author like CONCAT(CONCAT('%', #{author}), '%')
            </if>
        </trim>
    </select>

    <insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO xxl_job_info (
        job_group,
        job_desc,
        add_time,
        update_time,
        author,
        alarm_email,
        schedule_type,
        schedule_conf,
        misfire_strategy,
        executor_route_strategy,
        executor_handler,
        executor_param,
        executor_block_strategy,
        executor_timeout,
        executor_fail_retry_count,
        glue_type,
        glue_source,
        glue_remark,
        glue_updatetime,
        child_jobid,
        trigger_status,
        trigger_last_time,
        trigger_next_time
        ) VALUES (
        #{jobGroup},
        #{jobDesc},
        #{addTime},
        #{updateTime},
        #{author},
        #{alarmEmail},
        #{scheduleType},
        #{scheduleConf},
        #{misfireStrategy},
        #{executorRouteStrategy},
        #{executorHandler},
        #{executorParam},
        #{executorBlockStrategy},
        #{executorTimeout},
        #{executorFailRetryCount},
        #{glueType},
        #{glueSource},
        #{glueRemark},
        #{glueUpdatetime},
        #{childJobId},
        #{triggerStatus},
        #{triggerLastTime},
        #{triggerNextTime}
        );
        <!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
            /*SELECT @@IDENTITY AS id*/
        </selectKey>-->
    </insert>

    <select id="loadById" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
        SELECT
        <include refid="Base_Column_List"/>
        FROM xxl_job_info AS t
        WHERE t.id = #{id}
    </select>

    <update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobInfo">
        UPDATE xxl_job_info
        SET job_group                 = #{jobGroup},
            job_desc                  = #{jobDesc},
            update_time               = #{updateTime},
            author                    = #{author},
            alarm_email               = #{alarmEmail},
            schedule_type             = #{scheduleType},
            schedule_conf             = #{scheduleConf},
            misfire_strategy          = #{misfireStrategy},
            executor_route_strategy   = #{executorRouteStrategy},
            executor_handler          = #{executorHandler},
            executor_param            = #{executorParam},
            executor_block_strategy   = #{executorBlockStrategy},
            executor_timeout          = ${executorTimeout},
            executor_fail_retry_count = ${executorFailRetryCount},
            glue_type                 = #{glueType},
            glue_source               = #{glueSource},
            glue_remark               = #{glueRemark},
            glue_updatetime           = #{glueUpdatetime},
            child_jobid               = #{childJobId},
            trigger_status            = #{triggerStatus},
            trigger_last_time         = #{triggerLastTime},
            trigger_next_time         = #{triggerNextTime}
        WHERE id = #{id}
    </update>

    <delete id="delete" parameterType="java.util.HashMap">
        DELETE
        FROM xxl_job_info
        WHERE id = #{id}
    </delete>

    <select id="getJobsByGroup" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
        SELECT
        <include refid="Base_Column_List"/>
        FROM xxl_job_info AS t
        WHERE t.job_group = #{jobGroup}
    </select>

    <select id="findAllCount" resultType="int">
        SELECT count(1)
        FROM xxl_job_info
    </select>


    <select id="scheduleJobQuery" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
        SELECT
        <include refid="Base_Column_List"/>
        FROM xxl_job_info AS t
        WHERE t.trigger_status = 1
        and t.trigger_next_time <![CDATA[ <= ]]> #{maxNextTime}
        ORDER BY id ASC
        LIMIT #{pagesize}
    </select>

    <update id="scheduleUpdate" parameterType="com.xxl.job.admin.core.model.XxlJobInfo">
        UPDATE xxl_job_info
        SET trigger_last_time = #{triggerLastTime},
            trigger_next_time = #{triggerNextTime},
            trigger_status    = #{triggerStatus}
        WHERE id = #{id}
    </update>

</mapper>
