<?xml version="1.0" encoding="UTF-8"?>
<mapper xmlns="contract.xsd">
    <header>
        <application>HDS</application>
        <project>TST</project>
        <transaction>TST010</transaction>
        <datasource>DB01</datasource>
        <use>Y</use>
        <desc>데이터베이스 거래 테스트 예제</desc>
    </header>
    <commands>
        <statement id="GD01" seq="0" use="Y" timeout="0" desc="MySQL/MariaDB 데이터베이스 현재 시간 및 서버명 조회">
            <![CDATA[
			SELECT NOW() AS ServerDate, @@hostname AS ServerName;
			]]>
            <outputmeta value="ServerDate:string;ServerName:string;" />
        </statement>

        <statement id="GD02" seq="0" use="Y" timeout="0" desc="Oracle 데이터베이스 현재 시간 및 서버명 조회">
            <![CDATA[
			SELECT SYSDATE AS "ServerDate", host_name AS "ServerName" FROM v$instance
			]]>
        </statement>

        <statement id="GD03" seq="0" use="Y" timeout="0" desc="PostgreSQL 데이터베이스 현재 시간 및 서버명 조회">
            <![CDATA[
			SELECT CURRENT_DATE AS "ServerDate", current_database() AS "ServerName";
			]]>
        </statement>

        <statement id="GD04" seq="0" use="Y" timeout="0" desc="SQLite 데이터베이스 현재 시간 및 서버명 조회">
            <![CDATA[
			SELECT DATETIME('now', 'localtime') AS ServerDate, 'localhost' AS ServerName;
			]]>
        </statement>

        <statement id="GD05" seq="0" use="Y" timeout="0" desc="SQL Server 데이터베이스 현재 시간 및 서버명 조회">
            <![CDATA[
			SELECT GETDATE() AS ServerDate, @@SERVERNAME AS ServerName;
			]]>
        </statement>

        <statement id="GD07" seq="0" use="Y" timeout="0" desc="SQLite WorkflowStep Assertions 검증 예제">
            <![CDATA[
            SELECT
                'OK' AS ResultCode,
                'true' AS IsValid,
                'false' AS HasError,
                NULL AS DeletedDate,
                'localhost' AS ServerName,
                'admin,user' AS Roles,
                'release,stable' AS Tags,
                '' AS Warnings,
                'A' AS Items,
                75 AS Score,
                DATETIME('now', 'localtime') AS ServerDate;
			]]>
            <outputmeta value="ResultCode:string;IsValid:string;HasError:string;DeletedDate:string;ServerName:string;Roles:string;Tags:string;Warnings:string;Items:string;Score:int;ServerDate:string;" />
        </statement>

        <statement id="GD06" seq="0" use="Y" timeout="0" desc="SQL 확장 기능 예제">
            <![CDATA[
SELECT TOP 100 M.*
FROM [Message] AS M
INNER JOIN ConversationMember AS CM 
    ON M.ConversationID = CM.ConversationID 
    AND CM.UserID = @UserID
WHERE M.IsDeleted = 0
    AND M.UserID != '00000000000000000000000000000000'
            ]]>

            <if test="(Content != '')">
                <![CDATA[
    AND FREETEXT(M.MarkdownText, @Content)
			    ]]>
            </if>

            <if test="(SearchUsers != '')">
                <![CDATA[
    AND M.UserID IN (SELECT [value] FROM STRING_SPLIT(@SearchUsers, ','))
			    ]]>
            </if>

            <if test="(StartedAt != '')">
                <![CDATA[
    AND CONVERT(DATETIME, @StartedAt + ' 00:00:00') < M.CreatedAt
			    ]]>
            </if>

            <if test="(EndedAt != '')">
                <![CDATA[
    AND M.CreatedAt <= CONVERT(DATETIME, @EndedAt + ' 23:59:59')
			    ]]>
            </if>

            <if test="(EqualAt != '')">
                <![CDATA[
    AND CONVERT(DATETIME, @EqualAt + ' 00:00:00') < M.CreatedAt
    AND M.CreatedAt <= CONVERT(DATETIME, @EqualAt + ' 23:59:59')
			    ]]>
            </if>

            <if test="(ConversationIDs != '')">
                <![CDATA[
    AND M.ConversationID IN (SELECT [value] FROM STRING_SPLIT(@ConversationIDs, ','))
			    ]]>
            </if>

            <filters parameter="Filters" groupLogic="AND">
                <field groupID="user" column="M.UserID" type="String" operators="eq,neq" />
                <field groupID="content" column="M.MarkdownText" type="String" operators="eq,neq,begins_with,ends_with,contains,not_contains" />
                <field groupID="createdAt" column="M.CreatedAt" type="DateTime" operators="eq,neq,lte,gte" />
                <field groupID="conversation" column="M.ConversationID" type="String" operators="eq,neq" />
            </filters>

            <![CDATA[
SELECT *
FROM RoleUser AS RU
WHERE 1<2 AND
            ]]>
            <foreach collection="TransformRoles" item="TransformRole" open="(" close=")" separator="OR">
                <![CDATA[
    RU.UserID = #{TransformRole}
                ]]>
                
            </foreach>
            <param id="@UserID" type="String" length="255" value="NULL" />
            <param id="@RoleID" type="String" length="100" value="NULL" />
            <param id="@TransformRoles" type="String" length="100" value="NULL" transform="@FOREACH" />
            <param id="@Filters" type="String" length="-1" value="NULL" />
        </statement>

        <statement id="GD08" seq="0" use="Y" timeout="0" desc="SQLite JSON 필터 SQL 검증 예제">
            <![CDATA[
WITH SearchData (UserID, Content, Score, IsDeleted) AS (
    SELECT 'user001', 'HandStack guide', 90, 0
    UNION ALL SELECT 'user002', 'Filter sample', 70, 0
    UNION ALL SELECT 'user003', '100% literal_value!', 50, 0
    UNION ALL SELECT 'user004', 'Deleted message', 100, 1
)
SELECT M.UserID, M.Content, M.Score
FROM SearchData AS M
WHERE M.IsDeleted = 0
            ]]>
            <filters parameter="Filters" groupLogic="AND">
                <field groupID="user" column="M.UserID" type="String" operators="eq,neq,begins_with,ends_with,contains,not_contains" />
                <field groupID="content" column="M.Content" type="String" operators="eq,neq,begins_with,ends_with,contains,not_contains" />
                <field groupID="score" column="M.Score" type="Int32" operators="eq,neq,lte,gte" />
            </filters>
            <![CDATA[
ORDER BY M.UserID;
            ]]>
            <param id="@Filters" type="String" length="-1" value="NULL" />
            <outputmeta value="UserID:string;Content:string;Score:int;" />
        </statement>

        <statement id="GD09" seq="0" use="Y" timeout="0" desc="SQLite 기간 필터(년월일·년월·시간) 검증 예제">
            <![CDATA[
WITH SearchData (Id, CreatedAt, ClosingMonth, WorkTime) AS (
    SELECT 1, '2026-09-30 23:59:59', '2026-09-01 00:00:00', '08:59:59'
    UNION ALL SELECT 2, '2026-10-01 00:00:00', '2026-10-01 00:00:00', '09:30:00'
    UNION ALL SELECT 3, '2026-10-15 13:00:00', '2026-11-01 00:00:00', '09:30:30'
    UNION ALL SELECT 4, '2026-10-31 23:59:59', '2026-12-01 00:00:00', '10:00:59'
    UNION ALL SELECT 5, '2026-11-01 00:00:00', '2027-01-01 00:00:00', '10:01:00'
    UNION ALL SELECT 6, '2026-12-31 08:00:00', '2026-12-01 00:00:00', '23:59:59.5'
)
SELECT M.Id, M.CreatedAt, M.ClosingMonth, M.WorkTime
FROM SearchData AS M
WHERE 1 = 1
            ]]>
            <filters parameter="Filters" groupLogic="AND">
                <field groupID="createdAt" column="M.CreatedAt" type="DateTime" operators="gte,lt,lte" />
                <field groupID="closingMonth" column="M.ClosingMonth" type="DateTime" operators="gte,lt" />
                <field groupID="workTime" column="M.WorkTime" type="Time" operators="gte,lt,lte" />
            </filters>
            <![CDATA[
ORDER BY M.Id;
            ]]>
            <param id="@Filters" type="String" length="-1" value="NULL" />
            <outputmeta value="Id:int;CreatedAt:string;ClosingMonth:string;WorkTime:string;" />
        </statement>
    </commands>
</mapper>
