Skip to content
Snippets Groups Projects
Select Git revision
  • d9210d853758b5bed3f98daed157fe2041762ed4
  • main default protected
  • dev protected
  • f-linkahead-rename
  • f-real-id
  • f-filesystem-import
  • f-filesystem-link
  • f-filesystem-directory
  • f-filesystem-core
  • f-filesystem-cleanup
  • f-filesystem-main
  • f-name
  • keep_changes
  • f-permission-checks-2
  • f-mysql8-tests
  • f-retrieve-history
  • t-distinct-parents
  • v8.1.0
  • v8.0.0
  • v7.0.2
  • v7.0.1
  • v7.0.0
  • v6.0.1
  • v6.0.0
  • v5.0.0
  • v4.1.0
  • v4.0.0
  • v3.0
  • v2.0.30
29 results

makeStmt.sql

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    makeStmt.sql 3.07 KiB
    /*
     * ** header v3.0
     * This file is a part of the CaosDB Project.
     *
     * Copyright (C) 2018 Research Group Biomedical Physics,
     * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
     *
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU Affero General Public License as
     * published by the Free Software Foundation, either version 3 of the
     * License, or (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU Affero General Public License for more details.
     *
     * You should have received a copy of the GNU Affero General Public License
     * along with this program. If not, see <https://www.gnu.org/licenses/>.
     *
     * ** end header
     */
    DROP FUNCTION IF EXISTS db_2_0.makeStmt;
    DELIMITER //
    
    /**
     * Create and return a statement string which generalizes the source -> target procedure.
     *
     * Parameters
     * ----------
     *
     * sourceSet : table
     * The source table.
     *
     * targetSet : table
     * The table into which the results shall be copied.  If `NULL`, delete all non-matching rows from
     * `sourceSet`.
     *
     * data : table
     * Table whose IDs are a whitelist for which IDs shall be copied from `sourceSet` to `targetSet`.
     *
     * properties : table
     * Table with a whitelist of properties.  If not `NULL`, the `property_id` of `data` must be an ID
     * in `properties`.
     * TODO Add documentation about the `id2` meaning of `properties`.
     *
     * versiones : boolean
     * If `True` and if `sourceSet` is the `entities` table, the ID and version are copied directly from
     * `data` to `targetSet`, which must not be `NULL`.  Property filtering is done as usual.
     */
    CREATE FUNCTION db_2_0.makeStmt(sourceSet VARCHAR(255), targetSet VARCHAR(255), data VARCHAR(20000),
                                    properties VARCHAR(20000), versioned BOOLEAN)
    RETURNS VARCHAR(20000) NO SQL
    BEGIN
            IF sourceSet = "entities" AND versioned THEN
                RETURN CONCAT('INSERT IGNORE INTO `',
                    targetSet,
                    '` (id, _iversion) SELECT entity_id, _iversion FROM ',
                    data,
                    IF(properties IS NULL, '',
                        CONCAT(' AS data JOIN `', properties, '` AS prop ON (data.property_id = prop.id) WHERE ',
                               'data.entity_id = prop.id2 OR prop.id2 = 0')));
            END IF;
            RETURN CONCAT(
                IF(targetSet IS NULL,
                    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 ')),
                IF(properties IS NULL,
                    CONCAT(data,' as data WHERE '),
                    CONCAT('`',properties,'` as prop JOIN ',data,' as data ON (data.property_id=prop.id) WHERE ',
                           '(data.entity_id=prop.id2 OR prop.id2=0) AND ')),
                'data.entity_id=`', sourceSet, '`.`id` LIMIT 1)'
            );
    
    END;
    //
    DELIMITER ;