diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java index 87f47f03b..dd54267e9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java @@ -8,6 +8,7 @@ import eu.eudat.elastic.repository.Repository; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.utilities.helpers.StreamDistinctBy; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; @@ -47,7 +48,7 @@ public class TagController extends BaseController { //ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); /*List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getTags(externalUrlCriteria, type); TagExternalSourcesModel researchersExternalSourcesModel = new TagExternalSourcesModel().fromExternalItem(remoteRepos);*/ - List tags = this.getApiContext().getOperationsContext().getDatasetRepository().query(new DatasetCriteria()).stream().map(Dataset::getTags).flatMap(Collection::stream).collect(Collectors.toList()); + List tags = this.getApiContext().getOperationsContext().getDatasetRepository().query(new DatasetCriteria()).stream().map(Dataset::getTags).flatMap(Collection::stream).filter(StreamDistinctBy.distinctByKey(Tag::getId)).collect(Collectors.toList()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(tags).status(ApiMessageCode.NO_MESSAGE)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index c3248fce5..c7e61f8d4 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -15,6 +15,7 @@ import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequest import eu.eudat.elastic.criteria.DatasetCriteria; import eu.eudat.elastic.entities.Collaborator; import eu.eudat.elastic.entities.Organization; +import eu.eudat.elastic.entities.Tag; import eu.eudat.elastic.repository.DatasetRepository; import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.logic.builders.BuilderFactory; @@ -588,7 +589,15 @@ public class DatasetManager { // if (datasetWizardModel.getTags() != null && !datasetWizardModel.getTags().isEmpty()) { eu.eudat.elastic.entities.Dataset dataset = new eu.eudat.elastic.entities.Dataset(); dataset.setId(datasetWizardModel.getId().toString()); - dataset.setTags(datasetWizardModel.getTags()); + DatasetCriteria criteria = new DatasetCriteria(); + criteria.setTags(datasetWizardModel.getTags()); + List tags = apiContext.getOperationsContext().getDatasetRepository().query(criteria).stream().map(eu.eudat.elastic.entities.Dataset::getTags).flatMap(Collection::stream).collect(Collectors.toList()); + if (tags.isEmpty()) { + datasetWizardModel.getTags().forEach(tag -> tag.setId(UUID.randomUUID().toString())); + dataset.setTags(datasetWizardModel.getTags()); + } else { + dataset.setTags(tags); + } dataset.setLabel(datasetWizardModel.getLabel()); dataset.setDescription(datasetWizardModel.getDescription()); dataset.setTemplate(datasetWizardModel.getProfile()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/helpers/StreamDistinctBy.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/helpers/StreamDistinctBy.java new file mode 100644 index 000000000..1cce2c822 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/helpers/StreamDistinctBy.java @@ -0,0 +1,15 @@ +package eu.eudat.logic.utilities.helpers; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; + +public class StreamDistinctBy { + + public static Predicate distinctByKey( + Function keyExtractor) { + Map found = new ConcurrentHashMap<>(); + return t -> found.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; + } +}