package eu.old.eudat.migration; import eu.eudat.commons.enums.IsActive; import eu.eudat.data.DescriptionReferenceEntity; import eu.old.eudat.data.dao.entities.*; import eu.old.eudat.data.entities.*; import eu.old.eudat.logic.services.operations.DatabaseRepository; import gr.cite.tools.logging.LoggerService; import jakarta.persistence.EntityManager; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.time.Instant; import java.util.List; import java.util.UUID; @Service public class DatasetReferenceMigrationService { private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DmpDatasetProfileMigrationService.class)); private final DatabaseRepository databaseRepository; private static final int PageSize = 500; private final EntityManager entityManager; public DatasetReferenceMigrationService(DatabaseRepository databaseRepository, EntityManager entityManager) { this.databaseRepository = databaseRepository; this.entityManager = entityManager; } public void migrateDatasetReferences() { migrateDatasetDataRepositories(); migrateDatasetExternalDatasets(); migrateDatasetRegistries(); migrateDatasetServices(); } public void migrateDatasetDataRepositories() { DatasetDataRepositoryDao datasetDataRepositoryDao = databaseRepository.getDatasetDataRepositoryDao(); long total = datasetDataRepositoryDao.asQueryable().count(); logger.debug("Migrate Dataset DataRepository (from DatasetDataRepository) Total : " + total); int page = 0; List items; do { items = datasetDataRepositoryDao.asQueryable().orderBy((builder, root) -> builder.asc(root.get("id"))).skip(page * PageSize).take(PageSize).toList(); if (items != null && !items.isEmpty()) { logger.debug("Migrate Dataset DataRepository " + page * PageSize + " of " + total); for (DatasetDataRepository item : items) { // entityManager.detach(item); DescriptionReferenceEntity data = new DescriptionReferenceEntity(); data.setId(UUID.randomUUID()); data.setDescriptionId(item.getDataset().getId()); data.setReferenceId(item.getDataRepository().getId()); data.setCreatedAt(item.getDataset().getCreated() != null ? item.getDataset().getCreated().toInstant() : Instant.now()); data.setUpdatedAt(item.getDataset().getModified() != null ? item.getDataset().getModified().toInstant() : Instant.now()); data.setIsActive(IsActive.Active); this.entityManager.persist(data); } this.entityManager.flush(); page++; } } while (items != null && !items.isEmpty()); } public void migrateDatasetExternalDatasets() { DatasetExternalDatasetDao datasetExternalDatasetDao = databaseRepository.getDatasetExternalDatasetDao(); long total = datasetExternalDatasetDao.asQueryable().count(); logger.debug("Migrate Dataset ExternalDataset (from DatasetExternalDataset) Total : " + total); int page = 0; List items; do { items = datasetExternalDatasetDao.asQueryable().orderBy((builder, root) -> builder.asc(root.get("id"))).skip(page * PageSize).take(PageSize).toList(); if (items != null && !items.isEmpty()) { logger.debug("Migrate Dataset ExternalDataset " + page * PageSize + " of " + total); for (DatasetExternalDataset item : items) { // entityManager.detach(item); DescriptionReferenceEntity data = new DescriptionReferenceEntity(); data.setId(UUID.randomUUID()); data.setDescriptionId(item.getDataset().getId()); data.setReferenceId(item.getExternalDataset().getId()); data.setCreatedAt(item.getDataset().getCreated() != null ? item.getDataset().getCreated().toInstant() : Instant.now()); data.setUpdatedAt(item.getDataset().getModified() != null ? item.getDataset().getModified().toInstant() : Instant.now()); data.setIsActive(IsActive.Active); this.entityManager.persist(data); } this.entityManager.flush(); page++; } } while (items != null && !items.isEmpty()); } public void migrateDatasetRegistries() { DatasetRegistryDao datasetRegistryDao = databaseRepository.getDatasetRegistryDao(); long total = datasetRegistryDao.asQueryable().count(); logger.debug("Migrate Dataset Registry (from DatasetRegistry) Total : " + total); int page = 0; List items; do { items = datasetRegistryDao.asQueryable().orderBy((builder, root) -> builder.asc(root.get("id"))).skip(page * PageSize).take(PageSize).toList(); if (items != null && !items.isEmpty()) { logger.debug("Migrate Dataset Registry " + page * PageSize + " of " + total); for (DatasetRegistry item : items) { // entityManager.detach(item); DescriptionReferenceEntity data = new DescriptionReferenceEntity(); data.setId(UUID.randomUUID()); data.setDescriptionId(item.getDataset().getId()); data.setReferenceId(item.getRegistry().getId()); data.setCreatedAt(item.getDataset().getCreated() != null ? item.getDataset().getCreated().toInstant() : Instant.now()); data.setUpdatedAt(item.getDataset().getModified() != null ? item.getDataset().getModified().toInstant() : Instant.now()); data.setIsActive(IsActive.Active); this.entityManager.persist(data); } this.entityManager.flush(); page++; } } while (items != null && !items.isEmpty()); } public void migrateDatasetServices() { DatasetServiceDao datasetServiceDao = databaseRepository.getDatasetServiceDao(); long total = datasetServiceDao.asQueryable().count(); logger.debug("Migrate Dataset Service (from DatasetService) Total : " + total); int page = 0; List items; do { items = datasetServiceDao.asQueryable().orderBy((builder, root) -> builder.asc(root.get("id"))).skip(page * PageSize).take(PageSize).toList(); if (items != null && !items.isEmpty()) { logger.debug("Migrate Dataset Service " + page * PageSize + " of " + total); for (DatasetService item : items) { // entityManager.detach(item); DescriptionReferenceEntity data = new DescriptionReferenceEntity(); data.setId(UUID.randomUUID()); data.setDescriptionId(item.getDataset().getId()); data.setReferenceId(item.getService().getId()); data.setCreatedAt(item.getDataset().getCreated() != null ? item.getDataset().getCreated().toInstant() : Instant.now()); data.setUpdatedAt(item.getDataset().getModified() != null ? item.getDataset().getModified().toInstant() : Instant.now()); data.setIsActive(IsActive.Active); this.entityManager.persist(data); } this.entityManager.flush(); page++; } } while (items != null && !items.isEmpty()); } }