From e51a20d7325609f249af56a44ecf6e185a6b0956 Mon Sep 17 00:00:00 2001
From: npedot <nicola.pedot@gmail.com>
Date: Tue, 21 Jan 2020 17:03:53 +0100
Subject: [PATCH] adds TransformerUseCase

---
 .../kotlin/unibz.cs.semint.kprime/Starter.kt  |  2 -
 .../domain/Constraint.kt                      |  2 +-
 .../scenario/SakilaScenario.kt                | 50 ----------------
 .../usecase/ApplyChangeSetUseCase.kt          |  3 +
 ...{VSplitApplyUseCase.kt => HJoinUseCase.kt} |  1 -
 .../usecase/HSplitApplyUseCase.kt             |  5 --
 .../usecase/HSplitDetectUseCase.kt            | 10 ----
 .../HSplitUseCase.kt}                         | 43 ++-----------
 .../usecase/IdentifierApplyUseCase.kt         |  3 -
 .../usecase/IdentifierDetectUseCase.kt        |  4 --
 .../usecase/TransformerHUseCase.kt            | 16 +++++
 .../usecase/TransformerUseCase.kt             |  3 +-
 .../usecase/TransformerVUseCase.kt            | 17 ++++++
 .../usecase/VJoinUseCase.kt                   | 41 +++++++++++++
 .../usecase/VSplitDetectUseCase.kt            |  4 --
 .../VSplitUseCase.kt}                         | 60 +++----------------
 .../scenario/PersonHSplitScenarioTI.kt        | 35 ++++++++++-
 .../scenario/PersonVJoinScenarioTI.kt         | 60 +++++++++++++++++++
 .../scenario/PersonVSplitScenarioTI.kt        | 39 +++++++++++-
 .../scenario/SakilaScenarioTI.kt              | 47 ++++++++++++++-
 20 files changed, 270 insertions(+), 175 deletions(-)
 delete mode 100644 src/main/kotlin/unibz.cs.semint.kprime/scenario/SakilaScenario.kt
 rename src/main/kotlin/unibz.cs.semint.kprime/usecase/{VSplitApplyUseCase.kt => HJoinUseCase.kt} (59%)
 delete mode 100644 src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitApplyUseCase.kt
 delete mode 100644 src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitDetectUseCase.kt
 rename src/main/kotlin/unibz.cs.semint.kprime/{scenario/PersonHSplitScenario.kt => usecase/HSplitUseCase.kt} (74%)
 delete mode 100644 src/main/kotlin/unibz.cs.semint.kprime/usecase/IdentifierApplyUseCase.kt
 delete mode 100644 src/main/kotlin/unibz.cs.semint.kprime/usecase/IdentifierDetectUseCase.kt
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerHUseCase.kt
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerVUseCase.kt
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/usecase/VJoinUseCase.kt
 delete mode 100644 src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitDetectUseCase.kt
 rename src/main/kotlin/unibz.cs.semint.kprime/{scenario/PersonVSplitScenario.kt => usecase/VSplitUseCase.kt} (50%)
 create mode 100644 src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonVJoinScenarioTI.kt

diff --git a/src/main/kotlin/unibz.cs.semint.kprime/Starter.kt b/src/main/kotlin/unibz.cs.semint.kprime/Starter.kt
index 59d93b9..8135d3f 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/Starter.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/Starter.kt
@@ -1,6 +1,5 @@
 package unibz.cs.semint.kprime
 
