diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/ArchiveManagementAdministrationPlugin.java b/module-base/src/main/java/de/intranda/goobi/plugins/ArchiveManagementAdministrationPlugin.java index f7c8ac0..c72e761 100644 --- a/module-base/src/main/java/de/intranda/goobi/plugins/ArchiveManagementAdministrationPlugin.java +++ b/module-base/src/main/java/de/intranda/goobi/plugins/ArchiveManagementAdministrationPlugin.java @@ -1723,7 +1723,8 @@ public void moveNode() { destinationEntry.reOrderElements(); selectedEntry.updateHierarchy(); List nodesToUpdate = selectedEntry.getAllNodes(); - ArchiveManagementManager.saveNodes(recordGroup.getId(), nodesToUpdate); + + ArchiveManagementManager.updateNodeHierarchy(recordGroup.getId(), nodesToUpdate); setSelectedEntry(selectedEntry); displayMode = ""; @@ -1758,12 +1759,16 @@ public void moveNodeUp() { previousNode.setOrderNumber(currentOrderNumber); // save nodes - ArchiveManagementManager.saveNode(recordGroup.getId(), previousNode); - ArchiveManagementManager.saveNode(recordGroup.getId(), selectedEntry); + List nodes = new ArrayList<>(); + nodes.add(previousNode); + nodes.add(selectedEntry); + ArchiveManagementManager.updateNodeHierarchy(recordGroup.getId(), nodes); + selectedEntry.getParentNode().sortElements(); - selectedEntry.updateHierarchy(); - List nodesToUpdate = selectedEntry.getAllNodes(); - ArchiveManagementManager.saveNodes(recordGroup.getId(), nodesToUpdate); + selectedEntry.getParentNode().updateHierarchy(); + + List nodesToUpdate = selectedEntry.getParentNode().getAllNodes(); + ArchiveManagementManager.updateNodeHierarchy(recordGroup.getId(), nodesToUpdate); flatEntryList = null; @@ -1796,12 +1801,16 @@ public void moveNodeDown() { followingNode.setOrderNumber(currentOrderNumber); // save nodes - ArchiveManagementManager.saveNode(recordGroup.getId(), followingNode); - ArchiveManagementManager.saveNode(recordGroup.getId(), selectedEntry); + List nodes = new ArrayList<>(); + nodes.add(followingNode); + nodes.add(selectedEntry); + ArchiveManagementManager.updateNodeHierarchy(recordGroup.getId(), nodes); + selectedEntry.getParentNode().sortElements(); - selectedEntry.updateHierarchy(); - List nodesToUpdate = selectedEntry.getAllNodes(); - ArchiveManagementManager.saveNodes(recordGroup.getId(), nodesToUpdate); + selectedEntry.getParentNode().updateHierarchy(); + + List nodesToUpdate = selectedEntry.getParentNode().getAllNodes(); + ArchiveManagementManager.updateNodeHierarchy(recordGroup.getId(), nodesToUpdate); flatEntryList = null; } @@ -1826,9 +1835,6 @@ public void moveHierarchyDown() { // move node to prev. destinationEntry = previousNode; destinationEntry.setDisplayChildren(true); - destinationEntry.updateHierarchy(); - List nodesToUpdate = destinationEntry.getAllNodes(); - ArchiveManagementManager.saveNodes(recordGroup.getId(), nodesToUpdate); moveNode(); } @@ -1859,7 +1865,7 @@ public void moveHierarchyUp() { selectedEntry.getParentNode().reOrderElements(); selectedEntry.getParentNode().updateHierarchy(); List nodesToUpdate = selectedEntry.getParentNode().getAllNodes(); - ArchiveManagementManager.saveNodes(recordGroup.getId(), nodesToUpdate); + ArchiveManagementManager.updateNodeHierarchy(recordGroup.getId(), nodesToUpdate); } } @@ -2114,10 +2120,7 @@ private ProcessTitleGenerator prepareTitleGenerator(DocStruct docstruct) { ManipulationType manipulationType = null; // check for special types switch (comp.getType().toLowerCase()) { - case "camelcase": - case "camel_case": - case "camelcaselenghtlimited": - case "camel_case_lenght_limited": + case "camelcase", "camel_case", "camelcaselenghtlimited", "camel_case_lenght_limited": if (lengthLimit > 0) { manipulationType = ManipulationType.CAMEL_CASE_LENGTH_LIMITED; } else { @@ -2125,12 +2128,10 @@ private ProcessTitleGenerator prepareTitleGenerator(DocStruct docstruct) { } break; - case "afterlastseparator": - case "after_last_separator": + case "afterlastseparator", "after_last_separator": manipulationType = ManipulationType.AFTER_LAST_SEPARATOR; break; - case "beforefirstseparator": - case "before_first_separator": + case "beforefirstseparator", "before_first_separator": manipulationType = ManipulationType.BEFORE_FIRST_SEPARATOR; break; case "normal": diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/persistence/ArchiveManagementManager.java b/module-base/src/main/java/de/intranda/goobi/plugins/persistence/ArchiveManagementManager.java index aa67576..82e76fd 100644 --- a/module-base/src/main/java/de/intranda/goobi/plugins/persistence/ArchiveManagementManager.java +++ b/module-base/src/main/java/de/intranda/goobi/plugins/persistence/ArchiveManagementManager.java @@ -211,7 +211,7 @@ public static synchronized void saveNodes(Integer archiveId, List nod sql.append(values.toString()); sql.append("ON DUPLICATE KEY UPDATE hierarchy = VALUES(hierarchy), order_number = VALUES(order_number), " + "node_type = VALUES(node_type), sequence = VALUES(sequence), processtitle = VALUES(processtitle), " - + "processtitle = VALUES(processtitle), label = VALUES(label), data = VALUES(data)"); + + "processtitle = VALUES(processtitle), parent_id = VALUES(parent_id), label = VALUES(label), data = VALUES(data)"); try (Connection connection = MySQLHelper.getInstance().getConnection()) { QueryRunner run = new QueryRunner(); run.update(connection, sql.toString()); @@ -224,6 +224,50 @@ public static synchronized void saveNodes(Integer archiveId, List nod } } + public static void updateNodeHierarchy(Integer archiveId, List nodes) { + String insertSql = "INSERT INTO archive_record_node (id, hierarchy, order_number, sequence, parent_id) VALUES "; + + StringBuilder values = new StringBuilder(); + for (int i = 0; i < nodes.size(); i++) { + IEadEntry entry = nodes.get(i); + if (values.length() > 0) { + values.append(", "); + } + Integer parentId = null; + if (entry.getParentNode() != null) { + parentId = entry.getParentNode().getDatabaseId(); + } + + values.append("("); + values.append(entry.getDatabaseId()); + values.append(", "); + values.append(entry.getHierarchy()); + values.append(", "); + values.append(entry.getOrderNumber()); + values.append(", '"); + values.append(entry.getSequence()); + values.append("', "); + values.append(parentId); + values.append(")"); + // save every 50 records or when we reached the last one + if (i % 50 == 49 || i + 1 == nodes.size()) { + StringBuilder sql = new StringBuilder(insertSql); + sql.append(values.toString()); + sql.append( + "ON DUPLICATE KEY UPDATE hierarchy = VALUES(hierarchy), order_number = VALUES(order_number), sequence = VALUES(sequence), parent_id = VALUES(parent_id)"); + try (Connection connection = MySQLHelper.getInstance().getConnection()) { + QueryRunner run = new QueryRunner(); + run.update(connection, sql.toString()); + } catch (SQLException e) { + log.error(e); + } + // reset values + values = new StringBuilder(); + } + } + + } + public static IEadEntry loadRecordGroup(int recordGroupId) { try (Connection connection = MySQLHelper.getInstance().getConnection()) {