From be6227a81dc199adc091cc5e26fbfda303684c4e Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 7 Apr 2020 18:41:25 +0300 Subject: [PATCH] Fixed issue with dmp index when creating a new version, and some othe minor dmp index issues --- .../java/eu/eudat/elastic/entities/Dmp.java | 26 +++++--- .../logic/managers/DashBoardManager.java | 18 +++++- .../managers/DataManagementPlanManager.java | 64 +++++++++++++++---- .../logic/mapper/elastic/DatasetMapper.java | 37 ++++++----- 4 files changed, 102 insertions(+), 43 deletions(-) diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java index 6c98bab17..7f4933cc2 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java @@ -171,12 +171,16 @@ public class Dmp implements ElasticEntity { @Override public XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException { builder.startObject(); - builder.field(MapKey.ID.getName(), this.id.toString()); + if (this.id != null) { + builder.field(MapKey.ID.getName(), this.id.toString()); + } builder.field(MapKey.LABEL.getName(), this.label); builder.field(MapKey.DESCRIPTION.getName(), this.description); - builder.field(MapKey.GROUPID.getName(), this.groupId.toString()); + if (this.groupId != null) { + builder.field(MapKey.GROUPID.getName(), this.groupId.toString()); + } builder.field(MapKey.STATUS.getName(), this.status); - if (this.templates != null) { + if (this.templates != null && !this.templates.isEmpty()) { builder.startArray(MapKey.TEMPLATES.getName()); this.templates.forEach(template -> { try { @@ -187,7 +191,7 @@ public class Dmp implements ElasticEntity { }); builder.endArray(); } - if (this.collaborators != null) { + if (this.collaborators != null && !this.collaborators.isEmpty()) { builder.startArray(MapKey.COLLABORATORS.getName()); this.collaborators.forEach(collaborator -> { try { @@ -198,7 +202,7 @@ public class Dmp implements ElasticEntity { }); builder.endArray(); } - if (this.organizations != null) { + if (this.organizations != null && !this.organizations.isEmpty()) { builder.startArray(MapKey.ORGANIZATIONS.getName()); this.organizations.forEach(organization -> { try { @@ -212,18 +216,22 @@ public class Dmp implements ElasticEntity { builder.field(MapKey.LASTVERSION.getName(), this.lastVersion); builder.field(MapKey.LASTPUBLICVERSION.getName(), this.lastPublicVersion); builder.field(MapKey.ISPUBLIC.getName(), this.isPublic); - if (datasets != null) { + if (datasets != null && !this.datasets.isEmpty()) { builder.startArray(MapKey.DATASETS.getName()); this.datasets.forEach(dataset -> { try { - dataset.toElasticEntity(builder); - } catch (IOException e) { + if (dataset != null) { + dataset.toElasticEntity(builder); + } + } catch (Exception e) { logger.error(e.getMessage(), e); } }); builder.endArray(); } - builder.field(MapKey.GRANT.getName(), this.grant.toString()); + if (this.grant != null) { + builder.field(MapKey.GRANT.getName(), this.grant.toString()); + } builder.field(MapKey.GRANTSTATUS.getName(), this.grantStatus); builder.endObject(); return builder; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index ec33379da..50e45f103 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -7,6 +7,7 @@ import eu.eudat.data.dao.entities.OrganisationDao; import eu.eudat.data.dao.entities.GrantDao; import eu.eudat.data.entities.*; import eu.eudat.data.query.items.table.dmp.DataManagmentPlanPublicTableRequest; +import eu.eudat.elastic.entities.Dmp; import eu.eudat.logic.builders.model.models.RecentActivityDataBuilder; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.operations.DatabaseRepository; @@ -81,6 +82,7 @@ public class DashBoardManager { public DashBoardStatistics getMeStatistics(Principal principal) throws IOException { List datasets = null; + List dmps = null; DashBoardStatistics statistics = new DashBoardStatistics(); DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); DatasetDao datasetRepository = databaseRepository.getDatasetDao(); @@ -103,12 +105,24 @@ public class DashBoardManager { datasetCriteria.setAllVersions(false); datasetCriteria.setIsPublic(false); DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); + if (apiContext.getOperationsContext().getElasticRepository().getDmpRepository() != null) { + try { + eu.eudat.elastic.criteria.DmpCriteria dmpElasticCriteria = new eu.eudat.elastic.criteria.DmpCriteria(); + dmpElasticCriteria.setAllowAllVersions(false); + dmpElasticCriteria.setPublic(false); + dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().query(dmpElasticCriteria); + }catch (Exception e) { + logger.warn(e.getMessage(), e); + dmps = null; + } + } dataManagementPlanCriteria.setAllVersions(false); GrantCriteria grantCriteria = new GrantCriteria(); List roles = new LinkedList<>(); - CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles).countAsync() - .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); + List finalDmps = dmps; + CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dmps != null ? dataManagementPlanRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))) : dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles).countAsync() + .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); List finalDatasets = datasets; CompletableFuture datasetFuture = datasetRepository.getAuthenticated(datasets != null ? datasetRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))) : datasetRepository.getWithCriteria(datasetCriteria), user, roles).countAsync() .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index c8bc4928d..af7035943 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -685,6 +685,23 @@ public class DataManagementPlanManager { databaseRepository.getUserDmpDao().createOrUpdate(userDMP); } + private void updateGroupIndex(UUID groupId) { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setGroupIds(Collections.singletonList(groupId)); + criteria.setAllVersions(true); + List dmps = databaseRepository.getDmpDao().getWithCriteria(criteria).toList(); + for (DMP dmp: dmps) { + try { + if (dmp.getUsers() != null) { + logger.info(dmp.getUsers().toString()); + } + this.updateIndex(dmp); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + } + public void newVersion(UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { DMP oldDmp = databaseRepository.getDmpDao().find(uuid); if (!isUserOwnerOfDmp(oldDmp, principal)) { @@ -728,10 +745,14 @@ public class DataManagementPlanManager { copyDatasets(newDmp, databaseRepository.getDatasetDao()); - newDmp.getUsers().clear(); newDmp.setUsers(new HashSet<>(databaseRepository.getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), newDmp.getId())).toList())); - this.updateIndex(newDmp); + DatasetCriteria criteria1 = new DatasetCriteria(); + criteria1.setDmpIds(Collections.singletonList(newDmp.getId())); + newDmp.setDataset(new HashSet<>(databaseRepository.getDatasetDao().getWithCriteria(criteria1).toList())); + + this.updateGroupIndex(newDmp.getGroupId()); + } else { throw new DMPNewVersionException("Version to update not the latest."); } @@ -760,11 +781,18 @@ public class DataManagementPlanManager { assignFunderUserIfInternal(newDmp, user); assignProjectUserIfInternal(newDmp, user); databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); - newDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp); + DMP tempDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp); + newDmp.setId(tempDmp.getId()); assignUser(newDmp, user); copyDatasets(newDmp, databaseRepository.getDatasetDao()); + newDmp.setUsers(new HashSet<>(databaseRepository.getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), newDmp.getId())).toList())); + + DatasetCriteria criteria1 = new DatasetCriteria(); + criteria1.setDmpIds(Collections.singletonList(newDmp.getId())); + newDmp.setDataset(new HashSet<>(databaseRepository.getDatasetDao().getWithCriteria(criteria1).toList())); + this.updateIndex(newDmp); } @@ -782,6 +810,11 @@ public class DataManagementPlanManager { criteria1.setAllVersions(true); criteria1.setGroupIds(Collections.singletonList(oldDmp.getGroupId())); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria1).toList().forEach(dmp -> { + try { + this.updateIndex(dmp); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } for (Dataset dataset: dmp.getDataset()) { try { List tags = new ArrayList<>(); @@ -934,19 +967,24 @@ public class DataManagementPlanManager { private void copyDatasets(DMP newDmp, DatasetDao datasetDao) { List> futures = new LinkedList<>(); for (Dataset dataset : newDmp.getDataset()) { + Dataset tempDataset = datasetDao.find(dataset.getId()); + if (tempDataset.getProfile() != null) { + logger.info(tempDataset.getProfile().toString()); + } + try { + List tags = new ArrayList<>(); + eu.eudat.elastic.entities.Dataset elastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString()); + if (elastic != null) { + tags = elastic.getTags(); + } + + this.datasetManager.updateTags(tempDataset, tags); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } datasetDao.asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class)).where((builder, root) -> builder.equal(root.get("id"), dataset.getId())).getSingleAsync() .thenApplyAsync(entityDataset -> { Dataset newDataset = new Dataset(); - try { - List tags = new ArrayList<>(); - eu.eudat.elastic.entities.Dataset elastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString()); - if (elastic != null) { - tags = elastic.getTags(); - } - this.datasetManager.updateTags(dataset, tags); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } newDataset.update(entityDataset); newDataset.setDmp(newDmp); newDataset.setStatus(Dataset.Status.SAVED.getValue()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java index c15de6329..c9a3723f0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java @@ -26,8 +26,7 @@ public class DatasetMapper { public Dataset toElastic(eu.eudat.data.entities.Dataset dataset, List tags) throws Exception { Dataset elastic = new Dataset(); - eu.eudat.data.entities.Dataset tempDataset = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().find(dataset.getId()); - elastic.setId(tempDataset.getId().toString()); + elastic.setId(dataset.getId().toString()); if (tags != null && !tags.isEmpty()) { DatasetCriteria criteria = new DatasetCriteria(); criteria.setTags(tags); @@ -40,35 +39,35 @@ public class DatasetMapper { elastic.setTags(tags1); } } - elastic.setLabel(tempDataset.getLabel()); - elastic.setDescription(tempDataset.getDescription()); - elastic.setTemplate(tempDataset.getProfile().getId()); - elastic.setStatus(tempDataset.getStatus()); - elastic.setDmp(tempDataset.getDmp().getId()); - elastic.setGroup(tempDataset.getDmp().getGroupId()); - elastic.setGrant(tempDataset.getDmp().getGrant().getId()); - if (tempDataset.getDmp().getUsers() != null) { - elastic.setCollaborators(tempDataset.getDmp().getUsers().stream().map(user -> CollaboratorMapper.toElastic(user.getUser())).collect(Collectors.toList())); + elastic.setLabel(dataset.getLabel()); + elastic.setDescription(dataset.getDescription()); + elastic.setTemplate(dataset.getProfile().getId()); + elastic.setStatus(dataset.getStatus()); + elastic.setDmp(dataset.getDmp().getId()); + elastic.setGroup(dataset.getDmp().getGroupId()); + elastic.setGrant(dataset.getDmp().getGrant().getId()); + if (dataset.getDmp().getUsers() != null) { + elastic.setCollaborators(dataset.getDmp().getUsers().stream().map(user -> CollaboratorMapper.toElastic(user.getUser())).collect(Collectors.toList())); } DataManagementPlanCriteria dmpCriteria = new DataManagementPlanCriteria(); dmpCriteria.setAllVersions(true); - dmpCriteria.setGroupIds(Collections.singletonList(tempDataset.getDmp().getGroupId())); + dmpCriteria.setGroupIds(Collections.singletonList(dataset.getDmp().getGroupId())); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dmpCriteria).toList().stream() - .max(Comparator.comparing(DMP::getVersion)).ifPresent(dmp -> elastic.setLastVersion(dmp.getId().equals(tempDataset.getDmp().getId()))); + .max(Comparator.comparing(DMP::getVersion)).ifPresent(dmp -> elastic.setLastVersion(dmp.getId().equals(dataset.getDmp().getId()))); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dmpCriteria).toList().stream().filter(DMP::isPublic) - .max(Comparator.comparing(DMP::getVersion)).ifPresent(dmp -> elastic.setLastPublicVersion(dmp.getId().equals(tempDataset.getDmp().getId()))); + .max(Comparator.comparing(DMP::getVersion)).ifPresent(dmp -> elastic.setLastPublicVersion(dmp.getId().equals(dataset.getDmp().getId()))); if (elastic.getLastVersion() == null) { elastic.setLastVersion(true); } if (elastic.getLastPublicVersion() == null) { elastic.setLastPublicVersion(false); } - if (tempDataset.getDmp().getOrganisations() != null) { - elastic.setOrganizations(tempDataset.getDmp().getOrganisations().stream().map(OrganizationMapper::toElastic).collect(Collectors.toList())); + if (dataset.getDmp().getOrganisations() != null) { + elastic.setOrganizations(dataset.getDmp().getOrganisations().stream().map(OrganizationMapper::toElastic).collect(Collectors.toList())); } - elastic.setPublic(tempDataset.getDmp().isPublic()); - elastic.setGrantStatus(tempDataset.getDmp().getGrant().getStatus()); - elastic.setFormData(datasetManager.getWordDocumentText(tempDataset)); + elastic.setPublic(dataset.getDmp().isPublic()); + elastic.setGrantStatus(dataset.getDmp().getGrant().getStatus()); + elastic.setFormData(datasetManager.getWordDocumentText(dataset)); return elastic; }