diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java index 070845bbe..1e4a59104 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java @@ -4,6 +4,7 @@ import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.ReferenceSourceType; +import eu.eudat.data.DmpReferenceEntity; import eu.eudat.data.ReferenceEntity; import eu.eudat.model.PublicReference; import eu.eudat.model.Reference; @@ -36,6 +37,9 @@ public class ReferenceQuery extends QueryBase { private Collection excludedIds; + + private DmpReferenceQuery dmpReferenceQuery; + private Collection referenceTypeIds; private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @@ -134,6 +138,11 @@ public class ReferenceQuery extends QueryBase { this.referenceTypeIds = values; return this; } + + public ReferenceQuery dmpReferenceSubQuery(DmpReferenceQuery value) { + this.dmpReferenceQuery = value; + return this; + } public ReferenceQuery authorize(EnumSet values) { this.authorize = values; @@ -151,7 +160,7 @@ public class ReferenceQuery extends QueryBase { @Override protected Boolean isFalseQuery() { - return this.isEmpty(this.ids) || this.isEmpty(this.isActives) || this.isEmpty(this.excludedIds) || this.isEmpty(this.referenceTypes) || this.isEmpty(this.referenceSourceTypes); + return this.isEmpty(this.ids) || this.isEmpty(this.isActives) || this.isEmpty(this.excludedIds) || this.isEmpty(this.referenceTypes) || this.isEmpty(this.referenceSourceTypes)|| this.isFalseQuery(this.dmpReferenceQuery); } @Override @@ -193,6 +202,10 @@ public class ReferenceQuery extends QueryBase { notInClause.value(item); predicates.add(notInClause.not()); } + if (this.dmpReferenceQuery != null) { + QueryContext subQuery = this.applySubQuery(this.dmpReferenceQuery, queryContext, UUID.class, root -> root.get(DmpReferenceEntity._referenceId)); + predicates.add(queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpReferenceEntity._id)).value(subQuery.Query)); + } if (!predicates.isEmpty()) { Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); return queryContext.CriteriaBuilder.and(predicatesArray); diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dashborad/DashboardServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dashborad/DashboardServiceImpl.java index d7fae9df7..a4ae6b90e 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dashborad/DashboardServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dashborad/DashboardServiceImpl.java @@ -146,8 +146,12 @@ public class DashboardServiceImpl implements DashboardService { DashboardStatistics statistics = new DashboardStatistics(); statistics.setDmpCount(dmpQuery.authorize(EnumSet.of(Public)).count()); statistics.setDescriptionCount(this.queryFactory.query(DescriptionQuery.class).isActive(IsActive.Active).dmpSubQuery(dmpQuery).statuses(DescriptionStatus.Finalized).authorize(EnumSet.of(Public)).count()); - statistics.setOrganizationCount(this.queryFactory.query(DmpReferenceQuery.class).isActives(IsActive.Active).dmpSubQuery(dmpQuery).referenceSubQuery(this.queryFactory.query(ReferenceQuery.class).types(ReferenceType.Organizations).isActive(IsActive.Active)).authorize(EnumSet.of(Public)).count()); - statistics.setDmpCount(this.queryFactory.query(DmpReferenceQuery.class).isActives(IsActive.Active).dmpSubQuery(dmpQuery).referenceSubQuery(this.queryFactory.query(ReferenceQuery.class).types(ReferenceType.Grants).isActive(IsActive.Active)).authorize(EnumSet.of(Public)).count()); + statistics.setOrganizationCount(this.queryFactory.query(ReferenceQuery.class).isActive(IsActive.Active).types(ReferenceType.Organizations).authorize(EnumSet.of(Public)) + .dmpReferenceSubQuery(this.queryFactory.query(DmpReferenceQuery.class).isActives(IsActive.Active) + .dmpSubQuery(dmpQuery)).count()); + statistics.setGrantCount(this.queryFactory.query(ReferenceQuery.class).isActive(IsActive.Active).types(ReferenceType.Grants).authorize(EnumSet.of(Public)) + .dmpReferenceSubQuery(this.queryFactory.query(DmpReferenceQuery.class).isActives(IsActive.Active) + .dmpSubQuery(dmpQuery)).count()); cacheValue = new DashboardStatisticsCacheService.DashboardStatisticsCacheValue(); cacheValue.setPublic(true); cacheValue.setDashboardStatistics(statistics); @@ -166,13 +170,17 @@ public class DashboardServiceImpl implements DashboardService { dmpUserLookup.userIds(this.userScope.getUserId()); dmpUserLookup.isActives(IsActive.Active); - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active).dmpUserSubQuery(dmpUserLookup).versionStatuses(DmpVersionStatus.Current).statuses(DmpStatus.Finalized); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active).dmpUserSubQuery(dmpUserLookup).versionStatuses(DmpVersionStatus.Current); DashboardStatistics statistics = new DashboardStatistics(); - statistics.setDmpCount(dmpQuery.authorize(EnumSet.of(Owner)).count()); - statistics.setDescriptionCount(this.queryFactory.query(DescriptionQuery.class).isActive(IsActive.Active).dmpSubQuery(dmpQuery).statuses(DescriptionStatus.Finalized).authorize(EnumSet.of(Owner)).count()); - statistics.setOrganizationCount(this.queryFactory.query(DmpReferenceQuery.class).isActives(IsActive.Active).dmpSubQuery(dmpQuery).referenceSubQuery(this.queryFactory.query(ReferenceQuery.class).types(ReferenceType.Organizations).isActive(IsActive.Active)).authorize(EnumSet.of(Owner)).count()); - statistics.setDmpCount(this.queryFactory.query(DmpReferenceQuery.class).isActives(IsActive.Active).dmpSubQuery(dmpQuery).referenceSubQuery(this.queryFactory.query(ReferenceQuery.class).types(ReferenceType.Grants).isActive(IsActive.Active)).authorize(EnumSet.of(Owner)).count()); + statistics.setDmpCount(dmpQuery.authorize(EnumSet.of(AuthorizationFlags.DmpAssociated)).count()); + statistics.setDescriptionCount(this.queryFactory.query(DescriptionQuery.class).isActive(IsActive.Active).dmpSubQuery(dmpQuery).statuses(DescriptionStatus.Finalized).authorize(EnumSet.of(AuthorizationFlags.DmpAssociated)).count()); + statistics.setOrganizationCount(this.queryFactory.query(ReferenceQuery.class).isActive(IsActive.Active).types(ReferenceType.Organizations).authorize(EnumSet.of(Owner)) + .dmpReferenceSubQuery(this.queryFactory.query(DmpReferenceQuery.class).isActives(IsActive.Active) + .dmpSubQuery(dmpQuery)).count()); + statistics.setGrantCount(this.queryFactory.query(ReferenceQuery.class).isActive(IsActive.Active).types(ReferenceType.Grants).authorize(EnumSet.of(Owner)) + .dmpReferenceSubQuery(this.queryFactory.query(DmpReferenceQuery.class).isActives(IsActive.Active) + .dmpSubQuery(dmpQuery)).count()); cacheValue = new DashboardStatisticsCacheService.DashboardStatisticsCacheValue(this.userScope.getUserId()); cacheValue.setPublic(false); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DashboardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DashboardController.java index 14b9bfdee..0b86a9616 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DashboardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DashboardController.java @@ -44,7 +44,7 @@ public class DashboardController { - @PostMapping("/mine/recent-activity") + @PostMapping("mine/recent-activity") public List getMyRecentActivityItems(@RequestBody RecentActivityItemLookup lookup) throws InvalidApplicationException { logger.debug(new MapLogEntry("retrieving" + User.class.getSimpleName()).And("lookup", lookup)); diff --git a/dmp-migration-tool/web/src/main/java/eu/old/eudat/migration/DmpMigrationService.java b/dmp-migration-tool/web/src/main/java/eu/old/eudat/migration/DmpMigrationService.java index fe558f3c0..821e264be 100644 --- a/dmp-migration-tool/web/src/main/java/eu/old/eudat/migration/DmpMigrationService.java +++ b/dmp-migration-tool/web/src/main/java/eu/old/eudat/migration/DmpMigrationService.java @@ -49,6 +49,14 @@ public class DmpMigrationService { List items; do { items = dmpDao.asQueryable().orderBy((builder, root) -> builder.asc(root.get("created"))).orderBy((builder, root) -> builder.asc(root.get("ID"))).skip(page * PageSize).take(PageSize).toList(); + List finalItems = items; + List groupDmps = dmpDao.asQueryable().where((builder, root) -> root.get("groupId").in(finalItems.stream().map(DMP::getGroupId).distinct())).toList(); + Map> groupDmpMap = new HashMap<>(); + for (DMP dmp: groupDmps) { + if (!groupDmpMap.containsKey(dmp.getGroupId())) groupDmpMap.put(dmp.getGroupId(), new ArrayList<>()); + groupDmpMap.get(dmp.getGroupId()).add(dmp); + } + if (items != null && !items.isEmpty()) { logger.debug("Migrate Dmp " + page * PageSize + " of " + total); @@ -57,7 +65,9 @@ public class DmpMigrationService { DataManagementPlan model = new DataManagementPlan(); model.fromDataModel(item); - + List itemGroupDmps = groupDmpMap.get(item.getGroupId()); + DMP currentVersionDmp = itemGroupDmps.stream().max(Comparator.comparing(DMP::getVersion)).orElseThrow(); + DmpPropertiesEntity dmpProperties = new DmpPropertiesEntity(); dmpProperties.setDmpBlueprintValues(new ArrayList<>()); dmpProperties.setContacts(new ArrayList<>()); @@ -69,8 +79,7 @@ public class DmpMigrationService { if (model.getCreator() != null && model.getCreator().getId() != null) { data.setCreatorId(model.getCreator().getId()); } else { - List groupDmps = dmpDao.asQueryable().where((builder, root) -> root.get("groupId").in(List.of(item.getGroupId()))).toList(); - for (DMP groupDmp: groupDmps) { + for (DMP groupDmp: itemGroupDmps) { DataManagementPlan groupDmpModel = new DataManagementPlan(); groupDmpModel.fromDataModel(groupDmp); if (groupDmpModel.getCreator() != null) { @@ -81,7 +90,7 @@ public class DmpMigrationService { } data.setGroupId(model.getGroupId()); data.setVersion((short) model.getVersion()); - data.setVersionStatus(DmpVersionStatus.of((short) model.getVersionStatus())); + data.setVersionStatus(currentVersionDmp.getId().equals(item.getId()) ? DmpVersionStatus.Current: DmpVersionStatus.Previous); if (model.getCreated() != null) data.setCreatedAt(model.getCreated().toInstant()); if (model.getModified() != null)