This is an automated email from the ASF dual-hosted git repository. zehnder pushed a commit to branch fork/dev in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit 85789e186a50f89acfa254f7c07658fb598eaf47 Merge: cd838be4b 830ba8f6f Author: Philipp Zehnder <[email protected]> AuthorDate: Wed Dec 20 18:05:34 2023 +0100 Merge remote-tracking branch 'origin/2300-redesign-fileapi-to-use-original-file-name-v2' into fork/dev streampipes-service-core/pom.xml | 6 + .../v095/DuplicateFilesRenameMigration.java | 124 ++++++++++++++++----- .../v095/DuplicateFilesRenameMigrationTest.java | 120 ++++++++++++++++++++ 3 files changed, 224 insertions(+), 26 deletions(-) diff --cc streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/DuplicateFilesRenameMigration.java index 3a2eca649,de17535c9..e5e1f7647 --- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/DuplicateFilesRenameMigration.java +++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/DuplicateFilesRenameMigration.java @@@ -33,34 -32,30 +32,32 @@@ public class DuplicateFilesRenameMigrat return true; } + // Starting from v0.95, StreamPipes will use file name as the unique identifier of files + // This migration renames all the files that have duplicate names to ensure uniqueness @Override public void executeMigration() { - var duplicateFiles = new HashMap<String, List<FileMetadata>>(); - var fileMetadataStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getFileMetadataStorage(); - for (var metadata : fileMetadataStorage - .getAllFileMetadataDescriptions()) { - var originalFilename = metadata.getOriginalFilename().toLowerCase(); - if (!duplicateFiles.containsKey(originalFilename)) { - duplicateFiles.put(originalFilename, new ArrayList<FileMetadata>()); - } - duplicateFiles.get(originalFilename).add(metadata); - } - - for (var metadataList : duplicateFiles.values()) { - for (var i = 1; i < metadataList.size(); ++i) { - var metadata = metadataList.get(i); - var oldOriginalFilename = metadata.getOriginalFilename(); - var indexBeforeFileType = oldOriginalFilename.lastIndexOf('.'); - var newOriginalFilename = - String.format("%s(%d)%s", oldOriginalFilename.substring(0, indexBeforeFileType), i + 1, - oldOriginalFilename.substring(indexBeforeFileType)); - metadata.setOriginalFilename(newOriginalFilename); - fileMetadataStorage.updateFileMetadata(metadata); - } - } + var fileMetadataStorage = StorageDispatcher.INSTANCE.getNoSqlStore() + .getFileMetadataStorage(); + + var filesToUpdate = getFilesToUpdate(fileMetadataStorage.getAllFileMetadataDescriptions()); + filesToUpdate.forEach(fileMetadata -> fileMetadataStorage.updateFileMetadata(fileMetadata)); + } + + + /** + * Takes the list of files and groups all files with the same name together. + * The result is a list for each file name that has more than one file associated with it. + */ + private List<List<FileMetadata>> getListsOfFilesWithSameName(List<FileMetadata> filesWithOldName) { + var duplicateFileMap = filesWithOldName.stream() + .collect( + Collectors.groupingBy(file -> file.getOriginalFilename() + .toLowerCase())); + return duplicateFileMap.values() + .stream() + .filter(files -> files.size() > 1) + .toList(); } @Override
