Loading 00-tables.sql +2 −6 Original line number Diff line number Diff line Loading @@ -8,8 +8,8 @@ CREATE EXTENSION IF NOT EXISTS ltree; CREATE TYPE NodeType AS ENUM ('container', 'data', 'link', 'structured'); CREATE TYPE LocationType AS ENUM ('async', 'portal', 'user'); CREATE TYPE StorageType AS ENUM ('cold', 'hot', 'local', 'portal'); CREATE TYPE LocationType AS ENUM ('async', 'user'); CREATE TYPE StorageType AS ENUM ('cold', 'hot', 'local'); CREATE TABLE linked_service ( service_id SERIAL NOT NULL, Loading Loading @@ -40,10 +40,8 @@ CREATE TABLE location ( CREATE TABLE node ( node_id BIGSERIAL NOT NULL, parent_path LTREE default NULL, parent_relative_path LTREE default NULL, fs_path VARCHAR default NULL, name VARCHAR NOT NULL, os_name VARCHAR default NULL, tstamp_wrapper_dir VARCHAR default NULL, type NodeType NOT NULL, location_id SMALLINT default NULL, Loading Loading @@ -81,10 +79,8 @@ CREATE INDEX file_name_idx ON node USING btree(name); CREATE TABLE deleted_node ( node_id BIGSERIAL NOT NULL, parent_path LTREE default NULL, parent_relative_path LTREE default NULL, fs_path VARCHAR default NULL, name VARCHAR NOT NULL, os_name VARCHAR default NULL, tstamp_wrapper_dir VARCHAR default NULL, type NodeType NOT NULL, location_id SMALLINT default NULL, Loading 01-paths-indexes.sql +1 −4 Original line number Diff line number Diff line Loading @@ -33,11 +33,8 @@ ALTER TABLE node ADD COLUMN path ltree GENERATED ALWAYS AS (path(parent_path, no CREATE INDEX file_path_gist_idx ON node USING GIST(path); CREATE UNIQUE INDEX file_path_idx ON node USING btree(path); ALTER TABLE node ADD COLUMN relative_path ltree GENERATED ALWAYS AS (path(parent_relative_path, node_id)) STORED; CREATE INDEX file_rel_path_gist_idx ON node USING GIST(relative_path); ALTER TABLE node ADD CONSTRAINT unique_path UNIQUE (parent_path, name); ALTER TABLE node ADD CONSTRAINT fk_parent_path FOREIGN KEY (parent_path) REFERENCES node(path); -- Create root node INSERT INTO node (parent_path, parent_relative_path, name, type, creator_id, is_public) VALUES (NULL, NULL, '', 'container', '0', true); INSERT INTO node (parent_path, name, type, creator_id, is_public) VALUES (NULL, '', 'container', '0', true); 02-views.sql +1 −26 Original line number Diff line number Diff line Loading @@ -4,21 +4,6 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -- View that maps node_id to os_path (relative path of file on disk) CREATE VIEW node_os_path AS WITH RECURSIVE r_os_path AS ( SELECT node_id, relative_path, COALESCE(os_name, name) AS os_path FROM node WHERE name = '' UNION ALL SELECT n.node_id, n.relative_path, p.os_path || '/' || COALESCE(os_name, name) FROM node n JOIN r_os_path p ON p.relative_path = n.parent_relative_path WHERE n.parent_relative_path IS NOT NULL ) SELECT node_id, (CASE WHEN os_path = '' THEN '/' ELSE os_path END) AS os_path FROM r_os_path; -- View that maps node_id to vos_path (path in VOSpace) CREATE VIEW node_vos_path AS Loading @@ -32,13 +17,3 @@ WITH RECURSIVE r_vos_path AS ( JOIN r_vos_path p ON p.path = n.parent_path ) SELECT node_id, (CASE WHEN path = '' THEN '/' ELSE vos_path END) AS vos_path FROM r_vos_path; No newline at end of file -- View that combines the two previous views to obtain the os_path from the vos_path and vice versa CREATE VIEW node_path AS SELECT v.node_id, vos_path, os_path FROM node_vos_path v LEFT JOIN node_os_path o ON o.node_id = v.node_id; -- Example query to obtain the the ltree_path from the os_path: -- SELECT path FROM node n JOIN node_os_path o ON n.node_id = o.node_id WHERE os_path = '/curban/store'; 03-other-functions.sql +0 −18 Original line number Diff line number Diff line Loading @@ -52,24 +52,6 @@ SELECT string_agg(name, '/') FROM ( ) AS names $func$ LANGUAGE sql; -- Returns os_path from node_id CREATE OR REPLACE FUNCTION get_os_path(input_id BIGINT) RETURNS VARCHAR AS $func$ SELECT '/' || string_agg(name, '/') FROM ( WITH RECURSIVE paths AS ( SELECT node_id, COALESCE(os_name, name) AS name, relative_path, parent_relative_path, 1 AS level FROM node WHERE node_id = input_id UNION ALL SELECT f.node_id, COALESCE(f.os_name, f.name) AS name, f.relative_path, f.parent_relative_path, p.level + 1 FROM node f INNER JOIN paths p ON p.parent_relative_path = f.relative_path WHERE f.parent_relative_path IS NOT NULL ) SELECT name FROM paths ORDER BY LEVEL DESC ) AS names $func$ LANGUAGE sql; -- Trigger function that automatically updates start time and end time of jobs at phase update. -- This could be performed by business logic of each application that handles jobs but relying directly on the database ensures a better uniformity. Loading Loading
00-tables.sql +2 −6 Original line number Diff line number Diff line Loading @@ -8,8 +8,8 @@ CREATE EXTENSION IF NOT EXISTS ltree; CREATE TYPE NodeType AS ENUM ('container', 'data', 'link', 'structured'); CREATE TYPE LocationType AS ENUM ('async', 'portal', 'user'); CREATE TYPE StorageType AS ENUM ('cold', 'hot', 'local', 'portal'); CREATE TYPE LocationType AS ENUM ('async', 'user'); CREATE TYPE StorageType AS ENUM ('cold', 'hot', 'local'); CREATE TABLE linked_service ( service_id SERIAL NOT NULL, Loading Loading @@ -40,10 +40,8 @@ CREATE TABLE location ( CREATE TABLE node ( node_id BIGSERIAL NOT NULL, parent_path LTREE default NULL, parent_relative_path LTREE default NULL, fs_path VARCHAR default NULL, name VARCHAR NOT NULL, os_name VARCHAR default NULL, tstamp_wrapper_dir VARCHAR default NULL, type NodeType NOT NULL, location_id SMALLINT default NULL, Loading Loading @@ -81,10 +79,8 @@ CREATE INDEX file_name_idx ON node USING btree(name); CREATE TABLE deleted_node ( node_id BIGSERIAL NOT NULL, parent_path LTREE default NULL, parent_relative_path LTREE default NULL, fs_path VARCHAR default NULL, name VARCHAR NOT NULL, os_name VARCHAR default NULL, tstamp_wrapper_dir VARCHAR default NULL, type NodeType NOT NULL, location_id SMALLINT default NULL, Loading
01-paths-indexes.sql +1 −4 Original line number Diff line number Diff line Loading @@ -33,11 +33,8 @@ ALTER TABLE node ADD COLUMN path ltree GENERATED ALWAYS AS (path(parent_path, no CREATE INDEX file_path_gist_idx ON node USING GIST(path); CREATE UNIQUE INDEX file_path_idx ON node USING btree(path); ALTER TABLE node ADD COLUMN relative_path ltree GENERATED ALWAYS AS (path(parent_relative_path, node_id)) STORED; CREATE INDEX file_rel_path_gist_idx ON node USING GIST(relative_path); ALTER TABLE node ADD CONSTRAINT unique_path UNIQUE (parent_path, name); ALTER TABLE node ADD CONSTRAINT fk_parent_path FOREIGN KEY (parent_path) REFERENCES node(path); -- Create root node INSERT INTO node (parent_path, parent_relative_path, name, type, creator_id, is_public) VALUES (NULL, NULL, '', 'container', '0', true); INSERT INTO node (parent_path, name, type, creator_id, is_public) VALUES (NULL, '', 'container', '0', true);
02-views.sql +1 −26 Original line number Diff line number Diff line Loading @@ -4,21 +4,6 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -- View that maps node_id to os_path (relative path of file on disk) CREATE VIEW node_os_path AS WITH RECURSIVE r_os_path AS ( SELECT node_id, relative_path, COALESCE(os_name, name) AS os_path FROM node WHERE name = '' UNION ALL SELECT n.node_id, n.relative_path, p.os_path || '/' || COALESCE(os_name, name) FROM node n JOIN r_os_path p ON p.relative_path = n.parent_relative_path WHERE n.parent_relative_path IS NOT NULL ) SELECT node_id, (CASE WHEN os_path = '' THEN '/' ELSE os_path END) AS os_path FROM r_os_path; -- View that maps node_id to vos_path (path in VOSpace) CREATE VIEW node_vos_path AS Loading @@ -32,13 +17,3 @@ WITH RECURSIVE r_vos_path AS ( JOIN r_vos_path p ON p.path = n.parent_path ) SELECT node_id, (CASE WHEN path = '' THEN '/' ELSE vos_path END) AS vos_path FROM r_vos_path; No newline at end of file -- View that combines the two previous views to obtain the os_path from the vos_path and vice versa CREATE VIEW node_path AS SELECT v.node_id, vos_path, os_path FROM node_vos_path v LEFT JOIN node_os_path o ON o.node_id = v.node_id; -- Example query to obtain the the ltree_path from the os_path: -- SELECT path FROM node n JOIN node_os_path o ON n.node_id = o.node_id WHERE os_path = '/curban/store';
03-other-functions.sql +0 −18 Original line number Diff line number Diff line Loading @@ -52,24 +52,6 @@ SELECT string_agg(name, '/') FROM ( ) AS names $func$ LANGUAGE sql; -- Returns os_path from node_id CREATE OR REPLACE FUNCTION get_os_path(input_id BIGINT) RETURNS VARCHAR AS $func$ SELECT '/' || string_agg(name, '/') FROM ( WITH RECURSIVE paths AS ( SELECT node_id, COALESCE(os_name, name) AS name, relative_path, parent_relative_path, 1 AS level FROM node WHERE node_id = input_id UNION ALL SELECT f.node_id, COALESCE(f.os_name, f.name) AS name, f.relative_path, f.parent_relative_path, p.level + 1 FROM node f INNER JOIN paths p ON p.parent_relative_path = f.relative_path WHERE f.parent_relative_path IS NOT NULL ) SELECT name FROM paths ORDER BY LEVEL DESC ) AS names $func$ LANGUAGE sql; -- Trigger function that automatically updates start time and end time of jobs at phase update. -- This could be performed by business logic of each application that handles jobs but relying directly on the database ensures a better uniformity. Loading