public Optional<RecommendedParticipation> recommend() { return recommend(participation.getRemainingPrincipal()); }
public Optional<RecommendedParticipation> recommend() { return recommend(participation.getRemainingPrincipal()); }
@Override public Stream<RecommendedParticipation> recommend(final Collection<ParticipationDescriptor> available, final PortfolioOverview portfolio, final Restrictions restrictions) { if (!Util.isAcceptable(strategy, portfolio)) { return Stream.empty(); } // split available marketplace into buckets per rating final Map<Rating, List<ParticipationDescriptor>> splitByRating = Util.sortByRating(strategy.getApplicableParticipations(available), d -> d.item().getRating()); // recommend amount to invest per strategy return Util.rankRatingsByDemand(strategy, splitByRating.keySet(), portfolio) .flatMap(rating -> splitByRating.get(rating).stream().sorted(COMPARATOR)) .peek(d -> Decisions.report(logger -> logger.trace("Evaluating {}.", d.item()))) .filter(d -> sizeMatchesStrategy(d.item(), portfolio.getCzkAvailable())) .flatMap(d -> d.recommend().map(Stream::of).orElse(Stream.empty())); } }
@Override public Stream<RecommendedParticipation> recommend(final Collection<ParticipationDescriptor> available, final PortfolioOverview portfolio, final Restrictions restrictions) { if (!Util.isAcceptable(strategy, portfolio)) { return Stream.empty(); } // split available marketplace into buckets per rating final Map<Rating, List<ParticipationDescriptor>> splitByRating = Util.sortByRating(strategy.getApplicableParticipations(available), d -> d.item().getRating()); // recommend amount to invest per strategy return Util.rankRatingsByDemand(strategy, splitByRating.keySet(), portfolio) .flatMap(rating -> splitByRating.get(rating).stream().sorted(COMPARATOR)) .peek(d -> Decisions.report(logger -> logger.trace("Evaluating {}.", d.item()))) .filter(d -> sizeMatchesStrategy(d.item(), portfolio.getCzkAvailable())) .flatMap(d -> d.recommend().map(Stream::of).orElse(Stream.empty())); } }
private static RecommendedParticipation recommendedParticipation() { final Participation p = mock(Participation.class); when(p.getRemainingPrincipal()).thenReturn(BigDecimal.TEN); return new ParticipationDescriptor(p, () -> Loan.custom().build()).recommend().orElse(null); }
@Test void recommendWrong() { final Participation p = mockParticipation(BigDecimal.TEN); final ParticipationDescriptor pd = new ParticipationDescriptor(p, () -> LOAN); final Optional<RecommendedParticipation> r = pd.recommend(p.getRemainingPrincipal().subtract(BigDecimal.ONE)); assertThat(r).isEmpty(); }
@Test void recommend() { final Participation p = mockParticipation(BigDecimal.TEN); final ParticipationDescriptor pd = new ParticipationDescriptor(p, () -> LOAN); final Optional<RecommendedParticipation> r = pd.recommend(p.getRemainingPrincipal()); assertThat(r).isPresent(); assertSoftly(softly -> { softly.assertThat(r.get().amount()).isEqualTo(p.getRemainingPrincipal()); softly.assertThat(r.get().descriptor().related()).isSameAs(LOAN); softly.assertThat(r.get().descriptor()).isEqualTo(pd); }); }