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

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper
npedot's avatar
npedot committed
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
npedot's avatar
npedot committed
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
import unibz.cs.semint.kprime.domain.ddl.Database
npedot's avatar
npedot committed

@JacksonXmlRootElement(localName = "query")
class Query {
    @JacksonXmlProperty(isAttribute = true)
    var id = ""
npedot's avatar
npedot committed
    @JacksonXmlProperty(isAttribute = true)
    var name = ""
npedot's avatar
npedot committed
    var select = Select()
    @JacksonXmlElementWrapper(useWrapping=false)
    var union : Union? = null
npedot's avatar
npedot committed
    @JacksonXmlElementWrapper(useWrapping=false)
    var minus : Minus? = null

    fun safeMinus():Minus {
        if (minus==null) {
            this.minus = Minus()
        }
        return this.minus as Minus
    }

    fun safeUnion():Union {
        if (union==null) {
            this.union = Union()
        }
        return this.union as Union
    }

    companion object {
        fun build(tableName:String): Query {
            val query = Query()
            var select = query.select
            var attr = Attribute()
            attr.name = "*"
            select.attributes.add(attr)
            val fromT1 = From()
            fromT1.tableName = tableName
            select.from.add(fromT1)
            return query
        }

        fun build(tableName:String, condition:String): Query {
            val query = Query()
            var select = query.select
            var attr = Attribute()
            attr.name = "*"
            select.attributes.add(attr)
            val fromT1 = From()
            fromT1.tableName = tableName
            select.from.add(fromT1)
            select.where.condition = condition
            return query
        }

        fun buildFromTable(database: Database, tableName:String, condition:String): Query {
npedot's avatar
npedot committed
            val colNames = database.schema.tables().filter { t -> t.name == tableName }.first().columns.map { c -> var attr = Attribute(); attr.name=c.name; attr }
            val query = Query()
            var select = query.select
            select.attributes.addAll(colNames)
            val fromT1 = From()
            fromT1.tableName = tableName
            select.from.add(fromT1)
            select.where.condition = condition
            return query
        }

        fun buildFromTable(database: Database, tableName:String): Query {
npedot's avatar
npedot committed
            val colNames = database.schema.tables().filter { t -> t.name == tableName }.first().columns.map { c -> var attr = Attribute(); attr.name=c.name; attr }
            val query = Query()
            var select = query.select
            select.attributes.addAll(colNames)
            val fromT1 = From()
            fromT1.tableName = database.lineage(tableName).last()
            select.from.add(fromT1)
            return query
        }

        fun buildFromMapping(database: Database, tableName:String): Query? {
            return database.mappings().filter { m-> m.name == tableName }.firstOrNull()
        }
npedot's avatar
npedot committed
}