package com.baomidou.mybatisplus.test.sql;

import static org.junit.Assert.assertEquals;

import org.apache.ibatis.jdbc.SQL;
import org.junit.Before;
import org.junit.Test;

/**
 * http://www.mybatis.org/mybatis-3/zh/statement-builders.html
 * <p>
 * http://www.programcreek.com/java-api-examples/index.php?api=org.apache.ibatis.jdbc.ScriptRunner
 */
public class SqlBuilderTest {

    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void test1() {
        String sql = new SQL()
            .SELECT("id, name").FROM("PERSON A")
            .WHERE("name like ?")
            .WHERE("id = ?").toString();

        System.err.println(sql);
    }

    @Test
    public void test() {
        //Fluent Style
        String sql = new SQL()
            .SELECT("id, name").FROM("PERSON A")
            .WHERE("name like ?")
            .WHERE("id = ?").toString();

        assertEquals("" +
            "SELECT id, name\n" +
            "FROM PERSON A\n" +
            "WHERE (name like ? AND id = ?)", sql);

        //Mixed
        sql = new SQL() {{
            SELECT("id, name");
            FROM("PERSON A");
            WHERE("name like ?").WHERE("id = ?");
        }}.toString();

        assertEquals("" +
            "SELECT id, name\n" +
            "FROM PERSON A\n" +
            "WHERE (name like ? AND id = ?)", sql);

        sql = new SQL() {{
            SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
            SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
            FROM("PERSON P");
            FROM("ACCOUNT A");
            INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
            INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
            WHERE("P.ID = A.ID");
            WHERE("P.FIRST_NAME like ?");
            OR();
            WHERE("P.LAST_NAME like ?");
            GROUP_BY("P.ID");
            HAVING("P.LAST_NAME like ?");
            OR();
            HAVING("P.FIRST_NAME like ?");
            ORDER_BY("P.ID");
            ORDER_BY("P.FULL_NAME");
        }}.toString();

        assertEquals("SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON\n" +
            "FROM PERSON P, ACCOUNT A\n" +
            "INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID\n" +
            "INNER JOIN COMPANY C on D.COMPANY_ID = C.ID\n" +
            "WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) \n" +
            "OR (P.LAST_NAME like ?)\n" +
            "GROUP BY P.ID\n" +
            "HAVING (P.LAST_NAME like ?) \n" +
            "OR (P.FIRST_NAME like ?)\n" +
            "ORDER BY P.ID, P.FULL_NAME", sql);

    }

}
