2020-09-04 14:33:19 +02:00
|
|
|
package eu.dnetlib.broker.openaire;
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2020-09-11 12:05:11 +02:00
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.HashMap;
|
2020-07-02 08:55:42 +02:00
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Optional;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
import java.util.stream.StreamSupport;
|
|
|
|
|
2020-09-17 15:50:51 +02:00
|
|
|
import org.apache.commons.io.IOUtils;
|
2020-09-18 09:25:05 +02:00
|
|
|
import org.apache.commons.lang3.StringUtils;
|
2020-07-02 08:55:42 +02:00
|
|
|
import org.apache.commons.logging.Log;
|
|
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
|
import org.apache.lucene.search.join.ScoreMode;
|
|
|
|
import org.elasticsearch.action.search.SearchType;
|
|
|
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
2020-09-18 09:25:05 +02:00
|
|
|
import org.elasticsearch.index.query.NestedQueryBuilder;
|
2020-08-19 17:12:02 +02:00
|
|
|
import org.elasticsearch.index.query.Operator;
|
2020-09-18 09:25:05 +02:00
|
|
|
import org.elasticsearch.index.query.QueryBuilder;
|
2020-07-02 08:55:42 +02:00
|
|
|
import org.elasticsearch.index.query.QueryBuilders;
|
|
|
|
import org.elasticsearch.search.aggregations.Aggregation;
|
|
|
|
import org.elasticsearch.search.aggregations.AggregationBuilders;
|
|
|
|
import org.elasticsearch.search.aggregations.Aggregations;
|
|
|
|
import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested;
|
|
|
|
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
2020-08-20 10:56:23 +02:00
|
|
|
import org.springframework.context.annotation.Profile;
|
2020-07-02 08:55:42 +02:00
|
|
|
import org.springframework.data.domain.PageRequest;
|
|
|
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
|
|
|
import org.springframework.data.elasticsearch.core.SearchHit;
|
|
|
|
import org.springframework.data.elasticsearch.core.SearchHits;
|
|
|
|
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
|
|
|
|
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
|
|
|
|
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
|
2020-09-17 15:50:51 +02:00
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
|
import org.springframework.jdbc.core.RowMapper;
|
2020-07-02 08:55:42 +02:00
|
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
|
|
import org.springframework.web.bind.annotation.PathVariable;
|
|
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
2020-09-04 14:33:19 +02:00
|
|
|
import eu.dnetlib.broker.LiteratureBrokerServiceConfiguration;
|
|
|
|
import eu.dnetlib.broker.common.controllers.AbstractLbsController;
|
|
|
|
import eu.dnetlib.broker.common.elasticsearch.Event;
|
|
|
|
import eu.dnetlib.broker.common.elasticsearch.Notification;
|
|
|
|
import eu.dnetlib.broker.common.elasticsearch.NotificationRepository;
|
|
|
|
import eu.dnetlib.broker.common.properties.ElasticSearchProperties;
|
|
|
|
import eu.dnetlib.broker.common.subscriptions.MapCondition;
|
|
|
|
import eu.dnetlib.broker.common.subscriptions.Subscription;
|
|
|
|
import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository;
|
2020-09-11 12:05:11 +02:00
|
|
|
import eu.dnetlib.broker.events.output.DispatcherManager;
|
2020-07-02 15:33:02 +02:00
|
|
|
import eu.dnetlib.broker.objects.OaBrokerEventPayload;
|
2020-07-02 08:55:42 +02:00
|
|
|
import io.swagger.annotations.Api;
|
|
|
|
import io.swagger.annotations.ApiOperation;
|
|
|
|
|
2020-08-20 10:56:23 +02:00
|
|
|
@Profile("openaire")
|
2020-07-02 08:55:42 +02:00
|
|
|
@RestController
|
|
|
|
@RequestMapping("/api/openaireBroker")
|
|
|
|
@Api(tags = LiteratureBrokerServiceConfiguration.TAG_OPENAIRE)
|
|
|
|
public class OpenaireBrokerController extends AbstractLbsController {
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private ElasticsearchOperations esOperations;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private NotificationRepository notificationRepository;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private SubscriptionRepository subscriptionRepo;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private ElasticSearchProperties props;
|
|
|
|
|
2020-09-11 12:05:11 +02:00
|
|
|
@Autowired
|
|
|
|
private DispatcherManager dispatcher;
|
|
|
|
|
2020-09-17 15:50:51 +02:00
|
|
|
@Autowired
|
|
|
|
private JdbcTemplate jdbcTemplate;
|
|
|
|
|
2020-07-02 08:55:42 +02:00
|
|
|
private static final Log log = LogFactory.getLog(OpenaireBrokerController.class);
|
|
|
|
|
|
|
|
@ApiOperation("Return the datasources having events")
|
|
|
|
@GetMapping("/datasources")
|
2020-09-17 15:50:51 +02:00
|
|
|
public List<BrowseEntry> findDatasourcesWithEvents(@RequestParam(defaultValue = "false", required = false) final boolean useIndex) {
|
|
|
|
return useIndex ? findDatasourcesWithEventsUsingIndex() : findDatasourcesWithEventsUsingDb();
|
|
|
|
}
|
2020-07-02 08:55:42 +02:00
|
|
|
|
2020-09-17 15:50:51 +02:00
|
|
|
private List<BrowseEntry> findDatasourcesWithEventsUsingIndex() {
|
2020-07-02 08:55:42 +02:00
|
|
|
final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
|
2020-07-02 11:14:28 +02:00
|
|
|
.withQuery(QueryBuilders.matchAllQuery())
|
|
|
|
.withSearchType(SearchType.DEFAULT)
|
|
|
|
.addAggregation(AggregationBuilders.nested("nested", "map")
|
|
|
|
// .path("map")
|
2020-07-02 16:08:23 +02:00
|
|
|
.subAggregation(AggregationBuilders.terms("by_map").field("map.targetDatasourceName").size(1000).minDocCount(1)))
|
2020-07-02 11:14:28 +02:00
|
|
|
.build();
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
final SearchHits<Event> hits = esOperations.search(searchQuery, Event.class, IndexCoordinates.of(props.getEventsIndexName()));
|
|
|
|
|
|
|
|
final Aggregations aggregations = hits.getAggregations();
|
|
|
|
|
|
|
|
final Aggregation aggByMap = ((ParsedNested) aggregations.asMap().get("nested")).getAggregations().asMap().get("by_map");
|
|
|
|
|
|
|
|
return ((ParsedStringTerms) aggByMap).getBuckets()
|
2020-07-02 11:14:28 +02:00
|
|
|
.stream()
|
|
|
|
.map(b -> new BrowseEntry(b.getKeyAsString(), b.getDocCount()))
|
|
|
|
.collect(Collectors.toList());
|
2020-07-02 08:55:42 +02:00
|
|
|
}
|
|
|
|
|
2020-09-17 15:50:51 +02:00
|
|
|
private List<BrowseEntry> findDatasourcesWithEventsUsingDb() {
|
|
|
|
try {
|
|
|
|
final String sql = IOUtils.toString(getClass().getResourceAsStream("/sql/datasourceTopics.sql"));
|
|
|
|
final RowMapper<BrowseEntry> mapper = (rs, rowNum) -> new BrowseEntry(rs.getString("name"), rs.getLong("size"));
|
|
|
|
return jdbcTemplate.query(sql, mapper);
|
|
|
|
} catch (final Exception e) {
|
|
|
|
log.error("Error executing query", e);
|
|
|
|
return new ArrayList<>();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-02 08:55:42 +02:00
|
|
|
@ApiOperation("Return the topics of the events of a datasource")
|
|
|
|
@GetMapping("/topicsForDatasource")
|
2020-09-17 15:50:51 +02:00
|
|
|
public List<BrowseEntry> findTopicsForDatasource(@RequestParam final String ds,
|
|
|
|
@RequestParam(defaultValue = "false", required = false) final boolean useIndex) {
|
|
|
|
return useIndex ? findTopicsForDatasourceUsingIndex(ds) : findTopicsForDatasourceUsingDb(ds);
|
|
|
|
}
|
2020-07-02 08:55:42 +02:00
|
|
|
|
2020-09-17 15:50:51 +02:00
|
|
|
private List<BrowseEntry> findTopicsForDatasourceUsingIndex(final String ds) {
|
2020-07-29 14:15:28 +02:00
|
|
|
final String term = "topic.keyword";
|
|
|
|
|
2020-07-02 08:55:42 +02:00
|
|
|
final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
|
2020-07-02 16:08:23 +02:00
|
|
|
.withQuery(QueryBuilders.nestedQuery("map", QueryBuilders.matchQuery("map.targetDatasourceName", ds), ScoreMode.None))
|
2020-07-02 11:14:28 +02:00
|
|
|
.withSearchType(SearchType.DEFAULT)
|
2020-07-29 14:15:28 +02:00
|
|
|
.addAggregation(AggregationBuilders.terms(term).field(term).size(1000).minDocCount(1))
|
2020-07-02 11:14:28 +02:00
|
|
|
.build();
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
final SearchHits<Event> hits = esOperations.search(searchQuery, Event.class, IndexCoordinates.of(props.getEventsIndexName()));
|
|
|
|
|
|
|
|
final Aggregations aggregations = hits.getAggregations();
|
|
|
|
|
2020-07-29 14:15:28 +02:00
|
|
|
return ((ParsedStringTerms) aggregations.asMap().get(term)).getBuckets()
|
2020-07-02 11:14:28 +02:00
|
|
|
.stream()
|
|
|
|
.map(b -> new BrowseEntry(b.getKeyAsString(), b.getDocCount()))
|
|
|
|
.collect(Collectors.toList());
|
2020-07-02 08:55:42 +02:00
|
|
|
}
|
|
|
|
|
2020-09-17 15:50:51 +02:00
|
|
|
private List<BrowseEntry> findTopicsForDatasourceUsingDb(final String ds) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
final String sql = IOUtils.toString(getClass().getResourceAsStream("/sql/datasourceTopicsDetailed.sql"));
|
|
|
|
final RowMapper<BrowseEntry> mapper = (rs, rowNum) -> new BrowseEntry(rs.getString("topic"), rs.getLong("size"));
|
|
|
|
return jdbcTemplate.query(sql, new Object[] {
|
|
|
|
ds
|
|
|
|
}, mapper);
|
|
|
|
} catch (final Exception e) {
|
|
|
|
log.error("Error executing query", e);
|
|
|
|
return new ArrayList<>();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-02 08:55:42 +02:00
|
|
|
@ApiOperation("Return a page of events of a datasource (by topic)")
|
|
|
|
@GetMapping("/events/{nPage}/{size}")
|
|
|
|
public EventsPage showEvents(@RequestParam final String ds, @RequestParam final String topic, @PathVariable final int nPage, @PathVariable final int size) {
|
|
|
|
|
2020-09-18 09:25:05 +02:00
|
|
|
final NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery("map", QueryBuilders.matchQuery("map.targetDatasourceName", ds), ScoreMode.None);
|
|
|
|
|
|
|
|
final QueryBuilder q = StringUtils.isNotBlank(topic) && !topic.equals("*") ? QueryBuilders.boolQuery()
|
|
|
|
.must(QueryBuilders.matchQuery("topic", topic).operator(Operator.AND))
|
|
|
|
.must(nestedQuery) : nestedQuery;
|
|
|
|
|
2020-07-02 08:55:42 +02:00
|
|
|
final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
|
2020-09-18 09:25:05 +02:00
|
|
|
.withQuery(q)
|
2020-07-02 11:14:28 +02:00
|
|
|
.withSearchType(SearchType.DEFAULT)
|
|
|
|
.withFields("payload")
|
|
|
|
.withPageable(PageRequest.of(nPage, size))
|
|
|
|
.build();
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
final SearchHits<Event> page = esOperations.search(searchQuery, Event.class, IndexCoordinates.of(props.getEventsIndexName()));
|
|
|
|
|
2020-07-02 15:33:02 +02:00
|
|
|
final List<OaBrokerEventPayload> list = page.stream()
|
2020-07-02 11:14:28 +02:00
|
|
|
.map(SearchHit::getContent)
|
|
|
|
.map(Event::getPayload)
|
2020-07-02 15:33:02 +02:00
|
|
|
.map(OaBrokerEventPayload::fromJSON)
|
2020-07-02 11:14:28 +02:00
|
|
|
.collect(Collectors.toList());
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
return new EventsPage(ds, topic, nPage, overrideGetTotalPage(page, size), page.getTotalHits(), list);
|
|
|
|
}
|
|
|
|
|
|
|
|
@ApiOperation("Return a page of events of a datasource (by query)")
|
|
|
|
@PostMapping("/events/{nPage}/{size}")
|
|
|
|
public EventsPage advancedShowEvents(@PathVariable final int nPage, @PathVariable final int size, @RequestBody final AdvQueryObject qObj) {
|
|
|
|
|
|
|
|
final BoolQueryBuilder mapQuery = QueryBuilders.boolQuery();
|
2020-07-02 16:08:23 +02:00
|
|
|
ElasticSearchQueryUtils.addMapCondition(mapQuery, "map.targetDatasourceName", qObj.getDatasource());
|
|
|
|
ElasticSearchQueryUtils.addMapCondition(mapQuery, "map.targetResultTitle", qObj.getTitles());
|
|
|
|
ElasticSearchQueryUtils.addMapCondition(mapQuery, "map.targetAuthors", qObj.getAuthors());
|
|
|
|
ElasticSearchQueryUtils.addMapCondition(mapQuery, "map.targetSubjects", qObj.getSubjects());
|
2020-07-02 08:55:42 +02:00
|
|
|
ElasticSearchQueryUtils.addMapConditionForTrust(mapQuery, "map.trust", qObj.getTrust());
|
2020-07-02 16:08:23 +02:00
|
|
|
ElasticSearchQueryUtils.addMapConditionForDates(mapQuery, "map.targetDateofacceptance", qObj.getDates());
|
2020-07-02 08:55:42 +02:00
|
|
|
|
2020-09-18 09:25:05 +02:00
|
|
|
final NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery("map", mapQuery, ScoreMode.None);
|
|
|
|
|
|
|
|
final QueryBuilder q = StringUtils.isNotBlank(qObj.getTopic()) && !qObj.getTopic().equals("*") ? QueryBuilders.boolQuery()
|
|
|
|
.must(QueryBuilders.matchQuery("topic", qObj.getTopic()).operator(Operator.AND))
|
|
|
|
.must(nestedQuery) : nestedQuery;
|
|
|
|
|
2020-07-02 08:55:42 +02:00
|
|
|
final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
|
2020-09-18 09:25:05 +02:00
|
|
|
.withQuery(q)
|
2020-07-02 11:14:28 +02:00
|
|
|
.withSearchType(SearchType.DEFAULT)
|
|
|
|
.withFields("payload")
|
|
|
|
.withPageable(PageRequest.of(nPage, size))
|
|
|
|
.build();
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
final SearchHits<Event> page = esOperations.search(searchQuery, Event.class, IndexCoordinates.of(props.getEventsIndexName()));
|
|
|
|
|
2020-07-02 15:33:02 +02:00
|
|
|
final List<OaBrokerEventPayload> list = page.stream()
|
2020-07-02 11:14:28 +02:00
|
|
|
.map(SearchHit::getContent)
|
|
|
|
.map(Event::getPayload)
|
2020-07-02 15:33:02 +02:00
|
|
|
.map(OaBrokerEventPayload::fromJSON)
|
2020-07-02 11:14:28 +02:00
|
|
|
.collect(Collectors.toList());
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
return new EventsPage(qObj.getDatasource(), qObj.getTopic(), nPage, overrideGetTotalPage(page, size), page.getTotalHits(), list);
|
|
|
|
}
|
|
|
|
|
|
|
|
@ApiOperation("Perform a subscription")
|
|
|
|
@PostMapping("/subscribe")
|
|
|
|
public Subscription registerSubscription(@RequestBody final OpenaireSubscription oSub) {
|
|
|
|
final Subscription sub = oSub.asSubscription();
|
|
|
|
|
|
|
|
subscriptionRepo.save(sub);
|
|
|
|
|
|
|
|
return sub;
|
|
|
|
}
|
|
|
|
|
|
|
|
@ApiOperation("Return the subscriptions of an user (by email)")
|
|
|
|
@GetMapping("/subscriptions")
|
|
|
|
public Map<String, List<SimpleSubscriptionDesc>> subscriptions(@RequestParam final String email) {
|
|
|
|
final Iterable<Subscription> iter = subscriptionRepo.findBySubscriber(email);
|
|
|
|
return StreamSupport.stream(iter.spliterator(), false)
|
2020-07-02 11:14:28 +02:00
|
|
|
.map(this::subscriptionDesc)
|
|
|
|
.collect(Collectors.groupingBy(SimpleSubscriptionDesc::getDatasource));
|
2020-07-02 08:55:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@ApiOperation("Return a page of notifications")
|
|
|
|
@GetMapping("/notifications/{subscrId}/{nPage}/{size}")
|
|
|
|
public EventsPage notifications(@PathVariable final String subscrId, @PathVariable final int nPage, @PathVariable final int size) {
|
|
|
|
|
|
|
|
final Optional<Subscription> optSub = subscriptionRepo.findById(subscrId);
|
|
|
|
|
|
|
|
if (optSub.isPresent()) {
|
|
|
|
final Subscription sub = optSub.get();
|
|
|
|
|
|
|
|
final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
|
2020-09-08 16:38:14 +02:00
|
|
|
.withQuery(QueryBuilders.termQuery("subscriptionId.keyword", subscrId))
|
2020-07-02 11:14:28 +02:00
|
|
|
.withSearchType(SearchType.DEFAULT)
|
|
|
|
.withFields("payload")
|
|
|
|
.withPageable(PageRequest.of(nPage, size))
|
|
|
|
.build();
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
final SearchHits<Notification> page = esOperations.search(searchQuery, Notification.class, IndexCoordinates.of(props.getNotificationsIndexName()));
|
|
|
|
|
2020-07-02 15:33:02 +02:00
|
|
|
final List<OaBrokerEventPayload> list = page.stream()
|
2020-07-02 11:14:28 +02:00
|
|
|
.map(SearchHit::getContent)
|
|
|
|
.map(Notification::getPayload)
|
2020-07-02 15:33:02 +02:00
|
|
|
.map(OaBrokerEventPayload::fromJSON)
|
2020-07-02 11:14:28 +02:00
|
|
|
.collect(Collectors.toList());
|
2020-07-02 08:55:42 +02:00
|
|
|
|
|
|
|
return new EventsPage(extractDatasource(sub), sub.getTopic(), nPage, overrideGetTotalPage(page, size), page.getTotalHits(), list);
|
|
|
|
} else {
|
|
|
|
log.warn("Invalid subscription: " + subscrId);
|
|
|
|
return new EventsPage("", "", nPage, 0, 0, new ArrayList<>());
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-09-11 12:05:11 +02:00
|
|
|
@ApiOperation("Send notifications")
|
|
|
|
@GetMapping("/notifications/send/{date}")
|
|
|
|
private List<String> sendMailForNotifications(@PathVariable final long date) {
|
|
|
|
new Thread(() -> innerSendMailForNotifications(date)).start();
|
|
|
|
return Arrays.asList("Sending ...");
|
|
|
|
}
|
|
|
|
|
2020-09-17 15:50:51 +02:00
|
|
|
@ApiOperation("Update stats")
|
|
|
|
@GetMapping("/stats/update")
|
|
|
|
private List<String> updateStats() {
|
|
|
|
new Thread(() -> {
|
|
|
|
try {
|
|
|
|
jdbcTemplate.update(IOUtils.toString(getClass().getResourceAsStream("/sql/updateStats.sql")));
|
|
|
|
} catch (final Exception e) {
|
|
|
|
log.error("Error updating stats", e);
|
|
|
|
}
|
|
|
|
}).start();
|
|
|
|
return Arrays.asList("Sending ...");
|
|
|
|
}
|
|
|
|
|
2020-09-11 12:05:11 +02:00
|
|
|
private void innerSendMailForNotifications(final long date) {
|
|
|
|
for (final Subscription s : subscriptionRepo.findAll()) {
|
|
|
|
|
|
|
|
final long count = notificationRepository.countBySubscriptionIdAndDateAfter(s.getSubscriptionId(), date);
|
|
|
|
if (count > 0) {
|
|
|
|
final Map<String, Object> params = new HashMap<>();
|
|
|
|
params.put("oa_notifications_total", count);
|
|
|
|
dispatcher.sendNotification(s, params);
|
|
|
|
}
|
|
|
|
|
|
|
|
s.setLastNotificationDate(new Date());
|
|
|
|
subscriptionRepo.save(s);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-02 08:55:42 +02:00
|
|
|
private SimpleSubscriptionDesc subscriptionDesc(final Subscription s) {
|
|
|
|
return new SimpleSubscriptionDesc(s.getSubscriptionId(), extractDatasource(s), s.getTopic(), s.getCreationDate(), s.getLastNotificationDate(),
|
2020-07-02 11:14:28 +02:00
|
|
|
OpenaireBrokerController.this.notificationRepository.countBySubscriptionId(s.getSubscriptionId()));
|
2020-07-02 08:55:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private String extractDatasource(final Subscription sub) {
|
2020-07-02 11:14:28 +02:00
|
|
|
return sub.getConditionsAsList()
|
|
|
|
.stream()
|
2020-07-02 16:08:23 +02:00
|
|
|
.filter(c -> c.getField().equals("targetDatasourceName"))
|
2020-07-02 11:14:28 +02:00
|
|
|
.map(MapCondition::getListParams)
|
|
|
|
.filter(l -> !l.isEmpty())
|
|
|
|
.map(l -> l.get(0).getValue())
|
|
|
|
.findFirst()
|
|
|
|
.get();
|
2020-07-02 08:55:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private long overrideGetTotalPage(final SearchHits<?> page, final int size) {
|
|
|
|
return (page.getTotalHits() + size - 1) / size;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|