argos/dmp-backend/core/src/main/java/eu/eudat/service/elastic/ElasticQueryHelperServiceIm...

124 lines
6.6 KiB
Java

package eu.eudat.service.elastic;
import eu.eudat.authorization.AuthorizationFlags;
import eu.eudat.data.DescriptionEntity;
import eu.eudat.data.DmpEntity;
import eu.eudat.elastic.data.DescriptionElasticEntity;
import eu.eudat.elastic.data.DmpElasticEntity;
import eu.eudat.model.Description;
import eu.eudat.model.Dmp;
import eu.eudat.model.PublicDescription;
import eu.eudat.model.PublicDmp;
import eu.eudat.model.builder.DescriptionBuilder;
import eu.eudat.model.builder.DmpBuilder;
import eu.eudat.model.builder.PublicDescriptionBuilder;
import eu.eudat.model.builder.PublicDmpBuilder;
import eu.eudat.model.result.QueryResult;
import eu.eudat.query.DescriptionQuery;
import eu.eudat.query.DmpQuery;
import eu.eudat.query.lookup.DescriptionLookup;
import eu.eudat.query.lookup.DmpLookup;
import gr.cite.tools.data.builder.BuilderFactory;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.fieldset.BaseFieldSet;
import gr.cite.tools.fieldset.FieldSet;
import org.springframework.stereotype.Service;
import java.util.EnumSet;
import java.util.List;
import java.util.function.Function;
@Service
public class ElasticQueryHelperServiceImpl implements ElasticQueryHelperService {
private final QueryFactory queryFactory;
private final BuilderFactory builderFactory;
private final ElasticService elasticService;
public ElasticQueryHelperServiceImpl(QueryFactory queryFactory, BuilderFactory builderFactory, ElasticService elasticService) {
this.queryFactory = queryFactory;
this.builderFactory = builderFactory;
this.elasticService = elasticService;
}
@Override
public QueryResult<Dmp> collect(DmpLookup lookup, EnumSet<AuthorizationFlags> authorizationFlags, FieldSet fieldSet) {
EnumSet<AuthorizationFlags> flags = authorizationFlags == null ? EnumSet.of(AuthorizationFlags.None) : authorizationFlags;
return this.collect(lookup, (d) -> this.builderFactory.builder(DmpBuilder.class).authorize(flags).build(fieldSet != null ? fieldSet : lookup.getProject(), d), flags);
}
@Override
public QueryResult<PublicDmp> collectPublic(DmpLookup lookup, EnumSet<AuthorizationFlags> authorizationFlags, FieldSet fieldSet) {
EnumSet<AuthorizationFlags> flags = authorizationFlags == null ? EnumSet.of(AuthorizationFlags.None) : authorizationFlags;
return this.collect(lookup, (d) -> this.builderFactory.builder(PublicDmpBuilder.class).authorize(flags).build(fieldSet != null ? fieldSet : lookup.getProject(), d), flags);
}
private <M> QueryResult<M> collect(DmpLookup lookup, Function<List<DmpEntity>, List<M>> buildFunc, EnumSet<AuthorizationFlags> flags) {
DmpQuery query = null;
QueryResult<M> result = new QueryResult<>();
if (lookup.useElastic() && this.elasticService.enabled()){
List<DmpElasticEntity> elasticResponse = lookup.enrichElastic(this.queryFactory).authorize(flags).collectAs(new BaseFieldSet().ensure(DmpElasticEntity._id));
query = this.queryFactory.query(DmpQuery.class).authorize(flags).ids(elasticResponse.stream().map(DmpElasticEntity::getId).toList());
query.setOrder(lookup.enrich(this.queryFactory).getOrder());
if (lookup.getMetadata() != null && lookup.getMetadata().countAll) result.setCount(lookup.enrichElastic(this.queryFactory).authorize(flags).count());
} else {
query = lookup.enrich(this.queryFactory).authorize(flags);
if (lookup.getMetadata() != null && lookup.getMetadata().countAll) result.setCount(query.count());
}
result.setItems(buildFunc.apply(query.collect()));
if (lookup.getMetadata() == null || !lookup.getMetadata().countAll) result.setCount(result.getItems() != null ? result.getItems().size() : 0);
return result;
}
@Override
public long count(DmpLookup lookup, EnumSet<AuthorizationFlags> authorizationFlags) {
EnumSet<AuthorizationFlags> flags = authorizationFlags == null ? EnumSet.of(AuthorizationFlags.None) : authorizationFlags;
if (lookup.useElastic() && this.elasticService.enabled()){
return lookup.enrichElastic(this.queryFactory).authorize(flags).count();
} else {
return lookup.enrich(this.queryFactory).authorize(flags).count();
}
}
@Override
public QueryResult<Description> collect(DescriptionLookup lookup, EnumSet<AuthorizationFlags> authorizationFlags, FieldSet fieldSet) {
EnumSet<AuthorizationFlags> flags = authorizationFlags == null ? EnumSet.of(AuthorizationFlags.None) : authorizationFlags;
return this.collect(lookup, (d) -> this.builderFactory.builder(DescriptionBuilder.class).authorize(flags).build(fieldSet != null ? fieldSet : lookup.getProject(), d), flags);
}
@Override
public QueryResult<PublicDescription> collectPublic(DescriptionLookup lookup, EnumSet<AuthorizationFlags> authorizationFlags, FieldSet fieldSet) {
EnumSet<AuthorizationFlags> flags = authorizationFlags == null ? EnumSet.of(AuthorizationFlags.None) : authorizationFlags;
return this.collect(lookup, (d) -> this.builderFactory.builder(PublicDescriptionBuilder.class).authorize(flags).build(fieldSet != null ? fieldSet : lookup.getProject(), d), flags);
}
private <M> QueryResult<M> collect(DescriptionLookup lookup, Function<List<DescriptionEntity>, List<M>> buildFunc, EnumSet<AuthorizationFlags> flags) {
DescriptionQuery query = null;
QueryResult<M> result = new QueryResult<>();
if (lookup.useElastic() && this.elasticService.enabled()){
List<DescriptionElasticEntity> elasticResponse = lookup.enrichElastic(this.queryFactory).authorize(flags).collectAs(new BaseFieldSet().ensure(DescriptionElasticEntity._id));
query = this.queryFactory.query(DescriptionQuery.class).authorize(flags).ids(elasticResponse.stream().map(DescriptionElasticEntity::getId).toList());
query.setOrder(lookup.enrich(this.queryFactory).getOrder());
if (lookup.getMetadata() != null && lookup.getMetadata().countAll) result.setCount(lookup.enrichElastic(this.queryFactory).authorize(flags).count());
} else {
query = lookup.enrich(this.queryFactory).authorize(flags);
if (lookup.getMetadata() != null && lookup.getMetadata().countAll) result.setCount(query.count());
}
result.setItems(buildFunc.apply(query.collect()));
if (lookup.getMetadata() == null || !lookup.getMetadata().countAll) result.setCount(result.getItems() != null ? result.getItems().size() : 0);
return result;
}
@Override
public long count(DescriptionLookup lookup, EnumSet<AuthorizationFlags> authorizationFlags) {
EnumSet<AuthorizationFlags> flags = authorizationFlags == null ? EnumSet.of(AuthorizationFlags.None) : authorizationFlags;
if (lookup.useElastic() && this.elasticService.enabled()){
return lookup.enrichElastic(this.queryFactory).authorize(flags).count();
} else {
return lookup.enrich(this.queryFactory).authorize(flags).count();
}
}
}