<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
	license agreements. See the NOTICE file distributed with this work for additional
	information regarding copyright ownership. The ASF licenses this file to
	You under the Apache License, Version 2.0 (the "License"); you may not use
	this file except in compliance with the License. You may obtain a copy of
	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
	by applicable law or agreed to in writing, software distributed under the
	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
	OF ANY KIND, either express or implied. See the License for the specific
	language governing permissions and limitations under the License. -->

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.mapper.EventTargetRunnerMapper">

    <sql id="TABLE_NAME">
        event_target_runner
    </sql>

    <sql id="COLUMN_LIST">
        account_id,bus,rule,target,run_context,gmt_create,gmt_modify
    </sql>
    <resultMap id="resultMap"
               type="org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetRunnerDO">
        <result property="accountId" column="account_id"/>
        <result property="eventBusName" column="bus"/>
        <result property="eventRuleName" column="rule"/>
        <result property="eventTargetName" column="target"/>
        <result property="runContext" column="run_context"/>
        <result property="gmtCreate" column="gmt_create"/>
        <result property="gmtModify" column="gmt_modify"/>
    </resultMap>


    <insert id="createEventTargetRunner" parameterType="java.util.Map">
        INSERT INTO
        <include refid="TABLE_NAME"/>
        (
        <include refid="COLUMN_LIST"/>
        )
        VALUES
        (#{accountId},#{eventBusName},#{eventRuleName},#{eventTargetName},#{runContext},now(),now())
    </insert>

    <select id="getEventTargetRunner" parameterType="java.util.Map" resultMap="resultMap">
        SELECT
        <include refid="COLUMN_LIST"/>
        FROM
        <include refid="TABLE_NAME"/>
        WHERE account_id = #{accountId}
        AND bus = #{eventBusName}
        AND rule = #{eventRuleName}
        AND target = #{eventTargetName}
    </select>

    <select id="listEventTargetRunners" parameterType="java.util.Map" resultMap="resultMap">
        SELECT
        <include refid="COLUMN_LIST"/>
        FROM
        <include refid="TABLE_NAME"/>
        WHERE account_id = #{accountId}
        AND bus = #{eventBusName}
        AND rule = #{eventRuleName}
    </select>

    <delete id="deleteEventTargetRunner">
        DELETE FROM
        <include refid="TABLE_NAME"/>
        WHERE account_id = #{accountId}
        AND bus = #{eventBusName}
        AND rule = #{eventRuleName}
        AND target = #{eventTargetName}
    </delete>

    <update id="updateEventTargetRunner">
        UPDATE
        <include refid="TABLE_NAME"/>
        <set>
            gmt_modify = now()
            <if test="runContext != null">
                ,run_context= #{runContext}
            </if>
        </set>
        WHERE account_id = #{accountId}
        AND bus = #{eventBusName}
        AND rule = #{eventRuleName}
        AND target = #{eventTargetName}
    </update>

</mapper>