From 66d65306527179d02cac7d6f3083315a570dd84e Mon Sep 17 00:00:00 2001 From: Steven Barclay Date: Sun, 28 Jul 2024 21:46:46 +0200 Subject: [PATCH] Optimise/simplify some stream filtering for the REST API Replace the streaming of Map entry sets to pick out a single entry by key equality, and instead do a lookup into the map. Also, optimise the date range filtering in 'TradeStatisticsManager::getTradeStatisticsList' by using 'RangeUtils::subSet' to avoid scanning the entire collection. (This method is applicable, as the trade statistics set is navigable and naturally sorted by date.) --- .../burningman/accounting/balance/BalanceModel.java | 10 ++-------- .../core/trade/statistics/TradeStatisticsManager.java | 11 +++++++---- .../grpc/interceptor/CallRateMeteringInterceptor.java | 4 ++-- .../restapi/endpoints/ExplorerTransactionsApi.java | 8 ++------ 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/burningman/accounting/balance/BalanceModel.java b/core/src/main/java/bisq/core/dao/burningman/accounting/balance/BalanceModel.java index 920ee3baf75..4d94de6af5d 100644 --- a/core/src/main/java/bisq/core/dao/burningman/accounting/balance/BalanceModel.java +++ b/core/src/main/java/bisq/core/dao/burningman/accounting/balance/BalanceModel.java @@ -23,7 +23,6 @@ import bisq.common.util.DateUtil; import java.util.Calendar; -import java.util.Collection; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; @@ -54,8 +53,7 @@ public void addReceivedBtcBalanceEntry(ReceivedBtcBalanceEntry balanceEntry) { receivedBtcBalanceEntries.add(balanceEntry); Date month = balanceEntry.getMonth(); - receivedBtcBalanceEntriesByMonth.putIfAbsent(month, new HashSet<>()); - receivedBtcBalanceEntriesByMonth.get(month).add(balanceEntry); + receivedBtcBalanceEntriesByMonth.computeIfAbsent(month, m -> new HashSet<>()).add(balanceEntry); } public Set getReceivedBtcBalanceEntries() { @@ -63,11 +61,7 @@ public Set getReceivedBtcBalanceEntries() { } public Set getReceivedBtcBalanceEntriesByMonth(Date month) { - return receivedBtcBalanceEntriesByMonth.entrySet().stream() - .filter(e -> e.getKey().equals(month)) - .map(Map.Entry::getValue) - .flatMap(Collection::stream) - .collect(Collectors.toSet()); + return receivedBtcBalanceEntriesByMonth.getOrDefault(month, Set.of()); } public Stream getBurnedBsqBalanceEntries(Set burnOutputModels) { diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java index 0c070e928ec..79f801485a9 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java @@ -33,12 +33,15 @@ import bisq.common.config.Config; import bisq.common.file.JsonFileManager; +import bisq.common.util.RangeUtils; import com.google.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import com.google.common.collect.Range; + import javafx.collections.FXCollections; import javafx.collections.ObservableSet; @@ -136,10 +139,10 @@ public ObservableSet getObservableTradeStatisticsSet() { } public List getTradeStatisticsList(long dateStart, long dateEnd) { - return observableTradeStatisticsSet.stream() - .filter(x -> x.getDateAsLong() > dateStart && x.getDateAsLong() <= dateEnd) - .sorted((o1, o2) -> (Long.compare(o2.getDateAsLong(), o1.getDateAsLong()))) - .collect(Collectors.toList()); + return new ArrayList<>(RangeUtils.subSet(navigableTradeStatisticsSet) + .withKey(TradeStatistics3::getDateAsLong) + .overRange(Range.openClosed(Math.min(dateStart, dateEnd), dateEnd)) + .descendingSet()); } private void maybeDumpStatistics() { diff --git a/daemon/src/main/java/bisq/daemon/grpc/interceptor/CallRateMeteringInterceptor.java b/daemon/src/main/java/bisq/daemon/grpc/interceptor/CallRateMeteringInterceptor.java index 5f1dfd5c131..79ef7aaef92 100644 --- a/daemon/src/main/java/bisq/daemon/grpc/interceptor/CallRateMeteringInterceptor.java +++ b/daemon/src/main/java/bisq/daemon/grpc/interceptor/CallRateMeteringInterceptor.java @@ -103,8 +103,8 @@ private String getDefaultRateExceededError(String methodName, private Optional> getRateMeterKV(ServerCall serverCall) { String rateMeterKey = getRateMeterKey(serverCall); - return serviceCallRateMeters.entrySet().stream() - .filter((e) -> e.getKey().equals(rateMeterKey)).findFirst(); + return Optional.ofNullable(serviceCallRateMeters.get(rateMeterKey)) + .map(meter -> Map.entry(rateMeterKey, meter)); } private String getRateMeterKey(ServerCall serverCall) { diff --git a/restapi/src/main/java/bisq/restapi/endpoints/ExplorerTransactionsApi.java b/restapi/src/main/java/bisq/restapi/endpoints/ExplorerTransactionsApi.java index 3ce58aabdf9..2e48b612698 100644 --- a/restapi/src/main/java/bisq/restapi/endpoints/ExplorerTransactionsApi.java +++ b/restapi/src/main/java/bisq/restapi/endpoints/ExplorerTransactionsApi.java @@ -22,11 +22,10 @@ import bisq.core.dao.state.model.blockchain.Tx; import bisq.core.dao.state.model.blockchain.TxType; -import java.util.Collection; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; @@ -86,10 +85,7 @@ public List getBisqTxForAddr(@PathParam("addr") String address) { address = address.substring(1, address.length()); } String finalAddress = address; - List result = daoStateService.getTxIdSetByAddress().entrySet().stream() - .filter(e -> e.getKey().equals(finalAddress)) - .map(Map.Entry::getValue) - .flatMap(Collection::stream) + List result = daoStateService.getTxIdSetByAddress().getOrDefault(finalAddress, Set.of()).stream() .flatMap(txId -> daoStateService.getTx(txId).stream()) .map(tx -> BlockDataToJsonConverter.getJsonTx(daoStateService, tx)) .collect(Collectors.toList());