diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 98008035a95874d678df722819979393f5692f0c..ec4dfb07f0695f14b1bd952f7f3c6da578de0423 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -23,10 +23,6 @@ variables: CI_REGISTRY_IMAGE: $CI_REGISTRY/caosdb-mysqlbackend-testenv:latest # When using dind, it's wise to use the overlayfs driver for # improved performance. - DOCKER_DRIVER: overlay2 - -services: - - docker:19.03-dind image: $CI_REGISTRY_IMAGE stages: @@ -39,20 +35,20 @@ trigger_build: stage: deploy script: - /usr/bin/curl -X POST - -F token=8f29e5eeb7db2123d9c2bb84634da2 + -F token=$DEPLOY_TRIGGER_TOKEN -F "variables[MYSQLBACKEND]=$CI_COMMIT_REF_NAME" -F "variables[TriggerdBy]=MYSQLBACKEND" -F "variables[TriggerdByHash]=$CI_COMMIT_SHORT_SHA" - -F ref=master https://gitlab.indiscale.com/api/v4/projects/14/trigger/pipeline + -F ref=dev https://gitlab.indiscale.com/api/v4/projects/14/trigger/pipeline # Build a docker image in which tests for this repository can run build-testenv: - tags: [ docker ] + tags: [ cached-dind ] image: docker:19.03 stage: setup script: - cd .docker - - docker login -u testuser -p $CI_REGISTRY_PASSWORD $CI_REGISTRY + - docker login -u indiscale -p $CI_REGISTRY_PASSWORD $CI_REGISTRY # use here general latest or specific branch latest... - docker pull $CI_REGISTRY_IMAGE || true - docker build diff --git a/procedures/insertLinCon.sql b/procedures/insertLinCon.sql index 878b70a176e7777fef323bdea2c1bdc74144ee83..7c03d509cc2d49e8ca1c1e601ee28e84e94dc196 100644 --- a/procedures/insertLinCon.sql +++ b/procedures/insertLinCon.sql @@ -50,7 +50,7 @@ delimiter // CREATE PROCEDURE db_2_0.updateLinCon(in sig_from BIGINT, in sig_to BIGINT, in new_a DECIMAL(65,30), in new_b_dividend BIGINT, in new_b_divisor BIGINT, in new_c DECIMAL(65,30)) BEGIN - UPDATE units_ling_con SET signature_to=sig_to, a=new_a, b_dividend=new_b_dividend, b_divisor=new_b_divisor, c=new_c where signature_from=sig_from; + UPDATE units_lin_con SET signature_to=sig_to, a=new_a, b_dividend=new_b_dividend, b_divisor=new_b_divisor, c=new_c where signature_from=sig_from; END; // diff --git a/procedures/query/applyBackReference.sql b/procedures/query/applyBackReference.sql index f287408e98c053c1c73c2f1808199320565c131f..9a2450750b42963fcff5de1e02e0054097ecc7fa 100644 --- a/procedures/query/applyBackReference.sql +++ b/procedures/query/applyBackReference.sql @@ -38,7 +38,7 @@ BEGIN EXECUTE createBackRefSubQueryTable; DEALLOCATE PREPARE createBackRefSubQueryTable; - SET @backRefSubResultSetStmtStr = CONCAT('INSERT INTO `',newTableName,'` (id,entity_id) SELECT entity_id AS id, value AS entity_id FROM `reference_data` AS data WHERE EXISTS (SELECT 1 FROM `',sourceSet,'` AS source WHERE source.id=data.value LIMIT 1)', IF(propertiesTable IS NULL,'',CONCAT(' AND EXISTS (SELECT 1 FROM `',propertiesTable,'` AS p WHERE p.id=data.property_id LIMIT 1)')), IF(entitiesTable IS NULL,'',CONCAT(' AND EXISTS (SELECT 1 FROM `',entitiesTable,'` AS e WHERE e.id=data.entity_id LIMIT 1)'))); + SET @backRefSubResultSetStmtStr = CONCAT('INSERT IGNORE INTO `',newTableName,'` (id,entity_id) SELECT entity_id AS id, value AS entity_id FROM `reference_data` AS data WHERE EXISTS (SELECT 1 FROM `',sourceSet,'` AS source WHERE source.id=data.value LIMIT 1)', IF(propertiesTable IS NULL,'',CONCAT(' AND EXISTS (SELECT 1 FROM `',propertiesTable,'` AS p WHERE p.id=data.property_id LIMIT 1)')), IF(entitiesTable IS NULL,'',CONCAT(' AND EXISTS (SELECT 1 FROM `',entitiesTable,'` AS e WHERE e.id=data.entity_id LIMIT 1)'))); PREPARE backRefSubResultSetStmt FROM @backRefSubResultSetStmtStr; EXECUTE backRefSubResultSetStmt; diff --git a/procedures/query/applyPOV.sql b/procedures/query/applyPOV.sql index aab2eb19ca26c9393f7e972242a7649f1dd762d5..eefee066d8b72b7d13cc24ec6c56fa5b6150f061 100644 --- a/procedures/query/applyPOV.sql +++ b/procedures/query/applyPOV.sql @@ -21,10 +21,37 @@ * ** end header */ +/* Documentation including (?) has to be checked by an expert. */ +/* Question: What is datetime dot notation? */ + DROP PROCEDURE IF EXISTS db_2_0.applyPOV; DELIMITER // -CREATE PROCEDURE db_2_0.applyPOV(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), in propertiesTable VARCHAR(255), in refIdsTable VARCHAR(255), in o CHAR(4), in vText VARCHAR(255), in vInt INT, in vDouble DOUBLE, in unit_sig BIGINT, in vDoubleStdUnit DOUBLE, in stdUnit_sig BIGINT, in vDateTime VARCHAR(255), in vDateTimeDotNotation VARCHAR(255), in agg CHAR(3), in pname VARCHAR(255)) +CREATE PROCEDURE db_2_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 o CHAR(4), /* The operator for this operation. can be one of: + 0 check for "equals NULL" + !0 check for "not NULL" + -> check whether a reference exists + ( (?) check for datetime intervals + !( (?) check for being outside of datetime intervals + other operators (all SQL operators (?)) + these other operators can be used either with or without an aggregation + to use an aggregation set agg to non-zero + all SQL aggregations can be used + */ + in vText VARCHAR(255), /* (?) the text value to be checked against using operator o */ + in vInt INT, /* the integer value to be checked against using operator o */ + in vDouble DOUBLE, /* the double value to be checked against using operator o */ + in unit_sig BIGINT, + in vDoubleStdUnit DOUBLE, + in stdUnit_sig BIGINT, + in vDateTime VARCHAR(255), + in vDateTimeDotNotation VARCHAR(255), + in agg CHAR(3), /* an SQL aggregate function or NULL when no aggregation should be used */ + in pname VARCHAR(255)) /* name of the property, this name is only used for reporting more meaningful warnings */ POV_LABEL: BEGIN DECLARE data TEXT DEFAULT NULL; /*data subselect statement string*/ DECLARE sTextData VARCHAR(20000) DEFAULT NULL; /*SELECT PREFIX for data subselect plus WHERE CLAUSE for text_data*/ @@ -51,15 +78,33 @@ POV_LABEL: BEGIN SET vText = NULL; SET sTextData = 'SELECT domain_id, entity_id, property_id FROM `null_data` AS subdata'; + /* Question: in !0 the query is explicitly checked for NOT NULL. Aren't these NULL entries forgotten here? */ + ELSEIF o = '!0' THEN #-- special case: property IS NOT NULL #-- generate statement parts SET vText = NULL; + /* Union of the following tables: + text_data + enum_data + integer_data + date_data + datetime_data + reference_data + double_data + Notes: + SELECT DISTINCT -> No duplicate values + UNION ALL -> Allow also duplicate values + */ 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 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 #-- find aggregated value (min/max...) @@ -148,6 +193,8 @@ POV_LABEL: BEGIN DEALLOCATE PREPARE stmt3; DEALLOCATE PREPARE stmtPOVkeepTbl; + /* Question: why select AS and not select INTO? */ + SELECT @stmtPOVkeepTblStr as applyPOVStmt1, @stmtPOVStr as applyPOVStmt2, keepTabl as applyPOVIntermediateResultSet; diff --git a/procedures/query/initSubEntity.sql b/procedures/query/initSubEntity.sql index 0390fcc4f7a2674cdf529e95b15fe66c4f0e81cd..2c3aefb3f7061efed43a5c4d36d4e413dca97786 100644 --- a/procedures/query/initSubEntity.sql +++ b/procedures/query/initSubEntity.sql @@ -28,27 +28,39 @@ DELIMITER // CREATE PROCEDURE db_2_0.initSubEntity(in e_id INT UNSIGNED, in ename VARCHAR(255), in tableName VARCHAR(255)) BEGIN - DECLARE ecount INT DEFAULT 0; - - SET @stmtStr = CONCAT('INSERT IGNORE INTO `', tableName, '` (id) SELECT id FROM entities WHERE name = ? UNION ALL SELECT entity_id FROM name_data WHERE value=? AND domain_id=0;'); + DECLARE ecount INT DEFAULT 0; + DECLARE op VARCHAR(255) DEFAULT '='; + + IF LOCATE("%", ename) > 0 THEN + SET op = "LIKE"; + END IF; + + SET @stmtStr = CONCAT('INSERT IGNORE INTO `', + tableName, + '` (id) SELECT id FROM entities WHERE name ', + op, + ' ? UNION ALL SELECT entity_id FROM name_data WHERE value ', + op, + ' ? AND domain_id=0;'); + PREPARE stmt FROM @stmtStr; - SET @ename = ename; + SET @ename = ename; EXECUTE stmt USING @ename, @ename; SET ecount = ROW_COUNT(); - DEALLOCATE PREPARE stmt; + DEALLOCATE PREPARE stmt; IF e_id IS NOT NULL THEN SET @stmtStr = CONCAT('INSERT IGNORE INTO `', tableName, '` (id) VALUES (', e_id, ')'); PREPARE stmt FROM @stmtStr; EXECUTE stmt; SET ecount = ecount + ROW_COUNT(); - DEALLOCATE PREPARE stmt; + DEALLOCATE PREPARE stmt; END IF; IF ecount > 0 THEN call getChildren(tableName); END IF; - + END; -// +// DELIMITER ;