From 611eaa8beef0deb36a02b7dd9781473099e65a94 Mon Sep 17 00:00:00 2001 From: Sonia Zorba <sonia.zorba@inaf.it> Date: Thu, 27 May 2021 10:56:30 +0200 Subject: [PATCH] Improved view performance --- 02-views.sql | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/02-views.sql b/02-views.sql index b42ade7..0979a25 100644 --- a/02-views.sql +++ b/02-views.sql @@ -7,34 +7,21 @@ -- View that maps node_id to os_path (relative path of file on disk) CREATE VIEW node_os_path AS -SELECT node_id, '/' AS os_path FROM node WHERE path = '' -UNION -SELECT node_id, '/' || string_agg(name, '/') AS os_path -FROM ( - SELECT (CASE WHEN os_name IS NOT NULL THEN os_name ELSE name END) AS name, p.node_id - FROM node n - JOIN ( - SELECT UNNEST(string_to_array(relative_path::varchar, '.')) AS rel_id, node_id - FROM node - ) AS p ON n.node_id::varchar = p.rel_id - ORDER BY p.node_id, nlevel(n.path) -) AS j GROUP BY node_id; +SELECT n.node_id, '/' || STRING_AGG(j.name, '/' ORDER BY t.ord) AS os_path +FROM node n +JOIN REGEXP_SPLIT_TO_TABLE((CASE WHEN relative_path = '' THEN '1' ELSE '1.' || path::text END), '[.]') WITH ORDINALITY t(node_id, ord) ON true +JOIN node j ON j.node_id = t.node_id::int +WHERE j.relative_path IS NOT NULL AND j.relative_path <> '' +GROUP BY n.node_id; -- View that maps node_id to vos_path (path in VOSpace) CREATE VIEW node_vos_path AS -SELECT node_id, '/' AS vos_path FROM node WHERE path = '' -UNION -SELECT node_id, '/' || string_agg(name, '/') AS os_path -FROM ( - SELECT name, p.node_id - FROM node n - JOIN ( - SELECT UNNEST(string_to_array(path::varchar, '.')) AS rel_id, node_id - FROM node - ) AS p ON n.node_id::varchar = p.rel_id - ORDER BY p.node_id, nlevel(n.path) -) AS j GROUP BY node_id; +SELECT n.node_id, COALESCE(NULLIF(STRING_AGG(j.name, '/' ORDER BY t.ord), ''), '/') AS vos_path +FROM node n +JOIN REGEXP_SPLIT_TO_TABLE((CASE WHEN path = '' THEN '1' ELSE '1.' || path::text END), '[.]') WITH ORDINALITY t(node_id, ord) ON true +JOIN node j ON j.node_id = t.node_id::int +GROUP BY n.node_id; -- View that combines the two previous views to obtain the os_path from the vos_path and vice versa -- GitLab