package eu.eudat.elastic.repository; import eu.eudat.elastic.criteria.DmpCriteria; import eu.eudat.elastic.entities.Dataset; import eu.eudat.elastic.entities.Dmp; import eu.eudat.elastic.entities.Tag; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.core.CountRequest; import org.elasticsearch.client.core.CountResponse; import org.elasticsearch.client.indices.GetIndexRequest; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.reindex.DeleteByQueryRequest; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import java.util.stream.Stream; @Service("dmpRepository") public class DmpRepository extends ElasticRepository { @Autowired public DmpRepository(RestHighLevelClient client) { super(client); } @Override public Dmp createOrUpdate(Dmp entity) throws IOException { XContentBuilder builder = XContentFactory.jsonBuilder(); IndexRequest request = new IndexRequest("dmps").id(entity.getId().toString()).source(entity.toElasticEntity(builder)); IndexResponse response = this.getClient().index(request, RequestOptions.DEFAULT); return entity; } @Override public Dmp findDocument(String id) throws IOException { GetRequest request = new GetRequest("dmps",id); GetResponse response = this.getClient().get(request, RequestOptions.DEFAULT); return new Dmp().fromElasticEntity(response.getSourceAsMap()); } @Override public List query(DmpCriteria criteria) throws IOException { SearchRequest searchRequest = new SearchRequest("dmps"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); CountRequest countRequest = new CountRequest("dmps"); countRequest.query(QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(Dmp.MapKey.STATUS.getName(), Collections.singletonList(Dmp.DMPStatus.DELETED.getValue())))); CountResponse countResponse = getClient().count(countRequest, RequestOptions.DEFAULT); Long count = countResponse.getCount(); searchSourceBuilder.size(count.intValue()); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(Dmp.MapKey.STATUS.getName(), Collections.singletonList(Dmp.DMPStatus.DELETED.getValue()))); if (criteria.isPublic()) { boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.ISPUBLIC.getName(), true)); boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), Dmp.DMPStatus.FINALISED.getValue())); } if (criteria.getLike() != null && !criteria.getLike().isEmpty()) { boolQuery = boolQuery.should(QueryBuilders.queryStringQuery(criteria.getLike()).fields(Stream.of(new Object[][] { { Dmp.MapKey.LABEL.getName(), 1.0f }, { Dmp.MapKey.DESCRIPTION.getName(), 1.0f } }).collect(Collectors.toMap(data -> (String) data[0], data -> (Float) data[1])))); } if (criteria.getTemplates() != null && criteria.getTemplates().size() > 0) { boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.TEMPLATES.getName() + ".id.keyword", criteria.getTemplates().stream().map(UUID::toString).collect(Collectors.toList()))); } if (criteria.getStatus() != null) { boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), criteria.getStatus().intValue())); } if (criteria.getGroupIds() != null && criteria.getGroupIds().size() > 0) { boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GROUPID.getName(), criteria.getGroupIds().stream().map(UUID::toString).collect(Collectors.toList()))); } if (criteria.getGrants() != null && criteria.getGrants().size() > 0) { boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GRANT.getName() + ".keyword", criteria.getGrants().stream().map(UUID::toString).collect(Collectors.toList()))); } if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); } if (!criteria.isAllowAllVersions()) { boolQuery = boolQuery.should(QueryBuilders.termQuery(criteria.isPublic() ? Dmp.MapKey.LASTPUBLICVERSION.getName() : Dmp.MapKey.LASTVERSION.getName(), true)); } if (criteria.getOrganizations() != null && criteria.getOrganizations().size() > 0) { boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.ORGANIZATIONS.getName() + ".id.keyword", criteria.getOrganizations().stream().map(UUID::toString).collect(Collectors.toList()))); } if (criteria.getGrantStatus() != null) { boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.GRANTSTATUS.getName(), criteria.getGrantStatus())); } if (boolQuery.should().isEmpty() && boolQuery.mustNot().isEmpty()) { boolQuery = boolQuery.should(QueryBuilders.matchAllQuery()); } else { boolQuery.minimumShouldMatch(boolQuery.should().size()); } searchSourceBuilder.query(boolQuery); searchRequest.source(searchSourceBuilder); SearchResponse response = this.getClient().search(searchRequest, RequestOptions.DEFAULT); return Arrays.stream(response.getHits().getHits()).map(x -> new Dmp().fromElasticEntity((Map)this.transformFromString(x.getSourceAsString(), Map.class))).collect(Collectors.toList()); } @Override public boolean exists() throws IOException { GetIndexRequest request = new GetIndexRequest("dmps"); return this.getClient().indices().exists(request, RequestOptions.DEFAULT); } @Override public void clear() throws IOException { if (exists()) { DeleteByQueryRequest delete = new DeleteByQueryRequest("dmps"); delete.setQuery(QueryBuilders.matchAllQuery()); this.getClient().deleteByQuery(delete, RequestOptions.DEFAULT); } } }