From bb42f8fad06e8aae92e5e5f292e04308c929b3b6 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Mon, 9 Nov 2020 17:37:07 +0100 Subject: [PATCH] WIP: versioned queries --- procedures/query/applyPOV.sql | 22 ++++-- procedures/query/applyTransactionFilter.sql | 2 +- procedures/query/calcComplementUnion.sql | 24 +++++- procedures/query/calcDifference.sql | 10 ++- procedures/query/calcIntersection.sql | 16 +++- procedures/query/calcUnion.sql | 4 +- procedures/query/finishSubProperty.sql | 10 +-- procedures/query/initDisjunctionFilter.sql | 87 ++++++++++++--------- 8 files changed, 117 insertions(+), 58 deletions(-) diff --git a/procedures/query/applyPOV.sql b/procedures/query/applyPOV.sql index e648637..e7d0029 100644 --- a/procedures/query/applyPOV.sql +++ b/procedures/query/applyPOV.sql @@ -198,18 +198,30 @@ POV_LABEL: BEGIN - IF versioned AND sourceSet = "entities" THEN + IF versioned THEN call createVersionedTmpTable(keepTabl); #-- generate statement from statement parts SET @stmtPOVkeepTblStr = CONCAT("INSERT IGNORE INTO `", keepTabl, "` (id, _iversion) SELECT entity_id AS id, _iversion FROM ", data, " as data", IF(propertiesTable IS NULL, '', CONCAT(' WHERE EXISTS (Select 1 from `', propertiesTable, '` AS prop WHERE prop.id = data.property_id AND (prop.id2=data.entity_id OR prop.id2=0))'))); - SET @stmtPOVStr = CONCAT( - CONCAT('INSERT IGNORE INTO `', + IF targetSet IS NOT NULL THEN + SET @stmtPOVStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` (id, _iversion) SELECT source.id, source._iversion FROM `', keepTabl, - '` AS source')); + '` AS source'); + ELSE + SET @stmtPOVStr = CONCAT('DELETE FROM `', + sourceSet, + '` WHERE NOT EXISTS (SELECT 1 FROM `', + keepTabl, + '` AS data WHERE data.id=`', + sourceSet, + '`.`id` AND data._iversion=`', + sourceSet, + '`._iversion LIMIT 1)'); + + END IF; #-- prepare and execute PREPARE stmt3 FROM @stmtPOVStr; @@ -259,8 +271,6 @@ POV_LABEL: BEGIN DEALLOCATE PREPARE stmtPOVkeepTbl; END IF; - /* Question: why select AS and not select INTO? */ - SELECT @stmtPOVkeepTblStr as applyPOVStmt1, @stmtPOVStr as applyPOVStmt2, keepTabl as applyPOVIntermediateResultSet; diff --git a/procedures/query/applyTransactionFilter.sql b/procedures/query/applyTransactionFilter.sql index b40b287..56299d7 100644 --- a/procedures/query/applyTransactionFilter.sql +++ b/procedures/query/applyTransactionFilter.sql @@ -39,7 +39,7 @@ BEGIN ')' ); - SET @stmtTransactionStr = makeStmt(sourceSet,targetSet,data,NULL); + SET @stmtTransactionStr = makeStmt(sourceSet,targetSet,data,NULL,FALSE); PREPARE stmtTransactionFilter from @stmtTransactionStr; IF userName IS NOT NULL THEN SET @userName = userName; diff --git a/procedures/query/calcComplementUnion.sql b/procedures/query/calcComplementUnion.sql index b0e70f7..daaafa1 100644 --- a/procedures/query/calcComplementUnion.sql +++ b/procedures/query/calcComplementUnion.sql @@ -23,15 +23,33 @@ DROP PROCEDURE IF EXISTS db_2_0.calcComplementUnion; +-- Apparently this code is not used anymore DELIMITER // -CREATE PROCEDURE db_2_0.calcComplementUnion(in targetSet VARCHAR(255), in subResultSet VARCHAR(255), in universe VARCHAR(255)) +CREATE PROCEDURE db_2_0.calcComplementUnion(in targetSet VARCHAR(255), in subResultSet VARCHAR(255), in universe VARCHAR(255), in versioned BOOLEAN) BEGIN - SET @stmtComplementUnionStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT id FROM `',universe, '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `', subResultSet,'` AS diff WHERE diff.id=universe.id)'); + IF versioned AND universe = "entities" THEN + SET @stmtComplementUnionStr = CONCAT( + 'INSERT IGNORE INTO `', targetSet, + '` SELECT e.id, _get_head_iversion(e.id) FROM entities as e WHERE NOT EXISTS ( SELECT 1 FROM `', + subResultSet, + '` AS diff WHERE diff.id=e.id AND diff._iversion = _get_head_iversion(e.id)) UNION ALL SELECT e.id, e._iversion FROM archive_entities AS e WHERE NOT EXISTS ( SELECT 1 FROM `', + subResultSet, + '` as diff WHERE e.id = diff.id AND e._iversion = diff._iversion)'); + ELSEIF versioned THEN + SET @stmtComplementUnionStr = CONCAT( + 'INSERT IGNORE INTO `', targetSet, + '` SELECT id FROM `',universe, + '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `', + subResultSet,'` + AS diff WHERE diff.id=universe.id AND diff._iversion = universe.id_version)'); + ELSE + SET @stmtComplementUnionStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT id FROM `',universe, '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `', subResultSet,'` AS diff WHERE diff.id=universe.id)'); + END IF; PREPARE stmtComplementUnion FROM @stmtComplementUnionStr; EXECUTE stmtComplementUnion; DEALLOCATE PREPARE stmtComplementUnion; - + END; // diff --git a/procedures/query/calcDifference.sql b/procedures/query/calcDifference.sql index 279b8cb..6814bef 100644 --- a/procedures/query/calcDifference.sql +++ b/procedures/query/calcDifference.sql @@ -27,13 +27,17 @@ DROP PROCEDURE IF EXISTS db_2_0.calcDifference; DELIMITER // -CREATE PROCEDURE db_2_0.calcDifference(in resultSetTable VARCHAR(255), in diff VARCHAR(255)) +CREATE PROCEDURE db_2_0.calcDifference(in resultSetTable VARCHAR(255), in diff VARCHAR(255), in versioned BOOLEAN) BEGIN - SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)'); + IF versioned THEN + SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id` AND diff._iversion=`', resultSetTable, '`.`_iversion`)'); + ELSE + SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)'); + END IF; PREPARE diffStmt FROM @diffStmtStr; EXECUTE diffStmt; DEALLOCATE PREPARE diffStmt; - + END; // diff --git a/procedures/query/calcIntersection.sql b/procedures/query/calcIntersection.sql index e9f8616..0f53be2 100644 --- a/procedures/query/calcIntersection.sql +++ b/procedures/query/calcIntersection.sql @@ -25,9 +25,21 @@ DROP PROCEDURE IF EXISTS db_2_0.calcIntersection; DELIMITER // -CREATE PROCEDURE db_2_0.calcIntersection(in resultSetTable VARCHAR(255), in intersectWith VARCHAR(255)) +CREATE PROCEDURE db_2_0.calcIntersection(in resultSetTable VARCHAR(255), in intersectWith VARCHAR(255), in versioned BOOLEAN) BEGIN - SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE NOT EXISTS ( SELECT 1 FROM `', intersectWith,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)'); + IF versioned THEN + SET @diffStmtStr = CONCAT('DELETE FROM `', + resultSetTable, + '` WHERE NOT EXISTS ( SELECT 1 FROM `', + intersectWith, + '` AS diff WHERE diff.id=`', + resultSetTable, + '`.`id` AND diff._iversion=`', + resultSetTable, + '`.`_iversion`)'); + ELSE + SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE NOT EXISTS ( SELECT 1 FROM `', intersectWith,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)'); + END IF; PREPARE diffStmt FROM @diffStmtStr; EXECUTE diffStmt; diff --git a/procedures/query/calcUnion.sql b/procedures/query/calcUnion.sql index 7db35bb..885a713 100644 --- a/procedures/query/calcUnion.sql +++ b/procedures/query/calcUnion.sql @@ -28,11 +28,11 @@ DELIMITER // CREATE PROCEDURE db_2_0.calcUnion(in targetSet VARCHAR(255), in sourceSet VARCHAR(255)) BEGIN - SET @diffStmtStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` (id) SELECT id FROM `',sourceSet,'`'); + SET @diffStmtStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT * FROM `',sourceSet,'`'); PREPARE diffStmt FROM @diffStmtStr; EXECUTE diffStmt; DEALLOCATE PREPARE diffStmt; - + END; // diff --git a/procedures/query/finishSubProperty.sql b/procedures/query/finishSubProperty.sql index 635aba4..e63cd41 100644 --- a/procedures/query/finishSubProperty.sql +++ b/procedures/query/finishSubProperty.sql @@ -24,15 +24,15 @@ DROP PROCEDURE IF EXISTS db_2_0.finishSubProperty; DELIMITER // -CREATE PROCEDURE db_2_0.finishSubProperty(in sourceSet VARCHAR(255),in targetSet VARCHAR(255), in list VARCHAR(255)) +CREATE PROCEDURE db_2_0.finishSubProperty(in sourceSet VARCHAR(255),in targetSet VARCHAR(255), in list VARCHAR(255), in versioned BOOLEAN) BEGIN DECLARE data VARCHAR(20000) DEFAULT CONCAT('`',list,'`'); - SET @finishSubPropertyStmtStr = makeStmt(sourceSet, targetSet, data, NULL); + SET @finishSubPropertyStmtStr = makeStmt(sourceSet, targetSet, data, NULL, versioned); - PREPARE finishSubPropertyStmt FROM @finishSubPropertyStmtStr; - EXECUTE finishSubPropertyStmt; + PREPARE finishSubPropertyStmt FROM @finishSubPropertyStmtStr; + EXECUTE finishSubPropertyStmt; DEALLOCATE PREPARE finishSubPropertyStmt; - + SELECT @finishSubPropertyStmtStr AS finishSubPropertyStmt; END; diff --git a/procedures/query/initDisjunctionFilter.sql b/procedures/query/initDisjunctionFilter.sql index 7a5a45b..54e8c70 100644 --- a/procedures/query/initDisjunctionFilter.sql +++ b/procedures/query/initDisjunctionFilter.sql @@ -26,7 +26,7 @@ DROP PROCEDURE IF EXISTS db_2_0.initEmptyTargetSet; DELIMITER // -CREATE PROCEDURE db_2_0.initEmptyTargetSet(in targetSet VARCHAR(255)) +CREATE PROCEDURE db_2_0.initEmptyTargetSet(in targetSet VARCHAR(255), in versioned BOOLEAN) BEGIN DECLARE newTableName VARCHAR(255) DEFAULT targetSet; IF targetSet IS NOT NULL THEN @@ -36,10 +36,18 @@ BEGIN EXECUTE stmtIsNotEmpty; DEALLOCATE PREPARE stmtIsNotEmpty; IF @isNotEmptyVar IS NOT NULL THEN /*if targetSet is not empty*/ - call createTmpTable(newTableName); + IF versioned THEN + call createVersionedTmpTable(newTableName); + ELSE + call createTmpTable(newTableName); + END IF; END IF; ELSE - call createTmpTable(newTableName); + IF versioned THEN + call createVersionedTmpTable(newTableName); + ELSE + call createTmpTable(newTableName); + END IF; END IF; SELECT newTableName AS newTableName; END; @@ -49,49 +57,56 @@ DELIMITER ; DROP PROCEDURE IF EXISTS db_2_0.initDisjunctionFilter; DELIMITER // -CREATE PROCEDURE db_2_0.initDisjunctionFilter() +CREATE PROCEDURE db_2_0.initDisjunctionFilter(in versioned BOOLEAN) BEGIN - call initEmptyTargetSet(NULL); + call initEmptyTargetSet(NULL, versioned); END; // DELIMITER ; DROP PROCEDURE IF EXISTS db_2_0.initNegationFilter; -DELIMITER // +-- Apparently this code is not used anymore +-- DELIMITER // -CREATE PROCEDURE db_2_0.initNegationFilter(in sourceSet VARCHAR(255)) -BEGIN - DECLARE newTableName VARCHAR(255) DEFAULT NULL; - call createTmpTable(newTableName); - call copyTable(sourceSet, newTableName); - SELECT newTableName AS newTableName; -END; -// -DELIMITER ; +-- CREATE PROCEDURE db_2_0.initNegationFilter(in sourceSet VARCHAR(255), in versioned BOOLEAN) +-- BEGIN + -- DECLARE newTableName VARCHAR(255) DEFAULT NULL; + -- if versioned THEN + -- call createVersionedTmpTable(newTableName); + -- ELSE + -- call createTmpTable(newTableName); + -- END IF; + -- call copyTable(sourceSet, newTableName); + -- SELECT newTableName AS newTableName; +-- END; +-- // +-- DELIMITER ; DROP PROCEDURE IF EXISTS db_2_0.initConjunctionFilter; -DELIMITER // +-- Apparently this code is not used anymore +-- DELIMITER // -CREATE PROCEDURE db_2_0.initConjunctionFilter(in sourceSet VARCHAR(255)) -BEGIN - DECLARE newTableName VARCHAR(255) DEFAULT NULL; - call createTmpTable(newTableName); - call copyTable(sourceSet, newTableName); - SELECT newTableName AS newTableName; -END; -// -DELIMITER ; +-- CREATE PROCEDURE db_2_0.initConjunctionFilter(in sourceSet VARCHAR(255)) +-- BEGIN + -- DECLARE newTableName VARCHAR(255) DEFAULT NULL; + -- call createTmpTable(newTableName); + -- call copyTable(sourceSet, newTableName); + -- SELECT newTableName AS newTableName; +-- END; +-- // +-- DELIMITER ; DROP PROCEDURE IF EXISTS db_2_0.finishNegationFilter; -DELIMITER // +-- Apparently this code is not used anymore +-- DELIMITER // -CREATE PROCEDURE db_2_0.finishNegationFilter(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), in subResultSet VARCHAR(255)) -BEGIN - IF targetSet IS NULL OR sourceSet = targetSet THEN - call calcDifference(sourceSet, subResultSet); - ELSE - call calcComplementUnion(targetSet,subResultSet,sourceSet); - END IF; -END; -// -DELIMITER ; +-- CREATE PROCEDURE db_2_0.finishNegationFilter(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), in subResultSet VARCHAR(255), in versioned BOOLEAN) +-- BEGIN + -- IF targetSet IS NULL OR sourceSet = targetSet THEN + -- call calcDifference(sourceSet, subResultSet, versioned); + -- ELSE + -- call calcComplementUnion(targetSet,subResultSet,sourceSet, versioned); + -- END IF; +-- END; +-- // +-- DELIMITER ; -- GitLab