From 2b0028604f839be19c405f9fbadb6bae0e657971 Mon Sep 17 00:00:00 2001 From: Sonia Zorba <sonia.zorba@inaf.it> Date: Tue, 14 Sep 2021 17:37:56 +0200 Subject: [PATCH] Optimized some queries (tested with 10M+ nodes) --- .../oats/vospace/persistence/NodeDAO.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java index 44ac713..38137e6 100644 --- a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +++ b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java @@ -106,7 +106,7 @@ public class NodeDAO { + "c.type, c.async_trans, c.sticky, c.job_id IS NOT NULL AS busy_state, c.creator_id, c.group_read, c.group_write,\n" + "c.is_public, c.content_length, c.created_on, c.last_modified, c.accept_views, c.provide_views, c.quota, c.content_md5, c.target\n" + "FROM node n\n" - + "JOIN node c ON c.path ~ (n.path::varchar || ? || '*{1}')::lquery OR c.path = n.path\n" + + "JOIN node c ON c.parent_path = n.path OR c.path = n.path\n" + "WHERE n.node_id = id_from_vos_path(?)\n" + "ORDER BY vos_path"; @@ -116,7 +116,6 @@ public class NodeDAO { ps.setString(++i, path); ps.setString(++i, path); ps.setString(++i, "/".equals(path) ? "" : "/"); - ps.setString(++i, "/".equals(path) ? "" : "."); ps.setString(++i, path); return ps; }, (row, index) -> { @@ -174,7 +173,7 @@ public class NodeDAO { boolean isLinkNode = newNode instanceof LinkNode; // If is link ignore recursive: LinkNodes are supposed to be childless - if (recursive && !isLinkNode) { + if (recursive && !isLinkNode) { updatePermissionsRecursively(newNode, vosPath); } else { jdbcTemplate.update(conn -> { @@ -185,7 +184,7 @@ public class NodeDAO { if (isLinkNode) { sql += ", target = ?\n"; } - + sql += "WHERE node_id = id_from_vos_path(?)\n"; PreparedStatement ps = conn.prepareStatement(sql); @@ -317,8 +316,8 @@ public class NodeDAO { } public void renameNode(Long nodeId, String name) { - String sql = "UPDATE node SET name = ?\n, os_name = COALESCE(os_name, name)" - + "WHERE path ~ ('*.' || ?)::lquery"; + String sql = "UPDATE node SET name = ?, os_name = COALESCE(os_name, name) " + + "WHERE node_id = ?"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); @@ -345,7 +344,7 @@ public class NodeDAO { return ps; }); } - + public void copyBranch(String sourceVosPath, String destVosPath) { String destVosParentPath = NodeUtils.getParentPath(destVosPath); @@ -392,14 +391,14 @@ public class NodeDAO { + "copied_nodes_paths AS (" + cteCopiedNodesPaths + ")\n" + parentSelect; - + jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, destVosParentPath); ps.setString(2, destName); ps.setString(3, sourceVosPath); return ps; - }); + }); } public boolean isBranchBusy(long parentNodeId) { @@ -413,8 +412,10 @@ public class NodeDAO { } public void setBranchJobId(Long rootNodeId, String jobId) { - String sql = "UPDATE node SET job_id = ?\n" - + "WHERE path ~ ('*.' || ? || '.*')::lquery"; + String sql = "UPDATE node c SET job_id = ? " + + "FROM node r " + + "WHERE r.node_id = ? " + + "AND r.path @> c.path"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); -- GitLab