elastic fixes

This commit is contained in:
Efstratios Giannopoulos 2024-04-30 12:54:26 +03:00
parent 33196e28cd
commit a8c1736e83
13 changed files with 271 additions and 234 deletions

View File

@ -1,10 +1,13 @@
package org.opencdmp.elastic.data; package org.opencdmp.elastic.data;
import gr.cite.tools.elastic.ElasticConstants;
import org.opencdmp.commons.enums.DmpAccessType; import org.opencdmp.commons.enums.DmpAccessType;
import org.opencdmp.commons.enums.DmpStatus; import org.opencdmp.commons.enums.DmpStatus;
import org.opencdmp.commons.enums.DmpVersionStatus; import org.opencdmp.commons.enums.DmpVersionStatus;
import org.opencdmp.elastic.data.nested.*; import org.opencdmp.elastic.data.nested.NestedCollaboratorElasticEntity;
import gr.cite.tools.elastic.ElasticConstants; import org.opencdmp.elastic.data.nested.NestedDescriptionElasticEntity;
import org.opencdmp.elastic.data.nested.NestedDoiElasticEntity;
import org.opencdmp.elastic.data.nested.NestedReferenceElasticEntity;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*; import org.springframework.data.elasticsearch.annotations.*;
@ -23,9 +26,7 @@ public class DmpElasticEntity {
private UUID tenantId; private UUID tenantId;
public final static String _tenantId = "tenantId"; public final static String _tenantId = "tenantId";
@MultiField(mainField = @Field(value = DmpElasticEntity._label, type = FieldType.Text), otherFields = { @MultiField(mainField = @Field(value = DmpElasticEntity._label, type = FieldType.Text), otherFields = @InnerField(suffix = ElasticConstants.SubFields.keyword, type = FieldType.Keyword))
@InnerField(suffix = ElasticConstants.SubFields.keyword, type = FieldType.Keyword)
})
private String label; private String label;
public final static String _label = "label"; public final static String _label = "label";
@ -81,7 +82,7 @@ public class DmpElasticEntity {
public final static String _dois = "dois"; public final static String _dois = "dois";
public UUID getId() { public UUID getId() {
return id; return this.id;
} }
public void setId(UUID id) { public void setId(UUID id) {
@ -89,7 +90,7 @@ public class DmpElasticEntity {
} }
public UUID getTenantId() { public UUID getTenantId() {
return tenantId; return this.tenantId;
} }
public void setTenantId(UUID tenantId) { public void setTenantId(UUID tenantId) {
@ -97,7 +98,7 @@ public class DmpElasticEntity {
} }
public String getLabel() { public String getLabel() {
return label; return this.label;
} }
public void setLabel(String label) { public void setLabel(String label) {
@ -105,7 +106,7 @@ public class DmpElasticEntity {
} }
public String getDescription() { public String getDescription() {
return description; return this.description;
} }
public void setDescription(String description) { public void setDescription(String description) {
@ -113,7 +114,7 @@ public class DmpElasticEntity {
} }
public Short getVersion() { public Short getVersion() {
return version; return this.version;
} }
public void setVersion(Short version) { public void setVersion(Short version) {
@ -121,7 +122,7 @@ public class DmpElasticEntity {
} }
public DmpStatus getStatus() { public DmpStatus getStatus() {
return status; return this.status;
} }
public void setStatus(DmpStatus status) { public void setStatus(DmpStatus status) {
@ -129,7 +130,7 @@ public class DmpElasticEntity {
} }
public DmpAccessType getAccessType() { public DmpAccessType getAccessType() {
return accessType; return this.accessType;
} }
public void setAccessType(DmpAccessType accessType) { public void setAccessType(DmpAccessType accessType) {
@ -137,7 +138,7 @@ public class DmpElasticEntity {
} }
public String getLanguage() { public String getLanguage() {
return language; return this.language;
} }
public void setLanguage(String language) { public void setLanguage(String language) {
@ -145,7 +146,7 @@ public class DmpElasticEntity {
} }
public UUID getBlueprintId() { public UUID getBlueprintId() {
return blueprintId; return this.blueprintId;
} }
public void setBlueprintId(UUID blueprintId) { public void setBlueprintId(UUID blueprintId) {
@ -153,7 +154,7 @@ public class DmpElasticEntity {
} }
public UUID getGroupId() { public UUID getGroupId() {
return groupId; return this.groupId;
} }
public void setGroupId(UUID groupId) { public void setGroupId(UUID groupId) {
@ -161,7 +162,7 @@ public class DmpElasticEntity {
} }
public Date getFinalizedAt() { public Date getFinalizedAt() {
return finalizedAt; return this.finalizedAt;
} }
public void setFinalizedAt(Date finalizedAt) { public void setFinalizedAt(Date finalizedAt) {
@ -169,7 +170,7 @@ public class DmpElasticEntity {
} }
public List<NestedReferenceElasticEntity> getReferences() { public List<NestedReferenceElasticEntity> getReferences() {
return references; return this.references;
} }
public void setReferences(List<NestedReferenceElasticEntity> references) { public void setReferences(List<NestedReferenceElasticEntity> references) {
@ -177,7 +178,7 @@ public class DmpElasticEntity {
} }
public List<NestedCollaboratorElasticEntity> getCollaborators() { public List<NestedCollaboratorElasticEntity> getCollaborators() {
return collaborators; return this.collaborators;
} }
public void setCollaborators(List<NestedCollaboratorElasticEntity> collaborators) { public void setCollaborators(List<NestedCollaboratorElasticEntity> collaborators) {
@ -185,7 +186,7 @@ public class DmpElasticEntity {
} }
public List<NestedDescriptionElasticEntity> getDescriptions() { public List<NestedDescriptionElasticEntity> getDescriptions() {
return descriptions; return this.descriptions;
} }
public void setDescriptions(List<NestedDescriptionElasticEntity> descriptions) { public void setDescriptions(List<NestedDescriptionElasticEntity> descriptions) {
@ -193,7 +194,7 @@ public class DmpElasticEntity {
} }
public List<NestedDoiElasticEntity> getDois() { public List<NestedDoiElasticEntity> getDois() {
return dois; return this.dois;
} }
public void setDois(List<NestedDoiElasticEntity> dois) { public void setDois(List<NestedDoiElasticEntity> dois) {
@ -201,7 +202,7 @@ public class DmpElasticEntity {
} }
public DmpVersionStatus getVersionStatus() { public DmpVersionStatus getVersionStatus() {
return versionStatus; return this.versionStatus;
} }
public void setVersionStatus(DmpVersionStatus versionStatus) { public void setVersionStatus(DmpVersionStatus versionStatus) {

View File

@ -1,9 +1,12 @@
package org.opencdmp.elastic.data.nested; package org.opencdmp.elastic.data.nested;
import org.opencdmp.commons.enums.DmpUserRole;
import gr.cite.tools.elastic.ElasticConstants; import gr.cite.tools.elastic.ElasticConstants;
import org.opencdmp.commons.enums.DmpUserRole;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*; import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField;
import java.util.UUID; import java.util.UUID;
@ -12,10 +15,12 @@ public class NestedCollaboratorElasticEntity {
@Field(value = NestedCollaboratorElasticEntity._id, type = FieldType.Keyword) @Field(value = NestedCollaboratorElasticEntity._id, type = FieldType.Keyword)
private UUID id; private UUID id;
public final static String _id = "id"; public final static String _id = "id";
@Field(value = NestedCollaboratorElasticEntity._userId, type = FieldType.Keyword)
private UUID userId;
public final static String _userId = "userId";
@MultiField(mainField = @Field(value = NestedCollaboratorElasticEntity._name, type = FieldType.Text), otherFields = { @MultiField(mainField = @Field(value = NestedCollaboratorElasticEntity._name, type = FieldType.Text), otherFields = @InnerField(suffix = ElasticConstants.SubFields.keyword, type = FieldType.Keyword))
@InnerField(suffix = ElasticConstants.SubFields.keyword, type = FieldType.Keyword)
})
private String name; private String name;
public final static String _name = "name"; public final static String _name = "name";
@ -24,7 +29,7 @@ public class NestedCollaboratorElasticEntity {
public final static String _role = "role"; public final static String _role = "role";
public UUID getId() { public UUID getId() {
return id; return this.id;
} }
public void setId(UUID id) { public void setId(UUID id) {
@ -32,7 +37,7 @@ public class NestedCollaboratorElasticEntity {
} }
public String getName() { public String getName() {
return name; return this.name;
} }
public void setName(String name) { public void setName(String name) {
@ -40,10 +45,18 @@ public class NestedCollaboratorElasticEntity {
} }
public DmpUserRole getRole() { public DmpUserRole getRole() {
return role; return this.role;
} }
public void setRole(DmpUserRole role) { public void setRole(DmpUserRole role) {
this.role = role; this.role = role;
} }
public UUID getUserId() {
return this.userId;
}
public void setUserId(UUID userId) {
this.userId = userId;
}
} }

View File

@ -1,19 +1,17 @@
package org.opencdmp.elastic.elasticbuilder.nested; package org.opencdmp.elastic.elasticbuilder.nested;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.exception.MyApplicationException;
import gr.cite.tools.fieldset.BaseFieldSet;
import gr.cite.tools.logging.LoggerService;
import org.opencdmp.commons.enums.IsActive; import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.convention.ConventionService; import org.opencdmp.convention.ConventionService;
import org.opencdmp.data.DescriptionEntity;
import org.opencdmp.data.DmpUserEntity; import org.opencdmp.data.DmpUserEntity;
import org.opencdmp.data.UserEntity; import org.opencdmp.data.UserEntity;
import org.opencdmp.elastic.data.nested.NestedCollaboratorElasticEntity; import org.opencdmp.elastic.data.nested.NestedCollaboratorElasticEntity;
import org.opencdmp.elastic.elasticbuilder.BaseElasticBuilder; import org.opencdmp.elastic.elasticbuilder.BaseElasticBuilder;
import org.opencdmp.model.User; import org.opencdmp.model.User;
import org.opencdmp.query.DescriptionTemplateQuery;
import org.opencdmp.query.UserQuery; import org.opencdmp.query.UserQuery;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.exception.MyApplicationException;
import gr.cite.tools.fieldset.BaseFieldSet;
import gr.cite.tools.logging.LoggerService;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@ -24,7 +22,7 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class NestedCollaboratorElasticBuilder extends BaseElasticBuilder<NestedCollaboratorElasticEntity, DmpUserEntity> { public class NestedCollaboratorElasticBuilder extends BaseElasticBuilder<NestedCollaboratorElasticEntity, DmpUserEntity> {
private final QueryFactory queryFactory; private final QueryFactory queryFactory;
@ -46,6 +44,7 @@ public class NestedCollaboratorElasticBuilder extends BaseElasticBuilder<NestedC
for (DmpUserEntity d : data) { for (DmpUserEntity d : data) {
NestedCollaboratorElasticEntity m = new NestedCollaboratorElasticEntity(); NestedCollaboratorElasticEntity m = new NestedCollaboratorElasticEntity();
m.setId(d.getId()); m.setId(d.getId());
m.setUserId(d.getUserId());
m.setRole(d.getRole()); m.setRole(d.getRole());
m.setName(userNameMap.getOrDefault(d.getUserId(), d.getUserId().toString())); m.setName(userNameMap.getOrDefault(d.getUserId(), d.getUserId().toString()));
models.add(m); models.add(m);

View File

@ -1,6 +1,18 @@
package org.opencdmp.elastic.query; package org.opencdmp.elastic.query;
import co.elastic.clients.elasticsearch._types.query_dsl.Query; import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
import gr.cite.commons.web.authz.service.AuthorizationService;
import gr.cite.tools.data.query.FieldResolver;
import gr.cite.tools.data.query.OrderingFieldResolver;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.elastic.ElasticConstants;
import gr.cite.tools.elastic.configuration.ElasticProperties;
import gr.cite.tools.elastic.mapper.FieldBasedMapper;
import gr.cite.tools.elastic.query.ElasticField;
import gr.cite.tools.elastic.query.ElasticFields;
import gr.cite.tools.elastic.query.ElasticNestedQuery;
import gr.cite.tools.elastic.query.ElasticQuery;
import org.opencdmp.authorization.AuthorizationFlags; import org.opencdmp.authorization.AuthorizationFlags;
import org.opencdmp.authorization.Permission; import org.opencdmp.authorization.Permission;
import org.opencdmp.commons.enums.DescriptionStatus; import org.opencdmp.commons.enums.DescriptionStatus;
@ -8,20 +20,11 @@ import org.opencdmp.commons.enums.DmpAccessType;
import org.opencdmp.commons.enums.DmpStatus; import org.opencdmp.commons.enums.DmpStatus;
import org.opencdmp.commons.scope.tenant.TenantScope; import org.opencdmp.commons.scope.tenant.TenantScope;
import org.opencdmp.commons.scope.user.UserScope; import org.opencdmp.commons.scope.user.UserScope;
import org.opencdmp.service.elastic.AppElasticProperties;
import org.opencdmp.elastic.data.DescriptionElasticEntity; import org.opencdmp.elastic.data.DescriptionElasticEntity;
import org.opencdmp.elastic.data.DmpElasticEntity; import org.opencdmp.elastic.data.DmpElasticEntity;
import org.opencdmp.elastic.data.nested.NestedDmpElasticEntity; import org.opencdmp.elastic.data.nested.NestedDmpElasticEntity;
import org.opencdmp.service.elastic.AppElasticProperties;
import org.opencdmp.service.elastic.ElasticService; import org.opencdmp.service.elastic.ElasticService;
import gr.cite.commons.web.authz.service.AuthorizationService;
import gr.cite.tools.data.query.FieldResolver;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.elastic.configuration.ElasticProperties;
import gr.cite.tools.elastic.mapper.FieldBasedMapper;
import gr.cite.tools.elastic.query.ElasticField;
import gr.cite.tools.elastic.query.ElasticFields;
import gr.cite.tools.elastic.query.ElasticNestedQuery;
import gr.cite.tools.elastic.query.ElasticQuery;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
@ -137,7 +140,7 @@ public class DescriptionElasticQuery extends ElasticQuery<DescriptionElasticEnti
private final UserScope userScope; private final UserScope userScope;
private final TenantScope tenantScope; private final TenantScope tenantScope;
private final AuthorizationService authService; private final AuthorizationService authService;
@Autowired() @Autowired
public DescriptionElasticQuery(ElasticsearchTemplate elasticsearchTemplate, ElasticProperties elasticProperties, QueryFactory queryFactory, AppElasticProperties appElasticProperties, ElasticService elasticService, UserScope userScope, TenantScope tenantScope, AuthorizationService authService) { public DescriptionElasticQuery(ElasticsearchTemplate elasticsearchTemplate, ElasticProperties elasticProperties, QueryFactory queryFactory, AppElasticProperties appElasticProperties, ElasticService elasticService, UserScope userScope, TenantScope tenantScope, AuthorizationService authService) {
super(elasticsearchTemplate, elasticProperties); super(elasticsearchTemplate, elasticProperties);
this.queryFactory = queryFactory; this.queryFactory = queryFactory;
@ -199,7 +202,7 @@ public class DescriptionElasticQuery extends ElasticQuery<DescriptionElasticEnti
} }
if (userId != null) { if (userId != null) {
NestedCollaboratorElasticQuery query = this.queryFactory.query(NestedCollaboratorElasticQuery.class).nestedPath(DescriptionElasticEntity._dmp + "." + NestedDmpElasticEntity._collaborators); NestedCollaboratorElasticQuery query = this.queryFactory.query(NestedCollaboratorElasticQuery.class).nestedPath(DescriptionElasticEntity._dmp + "." + NestedDmpElasticEntity._collaborators);
query.ids(userId); query.userIds(userId);
predicates.add(this.nestedQuery(query).build()._toQuery()); predicates.add(this.nestedQuery(query).build()._toQuery());
} }
@ -213,39 +216,39 @@ public class DescriptionElasticQuery extends ElasticQuery<DescriptionElasticEnti
@Override @Override
protected Query applyFilters() { protected Query applyFilters() {
List<Query> predicates = new ArrayList<>(); List<Query> predicates = new ArrayList<>();
if (like != null && !like.isBlank()) { if (this.like != null && !this.like.isBlank()) {
if (!like.startsWith("*")) like = "*" + like; if (!this.like.startsWith("*")) this.like = "*" + this.like;
if (!like.endsWith("*")) like = like + "*"; if (!this.like.endsWith("*")) this.like = this.like + "*";
ElasticFields elasticFields = this.elasticFieldsOf(); ElasticFields elasticFields = this.elasticFieldsOf();
elasticFields.add("*", null, true); elasticFields.add("*", null, true);
predicates.add(this.or( predicates.add(this.or(
this.like(elasticFields, List.of(like))._toQuery(), this.like(elasticFields, List.of(this.like))._toQuery(),
QueryBuilders.nested().path(DescriptionElasticEntity._tags).query( QueryBuilders.nested().path(DescriptionElasticEntity._tags).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery(), ).build()._toQuery(),
QueryBuilders.nested().path(DescriptionElasticEntity._references).query( QueryBuilders.nested().path(DescriptionElasticEntity._references).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery(), ).build()._toQuery(),
QueryBuilders.nested().path(DescriptionElasticEntity._dmp + "." + NestedDmpElasticEntity._references).query( QueryBuilders.nested().path(DescriptionElasticEntity._dmp + "." + NestedDmpElasticEntity._references).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery(), ).build()._toQuery(),
QueryBuilders.nested().path(DescriptionElasticEntity._dmp + "." + NestedDmpElasticEntity._collaborators).query( QueryBuilders.nested().path(DescriptionElasticEntity._dmp + "." + NestedDmpElasticEntity._collaborators).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery(), ).build()._toQuery(),
QueryBuilders.nested().path(DescriptionElasticEntity._dmp + "." + NestedDmpElasticEntity._dois).query( QueryBuilders.nested().path(DescriptionElasticEntity._dmp + "." + NestedDmpElasticEntity._dois).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery() ).build()._toQuery()
)._toQuery()); )._toQuery());
} }
if (ids != null) { if (this.ids != null) {
predicates.add(this.containsUUID(this.elasticFieldOf(DescriptionElasticEntity._id), ids)._toQuery()); predicates.add(this.containsUUID(this.elasticFieldOf(DescriptionElasticEntity._id), this.ids)._toQuery());
} }
if (excludedIds != null) { if (this.excludedIds != null) {
predicates.add(this.not(this.containsUUID(this.elasticFieldOf(DescriptionElasticEntity._id), excludedIds)._toQuery())._toQuery()); predicates.add(this.not(this.containsUUID(this.elasticFieldOf(DescriptionElasticEntity._id), this.excludedIds)._toQuery())._toQuery());
} }
if (statuses != null) { if (this.statuses != null) {
predicates.add(this.contains(this.elasticFieldOf(DescriptionElasticEntity._status), statuses.stream().map(DescriptionStatus::getValue).toList().toArray(new Short[statuses.size()]))._toQuery()); predicates.add(this.contains(this.elasticFieldOf(DescriptionElasticEntity._status), this.statuses.stream().map(DescriptionStatus::getValue).toList().toArray(new Short[this.statuses.size()]))._toQuery());
} }
if (this.finalizedAfter != null) { if (this.finalizedAfter != null) {
predicates.add(this.dateGreaterThanQuery(this.elasticFieldOf(DescriptionElasticEntity._finalizedAt), this.finalizedAfter)._toQuery()); predicates.add(this.dateGreaterThanQuery(this.elasticFieldOf(DescriptionElasticEntity._finalizedAt), this.finalizedAfter)._toQuery());
@ -259,8 +262,8 @@ public class DescriptionElasticQuery extends ElasticQuery<DescriptionElasticEnti
if (this.createdBefore != null) { if (this.createdBefore != null) {
predicates.add(this.dateLessThanQuery(this.elasticFieldOf(DescriptionElasticEntity._createdAt), this.createdBefore)._toQuery()); predicates.add(this.dateLessThanQuery(this.elasticFieldOf(DescriptionElasticEntity._createdAt), this.createdBefore)._toQuery());
} }
if (dmpSubQuery != null) { if (this.dmpSubQuery != null) {
predicates.add(dmpSubQuery.innerPath(DescriptionElasticEntity._dmp).applyFilters()); predicates.add(this.dmpSubQuery.innerPath(DescriptionElasticEntity._dmp).applyFilters());
} }
if (!predicates.isEmpty()) { if (!predicates.isEmpty()) {
return this.and(predicates); return this.and(predicates);
@ -288,7 +291,7 @@ public class DescriptionElasticQuery extends ElasticQuery<DescriptionElasticEnti
@Override @Override
protected ElasticField fieldNameOf(FieldResolver item) { protected ElasticField fieldNameOf(FieldResolver item) {
if (item.match(DescriptionElasticEntity._id)) return this.elasticFieldOf(DescriptionElasticEntity._id); if (item.match(DescriptionElasticEntity._id)) return this.elasticFieldOf(DescriptionElasticEntity._id);
else if (item.match(DescriptionElasticEntity._label)) return this.elasticFieldOf(DescriptionElasticEntity._label); else if (item.match(DescriptionElasticEntity._label)) return item instanceof OrderingFieldResolver ? this.elasticFieldOf(DescriptionElasticEntity._label).subfield(ElasticConstants.SubFields.keyword) : this.elasticFieldOf(DescriptionElasticEntity._label);
else if (item.match(DescriptionElasticEntity._description)) return this.elasticFieldOf(DescriptionElasticEntity._description); else if (item.match(DescriptionElasticEntity._description)) return this.elasticFieldOf(DescriptionElasticEntity._description);
else if (item.match(DescriptionElasticEntity._status)) return this.elasticFieldOf(DescriptionElasticEntity._status); else if (item.match(DescriptionElasticEntity._status)) return this.elasticFieldOf(DescriptionElasticEntity._status);
else if (item.match(DescriptionElasticEntity._finalizedAt)) return this.elasticFieldOf(DescriptionElasticEntity._finalizedAt); else if (item.match(DescriptionElasticEntity._finalizedAt)) return this.elasticFieldOf(DescriptionElasticEntity._finalizedAt);

View File

@ -1,6 +1,18 @@
package org.opencdmp.elastic.query; package org.opencdmp.elastic.query;
import co.elastic.clients.elasticsearch._types.query_dsl.Query; import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
import gr.cite.commons.web.authz.service.AuthorizationService;
import gr.cite.tools.data.query.FieldResolver;
import gr.cite.tools.data.query.OrderingFieldResolver;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.elastic.ElasticConstants;
import gr.cite.tools.elastic.configuration.ElasticProperties;
import gr.cite.tools.elastic.mapper.FieldBasedMapper;
import gr.cite.tools.elastic.query.ElasticField;
import gr.cite.tools.elastic.query.ElasticFields;
import gr.cite.tools.elastic.query.ElasticNestedQuery;
import gr.cite.tools.elastic.query.ElasticQuery;
import org.opencdmp.authorization.AuthorizationFlags; import org.opencdmp.authorization.AuthorizationFlags;
import org.opencdmp.authorization.Permission; import org.opencdmp.authorization.Permission;
import org.opencdmp.commons.enums.DmpAccessType; import org.opencdmp.commons.enums.DmpAccessType;
@ -9,16 +21,10 @@ import org.opencdmp.commons.enums.DmpVersionStatus;
import org.opencdmp.commons.scope.tenant.TenantScope; import org.opencdmp.commons.scope.tenant.TenantScope;
import org.opencdmp.commons.scope.user.UserScope; import org.opencdmp.commons.scope.user.UserScope;
import org.opencdmp.elastic.data.DescriptionElasticEntity; import org.opencdmp.elastic.data.DescriptionElasticEntity;
import org.opencdmp.service.elastic.AppElasticProperties;
import org.opencdmp.elastic.data.DmpElasticEntity; import org.opencdmp.elastic.data.DmpElasticEntity;
import org.opencdmp.elastic.data.nested.NestedDescriptionElasticEntity; import org.opencdmp.elastic.data.nested.NestedDescriptionElasticEntity;
import org.opencdmp.service.elastic.AppElasticProperties;
import org.opencdmp.service.elastic.ElasticService; import org.opencdmp.service.elastic.ElasticService;
import gr.cite.commons.web.authz.service.AuthorizationService;
import gr.cite.tools.data.query.FieldResolver;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.elastic.configuration.ElasticProperties;
import gr.cite.tools.elastic.mapper.FieldBasedMapper;
import gr.cite.tools.elastic.query.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
@ -167,7 +173,7 @@ public class DmpElasticQuery extends ElasticQuery<DmpElasticEntity, UUID> {
private final UserScope userScope; private final UserScope userScope;
private final TenantScope tenantScope; private final TenantScope tenantScope;
private final AuthorizationService authService; private final AuthorizationService authService;
@Autowired() @Autowired
public DmpElasticQuery(ElasticsearchTemplate elasticsearchTemplate, ElasticProperties elasticProperties, QueryFactory queryFactory, AppElasticProperties appElasticProperties, ElasticService elasticService, UserScope userScope, TenantScope tenantScope, AuthorizationService authService) { public DmpElasticQuery(ElasticsearchTemplate elasticsearchTemplate, ElasticProperties elasticProperties, QueryFactory queryFactory, AppElasticProperties appElasticProperties, ElasticService elasticService, UserScope userScope, TenantScope tenantScope, AuthorizationService authService) {
super(elasticsearchTemplate, elasticProperties); super(elasticsearchTemplate, elasticProperties);
this.queryFactory = queryFactory; this.queryFactory = queryFactory;
@ -227,7 +233,7 @@ public class DmpElasticQuery extends ElasticQuery<DmpElasticEntity, UUID> {
} }
if (userId != null) { if (userId != null) {
NestedCollaboratorElasticQuery query = this.queryFactory.query(NestedCollaboratorElasticQuery.class).nestedPath(DmpElasticEntity._collaborators); NestedCollaboratorElasticQuery query = this.queryFactory.query(NestedCollaboratorElasticQuery.class).nestedPath(DmpElasticEntity._collaborators);
query.ids(userId); query.userIds(userId);
predicates.add(this.nestedQuery(query).build()._toQuery()); predicates.add(this.nestedQuery(query).build()._toQuery());
} }
if (!predicates.isEmpty()) { if (!predicates.isEmpty()) {
@ -241,53 +247,54 @@ public class DmpElasticQuery extends ElasticQuery<DmpElasticEntity, UUID> {
protected Query applyFilters() { protected Query applyFilters() {
List<Query> predicates = new ArrayList<>(); List<Query> predicates = new ArrayList<>();
if (like != null && !like.isBlank()) { if (this.like != null && !this.like.isBlank()) {
if (!like.startsWith("*")) like = "*" + like; if (!this.like.startsWith("*")) this.like = "*" + this.like;
if (!like.endsWith("*")) like = like + "*"; if (!this.like.endsWith("*")) this.like = this.like + "*";
ElasticFields elasticFields = this.elasticFieldsOf(); ElasticFields elasticFields = this.elasticFieldsOf();
elasticFields.add("*", null, true); elasticFields.add("*", null, true);
predicates.add(this.or( predicates.add(this.or(
this.like(elasticFields, List.of(like))._toQuery(), this.like(elasticFields, List.of(this.like))._toQuery()
,
QueryBuilders.nested().path(DmpElasticEntity._collaborators).query( QueryBuilders.nested().path(DmpElasticEntity._collaborators).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery(), ).build()._toQuery(),
QueryBuilders.nested().path(DmpElasticEntity._references).query( QueryBuilders.nested().path(DmpElasticEntity._references).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery(), ).build()._toQuery(),
QueryBuilders.nested().path(DmpElasticEntity._descriptions + "." + NestedDescriptionElasticEntity._references).query( QueryBuilders.nested().path(DmpElasticEntity._descriptions + "." + NestedDescriptionElasticEntity._references).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery(), ).build()._toQuery(),
QueryBuilders.nested().path(DmpElasticEntity._descriptions + "." + NestedDescriptionElasticEntity._tags).query( QueryBuilders.nested().path(DmpElasticEntity._descriptions + "." + NestedDescriptionElasticEntity._tags).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery(), ).build()._toQuery(),
QueryBuilders.nested().path(DmpElasticEntity._descriptions).query( QueryBuilders.nested().path(DmpElasticEntity._descriptions).query(
this.like(elasticFields, List.of(like))._toQuery() this.like(elasticFields, List.of(this.like))._toQuery()
).build()._toQuery() ).build()._toQuery()
)._toQuery()); )._toQuery());
} }
if (ids != null) { if (this.ids != null) {
predicates.add(this.containsUUID(this.elasticFieldOf(DmpElasticEntity._id), ids)._toQuery()); predicates.add(this.containsUUID(this.elasticFieldOf(DmpElasticEntity._id), this.ids)._toQuery());
} }
if (groupIds != null) { if (this.groupIds != null) {
predicates.add(this.containsUUID(this.elasticFieldOf(DmpElasticEntity._groupId), groupIds)._toQuery()); predicates.add(this.containsUUID(this.elasticFieldOf(DmpElasticEntity._groupId), this.groupIds)._toQuery());
} }
if (versions != null) { if (this.versions != null) {
predicates.add(this.contains(this.elasticFieldOf(DmpElasticEntity._version), versions.toArray(new Integer[versions.size()]))._toQuery()); predicates.add(this.contains(this.elasticFieldOf(DmpElasticEntity._version), this.versions.toArray(new Integer[this.versions.size()]))._toQuery());
} }
if (excludedIds != null) { if (this.excludedIds != null) {
predicates.add(this.not(this.containsUUID(this.elasticFieldOf(DmpElasticEntity._id), excludedIds)._toQuery())._toQuery()); predicates.add(this.not(this.containsUUID(this.elasticFieldOf(DmpElasticEntity._id), this.excludedIds)._toQuery())._toQuery());
} }
if (statuses != null) { if (this.statuses != null) {
predicates.add(this.contains(this.elasticFieldOf(DmpElasticEntity._status), statuses.stream().map(x-> x.getValue()).collect(Collectors.toList()).toArray(new Short[statuses.size()]))._toQuery()); predicates.add(this.contains(this.elasticFieldOf(DmpElasticEntity._status), this.statuses.stream().map(x-> x.getValue()).collect(Collectors.toList()).toArray(new Short[this.statuses.size()]))._toQuery());
} }
if (versionStatuses != null) { if (this.versionStatuses != null) {
predicates.add(this.contains(this.elasticFieldOf(DmpElasticEntity._versionStatus), versionStatuses.stream().map(x-> x.getValue()).collect(Collectors.toList()).toArray(new Short[versionStatuses.size()]))._toQuery()); predicates.add(this.contains(this.elasticFieldOf(DmpElasticEntity._versionStatus), this.versionStatuses.stream().map(x-> x.getValue()).collect(Collectors.toList()).toArray(new Short[this.versionStatuses.size()]))._toQuery());
} }
if (accessTypes != null) { if (this.accessTypes != null) {
predicates.add(this.contains(this.elasticFieldOf(DmpElasticEntity._accessType), accessTypes.stream().map(x-> x.getValue()).collect(Collectors.toList()).toArray(new Short[accessTypes.size()]))._toQuery()); predicates.add(this.contains(this.elasticFieldOf(DmpElasticEntity._accessType), this.accessTypes.stream().map(x-> x.getValue()).collect(Collectors.toList()).toArray(new Short[this.accessTypes.size()]))._toQuery());
} }
if (!predicates.isEmpty()) { if (!predicates.isEmpty()) {
@ -318,7 +325,7 @@ public class DmpElasticQuery extends ElasticQuery<DmpElasticEntity, UUID> {
@Override @Override
protected ElasticField fieldNameOf(FieldResolver item) { protected ElasticField fieldNameOf(FieldResolver item) {
if (item.match(DmpElasticEntity._id)) return this.elasticFieldOf(DmpElasticEntity._id); if (item.match(DmpElasticEntity._id)) return this.elasticFieldOf(DmpElasticEntity._id);
else if (item.match(DmpElasticEntity._label)) return this.elasticFieldOf(DmpElasticEntity._label); else if (item.match(DmpElasticEntity._label)) return item instanceof OrderingFieldResolver ? this.elasticFieldOf(DmpElasticEntity._label).subfield(ElasticConstants.SubFields.keyword) : this.elasticFieldOf(DmpElasticEntity._label);
else if (item.match(DmpElasticEntity._description)) return this.elasticFieldOf(DmpElasticEntity._description); else if (item.match(DmpElasticEntity._description)) return this.elasticFieldOf(DmpElasticEntity._description);
else if (item.match(DmpElasticEntity._status)) return this.elasticFieldOf(DmpElasticEntity._status); else if (item.match(DmpElasticEntity._status)) return this.elasticFieldOf(DmpElasticEntity._status);
else if (item.match(DmpElasticEntity._version)) return this.elasticFieldOf(DmpElasticEntity._version); else if (item.match(DmpElasticEntity._version)) return this.elasticFieldOf(DmpElasticEntity._version);

View File

@ -1,28 +1,25 @@
package org.opencdmp.elastic.query; package org.opencdmp.elastic.query;
import co.elastic.clients.elasticsearch._types.query_dsl.Query; import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import org.opencdmp.commons.enums.DescriptionStatus;
import org.opencdmp.commons.enums.DmpUserRole;
import org.opencdmp.elastic.data.DescriptionElasticEntity;
import org.opencdmp.elastic.data.DmpElasticEntity;
import org.opencdmp.elastic.data.nested.NestedCollaboratorElasticEntity;
import gr.cite.tools.data.query.FieldResolver; import gr.cite.tools.data.query.FieldResolver;
import gr.cite.tools.elastic.configuration.ElasticProperties; import gr.cite.tools.elastic.configuration.ElasticProperties;
import gr.cite.tools.elastic.mapper.FieldBasedMapper; import gr.cite.tools.elastic.mapper.FieldBasedMapper;
import gr.cite.tools.elastic.query.ElasticField; import gr.cite.tools.elastic.query.ElasticField;
import gr.cite.tools.elastic.query.ElasticNestedQuery; import gr.cite.tools.elastic.query.ElasticNestedQuery;
import org.opencdmp.commons.enums.DmpUserRole;
import org.opencdmp.elastic.data.nested.NestedCollaboratorElasticEntity;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Component @Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class NestedCollaboratorElasticQuery extends ElasticNestedQuery<NestedCollaboratorElasticQuery, NestedCollaboratorElasticEntity, UUID> { public class NestedCollaboratorElasticQuery extends ElasticNestedQuery<NestedCollaboratorElasticQuery, NestedCollaboratorElasticEntity, UUID> {
private Collection<UUID> ids; private Collection<UUID> ids;
private Collection<UUID> userIds;
private Collection<DmpUserRole> userRoles; private Collection<DmpUserRole> userRoles;
@ -42,6 +39,21 @@ public class NestedCollaboratorElasticQuery extends ElasticNestedQuery<NestedCol
return this; return this;
} }
public NestedCollaboratorElasticQuery userIds(UUID value) {
this.userIds = List.of(value);
return this;
}
public NestedCollaboratorElasticQuery userIds(UUID... value) {
this.userIds = Arrays.asList(value);
return this;
}
public NestedCollaboratorElasticQuery userIds(Collection<UUID> values) {
this.userIds = values;
return this;
}
public NestedCollaboratorElasticQuery userRoles(DmpUserRole value) { public NestedCollaboratorElasticQuery userRoles(DmpUserRole value) {
this.userRoles = List.of(value); this.userRoles = List.of(value);
return this; return this;
@ -79,7 +91,7 @@ public class NestedCollaboratorElasticQuery extends ElasticNestedQuery<NestedCol
@Override @Override
protected Boolean isFalseQuery() { protected Boolean isFalseQuery() {
return this.isEmpty(this.ids) || this.isEmpty(this.userRoles); return this.isEmpty(this.ids) || this.isEmpty(this.userIds) ||this.isEmpty(this.userRoles);
} }
@Override @Override
@ -90,12 +102,15 @@ public class NestedCollaboratorElasticQuery extends ElasticNestedQuery<NestedCol
@Override @Override
protected Query applyFilters() { protected Query applyFilters() {
List<Query> predicates = new ArrayList<>(); List<Query> predicates = new ArrayList<>();
if (ids != null) { if (this.ids != null) {
predicates.add(this.containsUUID(this.elasticFieldOf(NestedCollaboratorElasticEntity._id), ids)._toQuery()); predicates.add(this.containsUUID(this.elasticFieldOf(NestedCollaboratorElasticEntity._id), this.ids)._toQuery());
}
if (this.userIds != null) {
predicates.add(this.containsUUID(this.elasticFieldOf(NestedCollaboratorElasticEntity._userId), this.userIds)._toQuery());
} }
if (userRoles != null) { if (this.userRoles != null) {
predicates.add(this.contains(this.elasticFieldOf(NestedCollaboratorElasticEntity._role), userRoles.stream().map(DmpUserRole::getValue).toList().toArray(new Short[userRoles.size()]))._toQuery()); predicates.add(this.contains(this.elasticFieldOf(NestedCollaboratorElasticEntity._role), this.userRoles.stream().map(DmpUserRole::getValue).toList().toArray(new Short[this.userRoles.size()]))._toQuery());
} }
if (!predicates.isEmpty()) { if (!predicates.isEmpty()) {
@ -109,6 +124,7 @@ public class NestedCollaboratorElasticQuery extends ElasticNestedQuery<NestedCol
public NestedCollaboratorElasticEntity convert(Map<String, Object> rawData, Set<String> columns) { public NestedCollaboratorElasticEntity convert(Map<String, Object> rawData, Set<String> columns) {
NestedCollaboratorElasticEntity mocDoc = new NestedCollaboratorElasticEntity(); NestedCollaboratorElasticEntity mocDoc = new NestedCollaboratorElasticEntity();
if (columns.contains(NestedCollaboratorElasticEntity._id)) mocDoc.setId(FieldBasedMapper.shallowSafeConversion(rawData.get(NestedCollaboratorElasticEntity._id), UUID.class)); if (columns.contains(NestedCollaboratorElasticEntity._id)) mocDoc.setId(FieldBasedMapper.shallowSafeConversion(rawData.get(NestedCollaboratorElasticEntity._id), UUID.class));
if (columns.contains(NestedCollaboratorElasticEntity._userId)) mocDoc.setUserId(FieldBasedMapper.shallowSafeConversion(rawData.get(NestedCollaboratorElasticEntity._userId), UUID.class));
if (columns.contains(NestedCollaboratorElasticEntity._name)) mocDoc.setName(FieldBasedMapper.shallowSafeConversion(rawData.get(NestedCollaboratorElasticEntity._name), String.class)); if (columns.contains(NestedCollaboratorElasticEntity._name)) mocDoc.setName(FieldBasedMapper.shallowSafeConversion(rawData.get(NestedCollaboratorElasticEntity._name), String.class));
if (columns.contains(NestedCollaboratorElasticEntity._role)) mocDoc.setRole(FieldBasedMapper.shallowSafeConversion(rawData.get(NestedCollaboratorElasticEntity._role), DmpUserRole.class)); if (columns.contains(NestedCollaboratorElasticEntity._role)) mocDoc.setRole(FieldBasedMapper.shallowSafeConversion(rawData.get(NestedCollaboratorElasticEntity._role), DmpUserRole.class));
return mocDoc; return mocDoc;
@ -117,6 +133,7 @@ public class NestedCollaboratorElasticQuery extends ElasticNestedQuery<NestedCol
@Override @Override
protected ElasticField fieldNameOf(FieldResolver item) { protected ElasticField fieldNameOf(FieldResolver item) {
if (item.match(NestedCollaboratorElasticEntity._id)) return this.elasticFieldOf(NestedCollaboratorElasticEntity._id).disableInfer(true); if (item.match(NestedCollaboratorElasticEntity._id)) return this.elasticFieldOf(NestedCollaboratorElasticEntity._id).disableInfer(true);
else if (item.match(NestedCollaboratorElasticEntity._userId)) return this.elasticFieldOf(NestedCollaboratorElasticEntity._userId).disableInfer(true);
else if (item.match(NestedCollaboratorElasticEntity._name)) return this.elasticFieldOf(NestedCollaboratorElasticEntity._name).disableInfer(true); else if (item.match(NestedCollaboratorElasticEntity._name)) return this.elasticFieldOf(NestedCollaboratorElasticEntity._name).disableInfer(true);
else if (item.match(NestedCollaboratorElasticEntity._role)) return this.elasticFieldOf(NestedCollaboratorElasticEntity._role).disableInfer(true); else if (item.match(NestedCollaboratorElasticEntity._role)) return this.elasticFieldOf(NestedCollaboratorElasticEntity._role).disableInfer(true);
else return null; else return null;

View File

@ -1,5 +1,9 @@
package org.opencdmp.model.builder.commonmodels; package org.opencdmp.model.builder.commonmodels;
import gr.cite.tools.data.builder.BuilderFactory;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.exception.MyApplicationException;
import gr.cite.tools.logging.LoggerService;
import org.opencdmp.authorization.AuthorizationFlags; import org.opencdmp.authorization.AuthorizationFlags;
import org.opencdmp.commonmodels.enums.DmpUserRole; import org.opencdmp.commonmodels.enums.DmpUserRole;
import org.opencdmp.commonmodels.models.DmpUserModel; import org.opencdmp.commonmodels.models.DmpUserModel;
@ -9,10 +13,6 @@ import org.opencdmp.convention.ConventionService;
import org.opencdmp.data.DmpUserEntity; import org.opencdmp.data.DmpUserEntity;
import org.opencdmp.data.UserEntity; import org.opencdmp.data.UserEntity;
import org.opencdmp.query.UserQuery; import org.opencdmp.query.UserQuery;
import gr.cite.tools.data.builder.BuilderFactory;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.exception.MyApplicationException;
import gr.cite.tools.logging.LoggerService;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@ -23,7 +23,7 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DmpUserCommonModelBuilder extends BaseCommonModelBuilder<DmpUserModel, DmpUserEntity> { public class DmpUserCommonModelBuilder extends BaseCommonModelBuilder<DmpUserModel, DmpUserEntity> {
private final BuilderFactory builderFactory; private final BuilderFactory builderFactory;
@ -61,6 +61,8 @@ public class DmpUserCommonModelBuilder extends BaseCommonModelBuilder<DmpUserMod
switch (d.getRole()){ switch (d.getRole()){
case User -> m.setRole(DmpUserRole.User); case User -> m.setRole(DmpUserRole.User);
case Owner -> m.setRole(DmpUserRole.Owner); case Owner -> m.setRole(DmpUserRole.Owner);
case DescriptionContributor -> m.setRole(DmpUserRole.DescriptionContributor);
case Reviewer -> m.setRole(DmpUserRole.Reviewer);
default -> throw new MyApplicationException("unrecognized type " + d.getRole().getValue()); default -> throw new MyApplicationException("unrecognized type " + d.getRole().getValue());
} }
if (userItemsMap != null && userItemsMap.containsKey(d.getUserId())) m.setUser(userItemsMap.get(d.getUserId())); if (userItemsMap != null && userItemsMap.containsKey(d.getUserId())) m.setUser(userItemsMap.get(d.getUserId()));

View File

@ -1,15 +1,5 @@
package org.opencdmp.query; package org.opencdmp.query;
import org.opencdmp.authorization.AuthorizationFlags;
import org.opencdmp.authorization.Permission;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.commons.scope.user.UserScope;
import org.opencdmp.data.*;
import org.opencdmp.model.Language;
import org.opencdmp.model.User;
import org.opencdmp.model.PublicUser;
import org.opencdmp.query.utils.BuildSubQueryInput;
import org.opencdmp.query.utils.QueryUtilsService;
import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.commons.web.authz.service.AuthorizationService;
import gr.cite.tools.data.query.FieldResolver; import gr.cite.tools.data.query.FieldResolver;
import gr.cite.tools.data.query.QueryBase; import gr.cite.tools.data.query.QueryBase;
@ -19,16 +9,27 @@ import jakarta.persistence.Tuple;
import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Subquery; import jakarta.persistence.criteria.Subquery;
import org.opencdmp.authorization.AuthorizationFlags;
import org.opencdmp.authorization.Permission;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.commons.scope.user.UserScope;
import org.opencdmp.data.DmpUserEntity;
import org.opencdmp.data.UserContactInfoEntity;
import org.opencdmp.data.UserEntity;
import org.opencdmp.data.UserRoleEntity;
import org.opencdmp.model.PublicUser;
import org.opencdmp.model.User;
import org.opencdmp.query.utils.BuildSubQueryInput;
import org.opencdmp.query.utils.QueryUtilsService;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.Instant; import java.time.Instant;
import java.util.*; import java.util.*;
@Component @Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UserQuery extends QueryBase<UserEntity> { public class UserQuery extends QueryBase<UserEntity> {
private String like; private String like;
private Boolean dmpAssociated; private Boolean dmpAssociated;
@ -159,12 +160,12 @@ public class UserQuery extends QueryBase<UserEntity> {
UUID finalUserId = userId; UUID finalUserId = userId;
predicates.add(queryContext.CriteriaBuilder.or( predicates.add(queryContext.CriteriaBuilder.or(
userId != null ? queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)).value(userId) : queryContext.CriteriaBuilder.or(), //Creates a false query userId != null ? queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)).value(userId) : queryContext.CriteriaBuilder.or(), //Creates a false query
queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)).value(queryUtilsService.buildSubQuery(new BuildSubQueryInput<>(new BuildSubQueryInput.Builder<>(DmpUserEntity.class, UUID.class) queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)).value(this.queryUtilsService.buildSubQuery(new BuildSubQueryInput<>(new BuildSubQueryInput.Builder<>(DmpUserEntity.class, UUID.class)
.query(queryContext.Query) .query(queryContext.Query)
.criteriaBuilder(queryContext.CriteriaBuilder) .criteriaBuilder(queryContext.CriteriaBuilder)
.keyPathFunc((subQueryRoot) -> subQueryRoot.get(DmpUserEntity._userId)) .keyPathFunc((subQueryRoot) -> subQueryRoot.get(DmpUserEntity._userId))
.filterFunc((subQueryRoot, cb) -> .filterFunc((subQueryRoot, cb) ->
cb.in(subQueryRoot.get(DmpUserEntity._dmpId)).value(queryUtilsService.buildDmpAuthZSubQuery(queryContext.Query, queryContext.CriteriaBuilder, finalUserId, usePublic)) cb.in(subQueryRoot.get(DmpUserEntity._dmpId)).value(this.queryUtilsService.buildDmpAuthZSubQuery(queryContext.Query, queryContext.CriteriaBuilder, finalUserId, usePublic))
) )
))) )))
)); ));
@ -181,7 +182,7 @@ public class UserQuery extends QueryBase<UserEntity> {
protected <X, Y> Predicate applyFilters(QueryContext<X, Y> queryContext) { protected <X, Y> Predicate applyFilters(QueryContext<X, Y> queryContext) {
List<Predicate> predicates = new ArrayList<>(); List<Predicate> predicates = new ArrayList<>();
if (this.like != null && !this.like.isEmpty()) { if (this.like != null && !this.like.isEmpty()) {
predicates.add(queryUtilsService.ilike(queryContext.CriteriaBuilder, queryContext.Root.get(UserEntity._name), this.like)); predicates.add(this.queryUtilsService.ilike(queryContext.CriteriaBuilder, queryContext.Root.get(UserEntity._name), this.like));
} }
if (this.ids != null) { if (this.ids != null) {
CriteriaBuilder.In<UUID> inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)); CriteriaBuilder.In<UUID> inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id));
@ -202,7 +203,7 @@ public class UserQuery extends QueryBase<UserEntity> {
predicates.add(inClause); predicates.add(inClause);
} }
if (this.emails != null) { if (this.emails != null) {
Subquery<UUID> userContactInfoSubquery = queryUtilsService.buildSubQuery(new BuildSubQueryInput<>( Subquery<UUID> userContactInfoSubquery = this.queryUtilsService.buildSubQuery(new BuildSubQueryInput<>(
new BuildSubQueryInput.Builder<>(UserContactInfoQuery.class, UUID.class, queryContext) new BuildSubQueryInput.Builder<>(UserContactInfoQuery.class, UUID.class, queryContext)
.keyPathFunc((subQueryRoot) -> subQueryRoot.get(UserContactInfoEntity._id)) .keyPathFunc((subQueryRoot) -> subQueryRoot.get(UserContactInfoEntity._id))
.filterFunc((subQueryRoot, cb) -> { .filterFunc((subQueryRoot, cb) -> {
@ -224,7 +225,7 @@ public class UserQuery extends QueryBase<UserEntity> {
if (this.userScope.isSet()) userId = this.userScope.getUserIdSafe(); if (this.userScope.isSet()) userId = this.userScope.getUserIdSafe();
else throw new MyNotFoundException("Only user scoped allowed"); else throw new MyNotFoundException("Only user scoped allowed");
Subquery<UUID> dmpUserDmpQuery = queryUtilsService.buildSubQuery(new BuildSubQueryInput<>( Subquery<UUID> dmpUserDmpQuery = this.queryUtilsService.buildSubQuery(new BuildSubQueryInput<>(
new BuildSubQueryInput.Builder<>(DmpUserEntity.class, UUID.class, queryContext) new BuildSubQueryInput.Builder<>(DmpUserEntity.class, UUID.class, queryContext)
.keyPathFunc((subQueryRoot) -> subQueryRoot.get(DmpUserEntity._dmpId)) .keyPathFunc((subQueryRoot) -> subQueryRoot.get(DmpUserEntity._dmpId))
.filterFunc((subQueryRoot, cb) -> cb.and( .filterFunc((subQueryRoot, cb) -> cb.and(
@ -233,7 +234,7 @@ public class UserQuery extends QueryBase<UserEntity> {
)) ))
)); ));
Subquery<UUID> dmpUserUserQuery = queryUtilsService.buildSubQuery(new BuildSubQueryInput<>( Subquery<UUID> dmpUserUserQuery = this.queryUtilsService.buildSubQuery(new BuildSubQueryInput<>(
new BuildSubQueryInput.Builder<>(DmpUserEntity.class, UUID.class, queryContext) new BuildSubQueryInput.Builder<>(DmpUserEntity.class, UUID.class, queryContext)
.keyPathFunc((subQueryRoot) -> subQueryRoot.get(DmpUserEntity._userId)) .keyPathFunc((subQueryRoot) -> subQueryRoot.get(DmpUserEntity._userId))
.filterFunc((subQueryRoot, cb) -> cb.and( .filterFunc((subQueryRoot, cb) -> cb.and(

View File

@ -1,12 +1,12 @@
package org.opencdmp.query.lookup; package org.opencdmp.query.lookup;
import gr.cite.tools.data.query.Lookup;
import gr.cite.tools.data.query.QueryFactory;
import org.apache.commons.lang3.StringUtils;
import org.opencdmp.commons.enums.DescriptionStatus; import org.opencdmp.commons.enums.DescriptionStatus;
import org.opencdmp.commons.enums.IsActive; import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.elastic.query.DescriptionElasticQuery; import org.opencdmp.elastic.query.DescriptionElasticQuery;
import org.opencdmp.elastic.query.InnerObjectDmpElasticQuery;
import org.opencdmp.query.DescriptionQuery; import org.opencdmp.query.DescriptionQuery;
import gr.cite.tools.data.query.Lookup;
import gr.cite.tools.data.query.QueryFactory;
import java.time.Instant; import java.time.Instant;
import java.util.List; import java.util.List;
@ -31,7 +31,7 @@ public class DescriptionLookup extends Lookup {
private List<DescriptionStatus> statuses; private List<DescriptionStatus> statuses;
public String getLike() { public String getLike() {
return like; return this.like;
} }
public void setLike(String like) { public void setLike(String like) {
@ -39,7 +39,7 @@ public class DescriptionLookup extends Lookup {
} }
public List<UUID> getIds() { public List<UUID> getIds() {
return ids; return this.ids;
} }
public void setIds(List<UUID> ids) { public void setIds(List<UUID> ids) {
@ -47,7 +47,7 @@ public class DescriptionLookup extends Lookup {
} }
public List<UUID> getExcludedIds() { public List<UUID> getExcludedIds() {
return excludedIds; return this.excludedIds;
} }
public void setExcludedIds(List<UUID> excludedIds) { public void setExcludedIds(List<UUID> excludedIds) {
@ -55,7 +55,7 @@ public class DescriptionLookup extends Lookup {
} }
public List<IsActive> getIsActive() { public List<IsActive> getIsActive() {
return isActive; return this.isActive;
} }
public void setIsActive(List<IsActive> isActive) { public void setIsActive(List<IsActive> isActive) {
@ -63,7 +63,7 @@ public class DescriptionLookup extends Lookup {
} }
public List<DescriptionStatus> getStatuses() { public List<DescriptionStatus> getStatuses() {
return statuses; return this.statuses;
} }
public void setStatuses(List<DescriptionStatus> statuses) { public void setStatuses(List<DescriptionStatus> statuses) {
@ -71,7 +71,7 @@ public class DescriptionLookup extends Lookup {
} }
public DmpLookup getDmpSubQuery() { public DmpLookup getDmpSubQuery() {
return dmpSubQuery; return this.dmpSubQuery;
} }
public void setDmpSubQuery(DmpLookup dmpSubQuery) { public void setDmpSubQuery(DmpLookup dmpSubQuery) {
@ -79,7 +79,7 @@ public class DescriptionLookup extends Lookup {
} }
public Instant getCreatedAfter() { public Instant getCreatedAfter() {
return createdAfter; return this.createdAfter;
} }
public void setCreatedAfter(Instant createdAfter) { public void setCreatedAfter(Instant createdAfter) {
@ -87,7 +87,7 @@ public class DescriptionLookup extends Lookup {
} }
public Instant getCreatedBefore() { public Instant getCreatedBefore() {
return createdBefore; return this.createdBefore;
} }
public void setCreatedBefore(Instant createdBefore) { public void setCreatedBefore(Instant createdBefore) {
@ -95,7 +95,7 @@ public class DescriptionLookup extends Lookup {
} }
public Instant getFinalizedAfter() { public Instant getFinalizedAfter() {
return finalizedAfter; return this.finalizedAfter;
} }
public void setFinalizedAfter(Instant finalizedAfter) { public void setFinalizedAfter(Instant finalizedAfter) {
@ -103,7 +103,7 @@ public class DescriptionLookup extends Lookup {
} }
public Instant getFinalizedBefore() { public Instant getFinalizedBefore() {
return finalizedBefore; return this.finalizedBefore;
} }
public void setFinalizedBefore(Instant finalizedBefore) { public void setFinalizedBefore(Instant finalizedBefore) {
@ -130,8 +130,7 @@ public class DescriptionLookup extends Lookup {
public DescriptionElasticQuery enrichElastic(QueryFactory queryFactory) { public DescriptionElasticQuery enrichElastic(QueryFactory queryFactory) {
DescriptionElasticQuery query = queryFactory.query(DescriptionElasticQuery.class); DescriptionElasticQuery query = queryFactory.query(DescriptionElasticQuery.class);
InnerObjectDmpElasticQuery dmpElasticQuery = null; if (this.like != null) query.like(StringUtils.strip(this.like, "%"));
if (this.like != null) query.like(this.like);
if (this.ids != null) query.ids(this.ids); if (this.ids != null) query.ids(this.ids);
if (this.excludedIds != null) query.excludedIds(this.excludedIds); if (this.excludedIds != null) query.excludedIds(this.excludedIds);
if (this.statuses != null) query.statuses(this.statuses); if (this.statuses != null) query.statuses(this.statuses);

View File

@ -1,15 +1,15 @@
package org.opencdmp.query.lookup; package org.opencdmp.query.lookup;
import gr.cite.tools.data.query.Lookup;
import gr.cite.tools.data.query.QueryFactory;
import org.apache.commons.lang3.StringUtils;
import org.opencdmp.commons.enums.DmpAccessType; import org.opencdmp.commons.enums.DmpAccessType;
import org.opencdmp.commons.enums.DmpStatus; import org.opencdmp.commons.enums.DmpStatus;
import org.opencdmp.commons.enums.DmpVersionStatus; import org.opencdmp.commons.enums.DmpVersionStatus;
import org.opencdmp.commons.enums.IsActive; import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.elastic.query.DmpElasticQuery; import org.opencdmp.elastic.query.DmpElasticQuery;
import org.opencdmp.elastic.query.InnerObjectDmpElasticQuery; import org.opencdmp.elastic.query.InnerObjectDmpElasticQuery;
import org.opencdmp.query.DmpDescriptionTemplateQuery;
import org.opencdmp.query.DmpQuery; import org.opencdmp.query.DmpQuery;
import gr.cite.tools.data.query.Lookup;
import gr.cite.tools.data.query.QueryFactory;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -35,7 +35,7 @@ public class DmpLookup extends Lookup {
private DmpUserLookup dmpUserSubQuery; private DmpUserLookup dmpUserSubQuery;
public String getLike() { public String getLike() {
return like; return this.like;
} }
public void setLike(String like) { public void setLike(String like) {
@ -43,7 +43,7 @@ public class DmpLookup extends Lookup {
} }
public List<UUID> getIds() { public List<UUID> getIds() {
return ids; return this.ids;
} }
public void setIds(List<UUID> ids) { public void setIds(List<UUID> ids) {
@ -51,7 +51,7 @@ public class DmpLookup extends Lookup {
} }
public List<UUID> getExcludedIds() { public List<UUID> getExcludedIds() {
return excludedIds; return this.excludedIds;
} }
public void setExcludedIds(List<UUID> excludedIds) { public void setExcludedIds(List<UUID> excludedIds) {
@ -59,7 +59,7 @@ public class DmpLookup extends Lookup {
} }
public List<IsActive> getIsActive() { public List<IsActive> getIsActive() {
return isActive; return this.isActive;
} }
public void setIsActive(List<IsActive> isActive) { public void setIsActive(List<IsActive> isActive) {
@ -67,7 +67,7 @@ public class DmpLookup extends Lookup {
} }
public List<DmpStatus> getStatuses() { public List<DmpStatus> getStatuses() {
return statuses; return this.statuses;
} }
public void setStatuses(List<DmpStatus> statuses) { public void setStatuses(List<DmpStatus> statuses) {
@ -75,7 +75,7 @@ public class DmpLookup extends Lookup {
} }
public List<Integer> getVersions() { public List<Integer> getVersions() {
return versions; return this.versions;
} }
public void setVersions(List<Integer> versions) { public void setVersions(List<Integer> versions) {
@ -83,7 +83,7 @@ public class DmpLookup extends Lookup {
} }
public List<DmpAccessType> getAccessTypes() { public List<DmpAccessType> getAccessTypes() {
return accessTypes; return this.accessTypes;
} }
public void setAccessTypes(List<DmpAccessType> accessTypes) { public void setAccessTypes(List<DmpAccessType> accessTypes) {
@ -91,7 +91,7 @@ public class DmpLookup extends Lookup {
} }
public List<DmpVersionStatus> getVersionStatuses() { public List<DmpVersionStatus> getVersionStatuses() {
return versionStatuses; return this.versionStatuses;
} }
public void setVersionStatuses(List<DmpVersionStatus> versionStatuses) { public void setVersionStatuses(List<DmpVersionStatus> versionStatuses) {
@ -99,7 +99,7 @@ public class DmpLookup extends Lookup {
} }
public DmpDescriptionTemplateLookup getDmpDescriptionTemplateSubQuery() { public DmpDescriptionTemplateLookup getDmpDescriptionTemplateSubQuery() {
return dmpDescriptionTemplateSubQuery; return this.dmpDescriptionTemplateSubQuery;
} }
public void setDmpDescriptionTemplateSubQuery(DmpDescriptionTemplateLookup dmpDescriptionTemplateSubQuery) { public void setDmpDescriptionTemplateSubQuery(DmpDescriptionTemplateLookup dmpDescriptionTemplateSubQuery) {
@ -107,7 +107,7 @@ public class DmpLookup extends Lookup {
} }
public List<UUID> getGroupIds() { public List<UUID> getGroupIds() {
return groupIds; return this.groupIds;
} }
public void setGroupIds(List<UUID> groupIds) { public void setGroupIds(List<UUID> groupIds) {
@ -115,7 +115,7 @@ public class DmpLookup extends Lookup {
} }
public DmpUserLookup getDmpUserSubQuery() { public DmpUserLookup getDmpUserSubQuery() {
return dmpUserSubQuery; return this.dmpUserSubQuery;
} }
public void setDmpUserSubQuery(DmpUserLookup dmpUserSubQuery) { public void setDmpUserSubQuery(DmpUserLookup dmpUserSubQuery) {
@ -143,7 +143,7 @@ public class DmpLookup extends Lookup {
public DmpElasticQuery enrichElastic(QueryFactory queryFactory) { public DmpElasticQuery enrichElastic(QueryFactory queryFactory) {
DmpElasticQuery query = queryFactory.query(DmpElasticQuery.class); DmpElasticQuery query = queryFactory.query(DmpElasticQuery.class);
if (this.like != null) query.like(this.like); if (this.like != null) query.like(StringUtils.strip(this.like, "%"));
if (this.ids != null) query.ids(this.ids); if (this.ids != null) query.ids(this.ids);
if (this.groupIds != null) query.groupIds(this.groupIds); if (this.groupIds != null) query.groupIds(this.groupIds);
if (this.excludedIds != null) query.excludedIds(this.excludedIds); if (this.excludedIds != null) query.excludedIds(this.excludedIds);
@ -161,7 +161,7 @@ public class DmpLookup extends Lookup {
public InnerObjectDmpElasticQuery enrichElasticInner(QueryFactory queryFactory) { public InnerObjectDmpElasticQuery enrichElasticInner(QueryFactory queryFactory) {
InnerObjectDmpElasticQuery query = queryFactory.query(InnerObjectDmpElasticQuery.class); InnerObjectDmpElasticQuery query = queryFactory.query(InnerObjectDmpElasticQuery.class);
if (this.like != null) query.like(this.like); if (this.like != null) query.like(StringUtils.strip(this.like, "%"));
if (this.ids != null) query.ids(this.ids); if (this.ids != null) query.ids(this.ids);
if (this.groupIds != null) query.groupIds(this.groupIds); if (this.groupIds != null) query.groupIds(this.groupIds);
if (this.excludedIds != null) query.excludedIds(this.excludedIds); if (this.excludedIds != null) query.excludedIds(this.excludedIds);

View File

@ -1,12 +1,11 @@
package org.opencdmp.query.lookup; package org.opencdmp.query.lookup;
import org.opencdmp.commons.enums.*;
import org.opencdmp.elastic.query.DmpElasticQuery;
import org.opencdmp.elastic.query.InnerObjectDmpElasticQuery;
import org.opencdmp.elastic.query.NestedCollaboratorElasticQuery;
import org.opencdmp.query.DmpUserQuery;
import gr.cite.tools.data.query.Lookup; import gr.cite.tools.data.query.Lookup;
import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.data.query.QueryFactory;
import org.opencdmp.commons.enums.DmpUserRole;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.elastic.query.NestedCollaboratorElasticQuery;
import org.opencdmp.query.DmpUserQuery;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -24,7 +23,7 @@ public class DmpUserLookup extends Lookup {
private List<DmpUserRole> userRoles; private List<DmpUserRole> userRoles;
public List<UUID> getIds() { public List<UUID> getIds() {
return ids; return this.ids;
} }
public void setIds(List<UUID> ids) { public void setIds(List<UUID> ids) {
@ -32,7 +31,7 @@ public class DmpUserLookup extends Lookup {
} }
public List<UUID> getDmpIds() { public List<UUID> getDmpIds() {
return dmpIds; return this.dmpIds;
} }
public void setDmpIds(List<UUID> dmpIds) { public void setDmpIds(List<UUID> dmpIds) {
@ -40,7 +39,7 @@ public class DmpUserLookup extends Lookup {
} }
public List<UUID> getUserIds() { public List<UUID> getUserIds() {
return userIds; return this.userIds;
} }
public void setUserIds(List<UUID> userIds) { public void setUserIds(List<UUID> userIds) {
@ -48,7 +47,7 @@ public class DmpUserLookup extends Lookup {
} }
public List<UUID> getSectionIds() { public List<UUID> getSectionIds() {
return sectionIds; return this.sectionIds;
} }
public void setSectionIds(List<UUID> sectionIds) { public void setSectionIds(List<UUID> sectionIds) {
@ -56,7 +55,7 @@ public class DmpUserLookup extends Lookup {
} }
public List<IsActive> getIsActive() { public List<IsActive> getIsActive() {
return isActive; return this.isActive;
} }
public void setIsActive(List<IsActive> isActive) { public void setIsActive(List<IsActive> isActive) {
@ -64,7 +63,7 @@ public class DmpUserLookup extends Lookup {
} }
public List<DmpUserRole> getUserRoles() { public List<DmpUserRole> getUserRoles() {
return userRoles; return this.userRoles;
} }
public void setUserRoles(List<DmpUserRole> userRoles) { public void setUserRoles(List<DmpUserRole> userRoles) {
@ -88,6 +87,7 @@ public class DmpUserLookup extends Lookup {
public NestedCollaboratorElasticQuery enrichElastic(QueryFactory queryFactory) { public NestedCollaboratorElasticQuery enrichElastic(QueryFactory queryFactory) {
NestedCollaboratorElasticQuery query = queryFactory.query(NestedCollaboratorElasticQuery.class); NestedCollaboratorElasticQuery query = queryFactory.query(NestedCollaboratorElasticQuery.class);
if (this.ids != null) query.ids(this.ids); if (this.ids != null) query.ids(this.ids);
if (this.userIds != null) query.userIds(this.userIds);
if (this.userRoles != null) query.userRoles(this.userRoles); if (this.userRoles != null) query.userRoles(this.userRoles);
this.enrichCommon(query); this.enrichCommon(query);

View File

@ -4,22 +4,6 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.mapping.Property; import co.elastic.clients.elasticsearch._types.mapping.Property;
import co.elastic.clients.elasticsearch._types.mapping.TypeMapping; import co.elastic.clients.elasticsearch._types.mapping.TypeMapping;
import co.elastic.clients.elasticsearch.indices.*; import co.elastic.clients.elasticsearch.indices.*;
import org.opencdmp.authorization.Permission;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.data.DescriptionEntity;
import org.opencdmp.data.DmpEntity;
import org.opencdmp.data.TenantEntityManager;
import org.opencdmp.data.tenant.TenantScopedBaseEntity;
import org.opencdmp.elastic.data.DescriptionElasticEntity;
import org.opencdmp.elastic.data.DmpElasticEntity;
import org.opencdmp.elastic.data.nested.*;
import org.opencdmp.elastic.elasticbuilder.DescriptionElasticBuilder;
import org.opencdmp.elastic.elasticbuilder.DmpElasticBuilder;
import org.opencdmp.model.Description;
import org.opencdmp.model.Dmp;
import org.opencdmp.query.DescriptionQuery;
import org.opencdmp.query.DmpQuery;
import org.opencdmp.service.dmpblueprint.DmpBlueprintServiceImpl;
import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.commons.web.authz.service.AuthorizationService;
import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.builder.BuilderFactory;
import gr.cite.tools.data.query.Ordering; import gr.cite.tools.data.query.Ordering;
@ -30,20 +14,34 @@ import gr.cite.tools.exception.MyNotFoundException;
import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.fieldset.BaseFieldSet;
import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.LoggerService;
import gr.cite.tools.logging.MapLogEntry; import gr.cite.tools.logging.MapLogEntry;
import org.hibernate.Session; import org.opencdmp.authorization.Permission;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.data.DescriptionEntity;
import org.opencdmp.data.DmpEntity;
import org.opencdmp.data.TenantEntityManager;
import org.opencdmp.elastic.data.DescriptionElasticEntity;
import org.opencdmp.elastic.data.DmpElasticEntity;
import org.opencdmp.elastic.data.nested.*;
import org.opencdmp.elastic.elasticbuilder.DescriptionElasticBuilder;
import org.opencdmp.elastic.elasticbuilder.DmpElasticBuilder;
import org.opencdmp.model.Description;
import org.opencdmp.model.Dmp;
import org.opencdmp.query.DescriptionQuery;
import org.opencdmp.query.DmpQuery;
import org.opencdmp.service.dmpblueprint.DmpBlueprintServiceImpl;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.IOException;
import java.util.*;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.management.InvalidApplicationException; import javax.management.InvalidApplicationException;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service @Service
public class ElasticServiceImpl implements ElasticService { public class ElasticServiceImpl implements ElasticService {
@ -70,20 +68,20 @@ public class ElasticServiceImpl implements ElasticService {
@Override @Override
public boolean enabled() { public boolean enabled() {
return appElasticProperties.isEnabled(); return this.appElasticProperties.isEnabled();
} }
@Override @Override
public boolean existsDmpIndex() throws IOException { public boolean existsDmpIndex() throws IOException {
if (!this.enabled()) return false; if (!this.enabled()) return false;
return restHighLevelClient.indices().exists(new ExistsRequest.Builder().index(this.appElasticProperties.getDmpIndexName()).includeDefaults(true).build()).value(); return this.restHighLevelClient.indices().exists(new ExistsRequest.Builder().index(this.appElasticProperties.getDmpIndexName()).includeDefaults(true).build()).value();
} }
@Override @Override
public boolean existsDescriptionIndex() throws IOException { public boolean existsDescriptionIndex() throws IOException {
if (!this.enabled()) return false; if (!this.enabled()) return false;
return restHighLevelClient.indices().exists(new ExistsRequest.Builder().index(this.appElasticProperties.getDescriptionIndexName()).includeDefaults(true).build()).value(); return this.restHighLevelClient.indices().exists(new ExistsRequest.Builder().index(this.appElasticProperties.getDescriptionIndexName()).includeDefaults(true).build()).value();
} }
//region ensure index //region ensure index
@ -128,7 +126,7 @@ public class ElasticServiceImpl implements ElasticService {
indexSettingsAnalysis.analyzer("icu_analyzer_text", ab -> ab.custom(x-> x.filter("icu_folding", "english_stop", "english_stemmer").tokenizer("standard"))); indexSettingsAnalysis.analyzer("icu_analyzer_text", ab -> ab.custom(x-> x.filter("icu_folding", "english_stop", "english_stemmer").tokenizer("standard")));
} }
indexSettings.analysis(indexSettingsAnalysis.build()); indexSettings.analysis(indexSettingsAnalysis.build());
restHighLevelClient.indices().create(new CreateIndexRequest.Builder().index(indexName).mappings(typeMapping.build()).settings(indexSettings.build()).build()); this.restHighLevelClient.indices().create(new CreateIndexRequest.Builder().index(indexName).mappings(typeMapping.build()).settings(indexSettings.build()).build());
} }
@ -136,7 +134,7 @@ public class ElasticServiceImpl implements ElasticService {
Map<String, Property> propertyMap = new HashMap<>(); Map<String, Property> propertyMap = new HashMap<>();
propertyMap.put(DescriptionElasticEntity._id, this.createElastic(FieldType.Keyword, false)); propertyMap.put(DescriptionElasticEntity._id, this.createElastic(FieldType.Keyword, false));
propertyMap.put(DescriptionElasticEntity._tenantId, this.createElastic(FieldType.Keyword, false)); propertyMap.put(DescriptionElasticEntity._tenantId, this.createElastic(FieldType.Keyword, false));
propertyMap.put(DescriptionElasticEntity._label, this.createElastic(FieldType.Keyword, false)); propertyMap.put(DescriptionElasticEntity._label, this.createElastic(FieldType.Text, true));
propertyMap.put(DescriptionElasticEntity._description, this.createElastic(FieldType.Text, true)); propertyMap.put(DescriptionElasticEntity._description, this.createElastic(FieldType.Text, true));
propertyMap.put(DescriptionElasticEntity._status, this.createElastic(FieldType.Short, false)); propertyMap.put(DescriptionElasticEntity._status, this.createElastic(FieldType.Short, false));
propertyMap.put(DescriptionElasticEntity._finalizedAt, this.createElastic(FieldType.Date, false)); propertyMap.put(DescriptionElasticEntity._finalizedAt, this.createElastic(FieldType.Date, false));
@ -174,7 +172,7 @@ public class ElasticServiceImpl implements ElasticService {
private Map<String, Property> createNestedDescriptionTemplatePropertyMap(){ private Map<String, Property> createNestedDescriptionTemplatePropertyMap(){
Map<String, Property> propertyMap = new HashMap<>(); Map<String, Property> propertyMap = new HashMap<>();
propertyMap.put(NestedDescriptionElasticEntity._id, this.createElastic(FieldType.Keyword, false)); propertyMap.put(NestedDescriptionElasticEntity._id, this.createElastic(FieldType.Keyword, false));
propertyMap.put(NestedDescriptionElasticEntity._label, this.createElastic(FieldType.Keyword, false)); propertyMap.put(NestedDescriptionElasticEntity._label, this.createElastic(FieldType.Text, true));
propertyMap.put(NestedDescriptionElasticEntity._dmpId, this.createElastic(FieldType.Keyword, false)); propertyMap.put(NestedDescriptionElasticEntity._dmpId, this.createElastic(FieldType.Keyword, false));
propertyMap.put(NestedDescriptionElasticEntity._description, this.createElastic(FieldType.Text, true)); propertyMap.put(NestedDescriptionElasticEntity._description, this.createElastic(FieldType.Text, true));
propertyMap.put(NestedDescriptionElasticEntity._status, this.createElastic(FieldType.Short, false)); propertyMap.put(NestedDescriptionElasticEntity._status, this.createElastic(FieldType.Short, false));
@ -235,6 +233,7 @@ public class ElasticServiceImpl implements ElasticService {
private Map<String, Property> createNestedCollaboratorTemplatePropertyMap(){ private Map<String, Property> createNestedCollaboratorTemplatePropertyMap(){
Map<String, Property> propertyMap = new HashMap<>(); Map<String, Property> propertyMap = new HashMap<>();
propertyMap.put(NestedCollaboratorElasticEntity._id, this.createElastic(FieldType.Keyword, false)); propertyMap.put(NestedCollaboratorElasticEntity._id, this.createElastic(FieldType.Keyword, false));
propertyMap.put(NestedCollaboratorElasticEntity._userId, this.createElastic(FieldType.Keyword, false));
propertyMap.put(NestedCollaboratorElasticEntity._name, this.createElastic(FieldType.Text, true)); propertyMap.put(NestedCollaboratorElasticEntity._name, this.createElastic(FieldType.Text, true));
propertyMap.put(NestedCollaboratorElasticEntity._role, this.createElastic(FieldType.Short, false)); propertyMap.put(NestedCollaboratorElasticEntity._role, this.createElastic(FieldType.Short, false));
@ -308,7 +307,7 @@ public class ElasticServiceImpl implements ElasticService {
DescriptionElasticEntity descriptionElasticEntity = this.builderFactory.builder(DescriptionElasticBuilder.class).build(description); DescriptionElasticEntity descriptionElasticEntity = this.builderFactory.builder(DescriptionElasticBuilder.class).build(description);
this.elasticsearchTemplate.save(descriptionElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDescriptionIndexName())); this.elasticsearchTemplate.save(descriptionElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDescriptionIndexName()));
DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, description.getDmpId()); DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, description.getDmpId());
if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{description.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (dmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{description.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale()));
if (dmpEntity.getIsActive().equals(IsActive.Active)) { if (dmpEntity.getIsActive().equals(IsActive.Active)) {
DmpElasticEntity dmpElasticEntity = this.builderFactory.builder(DmpElasticBuilder.class).build(dmpEntity); DmpElasticEntity dmpElasticEntity = this.builderFactory.builder(DmpElasticBuilder.class).build(dmpEntity);
this.elasticsearchTemplate.save(dmpElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName())); this.elasticsearchTemplate.save(dmpElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName()));
@ -325,7 +324,7 @@ public class ElasticServiceImpl implements ElasticService {
this.elasticsearchTemplate.delete(descriptionElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDescriptionIndexName())); this.elasticsearchTemplate.delete(descriptionElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDescriptionIndexName()));
DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, description.getDmpId()); DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, description.getDmpId());
if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{description.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (dmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{description.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale()));
if (dmpEntity.getIsActive().equals(IsActive.Active)) { if (dmpEntity.getIsActive().equals(IsActive.Active)) {
DmpElasticEntity dmpElasticEntity = this.builderFactory.builder(DmpElasticBuilder.class).build(dmpEntity); DmpElasticEntity dmpElasticEntity = this.builderFactory.builder(DmpElasticBuilder.class).build(dmpEntity);
this.elasticsearchTemplate.save(dmpElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName())); this.elasticsearchTemplate.save(dmpElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName()));
@ -381,7 +380,7 @@ public class ElasticServiceImpl implements ElasticService {
items = query.collect(); items = query.collect();
if (items != null && !items.isEmpty()) { if (items != null && !items.isEmpty()) {
List<DmpElasticEntity> elasticEntities = this.builderFactory.builder(DmpElasticBuilder.class).build(items); List<DmpElasticEntity> elasticEntities = this.builderFactory.builder(DmpElasticBuilder.class).build(items);
elasticsearchTemplate.save(elasticEntities, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName())); this.elasticsearchTemplate.save(elasticEntities, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName()));
page++; page++;
} }
} while (items != null && !items.isEmpty()); } while (items != null && !items.isEmpty());
@ -413,7 +412,7 @@ public class ElasticServiceImpl implements ElasticService {
items = query.collect(); items = query.collect();
if (items != null && !items.isEmpty()) { if (items != null && !items.isEmpty()) {
List<DescriptionElasticEntity> elasticEntities = this.builderFactory.builder(DescriptionElasticBuilder.class).build(items); List<DescriptionElasticEntity> elasticEntities = this.builderFactory.builder(DescriptionElasticBuilder.class).build(items);
elasticsearchTemplate.save(elasticEntities, IndexCoordinates.of(this.appElasticProperties.getDescriptionIndexName())); this.elasticsearchTemplate.save(elasticEntities, IndexCoordinates.of(this.appElasticProperties.getDescriptionIndexName()));
page++; page++;
} }
} while (items != null && !items.isEmpty()); } while (items != null && !items.isEmpty());

View File

@ -1,30 +1,5 @@
package org.opencdmp.controllers; package org.opencdmp.controllers;
import org.opencdmp.audit.AuditableAction;
import org.opencdmp.authorization.AuthorizationFlags;
import org.opencdmp.commons.enums.DmpAccessType;
import org.opencdmp.commons.enums.DmpStatus;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.convention.ConventionService;
import org.opencdmp.data.StorageFileEntity;
import org.opencdmp.model.*;
import org.opencdmp.model.builder.PublicDescriptionBuilder;
import org.opencdmp.model.persist.DescriptionFieldFilePersist;
import org.opencdmp.model.persist.DescriptionSectionPermissionResolver;
import org.opencdmp.service.storage.StorageFileService;
import gr.cite.tools.validation.ValidationFilterAnnotation;
import org.opencdmp.model.builder.DescriptionBuilder;
import org.opencdmp.model.censorship.DescriptionCensor;
import org.opencdmp.model.censorship.PublicDescriptionCensor;
import org.opencdmp.model.persist.DescriptionPersist;
import org.opencdmp.model.persist.DescriptionStatusPersist;
import org.opencdmp.model.persist.UpdateDescriptionTemplatePersist;
import org.opencdmp.model.result.QueryResult;
import org.opencdmp.query.DescriptionQuery;
import org.opencdmp.query.DmpQuery;
import org.opencdmp.query.lookup.DescriptionLookup;
import org.opencdmp.service.description.DescriptionService;
import org.opencdmp.service.elastic.ElasticQueryHelperService;
import gr.cite.tools.auditing.AuditService; import gr.cite.tools.auditing.AuditService;
import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.builder.BuilderFactory;
import gr.cite.tools.data.censor.CensorFactory; import gr.cite.tools.data.censor.CensorFactory;
@ -35,7 +10,28 @@ import gr.cite.tools.exception.MyNotFoundException;
import gr.cite.tools.fieldset.FieldSet; import gr.cite.tools.fieldset.FieldSet;
import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.LoggerService;
import gr.cite.tools.logging.MapLogEntry; import gr.cite.tools.logging.MapLogEntry;
import gr.cite.tools.validation.ValidationFilterAnnotation;
import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.JAXBException;
import org.opencdmp.audit.AuditableAction;
import org.opencdmp.authorization.AuthorizationFlags;
import org.opencdmp.commons.enums.DmpAccessType;
import org.opencdmp.commons.enums.DmpStatus;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.convention.ConventionService;
import org.opencdmp.data.StorageFileEntity;
import org.opencdmp.model.*;
import org.opencdmp.model.builder.DescriptionBuilder;
import org.opencdmp.model.builder.PublicDescriptionBuilder;
import org.opencdmp.model.censorship.DescriptionCensor;
import org.opencdmp.model.censorship.PublicDescriptionCensor;
import org.opencdmp.model.persist.*;
import org.opencdmp.model.result.QueryResult;
import org.opencdmp.query.DescriptionQuery;
import org.opencdmp.query.DmpQuery;
import org.opencdmp.query.lookup.DescriptionLookup;
import org.opencdmp.service.description.DescriptionService;
import org.opencdmp.service.elastic.ElasticQueryHelperService;
import org.opencdmp.service.storage.StorageFileService;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.i18n.LocaleContextHolder;
@ -153,7 +149,7 @@ public class DescriptionController {
this.censorFactory.censor(DescriptionCensor.class).censor(fieldSet, null); this.censorFactory.censor(DescriptionCensor.class).censor(fieldSet, null);
DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).ids(id);
Description model = this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); Description model = this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet));
if (model == null) if (model == null)
throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale()));
@ -292,7 +288,7 @@ public class DescriptionController {
return true; return true;
} }
@RequestMapping(method = RequestMethod.GET, value = {"/xml/export/{id}"}, produces = "application/xml") @RequestMapping(method = RequestMethod.GET, value = "/xml/export/{id}", produces = "application/xml")
public @ResponseBody ResponseEntity<byte[]> getXml(@PathVariable UUID id) throws JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { public @ResponseBody ResponseEntity<byte[]> getXml(@PathVariable UUID id) throws JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException {
logger.debug(new MapLogEntry("export" + DmpBlueprint.class.getSimpleName()).And("id", id)); logger.debug(new MapLogEntry("export" + DmpBlueprint.class.getSimpleName()).And("id", id));