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;
+    }
 }


Reply via email to