diff --git a/xwiki-platform-core/xwiki-platform-ratings/xwiki-platform-ratings-api/src/main/java/org/xwiki/ratings/internal/SolrRatingsManager.java b/xwiki-platform-core/xwiki-platform-ratings/xwiki-platform-ratings-api/src/main/java/org/xwiki/ratings/internal/SolrRatingsManager.java index 446c4ad336f6b9dd62a7c8658ab9214f638ae562..e316110e001e910ce9ef06a20cae129ec201e156 100644 --- a/xwiki-platform-core/xwiki-platform-ratings/xwiki-platform-ratings-api/src/main/java/org/xwiki/ratings/internal/SolrRatingsManager.java +++ b/xwiki-platform-core/xwiki-platform-ratings/xwiki-platform-ratings-api/src/main/java/org/xwiki/ratings/internal/SolrRatingsManager.java @@ -554,7 +554,7 @@ public AverageRating recomputeAverageRating(EntityReference entityReference) thr offsetIndex += BULK_OPERATIONS_BATCH_SIZE; } while (!ratings.isEmpty()); - float newAverage = Float.valueOf(sumOfVotes) / numberOfVotes; + float newAverage = (numberOfVotes > 0) ? Float.valueOf(sumOfVotes) / numberOfVotes : 0; return this.getAverageRatingManager().resetAverageRating(entityReference, newAverage, numberOfVotes); } else { throw new RatingsException(AVERAGE_RATING_NOT_ENABLED_ERROR_MESSAGE); diff --git a/xwiki-platform-core/xwiki-platform-ratings/xwiki-platform-ratings-api/src/test/java/org/xwiki/ratings/internal/SolrRatingsManagerTest.java b/xwiki-platform-core/xwiki-platform-ratings/xwiki-platform-ratings-api/src/test/java/org/xwiki/ratings/internal/SolrRatingsManagerTest.java index 23669edbe6d0c5d183a93e9b3b9c6b3e16252aa0..0b88491df0e1d21e48c4f236e659bf75778f4073 100644 --- a/xwiki-platform-core/xwiki-platform-ratings/xwiki-platform-ratings-api/src/test/java/org/xwiki/ratings/internal/SolrRatingsManagerTest.java +++ b/xwiki-platform-core/xwiki-platform-ratings/xwiki-platform-ratings-api/src/test/java/org/xwiki/ratings/internal/SolrRatingsManagerTest.java @@ -822,6 +822,47 @@ void recomputeAverageRating() throws Exception assertEquals(averageRating, this.manager.recomputeAverageRating(inputReference)); } + @Test + void recomputeAverageRatings_noVote() throws Exception + { + when(this.configuration.isAverageStored()).thenReturn(true); + when(this.solr.getClient(RatingSolrCoreInitializer.DEFAULT_RATINGS_SOLR_CORE)).thenReturn(this.solrClient); + EntityReference inputReference = mock(EntityReference.class); + when(inputReference.toString()).thenReturn("document:Input.Reference"); + String managerId = "myManager"; + + this.manager.setIdentifier(managerId); + + String filterQuery = String.format("filter(%s:%s) AND filter(%s:%s)", + RatingQueryField.ENTITY_REFERENCE.getFieldName(), "document\\:Input.Reference", + RatingQueryField.MANAGER_ID.getFieldName(), managerId); + + SolrQuery expectedQuery = new SolrQuery() + .addFilterQuery(filterQuery) + .setRows(100) + .setStart(0) + .setSort(RatingQueryField.CREATED_DATE.getFieldName(), SolrQuery.ORDER.asc); + + QueryResponse response1 = mock(QueryResponse.class); + when(solrClient.query(any())).then(invocationOnMock -> { + SolrQuery givenQuery = invocationOnMock.getArgument(0); + QueryResponse result = null; + assertEquals(expectedQuery.getQuery(), givenQuery.getQuery()); + assertArrayEquals(expectedQuery.getFilterQueries(), givenQuery.getFilterQueries()); + assertEquals(expectedQuery.getRows(), givenQuery.getRows()); + assertEquals(expectedQuery.getStart(), givenQuery.getStart()); + assertEquals(expectedQuery.getSorts(), givenQuery.getSorts()); + result = response1; + return result; + }); + // empty response + when(response1.getResults()).thenReturn(new SolrDocumentList()); + + AverageRating averageRating = mock(AverageRating.class); + when(this.averageRatingManager.resetAverageRating(inputReference, 0, 0)).thenReturn(averageRating); + assertEquals(averageRating, this.manager.recomputeAverageRating(inputReference)); + } + @Test void removeRatings() throws Exception {