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