Skip to content
Snippets Groups Projects
QueryTest.kt 10 KiB
Newer Older
npedot's avatar
npedot committed
package unibz.cs.semint.kprime.domain

import junit.framework.Assert.assertEquals
npedot's avatar
npedot committed
import org.junit.Test
import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
import unibz.cs.semint.kprime.domain.dql.*
import unibz.cs.semint.kprime.usecase.common.SQLizeSelectUseCase
import unibz.cs.semint.kprime.usecase.common.UnSQLizeSelectUseCase
import kotlin.test.assertEquals as assertEquals1
npedot's avatar
npedot committed

class QueryTest {

npedot's avatar
npedot committed
    fun simpleQueryFixture(tableName:String): Query {
npedot's avatar
npedot committed
        val query = Query()
        var select = query.select
        var attr = Attribute()
        attr.name = "Name"
        select.attributes.add(attr)
        attr = Attribute()
        attr.name = "Surname"
        select.attributes.add(attr)
        val fromT1 = From()
        fromT1.tableName = tableName
        select.from.add(fromT1)
        select.where.condition = "Name='Gigi'"
        return query
    }

    private fun unionFixtureQuery(): Query {
        var query = Query()
        query.select = simpleQueryFixture("Table1").select
        var simple2 = simpleQueryFixture("Table2")
        val union = Union()
        union.selects().add(simple2.select)
        query.union=union
npedot's avatar
npedot committed
        return query
    }

    @Test
    fun test_from_simple_query_to_xml() {
        // given
        val query = simpleQueryFixture("Table1")
        // when
        var queryXml = XMLSerializerJacksonAdapter().prettyQuery(query) as String
        // then
        assertEquals("""
              <select>
                <attributes>
                  <attributes name="Name"/>
                  <attributes name="Surname"/>
                </attributes>
                <from>
                  <from tableName="Table1" alias=""/>
                </from>
                <where condition="Name='Gigi'"/>
              </select>
              <union/>
              <minus/>
            </query>
        """.trimIndent(),queryXml)
npedot's avatar
npedot committed

    }

    @Test
    fun test_from_simple_query_to_sql() {
        // given
        val query = simpleQueryFixture("Table1")
        // when
        var querySql = SQLizeSelectUseCase().sqlize(query)
npedot's avatar
npedot committed
        // then
        assertEquals1("""
            SELECT Name,Surname
            FROM   Table1
            WHERE Name='Gigi' LIMIT 10
            """.trimIndent(),querySql)
npedot's avatar
npedot committed

    }

    @Test
    fun test_from_simple_select_to_sql(){
        // given
        val select = Select()
        val att = Attribute()
        att.name="ww"
        select.attributes.add(att)
        val from = From()
        from.tableName="tab"
        select.from.add(from)
        select.where.condition="a = b"
        // when
        val selectSql = SQLizeSelectUseCase().sqlize(select)
        // then
        assertEquals1("""
            SELECT ww
            FROM   tab
            WHERE a = b LIMIT 10
        """.trimIndent(),selectSql)
    }
npedot's avatar
npedot committed

    @Test
    fun test_simple_join_to_sql(){
        // given
        val select = Select()
        val att = Attribute()
        att.name="ww"
        select.attributes.add(att)
        val from = From()
        from.tableName="Orders"
        val join = Join()
        join.joinLeftTable = "Orders"
        join.joinOnLeft = "customerId"
        join.joinRightTable = "Customer"
        join.joinOnRight = "customerId"
        join.joinType = "INNER"
        from.addJoin(join)
        select.from.add(from)
        select.where.condition="a = b"
        // when
        val selectSql = SQLizeSelectUseCase().sqlize(select)
        // then
        assertEquals1("""
            SELECT ww
            FROM   Orders
            INNER JOIN Customer
            ON Orders.customerId = Customer.customerId
            WHERE a = b LIMIT 10
        """.trimIndent(),selectSql)
    }

    @Test
    fun test_multiple_join_to_sql(){
        // given
        val select = Select()
        val att = Attribute()
        att.name="ww"
        select.attributes.add(att)
        val from = From()
        from.tableName="Orders"
        val join = Join()
        join.joinLeftTable = "Orders"
        join.joinOnLeft = "customerId"
        join.joinRightTable = "Customer"
        join.joinOnRight = "customerId"
        join.joinType = "INNER"
        from.addJoin(join)
        val join2 = Join()
        join2.joinLeftTable = "Customer"
        join2.joinOnLeft = "orderId"
        join2.joinRightTable = "Sales"
        join2.joinOnRight = "orderId"
        join2.joinType = "LEFT"
        from.addJoin(join2)
        select.from.add(from)
        select.where.condition="a = b"
        // when
        val selectSql = SQLizeSelectUseCase().sqlize(select)
        // then
        assertEquals1("""
            SELECT ww
            FROM   Orders
            INNER JOIN Customer
            ON Orders.customerId = Customer.customerId
            LEFT JOIN Sales
            ON Customer.orderId = Sales.orderId
            WHERE a = b LIMIT 10
        """.trimIndent(),selectSql)
    }

npedot's avatar
npedot committed
    @Test
    fun test_from_union_query_to_xml() {
        // given
        val query = unionFixtureQuery()
        // when
        var queryXml = XMLSerializerJacksonAdapter().prettyQuery(query) as String
        // then
        assertEquals("""
              <select>
                <attributes>
                  <attributes name="Name"/>
                  <attributes name="Surname"/>
                </attributes>
                <from>
                  <from tableName="Table1" alias=""/>
                </from>
                <where condition="Name='Gigi'"/>
              </select>
              <union>
                <selects>
                  <selects>
                    <attributes>
                      <attributes name="Name"/>
                      <attributes name="Surname"/>
                    </attributes>
                    <from>
                      <from tableName="Table2" alias=""/>
                    </from>
                    <where condition="Name='Gigi'"/>
                  </selects>
                </selects>
              </union>
              <minus/>
            </query>
        """.trimIndent(),queryXml)
npedot's avatar
npedot committed

    }

