diff --git a/procedures/query/applyPOV.sql b/procedures/query/applyPOV.sql index 28c05c8a2016bd183dfa682368a314f009dbde92..aab2eb19ca26c9393f7e972242a7649f1dd762d5 100644 --- a/procedures/query/applyPOV.sql +++ b/procedures/query/applyPOV.sql @@ -32,36 +32,36 @@ POV_LABEL: BEGIN DECLARE sIntData VARCHAR(20000) DEFAULT NULL; /*WHERE CLAUSE for integer_data*/ DECLARE sDoubleData VARCHAR(20000) DEFAULT NULL; /*WHERE CLAUSE for double_data*/ DECLARE sDatetimeData VARCHAR(20000) DEFAULT NULL; /*WHERE CLAUSE for datetime_data*/ - DECLARE sNullData VARCHAR(20000) DEFAULT NULL; /*WHERE CLAUSE for null_data*/ + DECLARE sNullData VARCHAR(20000) DEFAULT NULL; /*WHERE CLAUSE for null_data*/ DECLARE sDateData VARCHAR(20000) DEFAULT NULL; /*WHERE CLAUSE for date_data*/ DECLARE sRefData VARCHAR(20000) DEFAULT NULL; /*WHERE CLAUSE for reference_data*/ - DECLARE aggValue VARCHAR(255) DEFAULT NULL; + DECLARE aggValue VARCHAR(255) DEFAULT NULL; DECLARE aggValueWhereClause VARCHAR(20000) DEFAULT NULL; DECLARE distinctUnits INT DEFAULT 0; DECLARE usedStdUnit BIGINT DEFAULT NULL; - DECLARE keepTabl VARCHAR(255) DEFAULT NULL; + DECLARE keepTabl VARCHAR(255) DEFAULT NULL; IF o = '->' THEN - #-- special case: pure reference property + #-- special case: pure reference property call applyRefPOV(sourceSet,targetSet, propertiesTable, refIdsTable); - LEAVE POV_LABEL; - ELSEIF o = '0' THEN - #-- special case: property IS NULL - #-- generate statement parts - SET vText = NULL; - SET sTextData = 'SELECT domain_id, entity_id, property_id FROM `null_data` AS subdata'; - - ELSEIF o = '!0' THEN - #-- special case: property IS NOT NULL - #-- generate statement parts - SET vText = NULL; + LEAVE POV_LABEL; + ELSEIF o = '0' THEN + #-- special case: property IS NULL + #-- generate statement parts + SET vText = NULL; + SET sTextData = 'SELECT domain_id, entity_id, property_id FROM `null_data` AS subdata'; + + ELSEIF o = '!0' THEN + #-- special case: property IS NOT NULL + #-- generate statement parts + SET vText = NULL; SET sTextData = 'SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `integer_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `double_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` AS subdata WHERE subdata.value IS NOT NULL UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data` AS subdata WHERE subdata.value IS NOT NULL'; - + ELSEIF o = "(" or o = "!(" THEN SET sTextData = IF(vText IS NULL,' SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data`', IF(vDateTimeDotNotation IS NULL, NULL, CONCAT(' SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata WHERE ',getDateWhereClause(vDateTimeDotNotation,o)))); SET sDatetimeData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data`', IF(vDateTime IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` AS subdata WHERE ',getDateTimeWhereClause(vDateTime,o)))); SET vText = NULL; - ELSEIF agg IS NOT NULL THEN + ELSEIF agg IS NOT NULL THEN #-- find aggregated value (min/max...) #-- construct where clause @@ -69,7 +69,7 @@ POV_LABEL: BEGIN SET aggValueWhereClause = CONCAT(IF(aggValueWhereClause IS NULL, '', aggValueWhereClause), getAggValueWhereClause(sourceSet, propertiesTable)); #-- construct statement - SET @aggValueStmtStr = CONCAT('SELECT ',agg,'(subdata.value), ', agg, '(convert_unit(subdata.unit_sig,subdata.value)), COUNT(DISTINCT standard_unit(subdata.unit_sig)), max(standard_unit(subdata.unit_sig)) INTO @sAggValue, @sAggValueConvert, @distinctUnits, @StdUnitSig FROM (SELECT entity_id, property_id, value, unit_sig FROM `integer_data` UNION SELECT entity_id, property_id, value, unit_sig FROM `double_data`) AS subdata WHERE ', aggValueWhereClause); + SET @aggValueStmtStr = CONCAT('SELECT ',agg,'(subdata.value), ', agg, '(convert_unit(subdata.unit_sig,subdata.value)), COUNT(DISTINCT standard_unit(subdata.unit_sig)), max(standard_unit(subdata.unit_sig)) INTO @sAggValue, @sAggValueConvert, @distinctUnits, @StdUnitSig FROM (SELECT entity_id, property_id, value, unit_sig FROM `integer_data` UNION SELECT entity_id, property_id, value, unit_sig FROM `double_data`) AS subdata WHERE ', aggValueWhereClause); #-- run statement PREPARE stmtAggValueStmt FROM @aggValueStmtStr; @@ -97,7 +97,7 @@ POV_LABEL: BEGIN SET vText = NULL; ELSE - #-- generate statement parts + #-- generate statement parts SET sTextData = IF(vText IS NULL, 'SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data`', CONCAT('SELECT DISTINCT domain_id, entity_id, property_id FROM `text_data` AS subdata WHERE subdata.value ',o,' ?')); SET sEnumData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data`', CONCAT(' UNION SELECT DISTINCT domain_id, entity_id, property_id FROM `enum_data` AS subdata WHERE subdata.value ', o, ' ?')); SET sIntData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT subdata.domain_id, subdata.entity_id, subdata.property_id FROM `integer_data` AS subdata', IF(vInt IS NULL AND vDoubleStdUnit IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `integer_data` AS subdata WHERE ', getDoubleWhereClause(vInt, unit_sig, vDoubleStdUnit, stdUnit_sig, o)))); @@ -105,18 +105,18 @@ POV_LABEL: BEGIN SET sDatetimeData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data`', IF(vDateTime IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `datetime_data` AS subdata WHERE ',getDateTimeWhereClause(vDateTime,o)))); SET sDateData = IF(vText IS NULL,' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data`', IF(vDateTimeDotNotation IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `date_data` AS subdata WHERE ',getDateWhereClause(vDateTimeDotNotation,o)))); SET sRefData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data`', IF(refIdsTable IS NULL, NULL, CONCAT(' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `reference_data` AS subdata WHERE EXISTS (SELECT 1 FROM `', refIdsTable, '` AS refIdsTable WHERE subdata.value=refIdsTable.id LIMIT 1)'))); - SET sNullData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `null_data`', NULL); - - END IF; + SET sNullData = IF(vText IS NULL, ' UNION ALL SELECT DISTINCT domain_id, entity_id, property_id FROM `null_data`', NULL); + + END IF; SET data = CONCAT('(',sTextData, - IF(sEnumData IS NULL, '', sEnumData), + IF(sEnumData IS NULL, '', sEnumData), IF(sDoubleData IS NULL, '', sDoubleData), IF(sIntData IS NULL, '', sIntData), IF(sDatetimeData IS NULL, '', sDatetimeData), IF(sDateData IS NULL, '', sDateData), IF(sRefData IS NULL, '', sRefData), - IF(sNullData IS NULL, '', sNullData), + IF(sNullData IS NULL, '', sNullData), ')' ); @@ -124,20 +124,20 @@ POV_LABEL: BEGIN call createTmpTable(keepTabl); #-- 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))'))); - - SET @stmtPOVStr = CONCAT( + 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))'))); + + SET @stmtPOVStr = CONCAT( IF(targetSet IS NULL, - CONCAT('DELETE FROM `',sourceSet,'` WHERE NOT EXISTS (SELECT 1 FROM `'), + CONCAT('DELETE FROM `',sourceSet,'` WHERE NOT EXISTS (SELECT 1 FROM `'), CONCAT('INSERT IGNORE INTO `',targetSet,'` (id) SELECT id FROM `',sourceSet,'` WHERE EXISTS (SELECT 1 FROM `')), - keepTabl, + keepTabl, '` AS data WHERE data.id=`', sourceSet, '`.`id` LIMIT 1)' - ); + ); #-- prepare and execute PREPARE stmt3 FROM @stmtPOVStr; - PREPARE stmtPOVkeepTbl FROM @stmtPOVkeepTblStr; + PREPARE stmtPOVkeepTbl FROM @stmtPOVkeepTblStr; IF vText IS NULL THEN EXECUTE stmtPOVkeepTbl; ELSE @@ -145,8 +145,8 @@ POV_LABEL: BEGIN EXECUTE stmtPOVkeepTbl USING @vText, @vText; END IF; EXECUTE stmt3; - DEALLOCATE PREPARE stmt3; - DEALLOCATE PREPARE stmtPOVkeepTbl; + DEALLOCATE PREPARE stmt3; + DEALLOCATE PREPARE stmtPOVkeepTbl; SELECT @stmtPOVkeepTblStr as applyPOVStmt1, @stmtPOVStr as applyPOVStmt2, keepTabl as applyPOVIntermediateResultSet; diff --git a/procedures/query/getDoubleWhereClause.sql b/procedures/query/getDoubleWhereClause.sql index 0bf443dcf39850281e80842f280a96f71f73f4bc..a9e730768a3d09f62f7f8ebaed3a136f920dff1e 100644 --- a/procedures/query/getDoubleWhereClause.sql +++ b/procedures/query/getDoubleWhereClause.sql @@ -27,11 +27,11 @@ DELIMITER // CREATE FUNCTION db_2_0.getDoubleWhereClause(value DOUBLE, unit_sig BIGINT, valueStdUnit DECIMAL(65,30), stdUnit_sig BIGINT, o CHAR(4)) RETURNS VARCHAR(20000) DETERMINISTIC BEGIN RETURN IF(unit_sig IS NULL AND value IS NOT NULL, - CONCAT('subdata.value', o, '\'', value, '\''), #-- without unit but value must not be NULL + CONCAT('subdata.value ', o, ' \'', value, '\''), #-- without unit but value must not be NULL CONCAT( IF(value IS NULL, '', #-- value is NULL, but valueStdUnit might not be NULL - CONCAT('(subdata.unit_sig=', unit_sig, ' AND subdata.value', o, '\'', value, '\') OR ')), - IF(unit_sig = stdUnit_sig,'',CONCAT('(subdata.unit_sig=', stdUnit_sig,' AND subdata.value', o, '\'', valueStdUnit, '\') OR ')),'(standard_unit(subdata.unit_sig)=', stdUnit_sig,' AND convert_unit(subdata.unit_sig,subdata.value)', o, valueStdUnit, ')')); #-- with unit and non-null valueStdUnit + CONCAT('(subdata.unit_sig=', unit_sig, ' AND subdata.value ', o, ' \'', value, '\') OR ')), + IF(unit_sig = stdUnit_sig,'',CONCAT('(subdata.unit_sig=', stdUnit_sig,' AND subdata.value ', o, ' \'', valueStdUnit, '\') OR ')),'(standard_unit(subdata.unit_sig)=', stdUnit_sig,' AND convert_unit(subdata.unit_sig,subdata.value) ', o, ' ', valueStdUnit, ')')); #-- with unit and non-null valueStdUnit END; // DELIMITER ;