Loading src/main/java/it/inaf/oats/vospace/persistence/LocationDAO.java +4 −5 Original line number Diff line number Diff line Loading @@ -49,14 +49,13 @@ public class LocationDAO { public Optional<Location> getNodeLocation(String vosPath) { String sql = "SELECT location_id, location_type, storage_src_id, storage_dest_id,\n" String sql = "SELECT l.location_id, location_type, storage_src_id, storage_dest_id,\n" + "storage_id, storage_type, base_path, base_url, hostname\n" + "FROM location l\n" + "JOIN storage s ON l.storage_src_id = s.storage_id OR l.storage_dest_id = s.storage_id\n" + "WHERE location_id = (\n" + "SELECT location_id FROM node n\n" + "JOIN node_vos_path p ON n.node_id = p.node_id\n" + "WHERE p.vos_path = ?)"; + "JOIN node n ON n.location_id = l.location_id\n" + "WHERE n.node_id = id_from_vos_path(?)\n" + "AND storage_type <> 'cold'"; return jdbcTemplate.query(sql, ps -> { ps.setString(1, vosPath); Loading src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +27 −54 Original line number Diff line number Diff line Loading @@ -54,17 +54,12 @@ public class NodeDAO { public void createNode(Node myNode) { String nodeURI = myNode.getUri(); String path = nodeURI.replaceAll("vos://[^/]+", ""); String parentPath = NodeUtils.getParentPath(path); List<NodePaths> paths = getNodePathsFromDB(nodeURI); if (paths.isEmpty()) { throw new IllegalStateException("Unable to find parent node during node creation"); } if (paths.size() > 1) { throw new IllegalStateException("Multiple ltree parent paths found for " + parentPath); } StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO node"); Loading @@ -81,8 +76,8 @@ public class NodeDAO { ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getStandardNodePropertyByName(myNode, "groupread"))); ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getStandardNodePropertyByName(myNode, "groupwrite"))); ps.setBoolean(++i, Boolean.valueOf(NodeProperties.getStandardNodePropertyByName(myNode, "publicread"))); ps.setObject(++i, paths.get(0).path, Types.OTHER); ps.setObject(++i, paths.get(0).relativePath, Types.OTHER); ps.setObject(++i, paths.get(0).getPath(), Types.OTHER); ps.setObject(++i, paths.get(0).getRelativePath(), Types.OTHER); ps.setObject(++i, NodeUtils.getDbNodeType(myNode), Types.OTHER); ps.setObject(++i, fromViewsToArray(ps, myNode, d -> d.getAccepts()), Types.OTHER); ps.setObject(++i, fromViewsToArray(ps, myNode, d -> d.getProvides()), Types.OTHER); Loading Loading @@ -142,17 +137,16 @@ public class NodeDAO { String vosPath = NodeUtils.getVosPath(newNode); StringBuilder sb = new StringBuilder(); sb.append("UPDATE node"); sb.append(" SET group_read = ?, group_write = ?, is_public = ? "); sb.append(" FROM node_vos_path p WHERE p.vos_path = ? AND p.node_id = node.node_id "); if (recursive) { updatePermissionsRecursively(newNode, vosPath); } else { jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sb.toString()); String sql = "UPDATE node\n" + "SET group_read = ?, group_write = ?, is_public = ?" + "WHERE node_id = id_from_vos_path(?)\n"; PreparedStatement ps = conn.prepareStatement(sql); int i = 0; ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.GROUP_READ_URI))); ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.GROUP_WRITE_URI))); Loading @@ -165,16 +159,6 @@ public class NodeDAO { return newNode; } private String getAllLevelsChildrenSelector(String path) { String select = "(SELECT path FROM node WHERE node_id = (SELECT node_id FROM node_vos_path WHERE vos_path = ?))::varchar || '"; if (!"/".equals(path)) { select += "."; } select += "*{1,}'"; return select; } private Node getNodeFromResultSet(ResultSet rs) throws SQLException { Node node = NodeUtils.getTypedNode(rs.getString("type")); Loading Loading @@ -421,29 +405,26 @@ public class NodeDAO { String deleteSql = "DELETE \n" + "FROM node n\n" + "USING node_vos_path os\n" + "WHERE n.node_id = os.node_id AND\n" + "(n.path ~ (" + getAllLevelsChildrenSelector(path) + ")::lquery\n" + "OR os.vos_path = ?) RETURNING\n" + "n.node_id, parent_path, parent_relative_path, " + "name, os_name, tstamp_wrapper_dir, type, location_id, format, " + "async_trans, busy_state, creator_id, group_read, " + "group_write, is_public, delta, content_type, content_encoding, " + "content_length, content_md5, created_on, last_modified, " + "accept_views, provide_views, protocols, sticky\n"; + "USING node p\n" + "WHERE n.path <@ p.path AND p.node_id = id_from_vos_path(?)\n" + "RETURNING\n" + "n.node_id, n.parent_path, n.parent_relative_path, " + "n.name, n.os_name, n.tstamp_wrapper_dir, n.type, n.location_id, n.format, " + "n.async_trans, n.busy_state, n.creator_id, n.group_read, " + "n.group_write, n.is_public, n.delta, n.content_type, n.content_encoding, " + "n.content_length, n.content_md5, n.created_on, n.last_modified, " + "n.accept_views, n.provide_views, n.protocols, n.sticky\n"; String withSql = "WITH del AS (" + deleteSql + ")"; String sql = withSql + insertSql + "SELECT * FROM del\n"; jdbcTemplate.update(sql, path, path); jdbcTemplate.update(sql, path); } // utility method for deleteNode public int countNodesWithPath(String path) { String sql = "SELECT COUNT(*) from " + "node_vos_path p " + "where p.vos_path = ?"; String sql = "SELECT COUNT(*) FROM node WHERE node_id = id_from_vos_path(?)"; Object[] args = {path}; int[] types = {Types.VARCHAR}; Loading @@ -453,10 +434,9 @@ public class NodeDAO { public String getNodeOsName(String vosPath) { String sql = "SELECT \n" + "(CASE WHEN os_name IS NOT NULL THEN os_name ELSE name END) AS os_name\n" + "COALESCE(os_name, name) AS os_name\n" + "FROM node n\n" + "JOIN node_vos_path p ON n.node_id = p.node_id\n" + "WHERE p.vos_path = ?"; + "WHERE node_id = id_from_vos_path(?)"; Object[] args = {vosPath}; int[] types = {Types.VARCHAR}; Loading @@ -466,8 +446,7 @@ public class NodeDAO { public void setNodeLocation(String vosPath, int locationId, String nodeOsName) { String sql = "UPDATE node SET location_id = ?, os_name = ? WHERE node_id = " + "(SELECT node_id FROM node_vos_path WHERE vos_path = ?)"; String sql = "UPDATE node SET location_id = ?, os_name = ? WHERE node_id = id_from_vos_path(?)"; int updated = jdbcTemplate.update(sql, ps -> { ps.setInt(1, locationId); Loading Loading @@ -598,13 +577,12 @@ public class NodeDAO { Set<String> groupWriteToAdd = differenceBetweenSets(newGroupWrite, existingGroupWrite); Set<String> groupWriteToRemove = differenceBetweenSets(existingGroupWrite, newGroupWrite); String sql = "UPDATE node SET " + "group_read = update_array(group_read, ?, ?), " + "group_write = update_array(group_write, ?, ?), " String sql = "UPDATE node c SET " + "group_read = update_array(c.group_read, ?, ?), " + "group_write = update_array(c.group_write, ?, ?), " + "is_public = ? " + "WHERE path <@ (SELECT path FROM node n " + "JOIN node_vos_path p ON n.node_id = p.node_id " + "AND p.vos_path = ?)"; + "FROM node n " + "WHERE n.node_id = id_from_vos_path(?) AND c.path <@ n.path"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); Loading Loading @@ -659,11 +637,6 @@ public class NodeDAO { this.relativePath = myRelativePath; } @Override public String toString() { return relativePath + " " + path; } public String getPath() { return this.path; } Loading src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -332,6 +332,12 @@ public class NodeDAOTest { checkGroups(NodeProperties.getNodePropertyAsListByURI(child2, NodeProperties.GROUP_WRITE_URI), "group6"); } @Test public void testGetNodeOsName() { assertEquals("f2", dao.getNodeOsName("/test1/f1/f2_renamed")); assertEquals("f4", dao.getNodeOsName("/test2/f4")); } private Property getProperty(String uri, String value) { Property property = new Property(); property.setUri(uri); Loading Loading
src/main/java/it/inaf/oats/vospace/persistence/LocationDAO.java +4 −5 Original line number Diff line number Diff line Loading @@ -49,14 +49,13 @@ public class LocationDAO { public Optional<Location> getNodeLocation(String vosPath) { String sql = "SELECT location_id, location_type, storage_src_id, storage_dest_id,\n" String sql = "SELECT l.location_id, location_type, storage_src_id, storage_dest_id,\n" + "storage_id, storage_type, base_path, base_url, hostname\n" + "FROM location l\n" + "JOIN storage s ON l.storage_src_id = s.storage_id OR l.storage_dest_id = s.storage_id\n" + "WHERE location_id = (\n" + "SELECT location_id FROM node n\n" + "JOIN node_vos_path p ON n.node_id = p.node_id\n" + "WHERE p.vos_path = ?)"; + "JOIN node n ON n.location_id = l.location_id\n" + "WHERE n.node_id = id_from_vos_path(?)\n" + "AND storage_type <> 'cold'"; return jdbcTemplate.query(sql, ps -> { ps.setString(1, vosPath); Loading
src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +27 −54 Original line number Diff line number Diff line Loading @@ -54,17 +54,12 @@ public class NodeDAO { public void createNode(Node myNode) { String nodeURI = myNode.getUri(); String path = nodeURI.replaceAll("vos://[^/]+", ""); String parentPath = NodeUtils.getParentPath(path); List<NodePaths> paths = getNodePathsFromDB(nodeURI); if (paths.isEmpty()) { throw new IllegalStateException("Unable to find parent node during node creation"); } if (paths.size() > 1) { throw new IllegalStateException("Multiple ltree parent paths found for " + parentPath); } StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO node"); Loading @@ -81,8 +76,8 @@ public class NodeDAO { ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getStandardNodePropertyByName(myNode, "groupread"))); ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getStandardNodePropertyByName(myNode, "groupwrite"))); ps.setBoolean(++i, Boolean.valueOf(NodeProperties.getStandardNodePropertyByName(myNode, "publicread"))); ps.setObject(++i, paths.get(0).path, Types.OTHER); ps.setObject(++i, paths.get(0).relativePath, Types.OTHER); ps.setObject(++i, paths.get(0).getPath(), Types.OTHER); ps.setObject(++i, paths.get(0).getRelativePath(), Types.OTHER); ps.setObject(++i, NodeUtils.getDbNodeType(myNode), Types.OTHER); ps.setObject(++i, fromViewsToArray(ps, myNode, d -> d.getAccepts()), Types.OTHER); ps.setObject(++i, fromViewsToArray(ps, myNode, d -> d.getProvides()), Types.OTHER); Loading Loading @@ -142,17 +137,16 @@ public class NodeDAO { String vosPath = NodeUtils.getVosPath(newNode); StringBuilder sb = new StringBuilder(); sb.append("UPDATE node"); sb.append(" SET group_read = ?, group_write = ?, is_public = ? "); sb.append(" FROM node_vos_path p WHERE p.vos_path = ? AND p.node_id = node.node_id "); if (recursive) { updatePermissionsRecursively(newNode, vosPath); } else { jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sb.toString()); String sql = "UPDATE node\n" + "SET group_read = ?, group_write = ?, is_public = ?" + "WHERE node_id = id_from_vos_path(?)\n"; PreparedStatement ps = conn.prepareStatement(sql); int i = 0; ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.GROUP_READ_URI))); ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.GROUP_WRITE_URI))); Loading @@ -165,16 +159,6 @@ public class NodeDAO { return newNode; } private String getAllLevelsChildrenSelector(String path) { String select = "(SELECT path FROM node WHERE node_id = (SELECT node_id FROM node_vos_path WHERE vos_path = ?))::varchar || '"; if (!"/".equals(path)) { select += "."; } select += "*{1,}'"; return select; } private Node getNodeFromResultSet(ResultSet rs) throws SQLException { Node node = NodeUtils.getTypedNode(rs.getString("type")); Loading Loading @@ -421,29 +405,26 @@ public class NodeDAO { String deleteSql = "DELETE \n" + "FROM node n\n" + "USING node_vos_path os\n" + "WHERE n.node_id = os.node_id AND\n" + "(n.path ~ (" + getAllLevelsChildrenSelector(path) + ")::lquery\n" + "OR os.vos_path = ?) RETURNING\n" + "n.node_id, parent_path, parent_relative_path, " + "name, os_name, tstamp_wrapper_dir, type, location_id, format, " + "async_trans, busy_state, creator_id, group_read, " + "group_write, is_public, delta, content_type, content_encoding, " + "content_length, content_md5, created_on, last_modified, " + "accept_views, provide_views, protocols, sticky\n"; + "USING node p\n" + "WHERE n.path <@ p.path AND p.node_id = id_from_vos_path(?)\n" + "RETURNING\n" + "n.node_id, n.parent_path, n.parent_relative_path, " + "n.name, n.os_name, n.tstamp_wrapper_dir, n.type, n.location_id, n.format, " + "n.async_trans, n.busy_state, n.creator_id, n.group_read, " + "n.group_write, n.is_public, n.delta, n.content_type, n.content_encoding, " + "n.content_length, n.content_md5, n.created_on, n.last_modified, " + "n.accept_views, n.provide_views, n.protocols, n.sticky\n"; String withSql = "WITH del AS (" + deleteSql + ")"; String sql = withSql + insertSql + "SELECT * FROM del\n"; jdbcTemplate.update(sql, path, path); jdbcTemplate.update(sql, path); } // utility method for deleteNode public int countNodesWithPath(String path) { String sql = "SELECT COUNT(*) from " + "node_vos_path p " + "where p.vos_path = ?"; String sql = "SELECT COUNT(*) FROM node WHERE node_id = id_from_vos_path(?)"; Object[] args = {path}; int[] types = {Types.VARCHAR}; Loading @@ -453,10 +434,9 @@ public class NodeDAO { public String getNodeOsName(String vosPath) { String sql = "SELECT \n" + "(CASE WHEN os_name IS NOT NULL THEN os_name ELSE name END) AS os_name\n" + "COALESCE(os_name, name) AS os_name\n" + "FROM node n\n" + "JOIN node_vos_path p ON n.node_id = p.node_id\n" + "WHERE p.vos_path = ?"; + "WHERE node_id = id_from_vos_path(?)"; Object[] args = {vosPath}; int[] types = {Types.VARCHAR}; Loading @@ -466,8 +446,7 @@ public class NodeDAO { public void setNodeLocation(String vosPath, int locationId, String nodeOsName) { String sql = "UPDATE node SET location_id = ?, os_name = ? WHERE node_id = " + "(SELECT node_id FROM node_vos_path WHERE vos_path = ?)"; String sql = "UPDATE node SET location_id = ?, os_name = ? WHERE node_id = id_from_vos_path(?)"; int updated = jdbcTemplate.update(sql, ps -> { ps.setInt(1, locationId); Loading Loading @@ -598,13 +577,12 @@ public class NodeDAO { Set<String> groupWriteToAdd = differenceBetweenSets(newGroupWrite, existingGroupWrite); Set<String> groupWriteToRemove = differenceBetweenSets(existingGroupWrite, newGroupWrite); String sql = "UPDATE node SET " + "group_read = update_array(group_read, ?, ?), " + "group_write = update_array(group_write, ?, ?), " String sql = "UPDATE node c SET " + "group_read = update_array(c.group_read, ?, ?), " + "group_write = update_array(c.group_write, ?, ?), " + "is_public = ? " + "WHERE path <@ (SELECT path FROM node n " + "JOIN node_vos_path p ON n.node_id = p.node_id " + "AND p.vos_path = ?)"; + "FROM node n " + "WHERE n.node_id = id_from_vos_path(?) AND c.path <@ n.path"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); Loading Loading @@ -659,11 +637,6 @@ public class NodeDAO { this.relativePath = myRelativePath; } @Override public String toString() { return relativePath + " " + path; } public String getPath() { return this.path; } Loading
src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -332,6 +332,12 @@ public class NodeDAOTest { checkGroups(NodeProperties.getNodePropertyAsListByURI(child2, NodeProperties.GROUP_WRITE_URI), "group6"); } @Test public void testGetNodeOsName() { assertEquals("f2", dao.getNodeOsName("/test1/f1/f2_renamed")); assertEquals("f4", dao.getNodeOsName("/test2/f4")); } private Property getProperty(String uri, String value) { Property property = new Property(); property.setUri(uri); Loading