    @Test
    fun test_from_union_query_to_sql() {
        // given
        val query = unionFixtureQuery()
        // when
        var querySql = SQLizeSelectUseCase().sqlize(query)
npedot's avatar
npedot committed
        // then
        assertEquals1("""
            SELECT Name,Surname
            FROM   Table1
            WHERE Name='Gigi' LIMIT 10
            SELECT Name,Surname
            FROM   Table2
            WHERE Name='Gigi' LIMIT 10
            """.trimIndent(),querySql)
npedot's avatar
npedot committed

    }


    @Test
    fun test_from_xml_to_query() {

    }

    @Test
    fun test_from_minimal_sql_to_query() {
        // given
        val sqlQuery="""
            SELECT *
            FROM tab1
        """.trimIndent()
        val query = UnSQLizeSelectUseCase().fromsql("query1",sqlQuery)
        assertEquals("*",query.select.attributes[0].name)
        assertEquals("tab1",query.select.from[0].tableName)
    }

    @Test
    fun test_from_conditional_sql_to_query() {
        // given
        val sqlQuery="""
            SELECT alfa,beta
            FROM tab1
            WHERE a = b
        """.trimIndent()
        val query = UnSQLizeSelectUseCase().fromsql("query1",sqlQuery)
        assertEquals("alfa",query.select.attributes[0].name)
        assertEquals("beta",query.select.attributes[1].name)
        assertEquals("tab1",query.select.from[0].tableName)
        assertEquals("a = b",query.select.where.condition)
    }

    @Test
    fun test_from_3_union_sql_to_query() {
        // given
        val sqlQuery="""
            SELECT alfa,beta
            FROM tab1
            WHERE a = b
            UNION
            SELECT gamma,theta
            FROM tab2
            WHERE c = d
        """.trimIndent()
        val query = UnSQLizeSelectUseCase().fromsql("query1",sqlQuery)
        assertEquals(1,query.union?.selects()?.size)
        assertEquals("alfa",   query.select.attributes[0].name)
        assertEquals("beta",   query.select.attributes[1].name)
        assertEquals("tab1",    query.select.from[0].tableName)
        assertEquals("a = b",   query.select.where.condition)
npedot's avatar
npedot committed

        val select = query.union!!.selects()[0]
        assertEquals("gamma",    select.attributes[0].name)
        assertEquals("theta",    select.attributes[1].name)
        assertEquals("tab2",    select.from[0].tableName)
        assertEquals("c = d",    select.where.condition)
npedot's avatar
npedot committed
    }

    @Test
    fun test_from_union_sql_to_query() {
        // given
        val sqlQuery="""
            SELECT alfa,beta
            FROM tab1
            WHERE a = b
            UNION
            SELECT gamma,theta
            FROM tab2
            WHERE c = d
            UNION
            SELECT delta,zeta
            FROM tab3
            WHERE e = f
        """.trimIndent()
        val query = UnSQLizeSelectUseCase().fromsql("query1",sqlQuery)
        assertEquals(2,query.union!!.selects().size)
        assertEquals("alfa",   query.select.attributes[0].name)
        assertEquals("beta",   query.select.attributes[1].name)
        assertEquals("tab1",    query.select.from[0].tableName)
        assertEquals("a = b",   query.select.where.condition)

        val select = query.union!!.selects()[0]
        assertEquals("gamma",    select.attributes[0].name)
        assertEquals("theta",    select.attributes[1].name)
        assertEquals("tab2",    select.from[0].tableName)
        assertEquals("c = d",    select.where.condition)
        val select1 = query.union!!.selects()[1]
        assertEquals("delta",    select1.attributes[0].name)
        assertEquals("zeta",    select1.attributes[1].name)
        assertEquals("tab3",    select1.from[0].tableName)
        assertEquals("e = f",    select1.where.condition)
        val sqlize = SQLizeSelectUseCase().sqlize(query)
        assertEquals("""
            SELECT alfa,beta
            FROM   tab1
            WHERE a = b LIMIT 10
            SELECT gamma,theta
            FROM   tab2
            WHERE c = d LIMIT 10
            SELECT delta,zeta
            FROM   tab3
            WHERE e = f LIMIT 10
        """.trimIndent(),sqlize)
    }


npedot's avatar
npedot committed
}