-import unibz.cs.semint.kprime.scenario.SakilaScenario
 
 class Starter {
 
@@ -12,7 +11,6 @@ class Starter {
      fun main(args:Array<String>) {
          val version = "0.1.0-SNAPSHOT"
          println("KPrime $version")
-         SakilaScenario().run()
      }
 
  }
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/Constraint.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/Constraint.kt
index aab2074..02efb4e 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/domain/Constraint.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/Constraint.kt
@@ -6,7 +6,7 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
 @JacksonXmlRootElement(localName = "constraint")
 class Constraint () {
     enum class TYPE {
-        FOREIGN_KEY,PRIMARY_KEY,FUNCTIONAL,INCLUSION,DISJUNCTION,COVER
+        FOREIGN_KEY,PRIMARY_KEY,FUNCTIONAL,DOUBLE_INCLUSION,INCLUSION,DISJUNCTION,COVER
     }
     @JacksonXmlProperty(isAttribute = true)
     var name: String =""
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/scenario/SakilaScenario.kt b/src/main/kotlin/unibz.cs.semint.kprime/scenario/SakilaScenario.kt
deleted file mode 100644
index 7936ecc..0000000
--- a/src/main/kotlin/unibz.cs.semint.kprime/scenario/SakilaScenario.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-package unibz.cs.semint.kprime.scenario
-
-import unibz.cs.semint.kprime.adapter.repository.MetaSchemaJdbcAdapter
-import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
-import unibz.cs.semint.kprime.domain.DataSource
-import unibz.cs.semint.kprime.domain.Database
-import unibz.cs.semint.kprime.usecase.MetaSchemaReadUseCase
-
-class SakilaScenario {
-
-    fun run() {
-        val sakilaMeta = readSakilaMeta()
-        if (sakilaMeta!=null) {
-            vsplitSakila(sakilaMeta)
-            hsplitSakila(sakilaMeta)
-            identifySakila(sakilaMeta)
-        }
-    }
-
-    private fun readSakilaMeta(): Database? {
-        val type = "psql"
-        val name = "sakila-source"
-        val driver = "org.postgresql.Driver"
-        val path = "jdbc:postgresql://localhost:5432/sakila"
-        val user = "sammy"
-        val pass = "pass"
-        val sakilaSource = DataSource(type,name,driver,path,user,pass)
-        val result = MetaSchemaReadUseCase().doit(sakilaSource,
-                "read-meta-schema sakila-source",
-                MetaSchemaJdbcAdapter(),
-                XMLSerializerJacksonAdapter())
-        return result.ok
-    }
-
-    private fun vsplitSakila(db: Database) {
-        // if detect(db):result
-        //  apply(db,result):db
-    }
-
-    private fun hsplitSakila(db: Database) {
-        // if detect(db):result
-        //  apply(db,result):db
-    }
-
-    private fun identifySakila(db: Database) {
-        // if detect(db):result
-        //  apply(db,result):db
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/ApplyChangeSetUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/ApplyChangeSetUseCase.kt
index 33d2f11..0819b6f 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/ApplyChangeSetUseCase.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/ApplyChangeSetUseCase.kt
@@ -3,6 +3,9 @@ package unibz.cs.semint.kprime.usecase
 import unibz.cs.semint.kprime.domain.ChangeSet
 import unibz.cs.semint.kprime.domain.Database
 
+/**
+ * Given a Databse will apply changes following a given changeSet modification.
+ */
 class ApplyChangeSetUseCase {
     fun apply(db: Database, changeset:ChangeSet):Database {
         // TODO for every create* and remove* will do it on a cloned db
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitApplyUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/HJoinUseCase.kt
similarity index 59%
rename from src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitApplyUseCase.kt
rename to src/main/kotlin/unibz.cs.semint.kprime/usecase/HJoinUseCase.kt
index d344b7a..0cbb420 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitApplyUseCase.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/HJoinUseCase.kt
@@ -1,3 +1,2 @@
 package unibz.cs.semint.kprime.usecase
 
-class VSplitApplyUseCase {}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitApplyUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitApplyUseCase.kt
deleted file mode 100644
index e42a474..0000000
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitApplyUseCase.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package unibz.cs.semint.kprime.usecase
-
-class HSplitApplyUseCase {
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitDetectUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitDetectUseCase.kt
deleted file mode 100644
index eea22ef..0000000
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitDetectUseCase.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package unibz.cs.semint.kprime.usecase
-
-import unibz.cs.semint.kprime.domain.ChangeSet
-import unibz.cs.semint.kprime.domain.Database
-
-class HSplitDetectUseCase: TransformerUseCase {
-    override fun compute(db: Database): ChangeSet {
-        TODO("not implemented")
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/scenario/PersonHSplitScenario.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitUseCase.kt
similarity index 74%
rename from src/main/kotlin/unibz.cs.semint.kprime/scenario/PersonHSplitScenario.kt
rename to src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitUseCase.kt
index 06e1687..ee06f27 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/scenario/PersonHSplitScenario.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/HSplitUseCase.kt
@@ -1,48 +1,17 @@
-package unibz.cs.semint.kprime.scenario
+package unibz.cs.semint.kprime.usecase
 
 import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
 import unibz.cs.semint.kprime.domain.*
 import unibz.cs.semint.kprime.usecase.SQLizeUseCase
 import unibz.cs.semint.kprime.usecase.XMLSerializeUseCase
 
-class PersonHSplitScenario {
+class HSplitUseCase {
 
-    fun run() {
-        val personMetadata = buildPersonMetadata()
-        hsplitPersonMetadata(personMetadata)
-    }
-
-    private fun buildPersonMetadata(): Database {
-        val db = Database()
-        val personTable = Table()
-        personTable.name= "person"
-        val colSSN = Column("SSN", "id.SSN", "dbname.SSN")
-        personTable.columns.add(colSSN)
-        colSSN.nullable=false
-        val colT = Column("T", "id.T", "dbname.T")
-        personTable.columns.add(colT)
-        colT.nullable=false
-        val colS = Column("S", "id.S", "dbname.S")
-        colS.nullable=true
-        personTable.columns.add(colS)
-        db.schema.tables.add(personTable)
-
-        val primaryConstraint = Constraint()
-        primaryConstraint.name="primaryKey.person"
-        primaryConstraint.source.table="person"
-        primaryConstraint.source.columns.add(colSSN)
-        primaryConstraint.source.columns.add(colT)
-        primaryConstraint.type=Constraint.TYPE.PRIMARY_KEY.name
-        db.schema.constraints.add(primaryConstraint)
-
-        return db
-    }
-
-    private fun hsplitPersonMetadata(personMetadata: Database) {
-        printDb(personMetadata)
-        val  detected = detect(personMetadata)
+    fun compute(databaseMetadata: Database) {
+        printDb(databaseMetadata)
+        val  detected = detect(databaseMetadata)
         if (detected.ok!=null) {
-            val applied = apply(personMetadata, detected)
+            val applied = apply(databaseMetadata, detected)
             if (applied.ok!=null) {
                 printDb(applied.ok)
                 printSql(SQLizeUseCase().sqlize(applied.ok))
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/IdentifierApplyUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/IdentifierApplyUseCase.kt
deleted file mode 100644
index 12325d0..0000000
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/IdentifierApplyUseCase.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-package unibz.cs.semint.kprime.usecase
-
-class IdentifierApplyUseCase {}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/IdentifierDetectUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/IdentifierDetectUseCase.kt
deleted file mode 100644
index 1ba549d..0000000
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/IdentifierDetectUseCase.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package unibz.cs.semint.kprime.usecase
-
-class IdentifierDetectUseCase {
-}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerHUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerHUseCase.kt
new file mode 100644
index 0000000..1d21c6b
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerHUseCase.kt
@@ -0,0 +1,16 @@
+package unibz.cs.semint.kprime.usecase
+
+import unibz.cs.semint.kprime.domain.Database
+
+class TransformerHUseCase :TransformerUseCase {
+    override fun decompose(db: Database): Database {
+        // TODO("not implemented")
+        return Database()
+    }
+
+    override fun compose(db: Database): Database {
+        // TODO("not implemented")
+        return Database()
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerUseCase.kt
index b498358..7773a11 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerUseCase.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerUseCase.kt
@@ -4,5 +4,6 @@ import unibz.cs.semint.kprime.domain.ChangeSet
 import unibz.cs.semint.kprime.domain.Database
 
 interface TransformerUseCase {
-    fun compute(db: Database):ChangeSet
+    fun decompose(db: Database):Database
+    fun compose(db:Database): Database
 }
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerVUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerVUseCase.kt
new file mode 100644
index 0000000..f97f0ab
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/TransformerVUseCase.kt
@@ -0,0 +1,17 @@
+package unibz.cs.semint.kprime.usecase
+
+import unibz.cs.semint.kprime.domain.Database
+
+class TransformerVUseCase :TransformerUseCase {
+
+    override fun decompose(db: Database): Database {
+        val changeSet = VSplitUseCase().compute(db)
+        return ApplyChangeSetUseCase().apply(db,changeSet)
+    }
+
+    override fun compose(db: Database): Database {
+        val changeSet = VJoinUseCase().compute(db)
+        return ApplyChangeSetUseCase().apply(db,changeSet)
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/VJoinUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/VJoinUseCase.kt
new file mode 100644
index 0000000..e5ab2c8
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/VJoinUseCase.kt
@@ -0,0 +1,41 @@
+package unibz.cs.semint.kprime.usecase
+
+import unibz.cs.semint.kprime.domain.ChangeSet
+import unibz.cs.semint.kprime.domain.Constraint
+import unibz.cs.semint.kprime.domain.CreateView
+import unibz.cs.semint.kprime.domain.Database
+
+class VJoinUseCase {
+
+    fun compute(database: Database): ChangeSet {
+        val changeSet: ChangeSet = ChangeSet()
+
+
+        var tab1 = ""
+        var tab2 = ""
+        var colJoin1 = ""
+        var colJoin2 = ""
+
+        // if there is a double inclusion in tab1 and tab2 and a primary key on colJoin
+        for (const in database.schema.constraints) {
+            if (const.type==Constraint.TYPE.DOUBLE_INCLUSION.name) {
+                tab1 = const.source.table
+                tab2= const.target.table
+                colJoin1 = const.source.columns[0].name
+                colJoin2 = const.target.columns[0].name
+                break
+            }
+        }
+        if (tab1=="") {
+            return changeSet
+        }
+
+        val view1cols = "select * from $tab1 join $tab2 on $tab1.$colJoin1 = $tab2.$colJoin2"
+        val view1 = CreateView()
+        view1.viewName="tableJoin"
+        view1.text=view1cols
+        changeSet.createView.add(view1)
+        return changeSet
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitDetectUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitDetectUseCase.kt
deleted file mode 100644
index 7cd975a..0000000
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitDetectUseCase.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package unibz.cs.semint.kprime.usecase
-
-class VSplitDetectUseCase {
-}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/scenario/PersonVSplitScenario.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitUseCase.kt
similarity index 50%
rename from src/main/kotlin/unibz.cs.semint.kprime/scenario/PersonVSplitScenario.kt
rename to src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitUseCase.kt
index ad24c57..9bdd18e 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/scenario/PersonVSplitScenario.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/VSplitUseCase.kt
@@ -1,65 +1,29 @@
-package unibz.cs.semint.kprime.scenario
+package unibz.cs.semint.kprime.usecase
 
-import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
 import unibz.cs.semint.kprime.domain.*
-import unibz.cs.semint.kprime.usecase.XMLSerializeUseCase
 
-class PersonVSplitScenario {
+class VSplitUseCase {
 
-    fun run(): ChangeSet {
-        val personMetadata = buildPersonMetadata()
-        println(XMLSerializeUseCase(XMLSerializerJacksonAdapter()).prettyDatabase(personMetadata))
-        return vsplitPersonMetadata(personMetadata)
-    }
-
-    private fun buildPersonMetadata(): Database {
-        val db = Database()
-        val personTable = Table()
-        personTable.name= "person"
-        val colSSN = Column("SSN", "id.SSN", "dbname.SSN")
-        personTable.columns.add(colSSN)
-        colSSN.nullable=false
-
-        val colT = Column("T", "id.T", "dbname.T")
-        personTable.columns.add(colT)
-        colT.nullable=false
-
-        val colS = Column("S", "id.S", "dbname.S")
-        colS.nullable=true
-        personTable.columns.add(colS)
-
-        val colX = Column("X", "id.X", "dbname.X")
-        colX.nullable=true
-        personTable.columns.add(colX)
-
-        db.schema.key("person", mutableSetOf(colSSN))
-        db.schema.functional("person", mutableSetOf(colT), mutableSetOf(colS))
-
-        db.schema.tables.add(personTable)
-
-        return db
-    }
-
-    private fun vsplitPersonMetadata(personMetadata: Database): ChangeSet {
+    fun compute(metadataDatabase: Database): ChangeSet {
         // check for functional dep
         // create changeset
         var changeSet = ChangeSet()
 
         // compute K
-        val keyCols = personMetadata.schema.key("person")
+        val keyCols = metadataDatabase.schema.key("person")
         var key = keyCols.map { x -> x.name }.toSet()
         println("key $key")
         // compute LHS
-        var lhsCols = personMetadata.schema.functionalLHS("person")
+        var lhsCols = metadataDatabase.schema.functionalLHS("person")
                 var lhs= lhsCols.map { x -> x.name }.toSet()
         println("lhs $lhs")
         if (lhs.isEmpty()) return changeSet
         // compute RHS
-        val rhsCols = personMetadata.schema.functionalRHS("person")
+        val rhsCols = metadataDatabase.schema.functionalRHS("person")
         var rhs = rhsCols.map { x -> x.name }.toSet()
         println("rhs $rhs")
         // compute Rest
-        val allCols = personMetadata.schema.table("person").columns.toSet()
+        val allCols = metadataDatabase.schema.table("person").columns.toSet()
         val all = allCols.map { x -> x.name }.toSet()
         var rest = all.minus(key).minus(lhs).minus(rhs)
         val allNotKey = all.minus(key)
@@ -89,20 +53,12 @@ class PersonVSplitScenario {
         changeSet.createConstraint.add(inclusionTab1Tab2)
         // create inclusion constraint tab2 tab1
         val inclusionTab2Tab1 = Constraint()
-        inclusionTab2Tab1.type=Constraint.TYPE.INCLUSION.name
+        inclusionTab2Tab1.type=Constraint.TYPE.DOUBLE_INCLUSION.name
         inclusionTab2Tab1.source.table="tableName2"
         inclusionTab2Tab1.source.columns.addAll(lhsCols)
         inclusionTab2Tab1.target.table="tableName1"
         inclusionTab2Tab1.target.columns.addAll(lhsCols)
         changeSet.createConstraint.add(inclusionTab2Tab1)
-        // create primary key on tab2
-        val primaryTab2 = Constraint()
-        primaryTab2.type=Constraint.TYPE.PRIMARY_KEY.name
-        primaryTab2.source.table="tableName2"
-        primaryTab2.source.columns.addAll(lhsCols)
-        primaryTab2.target.table="tableName2"
-        primaryTab2.target.columns.addAll(rhsCols)
-        changeSet.createConstraint.add(primaryTab2)
         return changeSet
     }
 }
\ No newline at end of file
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonHSplitScenarioTI.kt b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonHSplitScenarioTI.kt
index ae8a381..105e63f 100644
--- a/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonHSplitScenarioTI.kt
+++ b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonHSplitScenarioTI.kt
@@ -1,15 +1,46 @@
 package unibz.cs.semint.kprime.scenario
 
 import org.junit.Test
+import unibz.cs.semint.kprime.domain.Column
+import unibz.cs.semint.kprime.domain.Constraint
+import unibz.cs.semint.kprime.domain.Database
+import unibz.cs.semint.kprime.domain.Table
+import unibz.cs.semint.kprime.usecase.HSplitUseCase
 
 class PersonHSplitScenarioTI {
 
+    private fun buildPersonMetadata(): Database {
+        val db = Database()
+        val personTable = Table()
+        personTable.name= "person"
+        val colSSN = Column("SSN", "id.SSN", "dbname.SSN")
+        personTable.columns.add(colSSN)
+        colSSN.nullable=false
+        val colT = Column("T", "id.T", "dbname.T")
+        personTable.columns.add(colT)
+        colT.nullable=false
+        val colS = Column("S", "id.S", "dbname.S")
+        colS.nullable=true
+        personTable.columns.add(colS)
+        db.schema.tables.add(personTable)
+
+        val primaryConstraint = Constraint()
+        primaryConstraint.name="primaryKey.person"
+        primaryConstraint.source.table="person"
+        primaryConstraint.source.columns.add(colSSN)
+        primaryConstraint.source.columns.add(colT)
+        primaryConstraint.type= Constraint.TYPE.PRIMARY_KEY.name
+        db.schema.constraints.add(primaryConstraint)
+
+        return db
+    }
+
     @Test
     fun test_person_hsplit_scenario() {
         // given
-        val personHSplitScenario = PersonHSplitScenario()
+        val personHSplitUseCase = HSplitUseCase()
         // when
-        personHSplitScenario.run()
+        personHSplitUseCase.compute(databaseMetadata = buildPersonMetadata())
         // then
         // prints splitted database
     }
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonVJoinScenarioTI.kt b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonVJoinScenarioTI.kt
new file mode 100644
index 0000000..9e7c8d0
--- /dev/null
+++ b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonVJoinScenarioTI.kt
@@ -0,0 +1,60 @@
+package unibz.cs.semint.kprime.scenario
+
+import org.junit.Test
+import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
+import unibz.cs.semint.kprime.domain.Column
+import unibz.cs.semint.kprime.domain.Database
+import unibz.cs.semint.kprime.domain.Table
+import unibz.cs.semint.kprime.usecase.VJoinUseCase
+import unibz.cs.semint.kprime.usecase.XMLSerializeUseCase
+
+class PersonVJoinScenarioTI {
+
+    private fun buildMetadata(): Database {
+        val db = Database()
+        val personTable1 = Table()
+        personTable1.name= "person1"
+        val colSSN = Column("SSN", "id.SSN", "dbname.SSN")
+        personTable1.columns.add(colSSN)
+        colSSN.nullable=false
+
+        val colT = Column("T", "id.T", "dbname.T")
+        personTable1.columns.add(colT)
+        colT.nullable=false
+
+        val colX = Column("X", "id.X", "dbname.X")
+        colX.nullable=true
+        personTable1.columns.add(colX)
+
+        db.schema.key("person1", mutableSetOf(colSSN))
+
+        db.schema.tables.add(personTable1)
+
+        val personTable2 = Table()
+        personTable2.name= "person2"
+
+        val colT2 = Column("T", "id.T", "dbname.T")
+        personTable2.columns.add(colT2)
+        colT2.nullable=false
+
+        val colS2 = Column("S", "id.S", "dbname.S")
+        colS2.nullable=true
+        personTable2.columns.add(colS2)
+
+        db.schema.key("person2", mutableSetOf(colT2))
+
+        db.schema.tables.add(personTable2)
+        return db
+    }
+
+    @Test
+    fun test_person_vsplit_scenario() {
+        // given
+        val personVJoinUseCase = VJoinUseCase()
+        // when
+        val changeSet = personVJoinUseCase.compute(buildMetadata())
+        // then
+        // prints changeset
+        println(XMLSerializeUseCase(XMLSerializerJacksonAdapter()).prettyChangeSet(changeSet))
+    }
+}
\ No newline at end of file
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonVSplitScenarioTI.kt b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonVSplitScenarioTI.kt
index 27e3ea7..86dd0e8 100644
--- a/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonVSplitScenarioTI.kt
+++ b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonVSplitScenarioTI.kt
@@ -2,16 +2,51 @@ package unibz.cs.semint.kprime.scenario
 
 import org.junit.Test
 import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
+import unibz.cs.semint.kprime.domain.Column
+import unibz.cs.semint.kprime.domain.Database
+import unibz.cs.semint.kprime.domain.Table
+import unibz.cs.semint.kprime.usecase.VSplitUseCase
 import unibz.cs.semint.kprime.usecase.XMLSerializeUseCase
 
 class PersonVSplitScenarioTI {
 
+    private fun buildPersonMetadata(): Database {
+        val db = Database()
+        val personTable = Table()
+        personTable.name= "person"
+        val colSSN = Column("SSN", "id.SSN", "dbname.SSN")
+        personTable.columns.add(colSSN)
+        colSSN.nullable=false
+
+        val colT = Column("T", "id.T", "dbname.T")
+        personTable.columns.add(colT)
+        colT.nullable=false
+
+        val colS = Column("S", "id.S", "dbname.S")
+        colS.nullable=true
+        personTable.columns.add(colS)
+
+        val colX = Column("X", "id.X", "dbname.X")
+        colX.nullable=true
+        personTable.columns.add(colX)
+
+        db.schema.key("person", mutableSetOf(colSSN))
+        db.schema.functional("person", mutableSetOf(colT), mutableSetOf(colS))
+
+        db.schema.tables.add(personTable)
+
+        return db
+    }
+
+
+
     @Test
     fun test_person_vsplit_scenario() {
         // given
-        val personVSplitScenario = PersonVSplitScenario()
+        val database = buildPersonMetadata()
+        val personVSplitUseCase = VSplitUseCase()
         // when
-        val changeSet = personVSplitScenario.run()
+        val changeSet = personVSplitUseCase.compute(database)
         // then
         // prints changeset
         println(XMLSerializeUseCase(XMLSerializerJacksonAdapter()).prettyChangeSet(changeSet))
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/scenario/SakilaScenarioTI.kt b/src/test/kotlin/unibz.cs.semint.kprime/scenario/SakilaScenarioTI.kt
index e8181a7..2c2e65a 100644
--- a/src/test/kotlin/unibz.cs.semint.kprime/scenario/SakilaScenarioTI.kt
+++ b/src/test/kotlin/unibz.cs.semint.kprime/scenario/SakilaScenarioTI.kt
@@ -1,16 +1,61 @@
 package unibz.cs.semint.kprime.scenario
 
 import org.junit.Test
+import unibz.cs.semint.kprime.adapter.repository.MetaSchemaJdbcAdapter
+import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
+import unibz.cs.semint.kprime.domain.DataSource
+import unibz.cs.semint.kprime.domain.Database
+import unibz.cs.semint.kprime.usecase.MetaSchemaReadUseCase
 
 class SakilaScenarioTI {
 
     @Test
     fun test_sakila_scenario() {
         // given
-        val sakilaScenario = SakilaScenario()
+        val sakilaScenario = SakilaScenarioTI()
         // when
         sakilaScenario.run()
         // then
         // prints manipulated sakila database
     }
+
+    fun run() {
+        val sakilaMeta = readSakilaMeta()
+        if (sakilaMeta!=null) {
+            vsplitSakila(sakilaMeta)
+            hsplitSakila(sakilaMeta)
+            identifySakila(sakilaMeta)
+        }
+    }
+
+    private fun readSakilaMeta(): Database? {
+        val type = "psql"
+        val name = "sakila-source"
+        val driver = "org.postgresql.Driver"
+        val path = "jdbc:postgresql://localhost:5432/sakila"
+        val user = "sammy"
+        val pass = "pass"
+        val sakilaSource = DataSource(type,name,driver,path,user,pass)
+        val result = MetaSchemaReadUseCase().doit(sakilaSource,
+                "read-meta-schema sakila-source",
+                MetaSchemaJdbcAdapter(),
+                XMLSerializerJacksonAdapter())
+        return result.ok
+    }
+
+    private fun vsplitSakila(db: Database) {
+        // if detect(db):result
+        //  apply(db,result):db
+    }
+
+    private fun hsplitSakila(db: Database) {
+        // if detect(db):result
+        //  apply(db,result):db
+    }
+
+    private fun identifySakila(db: Database) {
+        // if detect(db):result
+        //  apply(db,result):db
+    }
+
 }
\ No newline at end of file
-- 
GitLab