From 0d3ab251a616bbf863d9eb853bc7acf182b4de00 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Mon, 7 Oct 2024 15:10:22 +0200 Subject: [PATCH 1/2] RED-10034 Dossier Stats backport --- .../DossierStatsFileProjection.java | 44 ++++++++ .../service/DossierStatsService.java | 104 +++++++++--------- .../processor/service/FileStatusService.java | 6 + .../FileStatusPersistenceService.java | 6 + .../repository/FileRepository.java | 4 + .../db/changelog/db.changelog-tenant.yaml | 4 +- .../tenant/145-add-indexes-to-file-table.yaml | 25 +++++ .../test/resources/testcontainers.properties | 2 +- .../v1/api/shared/model/DossierStats.java | 5 +- 9 files changed, 141 insertions(+), 59 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/projection/DossierStatsFileProjection.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/145-add-indexes-to-file-table.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/projection/DossierStatsFileProjection.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/projection/DossierStatsFileProjection.java new file mode 100644 index 000000000..51e96208e --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/projection/DossierStatsFileProjection.java @@ -0,0 +1,44 @@ +package com.iqser.red.service.persistence.management.v1.processor.entity.projection; + +import java.time.OffsetDateTime; +import java.util.Collection; +import java.util.Set; + +import com.iqser.red.service.persistence.management.v1.processor.utils.JSONIntegerSetConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import jakarta.persistence.Convert; + +public interface DossierStatsFileProjection { + + boolean isHasRedactions(); + + + boolean isHasHints(); + + + boolean isHasSuggestions(); + + + boolean isHasUpdates(); + + + ProcessingStatus getProcessingStatus(); + + + OffsetDateTime getLastUpdated(); + + + OffsetDateTime getFileManipulationDate(); + + + WorkflowStatus getWorkflowStatus(); + + + int getNumberOfPages(); + + + @Convert(converter = JSONIntegerSetConverter.class) + Set getExcludedPages(); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierStatsService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierStatsService.java index fb714df7f..e847bfa24 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierStatsService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierStatsService.java @@ -2,17 +2,17 @@ package com.iqser.red.service.persistence.management.v1.processor.service; import static com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException.DOSSIER_NOT_FOUND_MESSAGE; -import java.util.Comparator; +import java.util.EnumMap; import java.util.List; -import java.util.stream.Collectors; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.projection.DossierStatsFileProjection; import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStats; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; - +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -52,64 +52,58 @@ public class DossierStatsService { private DossierStats computeDossierStats(DossierEntity dossierEntity) { - var dossierId = dossierEntity.getId(); - - DossierStats dossierStats = new DossierStats(); + String dossierId = dossierEntity.getId(); if (dossierEntity.getHardDeletedTime() != null) { throw new DossierNotFoundException(DOSSIER_NOT_FOUND_MESSAGE); } - dossierStats.setDossierId(dossierId); - // get the associated files - List files = fileStatusService.getActiveFiles(dossierId); - dossierStats.setNumberOfFiles(files.size()); - dossierStats.setNumberOfSoftDeletedFiles(fileStatusService.countSoftDeletedFiles(dossierId)); - dossierStats.setNumberOfPages(files.stream() - .mapToInt(FileModel::getNumberOfPages).sum()); - dossierStats.setNumberOfExcludedPages(files.stream() - .mapToInt(f -> f.getExcludedPages().size()).sum()); - files.stream() - .filter(FileModel::isHasRedactions) - .findAny() - .ifPresent(v -> dossierStats.setHasRedactionsFilePresent(true)); - files.stream() - .filter(FileModel::isHasHints) - .filter(f -> !f.isHasRedactions()) - .findAny() - .ifPresent(v -> dossierStats.setHasHintsNoRedactionsFilePresent(true)); - files.stream() - .filter(FileModel::isHasSuggestions) - .findAny() - .ifPresent(v -> dossierStats.setHasSuggestionsFilePresent(true)); - files.stream() - .filter(FileModel::isHasUpdates) - .findAny() - .ifPresent(v -> dossierStats.setHasUpdatesFilePresent(true)); - files.stream() - .filter(f -> !f.isHasRedactions()) - .filter(f -> !f.isHasHints()) - .filter(f -> !f.isHasSuggestions()) - .filter(f -> !f.isHasUpdates()) - .findAny() - .ifPresent(v -> dossierStats.setHasNoFlagsFilePresent(true)); - var fileCountPerProcessingStatus = files.stream() - .collect(Collectors.toMap(FileModel::getProcessingStatus, e -> 1, Math::addExact)); - dossierStats.setFileCountPerProcessingStatus(fileCountPerProcessingStatus); + List files = fileStatusService.getDossierStatsFiles(dossierId); + int numberOfSoftDeletedFiles = fileStatusService.countSoftDeletedFiles(dossierId); - var fileCountPerWorkflowStatus = files.stream() - .collect(Collectors.toMap(FileModel::getWorkflowStatus, e -> 1, Math::addExact)); - dossierStats.setFileCountPerWorkflowStatus(fileCountPerWorkflowStatus); + DossierStats stats = DossierStats.builder() + .dossierId(dossierId) + .numberOfFiles(files.size()) + .numberOfSoftDeletedFiles(numberOfSoftDeletedFiles) + .fileCountPerProcessingStatus(new EnumMap<>(ProcessingStatus.class)) + .fileCountPerWorkflowStatus(new EnumMap<>(WorkflowStatus.class)) + .build(); - files.stream() - .sorted(Comparator.comparing(FileModel::getLastUpdated, Comparator.nullsLast(Comparator.reverseOrder()))) - .findFirst() - .ifPresent(file -> dossierStats.setLastFileUpdateDate(file.getLastUpdated())); - files.stream() - .sorted(Comparator.comparing(FileModel::getFileManipulationDate, Comparator.nullsLast(Comparator.reverseOrder()))) - .findFirst() - .ifPresent(file -> dossierStats.setFileManipulationDate(file.getFileManipulationDate())); - return dossierStats; + for (DossierStatsFileProjection file : files) { + stats.setNumberOfPages(stats.getNumberOfPages() + file.getNumberOfPages()); + stats.setNumberOfExcludedPages(stats.getNumberOfExcludedPages() + file.getExcludedPages().size()); + + if (file.isHasRedactions()) { + stats.setHasRedactionsFilePresent(true); + } + if (file.isHasHints() && !file.isHasRedactions()) { + stats.setHasHintsNoRedactionsFilePresent(true); + } + if (file.isHasSuggestions()) { + stats.setHasSuggestionsFilePresent(true); + } + if (file.isHasUpdates()) { + stats.setHasUpdatesFilePresent(true); + } + if (!file.isHasRedactions() && !file.isHasHints() && !file.isHasSuggestions() && !file.isHasUpdates()) { + stats.setHasNoFlagsFilePresent(true); + } + + stats.getFileCountPerProcessingStatus().merge(file.getProcessingStatus(), 1, Integer::sum); + stats.getFileCountPerWorkflowStatus().merge(file.getWorkflowStatus(), 1, Integer::sum); + + if (stats.getLastFileUpdateDate() == null || + (file.getLastUpdated() != null && file.getLastUpdated().isAfter(stats.getLastFileUpdateDate()))) { + stats.setLastFileUpdateDate(file.getLastUpdated()); + } + + if (stats.getFileManipulationDate() == null || + (file.getFileManipulationDate() != null && file.getFileManipulationDate().isAfter(stats.getFileManipulationDate()))) { + stats.setFileManipulationDate(file.getFileManipulationDate()); + } + } + + return stats; } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java index 7668cad92..668a63577 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java @@ -10,6 +10,7 @@ import java.util.Set; import java.util.stream.Collectors; import com.iqser.red.service.pdftron.redaction.v1.api.model.ApplicationType; +import com.iqser.red.service.persistence.management.v1.processor.entity.projection.DossierStatsFileProjection; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; @@ -132,6 +133,11 @@ public class FileStatusService { return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convertedList); } + public List getDossierStatsFiles(String dossierId) { + + return fileStatusPersistenceService.getFilesForDossierStats(dossierId); + } + @Transactional public List getDossierStatus(String dossierId) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java index 7ad1d4115..f2fab1734 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import com.iqser.red.service.persistence.management.v1.processor.entity.projection.DossierStatsFileProjection; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -427,6 +428,11 @@ public class FileStatusPersistenceService { .collect(Collectors.toList()); } + public List getFilesForDossierStats(String dossierId) { + + return fileRepository.findDossierStatsProjectionFileProjectionByDossierId(dossierId); + } + public List getAllRelevantErrorFiles() { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java index a961381ac..12e0dc1b4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java @@ -10,6 +10,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.projection.DossierStatsFileProjection; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FilePageCountsProjection; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FileProcessingStatusProjection; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FileWorkflowStatusProjection; @@ -412,6 +413,9 @@ public interface FileRepository extends JpaRepository { + "where f.id in (:fileIds)") int hardDeleteFiles(@Param("fileIds") List fileIds, @Param("processingStatus") ProcessingStatus processingStatus, @Param("deletionTime") OffsetDateTime deletionTime); + @Query("SELECT f FROM FileEntity f WHERE f.dossierId = :dossierId AND f.hardDeletedTime IS NULL AND f.deleted IS NULL") + List findDossierStatsProjectionFileProjectionByDossierId(@Param("dossierId") String dossierId); + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml index 7b88e0973..6f7f0ea9c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml @@ -220,4 +220,6 @@ databaseChangeLog: - include: file: db/changelog/tenant/143-modify-download-redaction-file-status-details.yaml - include: - file: db/changelog/tenant/144-add-error-code-to-file.yaml \ No newline at end of file + file: db/changelog/tenant/144-add-error-code-to-file.yaml + - include: + file: db/changelog/tenant/145-add-indexes-to-file-table.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/145-add-indexes-to-file-table.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/145-add-indexes-to-file-table.yaml new file mode 100644 index 000000000..23ec7f7f2 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/145-add-indexes-to-file-table.yaml @@ -0,0 +1,25 @@ +databaseChangeLog: + - changeSet: + id: add-indexes-to-file-table + author: timo + changes: + - createIndex: + columns: + - column: + name: dossier_id + - column: + name: last_updated + indexName: file_dossier_id_last_updated_idx + unique: false + tableName: file + - createIndex: + columns: + - column: + name: dossier_id + - column: + name: deleted + - column: + name: hard_deleted_time + indexName: file_dossier_id_deleted_hard_deleted_time_idx + unique: false + tableName: file diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/testcontainers.properties b/persistence-service-v1/persistence-service-server-v1/src/test/resources/testcontainers.properties index ee9bd06b8..ead058aa4 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/testcontainers.properties +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/testcontainers.properties @@ -1 +1 @@ -hub.image.name.prefix=docker-dev.knecon.com/tests/ \ No newline at end of file +hub.image.name.prefix=docker-dev.knecon.com/tests/ diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStats.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStats.java index 944525ae7..c5ebac9ec 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStats.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStats.java @@ -2,6 +2,7 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model; import java.io.Serializable; import java.time.OffsetDateTime; +import java.util.HashMap; import java.util.Map; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; @@ -41,9 +42,9 @@ public class DossierStats implements Serializable { @Schema(description = "True if at least one file in the dossier has none of the other flags") private boolean hasNoFlagsFilePresent; // true if at least one file in the dossier has none of the other flags @Schema(description = "Number of files in each processing status") - private Map fileCountPerProcessingStatus; + private Map fileCountPerProcessingStatus = new HashMap<>(); @Schema(description = "Number of files in each status") - private Map fileCountPerWorkflowStatus; + private Map fileCountPerWorkflowStatus = new HashMap<>(); @Schema(description = "The most recent file modification date") private OffsetDateTime lastFileUpdateDate; @Schema(description = "The most recent file manipulation date") From 34c18a11510b8e4ac4a66233e1172ae843b9f569 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Tue, 5 Nov 2024 14:27:19 +0200 Subject: [PATCH 2/2] RED-10392 backport indexes --- .../db/changelog/db.changelog-tenant.yaml | 2 + ...indexes-across-tables-for-performance.yaml | 220 ++++++++++++++++++ 2 files changed, 222 insertions(+) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/149-add-indexes-across-tables-for-performance.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml index 6f7f0ea9c..106582b67 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml @@ -223,3 +223,5 @@ databaseChangeLog: file: db/changelog/tenant/144-add-error-code-to-file.yaml - include: file: db/changelog/tenant/145-add-indexes-to-file-table.yaml + - include: + file: db/changelog/tenant/149-add-indexes-across-tables-for-performance.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/149-add-indexes-across-tables-for-performance.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/149-add-indexes-across-tables-for-performance.yaml new file mode 100644 index 000000000..40f8645d2 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/149-add-indexes-across-tables-for-performance.yaml @@ -0,0 +1,220 @@ +databaseChangeLog: + - changeSet: + id: create_index_if_not_exists_idx_file_last_updated + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_file_last_updated + tableName: file + changes: + - createIndex: + tableName: file + indexName: idx_file_last_updated + columns: + - column: + name: last_updated + + - changeSet: + id: create_index_if_not_exists_idx_file_deleted_hard_deleted_time + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_file_deleted_hard_deleted_time + tableName: file + changes: + - createIndex: + tableName: file + indexName: idx_file_deleted_hard_deleted_time + columns: + - column: + name: deleted + - column: + name: hard_deleted_time + + - changeSet: + id: create_index_if_not_exists_idx_file_dossier_id_deleted_hard_deleted_time + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_file_dossier_id_deleted_hard_deleted_time + tableName: file + changes: + - createIndex: + tableName: file + indexName: idx_file_dossier_id_deleted_hard_deleted_time + columns: + - column: + name: dossier_id + - column: + name: deleted + - column: + name: hard_deleted_time + + - changeSet: + id: create_index_if_not_exists_idx_dossier_last_updated + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_dossier_last_updated + tableName: dossier + changes: + - createIndex: + tableName: dossier + indexName: idx_dossier_last_updated + columns: + - column: + name: last_updated + + - changeSet: + id: create_index_if_not_exists_idx_dossier_soft_deleted_time_hard_deleted_time + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_dossier_soft_deleted_time_hard_deleted_time + tableName: dossier + changes: + - createIndex: + tableName: dossier + indexName: idx_dossier_soft_deleted_time_hard_deleted_time + columns: + - column: + name: soft_deleted_time + - column: + name: hard_deleted_time + + - changeSet: + id: create_index_if_not_exists_idx_dossier_id_soft_deleted_time_hard_deleted_time + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_dossier_id_soft_deleted_time_hard_deleted_time + tableName: dossier + changes: + - createIndex: + tableName: dossier + indexName: idx_dossier_id_soft_deleted_time_hard_deleted_time + columns: + - column: + name: id + - column: + name: soft_deleted_time + - column: + name: hard_deleted_time + + - changeSet: + id: create_index_if_not_exists_idx_dossier_soft_deleted_time_hard_deleted_time_archived_time + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_dossier_soft_deleted_time_hard_deleted_time_archived_time + tableName: dossier + changes: + - createIndex: + tableName: dossier + indexName: idx_dossier_soft_deleted_time_hard_deleted_time_archived_time + columns: + - column: + name: soft_deleted_time + - column: + name: hard_deleted_time + - column: + name: archived_time + + - changeSet: + id: create_index_if_not_exists_idx_dossier_dossier_template_id_soft_deleted_time_hard_deleted_time_archived_time + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_dossier_dossier_template_id_soft_deleted_time_hard_deleted_time_archived_time + tableName: dossier + changes: + - createIndex: + tableName: dossier + indexName: idx_dossier_dossier_template_id_soft_deleted_time_hard_deleted_time_archived_time + columns: + - column: + name: dossier_template_id + - column: + name: soft_deleted_time + - column: + name: hard_deleted_time + - column: + name: archived_time + + - changeSet: + id: create_index_if_not_exists_idx_notification_preference_user_id_in_app_notifications_enabled + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_notification_preference_user_id_in_app_notifications_enabled + tableName: notification_preference + changes: + - createIndex: + tableName: notification_preference + indexName: idx_notification_preference_user_id_in_app_notifications_enabled + columns: + - column: + name: user_id + - column: + name: in_app_notifications_enabled + + - changeSet: + id: create_index_if_not_exists_idx_notification_user_id_creation_date_soft_deleted + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_notification_user_id_creation_date_soft_deleted + tableName: notification + changes: + - createIndex: + tableName: notification + indexName: idx_notification_user_id_creation_date_soft_deleted + columns: + - column: + name: user_id + - column: + name: creation_date + - column: + name: soft_deleted + + - changeSet: + id: create_index_if_not_exists_idx_entity_dossier_template_id + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_entity_dossier_template_id + tableName: entity + changes: + - createIndex: + tableName: entity + indexName: idx_entity_dossier_template_id + columns: + - column: + name: dossier_template_id + + - changeSet: + id: create_index_if_not_exists_idx_entity_dossier_id + author: Timo + preConditions: + - not: + indexExists: + indexName: idx_entity_dossier_id + tableName: entity + changes: + - createIndex: + tableName: entity + indexName: idx_entity_dossier_id + columns: + - column: + name: dossier_id