Commit ec2ba33b authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Optimized queries

parent 3f7bd6f2
Loading
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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);
+27 −54
Original line number Diff line number Diff line
@@ -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");
@@ -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);
@@ -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)));
@@ -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"));
@@ -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};
@@ -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};
@@ -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);
@@ -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);
@@ -659,11 +637,6 @@ public class NodeDAO {
            this.relativePath = myRelativePath;
        }

        @Override
        public String toString() {
            return relativePath + " " + path;
        }

        public String getPath() {
            return this.path;
        }
+6 −0
Original line number Diff line number Diff line
@@ -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);