package eu.dnetlib.dhp.broker.oa.matchers; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Function; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import eu.dnetlib.broker.objects.OpenaireBrokerResult; import eu.dnetlib.dhp.broker.model.Topic; import eu.dnetlib.dhp.broker.oa.util.UpdateInfo; import eu.dnetlib.pace.config.DedupConfig; public abstract class UpdateMatcher { private final boolean multipleUpdate; private final Function topicFunction; private final BiConsumer compileHighlightFunction; private final Function highlightToStringFunction; public UpdateMatcher(final boolean multipleUpdate, final Function topicFunction, final BiConsumer compileHighlightFunction, final Function highlightToStringFunction) { this.multipleUpdate = multipleUpdate; this.topicFunction = topicFunction; this.compileHighlightFunction = compileHighlightFunction; this.highlightToStringFunction = highlightToStringFunction; } public Collection> searchUpdatesForRecord(final OpenaireBrokerResult res, final Collection others, final DedupConfig dedupConfig) { final Map> infoMap = new HashMap<>(); for (final OpenaireBrokerResult source : others) { if (source != res) { for (final T hl : findDifferences(source, res)) { final Topic topic = getTopicFunction().apply(hl); final UpdateInfo info = new UpdateInfo<>(topic, hl, source, res, getCompileHighlightFunction(), getHighlightToStringFunction(), dedupConfig); final String s = DigestUtils.md5Hex(info.getHighlightValueAsString()); if (!infoMap.containsKey(s) || infoMap.get(s).getTrust() < info.getTrust()) { } else { infoMap.put(s, info); } } } } final Collection> values = infoMap.values(); if (values.isEmpty() || multipleUpdate) { return values; } else { final UpdateInfo v = values .stream() .sorted((o1, o2) -> Float.compare(o1.getTrust(), o2.getTrust())) .findFirst() .get(); return Arrays.asList(v); } } protected abstract List findDifferences(OpenaireBrokerResult source, OpenaireBrokerResult target); protected static boolean isMissing(final List list) { return list == null || list.isEmpty() || StringUtils.isBlank(list.get(0)); } protected boolean isMissing(final String field) { return StringUtils.isBlank(field); } public boolean isMultipleUpdate() { return multipleUpdate; } public Function getTopicFunction() { return topicFunction; } public BiConsumer getCompileHighlightFunction() { return compileHighlightFunction; } public Function getHighlightToStringFunction() { return highlightToStringFunction; } }