Skip to content
Snippets Groups Projects
Unverified Commit ff27612e authored by Daniel's avatar Daniel
Browse files

FIX DOC: One small fix, and documentation.

parent 5dd43882
No related branches found
No related tags found
No related merge requests found
...@@ -101,7 +101,10 @@ There are a few extra tables for implementing versioning. Also there is a speci ...@@ -101,7 +101,10 @@ There are a few extra tables for implementing versioning. Also there is a speci
`value_iversion` in the `reference_data` table which stores the version of the referenced entity at `value_iversion` in the `reference_data` table which stores the version of the referenced entity at
the time of the version. If `value_iversion` is NULL, no specific version is stored. the time of the version. If `value_iversion` is NULL, no specific version is stored.
### transactions ### The `_iversion` is an incremental version counter, starting implicitly at 1. Previous versions of
entities are stored, along with their `_iversion`, in the `archive_*` tables.
### `transactions` ###
Replacement for `transaction_log`, holds ID, user and time of transaction: Replacement for `transaction_log`, holds ID, user and time of transaction:
...@@ -123,15 +126,15 @@ Versioning info for entities: ...@@ -123,15 +126,15 @@ Versioning info for entities:
- `_ipparent` :: Primary parent ID (internal) for this version, i.e. predecessor - `_ipparent` :: Primary parent ID (internal) for this version, i.e. predecessor
- `srid` :: Server request / transaction ID which created this version - `srid` :: Server request / transaction ID which created this version
### `archive_foo_data` ### ### `archive_footable` ###
Older (i.e. not current) data value, from previous versions of an entity. Older (i.e. not current) data, from previous versions of an entity which were stored in `footable`.
- `domain_id` :: Same as in `foo_data`. - `domain_id` :: Same as in `footable`.
- `entity_id` :: Same as in `foo_data`. - `entity_id` :: Same as in `footable`.
- `property_id` :: Same as in `foo_data`. - `property_id` :: Same as in `footable`.
- `value` :: The value at the given version. - `value` :: The value at the given version.
- `status` :: The value at the given version. - `status` :: The value at the given version.
- `pidx` :: Same as in `foo_data`. - `pidx` :: Same as in `footable`.
- `_iversion` :: Version index of this version. - `_iversion` :: Version index of this version.
- ... :: Data type specific columns may also be there. - ... :: Data type specific columns may also be there.
......
...@@ -36,7 +36,11 @@ fi ...@@ -36,7 +36,11 @@ fi
check_version $OLD_VERSION check_version $OLD_VERSION
# * Add a `direct` column to `archive_isa` table
# * Remove unused procedures:
# * `initNegationFilter`
# * `initConjunctionFilter`
# * `finishNegationFilter`
mysql_execute_file $PATCH_DIR/update_archive_isa.sql mysql_execute_file $PATCH_DIR/update_archive_isa.sql
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
* *
* Copyright (C) 2018 Research Group Biomedical Physics, * Copyright (C) 2018 Research Group Biomedical Physics,
* Max-Planck-Institute for Dynamics and Self-Organization Göttingen * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
* Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
* Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
* Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as * it under the terms of the GNU Affero General Public License as
...@@ -24,7 +27,44 @@ ...@@ -24,7 +27,44 @@
DROP PROCEDURE IF EXISTS db_2_0.applyBackReference; DROP PROCEDURE IF EXISTS db_2_0.applyBackReference;
DELIMITER // DELIMITER //
CREATE PROCEDURE db_2_0.applyBackReference(in sourceSet VARCHAR(255), targetSet VARCHAR(255), in propertiesTable VARCHAR(255), in entitiesTable VARCHAR(255), in subQuery BOOLEAN, in versioned BOOLEAN) /**
* Process a set of entities, keeping those which are referenced in a specific way.
*
* This procedure filters a source table and writes the result is written into a target table. If
* the target table is not given, all non-matching entries are deleted from the source table
* instead.
*
* Candidate entities are allowed to pass if there is an entity from the entities table which
* references the candidate as one of the properties in the properties table.
*
* Parameters
* ----------
* sourceSet : table
* The name of the table which shall be filtered, must have column `id`.
*
* targetSet : table
* The name of the result table, must have column `id`.
*
* propertiesTable : table
* References as Properties in this table are counted.
*
* entitiesTable : table
* References by Entities in this table are counted.
*
* subQuery : boolean
* Create a temporary target table and select as `list`, instead of using the given targetSet. The
* `versioned` parameter has no effect in this case.
*
* versioned : boolean
* If True, if a reference is versioned (references to specific versions of entities), the target
* candidate's version must match. Therefore, the sourceSet and targetSet must have a `_iversion`
* column as well (unless sourceSet is the `entities` table). If `sourceSet` is the `entities`
* table, unversioned references will result in all versions of a referenced candidate being returned.
*
*/
CREATE PROCEDURE db_2_0.applyBackReference(in sourceSet VARCHAR(255), targetSet VARCHAR(255),
in propertiesTable VARCHAR(255), in entitiesTable VARCHAR(255), in subQuery BOOLEAN,
in versioned BOOLEAN)
BEGIN BEGIN
DECLARE newTableName VARCHAR(255) DEFAULT NULL; DECLARE newTableName VARCHAR(255) DEFAULT NULL;
...@@ -38,7 +78,23 @@ BEGIN ...@@ -38,7 +78,23 @@ BEGIN
EXECUTE createBackRefSubQueryTable; EXECUTE createBackRefSubQueryTable;
DEALLOCATE PREPARE createBackRefSubQueryTable; DEALLOCATE PREPARE createBackRefSubQueryTable;
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)'))); 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; PREPARE backRefSubResultSetStmt FROM @backRefSubResultSetStmtStr;
EXECUTE backRefSubResultSetStmt; EXECUTE backRefSubResultSetStmt;
...@@ -48,9 +104,14 @@ BEGIN ...@@ -48,9 +104,14 @@ BEGIN
ELSE ELSE
IF versioned THEN IF versioned THEN
IF sourceSet = "entities" THEN IF sourceSet = "entities" THEN
-- Find any referenced entity, current or archived
SET @stmtBackRefStr = CONCAT('INSERT IGNORE INTO `', SET @stmtBackRefStr = CONCAT('INSERT IGNORE INTO `',
targetSet, targetSet,
'` (id, _iversion) SELECT source.id, _get_head_iversion(source.id) FROM entities AS source WHERE EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND ( data.value_iversion IS NULL OR data.value_iversion=_get_head_iversion(source.id))', '` (id, _iversion) SELECT source.id, _get_head_iversion(source.id)',
-- current entities
' FROM entities AS source WHERE EXISTS (',
'SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND (',
'data.value_iversion IS NULL OR data.value_iversion=_get_head_iversion(source.id))',
IF(entitiesTable IS NULL, IF(entitiesTable IS NULL,
'', '',
CONCAT(' AND EXISTS (SELECT 1 FROM `', CONCAT(' AND EXISTS (SELECT 1 FROM `',
...@@ -61,7 +122,11 @@ BEGIN ...@@ -61,7 +122,11 @@ BEGIN
CONCAT(' AND EXISTS (SELECT 1 FROM `', CONCAT(' AND EXISTS (SELECT 1 FROM `',
propertiesTable, propertiesTable,
'` AS p WHERE p.id=data.property_id LIMIT 1)')), '` AS p WHERE p.id=data.property_id LIMIT 1)')),
') UNION ALL SELECT source.id, source._iversion FROM archive_entities AS source WHERE EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND ( data.value_iversion IS NULL OR data.value_iversion=source._iversion)', ') UNION ALL ',
-- and archived entities
'SELECT source.id, source._iversion FROM archive_entities AS source WHERE EXISTS (',
'SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND ',
'(data.value_iversion IS NULL OR data.value_iversion=source._iversion)',
IF(entitiesTable IS NULL, IF(entitiesTable IS NULL,
'', '',
CONCAT(' AND EXISTS (SELECT 1 FROM `', CONCAT(' AND EXISTS (SELECT 1 FROM `',
...@@ -98,7 +163,9 @@ BEGIN ...@@ -98,7 +163,9 @@ BEGIN
targetSet, targetSet,
'` (id, _iversion) SELECT source.id, source._iversion FROM `', '` (id, _iversion) SELECT source.id, source._iversion FROM `',
sourceSet, sourceSet,
'` AS source WHERE EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND ( data.value_iversion IS NULL OR data.value_iversion=_get_head_iversion(source.id))', '` AS source WHERE EXISTS (',
'SELECT 1 FROM `reference_data` AS data WHERE data.value=source.id AND',
' (data.value_iversion IS NULL OR data.value_iversion=source._iversion)',
IF(entitiesTable IS NULL, IF(entitiesTable IS NULL,
'', '',
CONCAT(' AND EXISTS (SELECT 1 FROM `', CONCAT(' AND EXISTS (SELECT 1 FROM `',
...@@ -115,6 +182,7 @@ BEGIN ...@@ -115,6 +182,7 @@ BEGIN
ELSE ELSE
-- unversioned queries -- unversioned queries
IF targetSet IS NULL OR sourceSet = targetSet THEN IF targetSet IS NULL OR sourceSet = targetSet THEN
-- delete from sourceSet
SET @stmtBackRefStr = CONCAT('DELETE FROM `', SET @stmtBackRefStr = CONCAT('DELETE FROM `',
sourceSet, sourceSet,
'` WHERE NOT EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=`', '` WHERE NOT EXISTS (SELECT 1 FROM `reference_data` AS data WHERE data.value=`',
...@@ -134,6 +202,7 @@ BEGIN ...@@ -134,6 +202,7 @@ BEGIN
'` AS p WHERE p.id=data.property_id LIMIT 1)')), '` AS p WHERE p.id=data.property_id LIMIT 1)')),
')'); ')');
ELSE ELSE
-- write to targetSet
SET @stmtBackRefStr = CONCAT('INSERT IGNORE INTO `', SET @stmtBackRefStr = CONCAT('INSERT IGNORE INTO `',
targetSet, targetSet,
'` (id) SELECT id FROM `', '` (id) SELECT id FROM `',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment