List<ExchangeCurrencyRate> allExchangeCurrencyRates = exchangeAggregateRate.getAllExchangeCurrencyRates(enabledCryptoCurrency);
protected Optional<BigDecimal> getRateFromHistoricalProviderAndSaveToDB(CurrencyType currencyType, Instant timestamp) { ExchangeEntryRate exchangeEntryRate = getRateFromHistoricalProviderFromAllSupportedCurrencies(timestamp); // create the aggregation object ExchangeAggregateRate aggregateRate = new ExchangeAggregateRate(Date.from(Instant.now()), blockNrProviderService.getCurrentBlockNrEthereum(), blockNrProviderService.getCurrentBlockNrBitcoin()); aggregateRate.addExchangeEntry(exchangeEntryRate); if (exchangeEntryRate.getExchangeCurrencyRates() != null && !exchangeEntryRate.getExchangeCurrencyRates().isEmpty()) { exchangeEntryRate.getExchangeCurrencyRates().stream() .filter(distinctByKey(ExchangeCurrencyRate::getCurrencyType)) .forEach((entry) -> { // get all "ExchangeCurrencyRate" objects of distinct crypto currencies List<ExchangeCurrencyRate> allExchangeCurrencyRates = aggregateRate.getAllExchangeCurrencyRates(entry.getCurrencyType()); // remove outliers and get the mean BigDecimal mean = aggregationService.removeOutliersAndGetMean(allExchangeCurrencyRates); // create a new aggregate currency ExchangeAggregateCurrencyRate aggCurrencyRate = new ExchangeAggregateCurrencyRate(entry.getCurrencyType(), mean); // add to the top-level "ExchangeAggregateRate" aggregateRate.addExchangeAggregateCurrencyRate(aggCurrencyRate); }); // save to DB exchangeAggregateRateRepository.save(aggregateRate); } return aggregateRate.getExchangeAggregateCurrencyRates(currencyType) .map((aggregateObj) -> aggregateObj.getAggregateExchangeRate()); }
private ExchangeAggregateRate createExchangeAggregateRateWithMultipleExchangeEntry(ExchangeType... exchangeTypes) { ExchangeAggregateRate aggregateRate = createExchangeAggregateRate(); Arrays.asList(exchangeTypes).stream().forEach((type) -> { ExchangeEntryRate entryRate = createExchangeEntryRate(type); ExchangeCurrencyRate rateBTC = createExchangeCurrencyRate(CurrencyType.BTC); ExchangeCurrencyRate rateETH = createExchangeCurrencyRate(CurrencyType.ETH); entryRate.addCurrencyRate(rateBTC); entryRate.addCurrencyRate(rateETH); aggregateRate.addExchangeEntry(entryRate); }); ExchangeAggregateCurrencyRate aggregateCurrencyRateBTC = createExchangeAggregateCurrencyRate( CurrencyType.BTC, aggregateRate.getAllExchangeCurrencyRates(CurrencyType.BTC)); ExchangeAggregateCurrencyRate aggregateCurrencyRateETH = createExchangeAggregateCurrencyRate( CurrencyType.ETH, aggregateRate.getAllExchangeCurrencyRates(CurrencyType.ETH)); aggregateRate.addExchangeAggregateCurrencyRate(aggregateCurrencyRateBTC); aggregateRate.addExchangeAggregateCurrencyRate(aggregateCurrencyRateETH); aggregateRateRepository.save(aggregateRate); return aggregateRate; }