diff --git a/procedures/query/applyPOV.sql b/procedures/query/applyPOV.sql index e648637e68745949e068b51cc82ffe9c11a9ac1b..e7d0029661f7a7d74a5a8a8b4f819b56281edce5 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 b40b287b25bdd703337d50f3ca19d25d71bfcada..56299d726f83b84c723ca23e0c94027b787139a5 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 b0e70f744087672519957d0b9b6713d8ef3574a3..daaafa1934e58d53dbcc5cd17551c9353efa4571 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 279b8cbac73c43893086187a38ec693978e16791..6814befff636e13f3a742baa57a21eca486a116c 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 e9f8616a6dc00dbd465151e2d637f1f74fb8d2a2..0f53be233e537a20a1b5e04f3299382c283691cc 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 7db35bb774659ae4d27ead20b92029991ef1fed3..885a7130a4b89717fe8c0908d39f28869fbd2175 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 635aba4f030eab0f7e3c6f547e4d1df0b3a15584..e63cd413d4b543a0a5a2edffeb5b3462d8fbaef2 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 7a5a45bd125563b847d69ca404d0c28294c64fc6..54e8c70ca771cd7bf9207166f29d1c47b0c2aff8 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 ;