From 2e2d2fbb26c1d46ac195fcab768c0b1f4241bc28 Mon Sep 17 00:00:00 2001
From: npedot <nicola.pedot@gmail.com>
Date: Thu, 23 Jan 2020 17:37:08 +0100
Subject: [PATCH] adds xpath conditionals

---
 .../usecase/XPathTransformUseCase.kt          | 35 ++++++++++++++-----
 .../decompose/vertical_decompose_1.paths      |  6 ++--
 2 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/XPathTransformUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/XPathTransformUseCase.kt
index bf410f3..315bacd 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/XPathTransformUseCase.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/XPathTransformUseCase.kt
@@ -19,8 +19,8 @@ class XPathTransformUseCase {
         val vdecomposeTemplatePath = "transformer/${trasformerName}/${trasformerDirection}/${trasformerName}_${trasformerDirection}_${trasformerVersion}.template"
 
         val personProperties = XPathTransformUseCase::class.java.getResourceAsStream(vdecomposeFilePath)
-        val personPaths = Properties()
-        personPaths.load(personProperties)
+        val xPaths = Properties()
+        xPaths.load(personProperties)
 
         var dbStream : InputStream
         if (dbFilePath.startsWith("/"))
@@ -35,35 +35,54 @@ class XPathTransformUseCase {
         val templConfig = Configuration(Configuration.VERSION_2_3_29)
         val classTemplLoader = ClassTemplateLoader(XPathTransformUseCase::javaClass.javaClass, "/")
         templConfig.templateLoader = classTemplLoader
-        val templModel = mutableMapOf<String, Any>()
+        val templModel = mutableMapOf<String, List<String>>()
 
         // compute xpath lists
         val xpath = XPathFactory.newInstance().newXPath()
-        for (entryNameas in personPaths.propertyNames()) {
+        var goon=true
+        for (entryNameas in xPaths.propertyNames()) {
             val name = entryNameas as String
-            val value = personPaths.getProperty(name)
+            val pathTokens = xPaths.getProperty(name).split(" ")
+            val value = pathTokens[0]
             if (!(value.startsWith("-") || value.startsWith("+"))) {
                 templModel[name] = asValueList(xpath.compile(value).evaluate(doc, XPathConstants.NODESET) as NodeList)
                 println(" ${name} = ${value}")
                 println(" ${name} = ${templModel[name]}")
             }
+            if (pathTokens.size==3) {
+                val pathCondition = pathTokens[1]
+                val pathSize = pathTokens[2].toInt()
+                if (pathCondition==">")
+                    if ((templModel[name])!!.size <= pathSize ) goon=false
+                if (pathCondition=="=")
+                    if ((templModel[name])!!.size != pathSize ) goon=false
+            }
+        }
+        if (!goon) {
+            println("Condition Failure")
+            return
         }
         // compute derived list sum and minus
-        for (entryNameas in personPaths.propertyNames()) {
+        for (entryNameas in xPaths.propertyNames()) {
             val name = entryNameas as String
-            val value = personPaths.getProperty(name)
+            val value = xPaths.getProperty(name)
             if (value.startsWith("-") || value.startsWith("+")) {
                 println(" ${name} = ${value}")
                 templModel[name] = computeDerivedList(templModel, value)
             }
         }
+        // compute list conditions
+        // = = 3 xpath
+        // = > 0 xpath
+        // = = 0 xpath
+
         val templ = //Template.getPlainTextTemplate("templ1",personTemplate,templConfig)
                 templConfig.getTemplate(vdecomposeTemplatePath)
         templ.process(templModel, OutputStreamWriter(System.out))
     }
 
 
-    private fun computeDerivedList(templModel: MutableMap<String, Any>, derivationRule: String): Any {
+    private fun computeDerivedList(templModel: MutableMap<String, List<String>>, derivationRule: String): List<String> {
         var derivedList = mutableListOf<String>()
         // if derivationRule starts with + then compute union
         val splittedRule = derivationRule.split(" ")
diff --git a/src/test/resources/transformer/vertical/decompose/vertical_decompose_1.paths b/src/test/resources/transformer/vertical/decompose/vertical_decompose_1.paths
index d65ba38..27b6e2d 100644
--- a/src/test/resources/transformer/vertical/decompose/vertical_decompose_1.paths
+++ b/src/test/resources/transformer/vertical/decompose/vertical_decompose_1.paths
@@ -1,6 +1,6 @@
-all=/database/schema/tables/tables[@name='person']/columns/columns/@name
-keys=/database/schema/constraints/constraints[@type='PRIMARY_KEY']/source/columns/columns/@name
+all=/database/schema/tables/tables[@name='person']/columns/columns/@name = 4
+keys=/database/schema/constraints/constraints[@type='PRIMARY_KEY']/source/columns/columns/@name > 0
 lhss=/database/schema/constraints/constraints[@type='FUNCTIONAL']/source/columns/columns/@name
 rhss=/database/schema/constraints/constraints[@type='FUNCTIONAL']/target/columns/columns/@name
 rests=- all keys lhss rhss
-table=/database/schema/tables/tables[@name='person']/@name
\ No newline at end of file
+table=/database/schema/tables/tables[@name='person']/@name = 1
\ No newline at end of file
-- 
GitLab