From f1522f22e92041d82718a19fcc149e85ff5fae41 Mon Sep 17 00:00:00 2001
From: "p.neub" <p.neub@adito.de>
Date: Tue, 2 Feb 2021 15:11:29 +0100
Subject: [PATCH] Liquibase export for keyword migration

---
 process/Liquibase_lib/process.js              |   2 +-
 .../migrateKeywordContainers.aod              |   2 +-
 process/migrateKeywordContainers/process.js   | 167 ++++++++++++++----
 3 files changed, 138 insertions(+), 33 deletions(-)

diff --git a/process/Liquibase_lib/process.js b/process/Liquibase_lib/process.js
index e97ca5b2721..dc12de6cc25 100644
--- a/process/Liquibase_lib/process.js
+++ b/process/Liquibase_lib/process.js
@@ -239,7 +239,7 @@ LiquiXmlUtils.databaseChangeLogWithChangeSet = function (pAuthor, pChangeSetId)
 LiquiXmlUtils.colValue = function (name, value, valueAttribute)
 {
     var DO_NOT_ADD_EMPTY_VALUES = true;//clob and blob will ignore this setting and always skip empty values
-    if (DO_NOT_ADD_EMPTY_VALUES && value == "")
+    if (DO_NOT_ADD_EMPTY_VALUES && value === "")
         return null;
     var x = <column {valueAttribute}={value}/>;
     x.@name = name;
diff --git a/process/migrateKeywordContainers/migrateKeywordContainers.aod b/process/migrateKeywordContainers/migrateKeywordContainers.aod
index 6cccb935971..d1bb16a7a5a 100644
--- a/process/migrateKeywordContainers/migrateKeywordContainers.aod
+++ b/process/migrateKeywordContainers/migrateKeywordContainers.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>migrateKeywordContainers</name>
   <title>Migrate keyword containers</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/migrateKeywordContainers/process.js b/process/migrateKeywordContainers/process.js
index f9734d8dd35..cfffbb903c8 100644
--- a/process/migrateKeywordContainers/process.js
+++ b/process/migrateKeywordContainers/process.js
@@ -1,44 +1,149 @@
+import("system.fileIO");
 import("system.db");
+import("system.SQLTYPES");
 import("system.logging");
 import("system.util");
 import("system.vars");
 import("Sql_lib");
 import("Util_lib");
+import("Liquibase_lib");
 
+// Change this to switch between generating liquibase file and directly modify the db
+var EXPORT_TO_LIQUIBASE = true;
+
+// Writes the liquibase files to log instead of writing them to disk
+// Useful for cloud systems
+var WRITE_FILES_TO_LOG = false;
 
-var newKeywordContainers = [];
 var oldKeywordContainers = newSelect("AB_KEYWORD_ENTRY.CONTAINER")
-                        .from("AB_KEYWORD_ENTRY")
-                        .where("AB_KEYWORD_ENTRY.CONTAINER", newSelect("1")
-                                                                .from("AB_KEYWORD_CATEGORY")
-                                                                .where("AB_KEYWORD_CATEGORY.NAME = AB_KEYWORD_ENTRY.CONTAINER")
-                              , SqlBuilder.NOT_EXISTS())
-                        .groupBy("AB_KEYWORD_ENTRY.CONTAINER")
-                        .orderBy("AB_KEYWORD_ENTRY.CONTAINER")
-                        .arrayColumn();
-                        
-oldKeywordContainers.forEach(function(pElement, pIndex, pArray) {
-    var columns = ["AB_KEYWORD_CATEGORYID", "NAME", "SORTINGBY", "SORTINGDIRECTION"];
-    var values = [util.getNewUUID(), pElement, 0, "ASC"];
-    logging.log(values);
-    //(new SqlBuilder()).insertData("AB_KEYWORD_CATEGORY", columns, null, values);
+    .from("AB_KEYWORD_ENTRY")
+    .where(
+        "AB_KEYWORD_ENTRY.CONTAINER",
+        newSelect("AB_KEYWORD_CATEGORY.NAME")
+            .from("AB_KEYWORD_CATEGORY")
+            .where("AB_KEYWORD_CATEGORY.NAME = AB_KEYWORD_ENTRY.CONTAINER"),
+        SqlBuilder.NOT_EXISTS()
+    )
+    .groupBy("AB_KEYWORD_ENTRY.CONTAINER")
+    .orderBy("AB_KEYWORD_ENTRY.CONTAINER")
+    .arrayColumn();
+    
+var categories = {};
+newSelect(["AB_KEYWORD_CATEGORYID", "AB_KEYWORD_CATEGORY.NAME"])
+.from("AB_KEYWORD_CATEGORY").table().forEach(function(pRow) {
+    categories[pRow[1]] = pRow[0];
 });
 
-var keywordUpdateQuery = "UPDATE AB_KEYWORD_ENTRY"
-                         + "SET AB_KEYWORD_CATEGORY_ID = ("
-                             + "SELECT AB_KEYWORD_CATEGORYID "
-                             + "FROM AB_KEYWORD_CATEGORY "
-                             + "WHERE AB_KEYWORD_CATEGORY.NAME = AB_KEYWORD_ENTRY.CONTAINER"
-                         + ");"
-                        ;
+if(EXPORT_TO_LIQUIBASE)
+{
+    function _writeLiquibaseXml(name, xmlScript)
+    {
+        var fileContent = LiquiXmlUtils.xmlHeaderLineStr() + "\n" + xmlScript;
+        if(WRITE_FILES_TO_LOG)
+        {
+            logging.log(name);
+            logging.log(fileContent + "\n");
+        }
+        else
+        {
+            var outFolderPath = vars.get("$sys.servertemp") + "/" +  "keywordMigration" + "/";
+            fileIO.storeData(outFolderPath + "init_keyword_category.xml",
+                fileContent, util.DATA_TEXT, false, "UTF-8");
+        }
+    }
+    
+    // init_keyword_category.xml
+    var liquibaseContainers = LiquiXmlUtils.databaseChangeLogWithChangeSet("autogenerated");
+    oldKeywordContainers.forEach(function(pElement) {
+        var uuid = util.getNewUUID();
+        categories[pElement] = uuid;
 
-var attributeUpdateQuery = "UPDATE AB_KEYWORD_ATTRIBUTE"
-                            + "SET AB_KEYWORD_CATEGORY_ID = ("
-                                + "SELECT AB_KEYWORD_CATEGORYID "
-                                + "FROM AB_KEYWORD_CATEGORY "
-                                + "WHERE AB_KEYWORD_CATEGORY.NAME = AB_KEYWORD_ATTRIBUTE.CONTAINER"
-                            + ");"
-                            ;
+        var categoryTable = LiquiXTable.make("AB_KEYWORD_CATEGORY");
+        categoryTable.addIdCol("AB_KEYWORD_CATEGORYID", uuid);
+        categoryTable.addStrCol("NAME", pElement);
+        categoryTable.addNumberCol("SORTINGBY", 0);
+        categoryTable.addStrCol("SORTINGDIRECTION", "ASC");
+        liquibaseContainers.changeSet.insert += categoryTable.xml;
+    });
+    _writeLiquibaseXml("init_keyword_category.xml", liquibaseContainers);
+    
+    // update_keyword_entry
+    var updateEntryChangeset = LiquiXmlUtils.databaseChangeLogWithChangeSet("autogenerated");
+    newSelect(["AB_KEYWORD_ENTRYID", "AB_KEYWORD_ENTRY.CONTAINER"])
+    .from("AB_KEYWORD_ENTRY")
+    .where("AB_KEYWORD_CATEGORY_ID is null")
+    .table().forEach(function(pRow) {
+        var updateXml = <update tableName="AB_KEYWORD_ENTRY"/>;
+        updateXml.column = <column name="AB_KEYWORD_CATEGORY_ID" value={categories[pRow[1]]}/>;
+        updateXml.where = <where>AB_KEYWORD_ENTRYID = {"'" + pRow[0] + "'"}</where>;
+        updateEntryChangeset.changeSet.update += updateXml;
+    });
+    _writeLiquibaseXml("update_keyword_entry.xml", updateEntryChangeset);
 
-//logging.log(db.runStatement(keywordUpdateQuery) + " keyword containers updated");
-//logging.log(db.runStatement(attributeUpdateQuery) + " attribute containers updated");
+    // update_keyword_attribute
+    var updateAttributeChangeset = LiquiXmlUtils.databaseChangeLogWithChangeSet("autogenerated");
+    newSelect(["AB_KEYWORD_ATTRIBUTEID", "AB_KEYWORD_ATTRIBUTE.CONTAINER"])
+    .from("AB_KEYWORD_ATTRIBUTE")
+    .where("AB_KEYWORD_CATEGORY_ID is null")
+    .table().forEach(function(pRow) {
+        var updateXml = <update tableName="AB_KEYWORD_ATTRIBUTE"/>;
+        updateXml.column = <column name="AB_KEYWORD_CATEGORY_ID" value={categories[pRow[1]]}/>;
+        updateXml.where = <where>AB_KEYWORD_ATTRIBUTEID = {"'" + pRow[0] + "'"}</where>;
+        updateAttributeChangeset.changeSet.update += updateXml;
+    });
+    _writeLiquibaseXml("update_keyword_attribute.xml", updateAttributeChangeset);
+    
+    // changelog.xml
+    var changelogFile = LiquiXmlUtils.databaseChangeLog();
+    changelogFile.include += <include relativeToChangelogFile="true" file="init_keyword_category.xml"/>;
+    changelogFile.include += <include relativeToChangelogFile="true" file="update_keyword_entry.xml"/>;
+    changelogFile.include += <include relativeToChangelogFile="true" file="update_keyword_attribute.xml"/>;
+    _writeLiquibaseXml("changelog.xml", changelogFile);
+    
+    logging.log("Keyword migration liquibase scripts created succesfully");
+}
+else
+{
+    var statements = [];
+    
+    oldKeywordContainers.forEach(function(pElement) {
+        var uuid = util.getNewUUID();
+        categories[pElement] = uuid;
+        
+        var columns = ["AB_KEYWORD_CATEGORYID", "NAME", "SORTINGBY", "SORTINGDIRECTION"];
+        statements.push([
+            "AB_KEYWORD_CATEGORY",
+            columns,
+            db.getColumnTypes("AB_KEYWORD_CATEGORY", columns),
+            [uuid, pElement, "0", "ASC"]
+        ]);
+    });
+    
+    var FIELD_NAMES = ["AB_KEYWORD_CATEGORY_ID"];
+    var FIELD_TYPES = [SQLTYPES.VARCHAR];
+    
+    newSelect(["AB_KEYWORD_ENTRYID", "AB_KEYWORD_ENTRY.CONTAINER"])
+    .from("AB_KEYWORD_ENTRY")
+    .where("AB_KEYWORD_CATEGORY_ID is null")
+    .table().forEach(function(pRow) {
+        statements.push([
+            "AB_KEYWORD_ENTRY",
+            FIELD_NAMES, FIELD_TYPES,
+            [categories[pRow[1]]],
+            "AB_KEYWORD_ENTRYID = '" + pRow[0] + "'"]);
+    });
+    
+    newSelect(["AB_KEYWORD_ATTRIBUTEID", "AB_KEYWORD_ATTRIBUTE.CONTAINER"])
+    .from("AB_KEYWORD_ATTRIBUTE")
+    .where("AB_KEYWORD_CATEGORY_ID is null")
+    .table().forEach(function(pRow) {
+        statements.push([
+            "AB_KEYWORD_ATTRIBUTE",
+            FIELD_NAMES, FIELD_TYPES,
+            [categories[pRow[1]]],
+            "AB_KEYWORD_ATTRIBUTEID = '" + pRow[0] + "'"]);
+    });
+    
+    db.execute(statements);
+    logging.log("Keywords migrated succesfully");
+}
-- 
GitLab