@Test public void queryByReviewRating() { withProduct(client(), product -> { withReview(client(), b -> b.target(product).rating(1), review1 -> { withReview(client(), b -> b.target(product).rating(3), review2 -> { assertEventually(Duration.ofSeconds(60), Duration.ofMillis(200), () -> { final ProductProjectionQuery query = ProductProjectionQuery.ofStaged() .withPredicates(m -> m.reviewRatingStatistics().averageRating().is(2.0)) .plusPredicates(m -> m.reviewRatingStatistics().count().is(2)) .plusPredicates(m -> m.reviewRatingStatistics().lowestRating().is(1)) .plusPredicates(m -> m.reviewRatingStatistics().highestRating().is(3)) .plusPredicates(m -> m.is(product)); final List<ProductProjection> results = client().executeBlocking(query).getResults(); assertThat(results).hasSize(1); assertThat(results.get(0).getId()).isEqualTo(product.getId()); }); }); }); }); }