added counter for soft-deleted files in dossier-stats

This commit is contained in:
Timo Bejan 2021-11-19 09:30:08 +02:00
parent 0f2e04aedf
commit 2a1d89fa35
6 changed files with 39 additions and 37 deletions

View File

@ -17,6 +17,7 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.do
public class DossierStats {
private String dossierId;
private int numberOfFiles;
private int numberOfSoftDeletedFiles;
private int numberOfPages; // sum of pages
private int numberOfExcludedPages; // sum of excludedPages
private boolean hasRedactionsFilePresent; // true if at least one file in the dossier has redactions

View File

@ -3,7 +3,6 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.dossier
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -138,5 +137,12 @@ public class FileEntity {
@Column(updatable = false, insertable = false, name = "dossier_id")
private String dossierId;
public boolean isSoftDeleted() {
return deleted != null;
}
public boolean isDeleted() {
return deleted != null || hardDeletedTime != null || ProcessingStatus.DELETED.equals(processingStatus);
}
}

View File

@ -20,7 +20,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@Service
@ -106,8 +105,8 @@ public class FileStatusPersistenceService {
return;
}
fileRepository.setUpdateStatusIndexingSuccessful(fileId, ProcessingStatus.PROCESSED,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
@ -159,9 +158,10 @@ public class FileStatusPersistenceService {
fileAttributesRepository.deleteByFileId(fileId);
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
if (isFileDeleted(file)) {
if (file.isDeleted()) {
return;
}
var fileAttributeEntities = convertFileAttributes(dossierId, file, fileAttributes);
file.setLastFileAttributeChange(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
@ -176,9 +176,10 @@ public class FileStatusPersistenceService {
@Transactional
public void setExcludedPages(String fileId, Set<Integer> excludedPages) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
if (isFileDeleted(file)) {
if (file.isDeleted()) {
return;
}
file.setLastManualRedaction(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setExcludedPages(excludedPages);
@ -197,7 +198,7 @@ public class FileStatusPersistenceService {
public List<FileEntity> getActiveFiles(String dossierId) {
return fileRepository.findByDossierId(dossierId).stream().filter(f -> !isFileDeleted(f)).collect(Collectors.toList());
return fileRepository.findByDossierId(dossierId).stream().filter(f -> !f.isDeleted()).collect(Collectors.toList());
}
@ -217,7 +218,7 @@ public class FileStatusPersistenceService {
public void softDelete(String fileId, OffsetDateTime softDeletedTime) {
int countUpdate = fileRepository.setSoftDelete(fileId, ProcessingStatus.DELETED,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), softDeletedTime);
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), softDeletedTime);
if (countUpdate == 0) {
throw new NotFoundException("Unknown file=" + fileId);
}
@ -260,8 +261,8 @@ public class FileStatusPersistenceService {
return;
}
int updateCount = fileRepository.setCurrentReviewer(fileId, currentReviewer, lastReviewer,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
currentReviewer == null ? WorkflowStatus.UNASSIGNED : WorkflowStatus.UNDER_REVIEW);
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
currentReviewer == null ? WorkflowStatus.UNASSIGNED : WorkflowStatus.UNDER_REVIEW);
if (updateCount == 0) {
throw new NotFoundException("Unknown file=" + fileId);
}
@ -288,9 +289,9 @@ public class FileStatusPersistenceService {
});
int countUpdate = fileRepository.overwriteFile(fileId, filename, uploader, ProcessingStatus.FULLREPROCESS,
WorkflowStatus.UNASSIGNED,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
WorkflowStatus.UNASSIGNED,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
if (countUpdate == 0) {
throw new NotFoundException("Unknown file=" + fileId);
}
@ -317,28 +318,15 @@ public class FileStatusPersistenceService {
}
private boolean isFileDeleted(FileEntity file) {
if (file == null || file.getDeleted() != null || file.getHardDeletedTime() != null || ProcessingStatus.DELETED.equals(file.getProcessingStatus())) {
return true;
}
return false;
}
private boolean isFileDeleted(String fileId) {
AtomicBoolean isFileDeleted = new AtomicBoolean(false);
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
isFileDeleted.set(isFileDeleted(file));
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
return isFileDeleted.get();
return fileRepository.findById(fileId).map(FileEntity::isDeleted).orElse(false);
}
public boolean hasChangesSince(String dossierId, OffsetDateTime since) {
return fileRepository.existsByDossierIdAndLastUpdatedIsAfter(dossierId, since);
}
public int countSoftDeletedFiles(String dossierId) {
return fileRepository.countSoftDeletedFiles(dossierId);
}
}

View File

@ -117,6 +117,10 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
"where f.id = :fileId")
int overwriteFile(String fileId, String filename, String uploader, ProcessingStatus processingStatus,
WorkflowStatus workflowStatus, OffsetDateTime lastUploaded, OffsetDateTime lastUpdated);
@Query("select count(f) from FileEntity f where f.dossierId = :dossierId and f.deleted is not null and f.hardDeletedTime is null")
int countSoftDeletedFiles(String dossierId);
}

View File

@ -35,6 +35,7 @@ public class DossierStatsService {
// get the associated files
List<FileEntity> files = fileStatusService.getActiveFiles(dossierId);
dossierStats.setNumberOfFiles(files.size());
dossierStats.setNumberOfSoftDeletedFiles(fileStatusService.countSoftDeletedFiles(dossierId));
dossierStats.setNumberOfPages(files.stream().mapToInt(FileEntity::getNumberOfPages).sum());
dossierStats.setNumberOfExcludedPages(files.stream().mapToInt(f -> f.getExcludedPages().size()).sum());
files.stream().filter(FileEntity::isHasRedactions).findAny().ifPresent(

View File

@ -10,7 +10,6 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.UserNotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
@ -227,7 +226,7 @@ public class FileStatusService {
}
var fileAttributes = fileStatus.getFileAttributes();
var analyseRequest = AnalyzeRequest.builder()
.dossierId(dossierId)
.sectionsToReanalyse(sectionsToReanalyse)
@ -280,7 +279,7 @@ public class FileStatusService {
public void overwriteFile(String dossierId, String fileId, String uploader, String filename, int length) {
fileStatusPersistenceService.overwriteFile(fileId, uploader, filename);
wipeFileData(dossierId,fileId);
wipeFileData(dossierId, fileId);
setStatusFullReprocess(dossierId, fileId, length);
}
@ -291,8 +290,7 @@ public class FileStatusService {
}
public void wipeFileData(String dossierId, String fileId){
public void wipeFileData(String dossierId, String fileId) {
OffsetDateTime now = OffsetDateTime.now();
// remove everything related to redaction
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.REDACTION_LOG);
@ -350,6 +348,10 @@ public class FileStatusService {
}
public boolean hasChangesSince(String dossierId, OffsetDateTime since) {
return fileStatusPersistenceService.hasChangesSince(dossierId,since);
return fileStatusPersistenceService.hasChangesSince(dossierId, since);
}
public int countSoftDeletedFiles(String dossierId) {
return fileStatusPersistenceService.countSoftDeletedFiles(dossierId);
}
}