124 lines
6.6 KiB
Java
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();
|
|
}
|
|
}
|
|
}
|