exclusion of deduplicated ds

This commit is contained in:
Michele Artini 2022-09-13 08:07:52 +02:00
parent 8e7901afdd
commit d5a754ffee
3 changed files with 80 additions and 59 deletions

View File

@ -1,5 +1,20 @@
package eu.dnetlib.openaire.dsm.dao;
import java.util.List;
import java.util.Map.Entry;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.jpa.domain.Specification;
import eu.dnetlib.enabling.datasources.common.DsmRuntimeException;
import eu.dnetlib.openaire.dsm.domain.FilterName;
import eu.dnetlib.openaire.dsm.domain.RequestFilter;
@ -7,15 +22,6 @@ import eu.dnetlib.openaire.dsm.domain.RequestSort;
import eu.dnetlib.openaire.dsm.domain.RequestSortOrder;
import eu.dnetlib.openaire.dsm.domain.db.DatasourceApiDbEntry;
import eu.dnetlib.openaire.dsm.domain.db.DatasourceDbEntry;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.*;
import java.util.List;
import java.util.Map.Entry;
public class DatasourceSpecs {
@ -24,39 +30,38 @@ public class DatasourceSpecs {
public static final String WILDCARD = "%";
public static Specification<DatasourceDbEntry> dsRegisteredbyNotNullSpec() {
return (ds, query, cb) -> cb.and(
cb.isNull(ds.get(FilterName.registeredby.name())).not(),
cb.isNull(ds.get("registrationdate")).not());
return (ds, query, cb) -> cb.and(cb.isNull(ds.get(FilterName.registeredby.name())).not(), cb.isNull(ds.get("registrationdate")).not());
}
public static Specification<DatasourceDbEntry> dsSpec(final RequestSort requestSortBy, final RequestSortOrder order, final RequestFilter requestFilter) {
log.debug(String.format("RequestFilter:'%s', RequestSort:'%s', RequestSortOrder:'%s'", requestFilter, requestSortBy, order));
return (ds, query, cb) -> {
final Predicate p = cb.conjunction();
final List<Expression<Boolean>> expressions = p.getExpressions();
expressions.add(cb.equal(ds.get("eoscType"), "Data Source"));
expressions.add(cb.equal(ds.get("dedupMainService"), true));
if (requestFilter != null) {
final List<Expression<Boolean>> expressions = p.getExpressions();
requestFilter.entrySet().stream()
.forEach(e -> {
switch (FilterName.type(e.getKey())) {
requestFilter.entrySet()
.stream()
.forEach(e -> {
switch (FilterName.type(e.getKey())) {
case exact:
expressions.add(exactSearch(ds, cb, e));
case exact:
expressions.add(exactSearch(ds, cb, e));
break;
case search:
expressions.add(likeSearch(ds, cb, e));
break;
case search:
expressions.add(likeSearch(ds, cb, e));
break;
case searchOrgs:
// search by case insensitive organization's country
expressions.add(
cb.equal(
cb.lower(
ds.join("organizations").get(FilterName.country.name())),
getValue(e)));
break;
}
});
break;
case searchOrgs:
// search by case insensitive organization's country
expressions.add(cb.equal(cb.lower(ds.join("organizations").get(FilterName.country.name())), getValue(e)));
break;
}
});
}
if (requestSortBy != null) {
if (order != null) {
@ -83,21 +88,22 @@ public class DatasourceSpecs {
final Predicate p = cb.conjunction();
if (requestFilter != null) {
final List<Expression<Boolean>> expressions = p.getExpressions();
requestFilter.entrySet().stream()
.forEach(e -> {
switch (FilterName.type(e.getKey())) {
requestFilter.entrySet()
.stream()
.forEach(e -> {
switch (FilterName.type(e.getKey())) {
case exact:
expressions.add(exactSearch(api, cb, e));
break;
case search:
case exact:
expressions.add(exactSearch(api, cb, e));
break;
case search:
expressions.add(likeSearch(api, cb, e));
break;
case searchOrgs:
throw new DsmRuntimeException("not implemented");
}
});
expressions.add(likeSearch(api, cb, e));
break;
case searchOrgs:
throw new DsmRuntimeException("not implemented");
}
});
}
query.distinct(true);
return p;
@ -108,32 +114,25 @@ public class DatasourceSpecs {
// substring, case insensitive, like based search
private static Predicate likeSearch(final Root<?> r, final CriteriaBuilder cb, final Entry<FilterName, Object> e) {
return cb.like(
cb.lower(
r.get(e.getKey().name())),
WILDCARD + getValue(e) + WILDCARD);
return cb.like(cb.lower(r.get(e.getKey().name())), WILDCARD + getValue(e) + WILDCARD);
}
// search by ID, managed. exact match
// search by ID, managed. exact match
private static Predicate exactSearch(final Root<?> r, final CriteriaBuilder cb, final Entry<FilterName, Object> e) {
return cb.equal(r.get(e.getKey().name()), getValue(e));
}
private static Object getValue(final Entry<FilterName, Object> e) {
if (e.getValue() instanceof String) {
final String s = ((String) e.getValue());
final String s = (String) e.getValue();
if (!e.getKey().equals(FilterName.country)) {
Boolean b = BooleanUtils.toBooleanObject(s);
if (b != null) {
return b;
}
final Boolean b = BooleanUtils.toBooleanObject(s);
if (b != null) { return b; }
}
return e.getKey().equals(FilterName.id) ? s : StringUtils.lowerCase(s);
}
if (e.getValue() instanceof Boolean) {
return e.getValue();
}
if (e.getValue() instanceof Boolean) { return e.getValue(); }
return e.getValue();
}

View File

@ -57,6 +57,9 @@ public abstract class DatasourceIgnoredProperties {
@JsonIgnore
protected String eoscType;
@JsonIgnore
protected Boolean dedupMainService;
public String getOd_contenttypes() {
return od_contenttypes;
}
@ -193,4 +196,12 @@ public abstract class DatasourceIgnoredProperties {
this.eoscType = eoscType;
}
public Boolean getDedupMainService() {
return dedupMainService;
}
public void setDedupMainService(final Boolean dedupMainService) {
this.dedupMainService = dedupMainService;
}
}

View File

@ -31,6 +31,9 @@ public class DatasourceDbEntry extends Datasource<OrganizationDbEntry, IdentityD
@Column(name = "eosc_type")
private String eoscType = DEFAULT_EOSC_TYPE;
@Column(name = "dedup_main_service")
private Boolean dedupMainService = true;
public String getOpenaireId() {
return openaireId;
}
@ -53,7 +56,15 @@ public class DatasourceDbEntry extends Datasource<OrganizationDbEntry, IdentityD
return eoscType;
}
public void setEoscType(String eoscType) {
public void setEoscType(final String eoscType) {
this.eoscType = eoscType;
}
public Boolean getDedupMainService() {
return dedupMainService;
}
public void setDedupMainService(final Boolean dedupMainService) {
this.dedupMainService = dedupMainService;
}
}