diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod index 9638ae2da441efb014794a1ed99ae581fdda95b6..c58080846f036f9611512c7779e345b7e2ae7cb8 100644 --- a/aliasDefinition/Data_alias/Data_alias.aod +++ b/aliasDefinition/Data_alias/Data_alias.aod @@ -18,7 +18,7 @@ <description></description> <auditSyncConfig> <name>auditSyncConfig</name> - <auditMode v="0" /> + <auditMode v="2" /> <syncActive v="false" /> <syncComplete v="true" /> <syncDirection v="1" /> @@ -174,7 +174,7 @@ <description></description> <auditSyncConfig> <name>auditSyncConfig</name> - <auditMode v="0" /> + <auditMode v="1" /> <syncActive v="false" /> <syncComplete v="true" /> <syncDirection v="1" /> @@ -323,7 +323,7 @@ <description></description> <auditSyncConfig> <name>auditSyncConfig</name> - <auditMode v="0" /> + <auditMode v="2" /> <syncActive v="false" /> <syncComplete v="true" /> <syncDirection v="1" /> @@ -458,8 +458,8 @@ <name>GENDER</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="12" /> - <size v="50" /> + <columnType v="1" /> + <size v="1" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> @@ -518,7 +518,6 @@ <description></description> <auditSyncConfig> <name>auditSyncConfig</name> - <auditMode v="0" /> <syncActive v="false" /> <syncComplete v="true" /> <syncDirection v="1" /> @@ -797,7 +796,7 @@ <description></description> <auditSyncConfig> <name>auditSyncConfig</name> - <auditMode v="0" /> + <auditMode v="1" /> <syncActive v="false" /> <syncComplete v="true" /> <syncDirection v="1" /> @@ -860,8 +859,8 @@ <name>ADDR_TYPE</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="4" /> - <size v="10" /> + <columnType v="5" /> + <size v="5" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> @@ -1044,7 +1043,7 @@ <description></description> <auditSyncConfig> <name>auditSyncConfig</name> - <auditMode v="0" /> + <auditMode v="1" /> <syncActive v="false" /> <syncComplete v="true" /> <syncDirection v="1" /> @@ -1181,4 +1180,41 @@ </entityGroup> </aliasDefDb> </aliasDefinitionSub> + <indexSearchGroups> + <indexSearchGroup> + <name>ORG</name> + <title>Company</title> + <icon>VAADIN:BUILDING</icon> + <idColumn>RELATIONID</idColumn> + <titleColumn>TITLECOLUMN</titleColumn> + <descriptionColumn>DESCCOLUMN</descriptionColumn> + <query>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/org/query.js</query> + <resultContextNeon>Org_context</resultContextNeon> + <affectedTables> + <element>ADDRESS</element> + <element>COMM</element> + <element>RELATION</element> + <element>ORG</element> + </affectedTables> + <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/org/affectedIds.js</affectedIds> + </indexSearchGroup> + <indexSearchGroup> + <name>PERS</name> + <title>Contact</title> + <icon>VAADIN:USERS</icon> + <idColumn>RELATIONID</idColumn> + <titleColumn>TITLECOLUMN</titleColumn> + <descriptionColumn>DESCCOLUMN</descriptionColumn> + <query>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js</query> + <resultContextNeon>Pers_context</resultContextNeon> + <affectedTables> + <element>ADDRESS</element> + <element>COMM</element> + <element>PERS</element> + <element>RELATION</element> + <element>ORG</element> + </affectedTables> + <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/pers/affectedIds.js</affectedIds> + </indexSearchGroup> + </indexSearchGroups> </aliasDefinition> diff --git a/aliasDefinition/Data_alias/indexsearchgroups/org/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/org/affectedIds.js new file mode 100644 index 0000000000000000000000000000000000000000..ae199b2018a9652efde2cbe29362e0e1f0e0b58c --- /dev/null +++ b/aliasDefinition/Data_alias/indexsearchgroups/org/affectedIds.js @@ -0,0 +1,41 @@ +import("system.db"); +import("system.result"); +import("system.vars"); +import("IndexSearch_lib"); +var indexHelper, infoContainer, onUpdFn, tableName, res; + +indexHelper = new IndexsearchUtils(); +tableName = vars.get("$local.table"); +idValue = vars.get("$local.idvalue"); +infoContainer = indexHelper.createAffectedInfoContainer(idValue, null, vars.get("$local.action") + ,function (){return vars.get("$local.columns")} + ,function (){return vars.get("$local.oldvalues")} + ,function (){return vars.get("$local.values")}); + +switch (tableName) +{ + case "RELATION": + res = [idValue]; + break; + case "ORG": + res = db.array(db.COLUMN, "select RELATION.RELATIONID from RELATION where RELATION.PERS_ID is null and RELATION.ORG_ID = '" + idValue + "'"); + break; + case "ADDRESS": + res = indexHelper.getAffectedIdValues("RELATION_ID", infoContainer, function (id){ + return db.array(db.COLUMN, ["select ADDRESS.RELATION_ID from ADDRESS where ADDRESS.ADDRESSID = ?", [ + [id, db.getColumnTypes("ADDRESS", ["ADDRESSID"])[0]] + ]]); + }); + break; + case "COMM": + res = indexHelper.getAffectedIdValues("RELATION_ID", infoContainer, function (id){ + return db.array(db.COLUMN, ["select ADDRESS.RELATION_ID from COMM where COMMID = ?", [ + [id, db.getColumnTypes("COMM", ["COMMID"])[0]] + ]]); + }); + break; +} + +if (res) { + result.object(res); +} \ No newline at end of file diff --git a/aliasDefinition/Data_alias/indexsearchgroups/org/query.js b/aliasDefinition/Data_alias/indexsearchgroups/org/query.js new file mode 100644 index 0000000000000000000000000000000000000000..b49ee30966107787b47007bcf2fd2dd0c0c9f27e --- /dev/null +++ b/aliasDefinition/Data_alias/indexsearchgroups/org/query.js @@ -0,0 +1,26 @@ +import("system.result"); +import("system.vars"); +import("system.calendars"); +import("system.db"); +import("Sql_lib"); + +var sqlQuery, sqlHelper, queryCondition, affectedIds; +if (vars.exists("$local.idvalue")) { + affectedIds = vars.get("$local.idvalue"); + queryCondition = "where RELATION.RELATIONID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')"; + //TODO: refactor this for incremental indexer (injections?) +} +sqlHelper = new SqlUtils(); +sqlQuery = "select RELATION.RELATIONID " + + "," + sqlHelper.concat(["ORG.NAME", "ORG.CUSTOMERCODE", "defaultAddress.COUNTRY", "defaultAddress.ZIP", "defaultAddress.CITY"]) + + " as TITLECOLUMN " + + "," + sqlHelper.concat(["ADDRESS", "BUILDINGNO", "', '", "COUNTRY", "'-'", "ZIP", "CITY"], ' ') + " as DESCCOLUMN " + //additional indexed fields + + ",ORG.NAME, COMM.ADDR " + + " from ORG " + + " join RELATION on RELATION.ORG_ID = ORG.ORGID and RELATION.PERS_ID is null " + + " left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = RELATION.ADDRESS_ID " + + " left join COMM on COMM.RELATION_ID = RELATION.RELATIONID " + + (queryCondition || "") + + " order by RELATION.RELATIONID "; +result.string(sqlQuery); \ No newline at end of file diff --git a/aliasDefinition/Data_alias/indexsearchgroups/pers/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/pers/affectedIds.js new file mode 100644 index 0000000000000000000000000000000000000000..a87cc105b4964eab1b273f808b2586b93b041a24 --- /dev/null +++ b/aliasDefinition/Data_alias/indexsearchgroups/pers/affectedIds.js @@ -0,0 +1,45 @@ +import("system.db"); +import("system.result"); +import("system.vars"); +import("IndexSearch_lib"); +var indexHelper, infoContainer, onUpdFn, tableName, res; + +indexHelper = new IndexsearchUtils(); +tableName = vars.get("$local.table"); +idValue = vars.get("$local.idvalue"); +infoContainer = indexHelper.createAffectedInfoContainer(idValue, null, vars.get("$local.action") + ,function (){return vars.get("$local.columns")} + ,function (){return vars.get("$local.oldvalues")} + ,function (){return vars.get("$local.values")}); + +switch (tableName) +{ + case "RELATION": + res = [idValue]; + break; + case "PERS": + res = db.array(db.COLUMN, "select RELATION.RELATIONID from RELATION where RELATION.PERS_ID = '" + idValue + "'"); + break; + case "ORG": + res = db.array(db.COLUMN, "select RELATION.RELATIONID from RELATION where RELATION.PERS_ID is not null and RELATION.ORG_ID = '" + idValue + "'"); + break; + case "ADDRESS": + res = indexHelper.getAffectedIdValues("RELATION_ID", infoContainer, function (id){ + return db.array(db.COLUMN, ["select ADDRESS.RELATION_ID from ADDRESS where ADDRESS.ADDRESSID = ?", [ + [id, db.getColumnTypes("ADDRESS", ["ADDRESSID"])[0]] + ]]); + }); + break; + case "COMM": + res = indexHelper.getAffectedIdValues("RELATION_ID", infoContainer, function (id){ + return db.array(db.COLUMN, ["select ADDRESS.RELATION_ID from COMM where COMMID = ?", [ + [id, db.getColumnTypes("COMM", ["COMMID"])[0]] + ]]); + }); + break; +} + +if (res) { + result.object(res); +} + \ No newline at end of file diff --git a/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js b/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js new file mode 100644 index 0000000000000000000000000000000000000000..39d30b5b8b9606410fc06eb5fcabe34e1d5b018c --- /dev/null +++ b/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js @@ -0,0 +1,27 @@ +import("system.result"); +import("system.vars"); +import("system.calendars"); +import("system.db"); +import("Sql_lib"); + +var sqlQuery, sqlHelper, queryCondition, affectedIds; +if (vars.exists("$local.idvalue")) { + affectedIds = vars.get("$local.idvalue"); + queryCondition = "where RELATION.RELATIONID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')"; + //TODO: refactor this for incremental indexer (injections?) +} +sqlHelper = new SqlUtils(); +sqlQuery = "select RELATION.RELATIONID " + + "," + sqlHelper.concat(["PERS.SALUTATION", "PERS.FIRSTNAME", "PERS.LASTNAME", "ORG.NAME"]) + + " as TITLECOLUMN " + + "," + sqlHelper.concat(["ADDRESS", "BUILDINGNO", "', '", "COUNTRY", "'-'", "ZIP", "CITY"], ' ') + " as DESCCOLUMN " + //additional indexed fields + + ",ORG.NAME, COMM.ADDR " + + " from PERS " + + " join RELATION on RELATION.PERS_ID = PERS.PERSID " + + " join ORG on RELATION.ORG_ID = ORG.ORGID " + + " left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = RELATION.ADDRESS_ID " + + " left join COMM on COMM.RELATION_ID = RELATION.RELATIONID " + + (queryCondition || "") + + " order by RELATION.RELATIONID "; +result.string(sqlQuery); \ No newline at end of file diff --git a/entity/Org_entity/Org_entity.aod b/entity/Org_entity/Org_entity.aod index f0132921f1e08fd4809f14c9aa5d15c6d6983c57..b2ad0af5ac69ed0d7a9b41391bfcc688caee3d25 100644 --- a/entity/Org_entity/Org_entity.aod +++ b/entity/Org_entity/Org_entity.aod @@ -56,6 +56,7 @@ <name>ORGID</name> <tableName>ORG</tableName> <columnName>ORGID</columnName> + <valueProcess>%aditoprj%/entity/Org_entity/entityfields/orgid/valueProcess.js</valueProcess> </entityField> <entityField> <name>ORG_USER_EDIT</name> @@ -105,7 +106,6 @@ <name>RELATIONID</name> <tableName>RELATION</tableName> <columnName>RELATIONID</columnName> - <valueProcess>%aditoprj%/entity/Org_entity/entityfields/relationid/valueProcess.js</valueProcess> </entityField> <entityField> <name>STATUS</name> @@ -228,15 +228,15 @@ </entityFields> <linkInformation> <linkInformation> - <name>7fe13e6e-8605-44e1-989b-41e103f5c884</name> + <name>a08ad13b-9031-4b6f-8c42-9df8d4185ce5</name> <tableName>ORG</tableName> <primaryKey>ORGID</primaryKey> - <isUIDTable v="true" /> </linkInformation> <linkInformation> - <name>181abde8-149c-44f1-bc1b-90635e314fab</name> + <name>419e74cd-64ad-472d-915e-cff50aa293da</name> <tableName>RELATION</tableName> <primaryKey>RELATIONID</primaryKey> + <isUIDTable v="true" /> </linkInformation> </linkInformation> </entity> diff --git a/entity/Org_entity/entityfields/relationid/valueProcess.js b/entity/Org_entity/entityfields/orgid/valueProcess.js similarity index 100% rename from entity/Org_entity/entityfields/relationid/valueProcess.js rename to entity/Org_entity/entityfields/orgid/valueProcess.js diff --git a/entity/Pers_entity/Pers_entity.aod b/entity/Pers_entity/Pers_entity.aod index 651f045ef310b1a4d323d916d7c61350c4cef607..bbef94d586725593302110edba48ba29850db03a 100644 --- a/entity/Pers_entity/Pers_entity.aod +++ b/entity/Pers_entity/Pers_entity.aod @@ -67,6 +67,7 @@ <name>PERSID</name> <tableName>PERS</tableName> <columnName>PERSID</columnName> + <valueProcess>%aditoprj%/entity/Pers_entity/entityfields/persid/valueProcess.js</valueProcess> </entityField> <entityField> <name>SALUTATION</name> @@ -143,7 +144,6 @@ <name>RELATIONID</name> <tableName>RELATION</tableName> <columnName>RELATIONID</columnName> - <valueProcess>%aditoprj%/entity/Pers_entity/entityfields/relationid/valueProcess.js</valueProcess> </entityField> <entityIncomingField> <name>PersOrg_dfi</name> @@ -243,15 +243,15 @@ </entityFields> <linkInformation> <linkInformation> - <name>1a8da51e-5630-46af-bc83-0928d534ff4c</name> + <name>449dc321-de5a-40da-a96e-23784d830745</name> <tableName>PERS</tableName> <primaryKey>PERSID</primaryKey> - <isUIDTable v="true" /> </linkInformation> <linkInformation> - <name>5989cdc1-54c8-4b98-a571-6fefe5980e2a</name> + <name>724cb303-ea72-4207-9fc4-52aec17e0c31</name> <tableName>RELATION</tableName> <primaryKey>RELATIONID</primaryKey> + <isUIDTable v="true" /> </linkInformation> </linkInformation> </entity> diff --git a/entity/Pers_entity/entityfields/relationid/valueProcess.js b/entity/Pers_entity/entityfields/persid/valueProcess.js similarity index 100% rename from entity/Pers_entity/entityfields/relationid/valueProcess.js rename to entity/Pers_entity/entityfields/persid/valueProcess.js diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod index 2e9d98b454f5cd5169906b7d1af461aa3ebc223f..8fcbb815aad5cead7402f24d249fc968f7af9e89 100644 --- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod +++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod @@ -7,7 +7,7 @@ <clientSearchOptimizedForSpeed v="true" /> <clientSearchExcludeForIgnorecase v="true" /> <blobHandlingMethod>DATABASE</blobHandlingMethod> - <databaseAuditGetOldValueLobs v="true" /> + <databaseAuditGetOldValueLobs v="false" /> <indexsearchFullIndexerEnabled v="true" /> <indexsearchFullIndexerInterval v="0" /> <indexsearchIncrementingIndexerEnabled v="true" /> diff --git a/process/IndexSearch_lib/IndexSearch_lib.aod b/process/IndexSearch_lib/IndexSearch_lib.aod new file mode 100644 index 0000000000000000000000000000000000000000..a019eaf85a888b94f584905bedf2d48a47b83286 --- /dev/null +++ b/process/IndexSearch_lib/IndexSearch_lib.aod @@ -0,0 +1,6 @@ +<?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.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7"> + <name>IndexSearch_lib</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/IndexSearch_lib/process.js</process> +</process> diff --git a/process/IndexSearch_lib/process.js b/process/IndexSearch_lib/process.js new file mode 100644 index 0000000000000000000000000000000000000000..afef388c81f632b9704dc7fcc8c4444f2c5542f9 --- /dev/null +++ b/process/IndexSearch_lib/process.js @@ -0,0 +1,61 @@ +function IndexsearchUtils(){ + this.getAffectedIdValues = function(fieldname, affectedInfoContainer, updateFn){ + var affectedIds; + switch (affectedInfoContainer.action){ + case "I": + affectedIds = [affectedInfoContainer.newValues[affectedInfoContainer.columns.indexOf(fieldname)]]; + break; + case "U": + affectedIds = updateFn.call(null, changedIdValue); + break; + case "D": + affectedIds = [affectedInfoContainer.oldValues[affectedInfoContainer.columns.indexOf(fieldname)]]; + break; + } + return affectedIds || []; + } + + this.createAffectedInfoContainer = function(changedIdValue, changedTable, action, columnsFn, oldValueFn, newValueFn){ + var res, internalStorage; + internalStorage = {}; + res = { + id: changedIdValue + ,table: changedTable + ,action: action + ,columns: null //null for autocomplete in the ADITO-designer + ,oldValues: null + ,newValues: null + }; + Object.defineProperty(res, "columns", { + get: function(){ + if (internalStorage["columns"] == undefined) + internalStorage["columns"] = columnsFn.call(null); + return internalStorage["columns"]; + } + ,set: function (v){ + internalStorage["columns"] = v; + } + }); + Object.defineProperty(res, "oldValues", { + get: function(){ + if (internalStorage["oldValues"] == undefined) + internalStorage["oldValues"] = oldValueFn.call(null); + return internalStorage["oldValues"]; + } + ,set: function (v){ + internalStorage["oldValues"] = v; + } + }); + Object.defineProperty(res, "newValues", { + get: function(){ + if (internalStorage["newValues"] == undefined) + internalStorage["newValues"] = newValueFn.call(null); + return internalStorage["newValues"]; + } + ,set: function (v){ + internalStorage["newValues"] = v; + } + }); + return res; + } +} \ No newline at end of file diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js index 4ab390756ec5e5e39fe246e801f4509ba45c24d2..a29b85a638e5f669c5e6f459e2849b09a36f5bbc 100644 --- a/process/Sql_lib/process.js +++ b/process/Sql_lib/process.js @@ -342,8 +342,8 @@ function SqlUtils() if(retstr != "") retstr += concat_string; if ( i < pFields.length - 1 ) //Check if another value follows, if not separator is not needed - retstr += " case when " + pFields[i] + isNotEmpty + " then case when " + trimSQL(pFields[i+1], pAlias) + isNotEmpty + " and " - + trimSQL(pFields[i+1], pAlias) + isNotNull + " then " + pFields[i] + pSeparator + " else " + pFields[i] + " end" + " else " + blank + " end "; + retstr += " case when " + pFields[i] + isNotEmpty + " then case when " + this.trimSql(pFields[i+1], pAlias) + isNotEmpty + " and " + + this.trimSql(pFields[i+1], pAlias) + isNotNull + " then " + pFields[i] + pSeparator + " else " + pFields[i] + " end" + " else " + blank + " end "; else retstr += " case when " + pFields[i] + isNotEmpty + " then " + pFields[i] + " else " + blank + " end "; } diff --git a/process/indexsearch_patternextension/indexsearch_patternextension.aod b/process/indexsearch_patternextension/indexsearch_patternextension.aod new file mode 100644 index 0000000000000000000000000000000000000000..22933191c0ebb0edc6826919080acc9f7e2041c8 --- /dev/null +++ b/process/indexsearch_patternextension/indexsearch_patternextension.aod @@ -0,0 +1,6 @@ +<?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.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7"> + <name>indexsearch_patternextension</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/indexsearch_patternextension/process.js</process> +</process> diff --git a/process/indexsearch_patternextension/process.js b/process/indexsearch_patternextension/process.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/process/runIndexer_ws/process.js b/process/runIndexer_ws/process.js new file mode 100644 index 0000000000000000000000000000000000000000..e9d5f5e85953705e13bbb1ebcb3a0dbf4cba2b00 --- /dev/null +++ b/process/runIndexer_ws/process.js @@ -0,0 +1,13 @@ +import("system.indexsearch"); + +function restget(obj) { + obj = JSON.parse(obj); + var index = obj.query.index.split(","); + index = typeof(index) == "string" ? [index] : index; + indexsearch.runIndexer(index); + obj.response.body = "index(es) requested for rebuild:\n" + index.reduce(function (l, r){ + return l + "\n > " + r; + }, ""); + obj = JSON.stringify(obj); + return obj; +} diff --git a/process/runIndexer_ws/runIndexer_ws.aod b/process/runIndexer_ws/runIndexer_ws.aod new file mode 100644 index 0000000000000000000000000000000000000000..e26f6a137d78c35b7c8e89b82e4539101d562297 --- /dev/null +++ b/process/runIndexer_ws/runIndexer_ws.aod @@ -0,0 +1,10 @@ +<?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.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7"> + <name>runIndexer_ws</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/runIndexer_ws/process.js</process> + <publishAsWebservice v="true" /> + <style>REST</style> + <loginTypeId>internal.none</loginTypeId> + <restrictedRoles /> +</process>