Author: mfranklin
Date: Mon Nov 19 23:21:35 2012
New Revision: 1411479
URL: http://svn.apache.org/viewvc?rev=1411479&view=rev
Log:
Added tests for stats class
Modified:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbMapReduceStatisticsAggregator.java
rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MonogoDbMapReduceStatisticsAggregatorTest.java
Modified:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbMapReduceStatisticsAggregator.java
URL:
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbMapReduceStatisticsAggregator.java?rev=1411479&r1=1411478&r2=1411479&view=diff
==============================================================================
---
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbMapReduceStatisticsAggregator.java
(original)
+++
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbMapReduceStatisticsAggregator.java
Mon Nov 19 23:21:35 2012
@@ -29,6 +29,7 @@ import org.apache.rave.portal.model.util
import org.apache.rave.portal.repository.StatisticsAggregator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions;
import org.springframework.data.mongodb.core.mapreduce.MapReduceResults;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
@@ -67,7 +68,7 @@ public class MongoDbMapReduceStatisticsA
public WidgetStatistics getWidgetStatistics(long widget_id, long user_id) {
Query statsQuery = query(where("widgetId").is(widget_id));
MapReduceResults<WidgetRatingsMapReduceResult> widgetStats =
mongoOperations.mapReduce(statsQuery, WIDGET_COLLECTION, RATINGS_MAP,
RATINGS_REDUCE, WidgetRatingsMapReduceResult.class);
- List<MongoDbPage> pages =
mongoOperations.find(query(where("regions").elemMatch(where("regionWidgets").elemMatch(where("widgetId").is(widget_id)))),
MongoDbPage.class ,PAGE_COLLECTION);
+ List<MongoDbPage> pages =
mongoOperations.find(query(where("regions").elemMatch(where("regionWidgets").elemMatch(where("widgetId").is(widget_id)))),
MongoDbPage.class, PAGE_COLLECTION);
int userCount = getUserCount(pages).size();
switch (widgetStats.getCounts().getOutputCount()) {
@@ -100,26 +101,27 @@ public class MongoDbMapReduceStatisticsA
}
@PostConstruct
- private void init() {
+ public void init() {
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new
Runnable() {
@Override
public void run() {
- RunStatistics runStats = mongoOperations.findById(ID,
RunStatistics.class, STATS_COLLECTION);
- if(System.currentTimeMillis() -
runStats.getRefreshedTimeStamp() > DEFAULT_RESULT_VALIDITY) {
- queryForUserStats(runStats);
- }
+ buildStats();
}
}, 0, DEFAULT_RESULT_VALIDITY, TimeUnit.MILLISECONDS);
}
- private void queryForUserStats(RunStatistics runStats) {
+ public void buildStats() {
+ RunStatistics runStats = mongoOperations.findById(ID,
RunStatistics.class, STATS_COLLECTION);
+ if(runStats == null || (System.currentTimeMillis() -
runStats.getRefreshedTimeStamp() > DEFAULT_RESULT_VALIDITY)) {
+ queryForUserStats();
+ }
+ }
+
+ private void queryForUserStats() {
synchronized (this) {
- if(System.currentTimeMillis() - runStats.getRefreshedTimeStamp() >
DEFAULT_RESULT_VALIDITY) {
- executeUsersMapReduce();
- executeRatingsMapReduce();
- runStats.setRefreshedTimeStamp(System.currentTimeMillis());
- mongoOperations.save(runStats, STATS_COLLECTION);
- }
+ executeUsersMapReduce();
+ executeRatingsMapReduce();
+ mongoOperations.save(new RunStatistics(ID,
System.currentTimeMillis()), STATS_COLLECTION);
}
}
@@ -133,12 +135,16 @@ public class MongoDbMapReduceStatisticsA
return map;
}
+ private MapReduceOptions getOptions() {
+ return
MapReduceOptions.options().javaScriptMode(true).outputCollection(STATS_COLLECTION).outputTypeReplace();
+ }
+
private MapReduceResults<WidgetUsersMapReduceResult>
executeUsersMapReduce() {
- return mongoOperations.mapReduce(PAGE_COLLECTION, USERS_MAP,
USERS_REDUCE, WidgetUsersMapReduceResult.class);
+ return mongoOperations.mapReduce(PAGE_COLLECTION, USERS_MAP,
USERS_REDUCE, getOptions(), WidgetUsersMapReduceResult.class);
}
private MapReduceResults<WidgetRatingsMapReduceResult>
executeRatingsMapReduce() {
- return mongoOperations.mapReduce(PAGE_COLLECTION, RATINGS_MAP,
RATINGS_REDUCE, WidgetRatingsMapReduceResult.class);
+ return mongoOperations.mapReduce(WIDGET_COLLECTION, RATINGS_MAP,
RATINGS_REDUCE, getOptions(), WidgetRatingsMapReduceResult.class);
}
private void addUserCount(Map<Long, Integer> users, Map<Long,
WidgetStatistics> stats) {
@@ -163,6 +169,8 @@ public class MongoDbMapReduceStatisticsA
statistics.setTotalDislike(result.getDislike().intValue());
statistics.setTotalLike(result.getLike().intValue());
statistics.setUserRating(result.getUserRatings().containsKey(user_id) ?
result.getUserRatings().get(user_id).intValue() : -1);
+ } else {
+ statistics.setUserRating(-1);
}
statistics.setTotalUserCount(userResult == null ? 0 : userResult);
return statistics;
@@ -183,6 +191,14 @@ public class MongoDbMapReduceStatisticsA
private String id;
private Long refreshedTimeStamp;
+ public RunStatistics() {
+ }
+
+ public RunStatistics(String id, long timestamp) {
+ this.id = id;
+ this.refreshedTimeStamp = timestamp;
+ }
+
public String getId() {
return id;
}
Modified:
rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MonogoDbMapReduceStatisticsAggregatorTest.java
URL:
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MonogoDbMapReduceStatisticsAggregatorTest.java?rev=1411479&r1=1411478&r2=1411479&view=diff
==============================================================================
---
rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MonogoDbMapReduceStatisticsAggregatorTest.java
(original)
+++
rave/branches/mongo/rave-components/rave-mongodb/src/test/java/org/apache/rave/portal/repository/impl/MonogoDbMapReduceStatisticsAggregatorTest.java
Mon Nov 19 23:21:35 2012
@@ -19,6 +19,7 @@
package org.apache.rave.portal.repository.impl;
+import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.rave.portal.model.WidgetRatingsMapReduceResult;
import org.apache.rave.portal.model.WidgetUsersMapReduceResult;
@@ -28,11 +29,14 @@ import org.apache.rave.portal.repository
import org.junit.Before;
import org.junit.Test;
import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import static
org.apache.rave.portal.repository.impl.MongoDbMapReduceStatisticsAggregator.*;
+import static org.apache.rave.portal.repository.util.CollectionNames.*;
import static org.easymock.EasyMock.*;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
@@ -50,24 +54,15 @@ public class MonogoDbMapReduceStatistics
}
@Test
- public void getAllStatistics_valid_allPositive() {
+ public void getAllStatistics_valid() {
- Map<Long, Long> userRatings = Maps.newHashMap();
- userRatings.put(1L, 10L);
- userRatings.put(2L, 10L);
-
- Map<Long, Long> users = Maps.newHashMap();
- users.put(1L, 1L);
- users.put(2L, 1L);
- users.put(3L, 1L);
- users.put(4L, 1L);
- users.put(5L, 1L);
- users.put(6L, 1L);
+ Map<Long, Long> userRatings = getRatingsMap();
+ Map<Long, Long> users = getUsersMap();
List<WidgetRatingsMapReduceResult> ratings = Arrays.asList(
- new WidgetRatingsMapReduceResult(24L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 20L,
0L)),
- new WidgetRatingsMapReduceResult(25L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 20L,
0L)),
- new WidgetRatingsMapReduceResult(26L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 10L,
0L))
+ new WidgetRatingsMapReduceResult(24L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 2L,
0L)),
+ new WidgetRatingsMapReduceResult(25L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 2L,
0L)),
+ new WidgetRatingsMapReduceResult(26L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 2L,
0L))
);
List<WidgetUsersMapReduceResult> usersMapReduceResults = Arrays.asList(
@@ -82,35 +77,60 @@ public class MonogoDbMapReduceStatistics
Map<Long, WidgetStatistics> stats =
aggregator.getAllWidgetStatistics(1L);
assertThat(stats.size(), is(equalTo(3)));
- assertThat(stats.get(24L).getTotalLike(), is(equalTo(20)));
+ assertThat(stats.get(24L).getTotalLike(), is(equalTo(2)));
assertThat(stats.get(24L).getTotalDislike(), is(equalTo(0)));
assertThat(stats.get(24L).getUserRating(), is(equalTo(10)));
assertThat(stats.get(24L).getTotalUserCount(),
is(equalTo(users.size())));
- assertThat(stats.get(26L).getTotalLike(), is(equalTo(10)));
+ assertThat(stats.get(26L).getTotalLike(), is(equalTo(2)));
assertThat(stats.get(26L).getTotalDislike(), is(equalTo(0)));
assertThat(stats.get(26L).getUserRating(), is(equalTo(10)));
assertThat(stats.get(26L).getTotalUserCount(),
is(equalTo(users.size())));
}
@Test
- public void getAllStatistics_valid_allNegative() {
+ public void getAllStatistics_noUserRating() {
- Map<Long, Long> userRatings = Maps.newHashMap();
- userRatings.put(1L, 10L);
- userRatings.put(2L, 10L);
+ Map<Long, Long> userRatings = getRatingsMap();
+ Map<Long, Long> users = getUsersMap();
- Map<Long, Long> users = Maps.newHashMap();
- users.put(1L, 1L);
- users.put(2L, 1L);
- users.put(3L, 1L);
- users.put(4L, 1L);
- users.put(5L, 1L);
- users.put(6L, 1L);
+ List<WidgetRatingsMapReduceResult> ratings = Arrays.asList(
+ new WidgetRatingsMapReduceResult(24L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 2L,
0L)),
+ new WidgetRatingsMapReduceResult(25L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 2L,
0L)),
+ new WidgetRatingsMapReduceResult(26L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 2L,
0L))
+ );
+
+ List<WidgetUsersMapReduceResult> usersMapReduceResults = Arrays.asList(
+ new WidgetUsersMapReduceResult(24L, users),
+ new WidgetUsersMapReduceResult(25L, users),
+ new WidgetUsersMapReduceResult(26L, users)
+ );
+
+ expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class,
CollectionNames.STATS_COLLECTION)).andReturn(ratings);
+ expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class,
CollectionNames.STATS_COLLECTION)).andReturn(usersMapReduceResults);
+ replay(mongoOperations);
+
+ Map<Long, WidgetStatistics> stats =
aggregator.getAllWidgetStatistics(5L);
+ assertThat(stats.size(), is(equalTo(3)));
+ assertThat(stats.get(24L).getTotalLike(), is(equalTo(2)));
+ assertThat(stats.get(24L).getTotalDislike(), is(equalTo(0)));
+ assertThat(stats.get(24L).getUserRating(), is(equalTo(-1)));
+ assertThat(stats.get(24L).getTotalUserCount(),
is(equalTo(users.size())));
+ assertThat(stats.get(26L).getTotalLike(), is(equalTo(2)));
+ assertThat(stats.get(26L).getTotalDislike(), is(equalTo(0)));
+ assertThat(stats.get(26L).getUserRating(), is(equalTo(-1)));
+ assertThat(stats.get(26L).getTotalUserCount(),
is(equalTo(users.size())));
+ }
+
+ @Test
+ public void getAllStatistics_nullStats() {
+
+ Map<Long, Long> userRatings = getRatingsMap();
+ Map<Long, Long> users = getUsersMap();
List<WidgetRatingsMapReduceResult> ratings = Arrays.asList(
- new WidgetRatingsMapReduceResult(24L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 20L,
0L)),
- new WidgetRatingsMapReduceResult(25L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 20L,
0L)),
- new WidgetRatingsMapReduceResult(26L, new
WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userRatings, 10L,
0L))
+ new WidgetRatingsMapReduceResult(24L, null),
+ new WidgetRatingsMapReduceResult(25L, null),
+ new WidgetRatingsMapReduceResult(26L, null)
);
List<WidgetUsersMapReduceResult> usersMapReduceResults = Arrays.asList(
@@ -123,15 +143,100 @@ public class MonogoDbMapReduceStatistics
expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class,
CollectionNames.STATS_COLLECTION)).andReturn(usersMapReduceResults);
replay(mongoOperations);
- Map<Long, WidgetStatistics> stats =
aggregator.getAllWidgetStatistics(1L);
+ Map<Long, WidgetStatistics> stats =
aggregator.getAllWidgetStatistics(5L);
assertThat(stats.size(), is(equalTo(3)));
- assertThat(stats.get(24L).getTotalLike(), is(equalTo(20)));
+ assertThat(stats.get(24L).getTotalLike(), is(equalTo(0)));
assertThat(stats.get(24L).getTotalDislike(), is(equalTo(0)));
- assertThat(stats.get(24L).getUserRating(), is(equalTo(10)));
+ assertThat(stats.get(24L).getUserRating(), is(equalTo(-1)));
assertThat(stats.get(24L).getTotalUserCount(),
is(equalTo(users.size())));
- assertThat(stats.get(26L).getTotalLike(), is(equalTo(10)));
+ assertThat(stats.get(26L).getTotalLike(), is(equalTo(0)));
assertThat(stats.get(26L).getTotalDislike(), is(equalTo(0)));
- assertThat(stats.get(26L).getUserRating(), is(equalTo(10)));
+ assertThat(stats.get(26L).getUserRating(), is(equalTo(-1)));
+ assertThat(stats.get(26L).getTotalUserCount(),
is(equalTo(users.size())));
+ }
+
+ @Test
+ public void getAllStatistics_noRatings() {
+
+ Map<Long, Long> users = getUsersMap();
+
+ List<WidgetRatingsMapReduceResult> ratings = Lists.newArrayList();
+
+ List<WidgetUsersMapReduceResult> usersMapReduceResults = Arrays.asList(
+ new WidgetUsersMapReduceResult(24L, users),
+ new WidgetUsersMapReduceResult(25L, users),
+ new WidgetUsersMapReduceResult(26L, users)
+ );
+
+ expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class,
CollectionNames.STATS_COLLECTION)).andReturn(ratings);
+ expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class,
CollectionNames.STATS_COLLECTION)).andReturn(usersMapReduceResults);
+ replay(mongoOperations);
+
+ Map<Long, WidgetStatistics> stats =
aggregator.getAllWidgetStatistics(5L);
+ assertThat(stats.size(), is(equalTo(3)));
+ assertThat(stats.get(24L).getTotalLike(), is(equalTo(0)));
+ assertThat(stats.get(24L).getTotalDislike(), is(equalTo(0)));
+ assertThat(stats.get(24L).getUserRating(), is(equalTo(-1)));
+ assertThat(stats.get(24L).getTotalUserCount(),
is(equalTo(users.size())));
+ assertThat(stats.get(26L).getTotalLike(), is(equalTo(0)));
+ assertThat(stats.get(26L).getTotalDislike(), is(equalTo(0)));
+ assertThat(stats.get(26L).getUserRating(), is(equalTo(-1)));
assertThat(stats.get(26L).getTotalUserCount(),
is(equalTo(users.size())));
}
+
+ @Test
+ public void init_existing() {
+ expect(mongoOperations.findById(ID, RunStatistics.class,
STATS_COLLECTION)).andReturn(new RunStatistics(ID, System.currentTimeMillis() -
DEFAULT_RESULT_VALIDITY));
+ setMapReduceExpectations();
+ mongoOperations.save(isA(RunStatistics.class), eq(STATS_COLLECTION));
+ expectLastCall();
+ replay(mongoOperations);
+
+ ((MongoDbMapReduceStatisticsAggregator)aggregator).buildStats();
+ verify(mongoOperations);
+ }
+
+ @Test
+ public void init_empty() {
+ expect(mongoOperations.findById(ID, RunStatistics.class,
STATS_COLLECTION)).andReturn(null);
+ setMapReduceExpectations();
+ mongoOperations.save(isA(RunStatistics.class), eq(STATS_COLLECTION));
+ expectLastCall();
+ replay(mongoOperations);
+
+ ((MongoDbMapReduceStatisticsAggregator)aggregator).buildStats();
+ verify(mongoOperations);
+ }
+
+ @Test
+ public void init_tooEarly() {
+ expect(mongoOperations.findById(ID, RunStatistics.class,
STATS_COLLECTION)).andReturn(new RunStatistics(ID, System.currentTimeMillis() -
1000L));
+ replay(mongoOperations);
+
+ ((MongoDbMapReduceStatisticsAggregator)aggregator).buildStats();
+ verify(mongoOperations);
+ }
+
+ private void setMapReduceExpectations() {
+ expect(mongoOperations.mapReduce(eq(WIDGET_COLLECTION),
eq(RATINGS_MAP), eq(RATINGS_REDUCE), isA(MapReduceOptions.class),
eq(WidgetRatingsMapReduceResult.class))).andReturn(null);
+ expect(mongoOperations.mapReduce(eq(PAGE_COLLECTION), eq(USERS_MAP),
eq(USERS_REDUCE), isA(MapReduceOptions.class),
eq(WidgetUsersMapReduceResult.class))).andReturn(null);
+ }
+
+ private Map<Long, Long> getRatingsMap() {
+ Map<Long, Long> userRatings = Maps.newHashMap();
+ userRatings.put(1L, 10L);
+ userRatings.put(2L, 10L);
+ return userRatings;
+ }
+
+ private Map<Long, Long> getUsersMap() {
+ Map<Long, Long> users = Maps.newHashMap();
+ users.put(1L, 1L);
+ users.put(2L, 1L);
+ users.put(3L, 1L);
+ users.put(4L, 1L);
+ users.put(5L, 1L);
+ users.put(6L, 1L);
+ return users;
+ }
}