Skip to content
Snippets Groups Projects
Select Git revision
  • 7bca36c6961985ad9d20d3a672e33d3a822aebc8
  • main default protected
  • f-sss4grpc
  • dev
  • 108-implement-rpc-call-for-server-side-scripting
  • f-windows-conan-create
  • f-to-string
  • f-update-requirements
  • f-related-projects
  • f-role
  • f-remote-path
  • f-rel-path
  • f-consol-message
  • v0.3.0
  • v0.2.2
  • v0.2.1
  • v0.2.0
  • v0.1.2
  • v0.1.1
  • v0.1
  • v0.0.19
  • v0.0.18
  • v0.0.16
  • v0.0.15
  • v0.0.10
  • v0.0.9
  • v0.0.8
  • v0.0.7
  • v0.0.6
  • v0.0.5
  • v0.0.4
  • v0.0.3
  • v0.0.2
33 results

CMakeLists.txt

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 ;