diff --git a/src/main/kotlin/unibz.cs.semint.kprime/Starter.kt b/src/main/kotlin/unibz.cs.semint.kprime/Starter.kt index 59d93b9eeb774be424e29635db9a678d420f4a25..8135d3f41aa0f77b56a04403632fc09b8b49a661 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 aab20740a9ef52ac4e9c31c479f46e7eb2e2e34a..02efb4e9faadc11e08940ebaf29ed805093fa1dc 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 7936ecc68321a89d0f805622cb04064cabc25ed1..0000000000000000000000000000000000000000 --- 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 33d2f116e54cc9800c77222cf664d21d3b6c0d4f..0819b6fbe3f83cafce30797b71858aad468358e7 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 d344b7a99a874c096093a51b462e903ea86c7275..0cbb4201ed37893e7c339865a4595eedd0160de2 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 e42a4741f7513e4d4811d1fbcdb5245f012b4c59..0000000000000000000000000000000000000000 --- 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 eea22ef2b427ad74495a81fdcd2645911b092c4a..0000000000000000000000000000000000000000 --- 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 06e1687ad27140eccb5c5472938e5eaae2d5fbc8..ee06f273fc1a15cd42da97d7b63f767d070320da 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 12325d0bd979de5317f7ca63fb277e1635bce5e5..0000000000000000000000000000000000000000 --- 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 1ba549d5b1440338a83baf2b82f1a4bdbabd4241..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..1d21c6be09ed7e88d5b4954ba0050275ba8d764f --- /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 b4983582bb26db0a9be90c9f0ccf8f89bccf1a6f..7773a116ee6cc6113539859fdd3a4e65c04332ca 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 0000000000000000000000000000000000000000..f97f0ab33cf65b0ab615562e702a9a4e25747bdc --- /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 0000000000000000000000000000000000000000..e5ab2c8563d70ce17d2d00b3f637eb1217f0b0a6 --- /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 7cd975a3ef796119ca67434eb8a9ce9ea85d5611..0000000000000000000000000000000000000000 --- 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 ad24c571920ff9dba28bcc00ea67f3320917a520..9bdd18eebbe535f4cbe9d52e727f3ac28fd21230 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 ae8a38132acb5dcb45b6dcc0a3fb6222852f0edc..105e63fe8b33ad39a11f8e339ff933dbdecaccca 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 0000000000000000000000000000000000000000..9e7c8d0ee76d2dc7d7eeb209acf60c58a06ae99a --- /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 27e3ea7c9895a7044e09f78a9fa2e135db27775c..86dd0e846f6b34d8285a97a465fe7e1816bc76a3 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 e8181a7a5930e4c672470d8326a40b69be4948bd..2c2e65a7dd64b698ead36d18599b14f7d97ccd4c 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