From 9c02cdd3ebb521beabc3cc48a64600a76d2a094a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com> Date: Tue, 5 Dec 2023 20:39:42 +0100 Subject: [PATCH] select useful" --- procedures/query/applyPOV.sql | 36 ++++++++++++++++++++++++++++-- procedures/query/initPOV.sql | 1 + procedures/query/initSubEntity.sql | 8 +++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/procedures/query/applyPOV.sql b/procedures/query/applyPOV.sql index d1d8467..0297b08 100644 --- a/procedures/query/applyPOV.sql +++ b/procedures/query/applyPOV.sql @@ -40,7 +40,7 @@ DELIMITER // CREATE PROCEDURE db_5_0.applyPOV(in sourceSet VARCHAR(255), /* (?) Name of the table that the POV will be applied to. This can be a temporary table. */ in targetSet VARCHAR(255), /* (?) Name of the result table of this POV. */ in propertiesTable VARCHAR(255), - in refIdsTable VARCHAR(255), + in refIdsTable VARCHAR(255), /* (?) Name of a tmp table that contains all ids of children of the value interpreted as entity */ in o CHAR(4), /* The operator for this operation. can be one of: 0 check for "equals NULL" !0 check for "not NULL" @@ -81,6 +81,19 @@ POV_LABEL: BEGIN DECLARE keepTabl VARCHAR(255) DEFAULT NULL; DECLARE existence_op VARCHAR(255) DEFAULT "EXISTS"; + select NOW(6) into @time; + SET @tmpquery = CONCAT('SELECT * FROM `', refIdsTable, '` into outfile "/tmp/stuff', now(0),'"'); + PREPARE stmt FROM @tmpquery; + EXECUTE stmt; + SET @tmpquery2 = CONCAT('insert into povtimes (SELECT now(0), count(*), 0 FROM `', propertiesTable , '`)'); + PREPARE stmt2 FROM @tmpquery2; + EXECUTE stmt2; + + insert into povtimes (select now(0), "Beginning", timediff(NOW(6),@time) as time_passed); + #-- ######### HINT ############## + #-- first the appropriate statement is created which in the end prepared and executed + #-- ############################# + IF o = '->' THEN #-- special case: pure reference property call applyRefPOV(sourceSet,targetSet, propertiesTable, refIdsTable, versioned); @@ -229,6 +242,8 @@ POV_LABEL: BEGIN IF o = "!=" AND refIdsTable IS NOT NULL THEN SET existence_op = "NOT EXISTS"; END IF; + /* select all entities that reference the entity or a child of the + * value interpreted as ID*/ SET sRefData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data`', IF(refIdsTable IS NULL, @@ -243,6 +258,9 @@ POV_LABEL: BEGIN END IF; + + insert into povtimes (select now(0), "data string assembled", timediff(NOW(6),@time) as time_passed); + #-- create array of statement parts (and replace null with empty string) (?) SET data = CONCAT('(',sTextData, IF(sNameData IS NULL, '', sNameData), IF(sEnumData IS NULL, '', sEnumData), @@ -257,8 +275,10 @@ POV_LABEL: BEGIN call createTmpTable(keepTabl, versioned); + insert into povtimes (select now(0), "created tmptable ", timediff(NOW(6),@time) as time_passed); IF versioned THEN #-- generate statement from statement parts + #-- (versioned section) SET @stmtPOVkeepTblStr = CONCAT( 'INSERT IGNORE INTO `', keepTabl, '` (id, _iversion) SELECT entity_id AS id, _iversion FROM ', data, ' as data', IF(propertiesTable IS NULL, '', CONCAT( @@ -299,7 +319,15 @@ POV_LABEL: BEGIN DEALLOCATE PREPARE stmtPOVkeepTbl; ELSE #-- generate statement from statement parts - SET @stmtPOVkeepTblStr = CONCAT('INSERT IGNORE INTO `', keepTabl, '` (id) SELECT DISTINCT entity_id AS id 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))'))); + #-- (unversioned section) + SET @stmtPOVkeepTblStr = CONCAT('INSERT IGNORE INTO `', keepTabl, '` (id) + SELECT DISTINCT entity_id AS id FROM ', data, ' as data', + IF(propertiesTable IS NULL, + '', + /* restrict to properties with one of the appropriate ids + * and where the domain (???) equals the entity*/ + 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( IF(targetSet IS NULL, @@ -320,19 +348,23 @@ POV_LABEL: BEGIN #-- prepare and execute PREPARE stmt3 FROM @stmtPOVStr; PREPARE stmtPOVkeepTbl FROM @stmtPOVkeepTblStr; + insert into povtimes (select now(0), "statements prepared ", timediff(NOW(6),@time) as time_passed); IF vText IS NULL THEN EXECUTE stmtPOVkeepTbl; ELSE SET @vText = vText; EXECUTE stmtPOVkeepTbl USING @vText, @vText, @vText; END IF; + insert into povtimes (select now(0), "first execute ", timediff(NOW(6),@time) as time_passed); EXECUTE stmt3; + insert into povtimes (select now(0), "second execute ", timediff(NOW(6),@time) as time_passed); DEALLOCATE PREPARE stmt3; DEALLOCATE PREPARE stmtPOVkeepTbl; END IF; SELECT @stmtPOVkeepTblStr as applyPOVStmt1, @stmtPOVStr as applyPOVStmt2, keepTabl as applyPOVIntermediateResultSet; + insert into povtimes (select now(0), "end ", timediff(NOW(6),@time) as time_passed); END; // diff --git a/procedures/query/initPOV.sql b/procedures/query/initPOV.sql index 31347ba..377bc98 100644 --- a/procedures/query/initPOV.sql +++ b/procedures/query/initPOV.sql @@ -61,6 +61,7 @@ BEGIN call createTmpTable2(propertiesTable); -- fill in all properties named "PropertyName" + -- what are overwrites needed for? SET @initPOVPropertiesTableStmt1 = CONCAT('INSERT IGNORE INTO `', propertiesTable, '` (id, id2, domain) SELECT property_id, entity_id, domain_id from name_overrides WHERE name = ? UNION ALL SELECT entity_id, domain_id, 0 FROM name_data WHERE value = ?;'); PREPARE stmt FROM @initPOVPropertiesTableStmt1; SET @PropertyName = PropertyName; diff --git a/procedures/query/initSubEntity.sql b/procedures/query/initSubEntity.sql index c60ddb6..67484d0 100644 --- a/procedures/query/initSubEntity.sql +++ b/procedures/query/initSubEntity.sql @@ -24,6 +24,13 @@ DROP PROCEDURE IF EXISTS db_5_0.initSubEntity; DELIMITER // +/* +* This procedures composes a table with the ids of all entities with the given + * name and all their children (!!) +* and if provided adds the supplied entity id. +* +* The table name has to be provided. +*/ /* * Initialize a new temporary table by loading an entity and all of its children @@ -45,6 +52,7 @@ BEGIN DECLARE ecount INT DEFAULT 0; DECLARE op VARCHAR(255) DEFAULT '='; + IF LOCATE("%", ename) > 0 THEN SET op = "LIKE"; END IF; -- GitLab