Skip to content
Snippets Groups Projects
Commit b1acafa1 authored by Sara Bertocco's avatar Sara Bertocco
Browse files
parents c4531a11 5b8aed9e
No related branches found
No related tags found
No related merge requests found
...@@ -146,6 +146,16 @@ public class NodeDAO { ...@@ -146,6 +146,16 @@ public class NodeDAO {
return select; return select;
} }
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 { private Node getNodeFromResultSet(ResultSet rs) throws SQLException {
Node node = getTypedNode(rs.getString("type")); Node node = getTypedNode(rs.getString("type"));
...@@ -191,6 +201,57 @@ public class NodeDAO { ...@@ -191,6 +201,57 @@ public class NodeDAO {
return node; return node;
} }
public void deleteNode(String path) {
int nodesWithPath = countNodesWithPath(path);
if (nodesWithPath == 0) {
throw new IllegalStateException("Node at path "
+ path + " not found");
}
if (nodesWithPath > 1) {
throw new IllegalStateException("Multiple nodes at path " + path);
}
String insertSql = "INSERT INTO deleted_node "
+ "(node_id, parent_path, parent_relative_path, "
+ "name, os_name, tstamp_wrapper_dir, type, location_id, format, "
+ "async_trans, busy_state, owner_id, 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)\n";
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, owner_id, 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\n";
String withSql = "WITH del AS ("+deleteSql+")";
String sql = withSql+insertSql+"SELECT * FROM del\n";
jdbcTemplate.update(sql, path, path);
}
// utility method for deleteNode
public int countNodesWithPath(String path) {
String sql = "SELECT COUNT(*) from "
+ "node_vos_path p "
+ "where p.vos_path = ?";
Object[] args = {path};
int[] types = {Types.VARCHAR};
return jdbcTemplate.queryForObject(sql, args, types, Integer.class);
}
private String getPropertyURI(String propertyName) { private String getPropertyURI(String propertyName) {
return "ivo://ivoa.net/vospace/core#".concat(propertyName); return "ivo://ivoa.net/vospace/core#".concat(propertyName);
} }
......
...@@ -9,6 +9,7 @@ import net.ivoa.xml.vospace.v2.Node; ...@@ -9,6 +9,7 @@ import net.ivoa.xml.vospace.v2.Node;
import net.ivoa.xml.vospace.v2.Property; import net.ivoa.xml.vospace.v2.Property;
import net.ivoa.xml.vospace.v2.View; import net.ivoa.xml.vospace.v2.View;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
...@@ -56,6 +57,35 @@ public class NodeDAOTest { ...@@ -56,6 +57,35 @@ public class NodeDAOTest {
assertEquals("group1 group2", getProperty(root.getNodes().get(0), "ivo://ivoa.net/vospace/core#groupread")); assertEquals("group1 group2", getProperty(root.getNodes().get(0), "ivo://ivoa.net/vospace/core#groupread"));
} }
@Test
public void testCountNodeWithPath() {
assertEquals(1, dao.countNodesWithPath("/"));
assertEquals(1, dao.countNodesWithPath("/test1"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test1/f1"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test1/f1/f2_renamed"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test1/f1/f2_renamed/f3"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test2"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test2/f4"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test2/f5"), "Test db has been changed");
assertEquals(0, dao.countNodesWithPath("/pippooo"), "Test db has been changed");
}
@Test
public void testDeleteNode() {
assertEquals(1, dao.countNodesWithPath("/test1/f1/f2_renamed/f3"), "Test db has been changed");
dao.deleteNode("/test1");
assertEquals(0, dao.countNodesWithPath("/test1"));
assertEquals(0, dao.countNodesWithPath("/test1/f1"));
assertEquals(0, dao.countNodesWithPath("/test1/f1/f2_renamed"));
assertEquals(0, dao.countNodesWithPath("/test1/f1/f2_renamed/f3"));
}
private String getProperty(Node node, String uri) { private String getProperty(Node node, String uri) {
for (Property property : node.getProperties()) { for (Property property : node.getProperties()) {
if (uri.equals(property.getUri())) { if (uri.equals(property.getUri())) {
......
DELETE FROM node; DELETE FROM node;
ALTER SEQUENCE node_node_id_seq RESTART WITH 1; ALTER SEQUENCE node_node_id_seq RESTART WITH 1;
INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id) VALUES (NULL, NULL, '', 'container', '0', '0'); INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, location_id) VALUES (NULL, NULL, '', 'container', '0', '0', 1);
INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, group_read, group_write) VALUES ('', NULL, 'test1', 'container', 'user1', 'user1', '{"group1","group2"}','{"group2"}'); -- /test1 INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, group_read, group_write, location_id) VALUES ('', NULL, 'test1', 'container', 'user1', 'user1', '{"group1","group2"}','{"group2"}', 1); -- /test1
INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id) VALUES ('2', '', 'f1', 'container', 'user1', 'user1'); -- /test1/f1 (rel: /f1) INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, location_id) VALUES ('2', '', 'f1', 'container', 'user1', 'user1', 1); -- /test1/f1 (rel: /f1)
INSERT INTO node (parent_path, parent_relative_path, name, os_name, type, owner_id, creator_id) VALUES ('2.3', '3', 'f2_renamed', 'f2', 'container', 'user1', 'user1'); -- /test1/f1/f2_renamed (rel: /f1/f2) INSERT INTO node (parent_path, parent_relative_path, name, os_name, type, owner_id, creator_id, location_id) VALUES ('2.3', '3', 'f2_renamed', 'f2', 'container', 'user1', 'user1', 1); -- /test1/f1/f2_renamed (rel: /f1/f2)
INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id) VALUES ('2.3.4', '3.4', 'f3', 'data', 'user1', 'user1'); -- /test1/f1/f2_renamed/f3 (rel: /f1/f2/f3) INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, location_id) VALUES ('2.3.4', '3.4', 'f3', 'data', 'user1', 'user1', 1); -- /test1/f1/f2_renamed/f3 (rel: /f1/f2/f3)
INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, is_public) VALUES ('', NULL, 'test2', 'container', 'user2', 'user2', true); -- /test2 INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, is_public, location_id) VALUES ('', NULL, 'test2', 'container', 'user2', 'user2', true, 1); -- /test2
INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, is_public) VALUES ('5', '', 'f4', 'container', 'user2', 'user2', true); -- /test2/f4 (rel: /f4) INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, is_public, location_id) VALUES ('6', '', 'f4', 'container', 'user2', 'user2', true, 1); -- /test2/f4 (rel: /f4)
INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, is_public) VALUES ('5', '', 'f5', 'container', 'user2', 'user2', true); -- /test2/f5 (rel: /f5) INSERT INTO node (parent_path, parent_relative_path, name, type, owner_id, creator_id, is_public, location_id) VALUES ('6', '', 'f5', 'container', 'user2', 'user2', true, 1); -- /test2/f5 (rel: /f5)
DELETE FROM job; DELETE FROM job;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment