package eu.dnetlib.dhp.schema.oaf; import java.io.Serializable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; import eu.dnetlib.dhp.schema.common.LicenseComparator; public class Result extends OafEntity implements Serializable { private List measures; private List author; // resulttype allows subclassing results into publications | datasets | software private Qualifier resulttype; // common fields private Qualifier language; private List country; private List subject; private List title; private List relevantdate; private List> description; private Field dateofacceptance; private Field publisher; private Field embargoenddate; private List> source; private List> fulltext; // remove candidate private List> format; private List> contributor; private Qualifier resourcetype; private List> coverage; private Qualifier bestaccessright; private List context; private List externalReference; private List instance; public List getMeasures() { return measures; } public void setMeasures(List measures) { this.measures = measures; } public List getAuthor() { return author; } public void setAuthor(List author) { this.author = author; } public Qualifier getResulttype() { return resulttype; } public void setResulttype(Qualifier resulttype) { this.resulttype = resulttype; } public Qualifier getLanguage() { return language; } public void setLanguage(Qualifier language) { this.language = language; } public List getCountry() { return country; } public void setCountry(List country) { this.country = country; } public List getSubject() { return subject; } public void setSubject(List subject) { this.subject = subject; } public List getTitle() { return title; } public void setTitle(List title) { this.title = title; } public List getRelevantdate() { return relevantdate; } public void setRelevantdate(List relevantdate) { this.relevantdate = relevantdate; } public List> getDescription() { return description; } public void setDescription(List> description) { this.description = description; } public Field getDateofacceptance() { return dateofacceptance; } public void setDateofacceptance(Field dateofacceptance) { this.dateofacceptance = dateofacceptance; } public Field getPublisher() { return publisher; } public void setPublisher(Field publisher) { this.publisher = publisher; } public Field getEmbargoenddate() { return embargoenddate; } public void setEmbargoenddate(Field embargoenddate) { this.embargoenddate = embargoenddate; } public List> getSource() { return source; } public void setSource(List> source) { this.source = source; } public List> getFulltext() { return fulltext; } public void setFulltext(List> fulltext) { this.fulltext = fulltext; } public List> getFormat() { return format; } public void setFormat(List> format) { this.format = format; } public List> getContributor() { return contributor; } public void setContributor(List> contributor) { this.contributor = contributor; } public Qualifier getResourcetype() { return resourcetype; } public void setResourcetype(Qualifier resourcetype) { this.resourcetype = resourcetype; } public List> getCoverage() { return coverage; } public void setCoverage(List> coverage) { this.coverage = coverage; } public Qualifier getBestaccessright() { return bestaccessright; } public void setBestaccessright(Qualifier bestaccessright) { this.bestaccessright = bestaccessright; } public List getContext() { return context; } public void setContext(List context) { this.context = context; } public List getExternalReference() { return externalReference; } public void setExternalReference(List externalReference) { this.externalReference = externalReference; } public List getInstance() { return instance; } public void setInstance(List instance) { this.instance = instance; } @Override public void mergeFrom(OafEntity e) { super.mergeFrom(e); if (!Result.class.isAssignableFrom(e.getClass())) { return; } Result r = (Result) e; measures = mergeLists(measures, r.getMeasures()); instance = mergeLists(instance, r.getInstance()); if (r.getBestaccessright() != null && new LicenseComparator().compare(r.getBestaccessright(), bestaccessright) < 0) bestaccessright = r.getBestaccessright(); if (r.getResulttype() != null && compareTrust(this, r) < 0) resulttype = r.getResulttype(); if (r.getLanguage() != null && compareTrust(this, r) < 0) language = r.getLanguage(); country = mergeLists(country, r.getCountry()); subject = mergeLists(subject, r.getSubject()); // merge title lists: main title with higher trust and distinct between the others StructuredProperty baseMainTitle = null; if (title != null) { baseMainTitle = getMainTitle(title); if (baseMainTitle != null) { final StructuredProperty p = baseMainTitle; title = title.stream().filter(t -> t != p).collect(Collectors.toList()); } } StructuredProperty newMainTitle = null; if (r.getTitle() != null) { newMainTitle = getMainTitle(r.getTitle()); if (newMainTitle != null) { final StructuredProperty p = newMainTitle; r.setTitle(r.getTitle().stream().filter(t -> t != p).collect(Collectors.toList())); } } if (newMainTitle != null && compareTrust(this, r) < 0) { baseMainTitle = newMainTitle; } title = mergeLists(title, r.getTitle()); if (title != null && baseMainTitle != null) { title.add(baseMainTitle); } relevantdate = mergeLists(relevantdate, r.getRelevantdate()); description = longestLists(description, r.getDescription()); if (r.getPublisher() != null && compareTrust(this, r) < 0) publisher = r.getPublisher(); if (r.getEmbargoenddate() != null && compareTrust(this, r) < 0) embargoenddate = r.getEmbargoenddate(); source = mergeLists(source, r.getSource()); fulltext = mergeLists(fulltext, r.getFulltext()); format = mergeLists(format, r.getFormat()); contributor = mergeLists(contributor, r.getContributor()); if (r.getResourcetype() != null) resourcetype = r.getResourcetype(); coverage = mergeLists(coverage, r.getCoverage()); context = mergeLists(context, r.getContext()); externalReference = mergeLists(externalReference, r.getExternalReference()); } private List> longestLists(List> a, List> b) { if (a == null || b == null) return a == null ? b : a; if (a.size() == b.size()) { int msa = a .stream() .filter(i -> i != null && i.getValue() != null) .map(i -> i.getValue().length()) .max(Comparator.naturalOrder()) .orElse(0); int msb = b .stream() .filter(i -> i != null && i.getValue() != null) .map(i -> i.getValue().length()) .max(Comparator.naturalOrder()) .orElse(0); return msa > msb ? a : b; } return a.size() > b.size() ? a : b; } private StructuredProperty getMainTitle(List titles) { // need to check if the list of titles contains more than 1 main title? (in that case, we should chose which // main title select in the list) for (StructuredProperty title : titles) { if (title.getQualifier() != null && title.getQualifier().getClassid() != null) if (title.getQualifier().getClassid().equals("main title")) return title; } return null; } }