94 lines
3.0 KiB
Java
94 lines
3.0 KiB
Java
package eu.dnetlib.openaire.funders;
|
|
|
|
import java.time.LocalDate;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.util.ArrayList;
|
|
import java.util.Comparator;
|
|
import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
import org.springframework.data.domain.PageRequest;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import eu.dnetlib.openaire.dsm.dao.MongoLoggerClient;
|
|
import eu.dnetlib.openaire.exporter.exceptions.DsmApiException;
|
|
import eu.dnetlib.openaire.exporter.exceptions.FundersApiException;
|
|
import eu.dnetlib.openaire.exporter.model.dsm.AggregationInfo;
|
|
import eu.dnetlib.openaire.exporter.model.dsm.AggregationStage;
|
|
import eu.dnetlib.openaire.funders.domain.db.FunderDatasource;
|
|
import eu.dnetlib.openaire.funders.domain.db.FunderDbEntry;
|
|
|
|
@Component
|
|
@ConditionalOnProperty(value = "openaire.exporter.enable.funders", havingValue = "true")
|
|
public class FunderDao {
|
|
|
|
@Autowired
|
|
private FunderRepository funderRepository;
|
|
|
|
@Autowired
|
|
private MongoLoggerClient mongoLoggerClient;
|
|
|
|
private final DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
|
private static final Log log = LogFactory.getLog(FunderDao.class);
|
|
|
|
public FunderDbEntry findFunder(final String funderId) throws FundersApiException {
|
|
return funderRepository.findById(funderId)
|
|
.map(this::addAggregationHistory)
|
|
.orElseThrow(() -> new FundersApiException("Funder not found. ID: " + funderId));
|
|
}
|
|
|
|
public List<FunderDbEntry> listFunders(final int page, final int size) throws FundersApiException {
|
|
return funderRepository.findAll(PageRequest.of(page, size))
|
|
.getContent()
|
|
.stream()
|
|
.map(this::addAggregationHistory)
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
public List<String> listFunderIds(final int page, final int size) throws FundersApiException {
|
|
return funderRepository.findAll(PageRequest.of(page, size))
|
|
.getContent()
|
|
.stream()
|
|
.map(FunderDbEntry::getId)
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
public long count() {
|
|
return funderRepository.count();
|
|
}
|
|
|
|
private FunderDbEntry addAggregationHistory(final FunderDbEntry funder) {
|
|
|
|
final List<LocalDate> dates = funder.getDatasources()
|
|
.stream()
|
|
.map(FunderDatasource::getId)
|
|
.map(id -> {
|
|
try {
|
|
return mongoLoggerClient.getAggregationHistoryV2(id);
|
|
} catch (final DsmApiException e) {
|
|
log.error("Error retrieving the aggregation history");
|
|
// throw new RuntimeException(e);
|
|
return new ArrayList<AggregationInfo>();
|
|
}
|
|
})
|
|
.flatMap(List::stream)
|
|
.filter(AggregationInfo::isCompletedSuccessfully)
|
|
.filter(info -> info.getAggregationStage() == AggregationStage.TRANSFORM)
|
|
.map(AggregationInfo::getDate)
|
|
.distinct()
|
|
.map(s -> LocalDate.parse(s, DATEFORMATTER))
|
|
.sorted(Comparator.reverseOrder())
|
|
.toList();
|
|
|
|
funder.setAggregationDates(dates);
|
|
|
|
return funder;
|
|
}
|
|
|
|
}
|