Author: mfranklin
Date: Tue Dec 18 01:29:38 2012
New Revision: 1423245

URL: http://svn.apache.org/viewvc?rev=1423245&view=rev
Log:
Fixed issues with widget statistics

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/main/java/org/apache/rave/portal/repository/util/CollectionNames.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=1423245&r1=1423244&r2=1423245&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
 Tue Dec 18 01:29:38 2012
@@ -20,9 +20,6 @@
 package org.apache.rave.portal.repository.impl;
 
 import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.rave.portal.model.MongoDbPage;
-import org.apache.rave.portal.model.Page;
 import org.apache.rave.portal.model.WidgetRatingsMapReduceResult;
 import org.apache.rave.portal.model.WidgetUsersMapReduceResult;
 import org.apache.rave.portal.model.util.WidgetStatistics;
@@ -31,21 +28,15 @@ import org.springframework.beans.factory
 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;
 
 import javax.annotation.PostConstruct;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
-import static 
org.apache.rave.portal.repository.util.CollectionNames.PAGE_COLLECTION;
-import static 
org.apache.rave.portal.repository.util.CollectionNames.STATS_COLLECTION;
-import static 
org.apache.rave.portal.repository.util.CollectionNames.WIDGET_COLLECTION;
-import static org.springframework.data.mongodb.core.query.Criteria.where;
-import static org.springframework.data.mongodb.core.query.Query.query;
+import static org.apache.rave.portal.repository.util.CollectionNames.*;
 
 /**
  * Provides Statistics via MapReduce jobs
@@ -66,28 +57,25 @@ public class MongoDbMapReduceStatisticsA
         this.mongoOperations = mongoOperations;
     }
     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);
-
-        int userCount = getUserCount(pages).size();
-        switch (widgetStats.getCounts().getOutputCount()) {
-            case 0:
-                WidgetStatistics stats = new WidgetStatistics();
-                stats.setTotalUserCount(userCount);
-                return stats;
-            case 1:
-                WidgetRatingsMapReduceResult statsResult = 
widgetStats.iterator().next();
-                return createWidgetStatisticsFromResults(user_id, statsResult, 
userCount);
-            default:
-                throw new IllegalStateException("Invalid results returned from 
Map/Reduce");
+        WidgetUsersMapReduceResult userResult = 
mongoOperations.findById(widget_id, WidgetUsersMapReduceResult.class, 
WIDGET_USERS);
+        WidgetRatingsMapReduceResult ratingResult = 
mongoOperations.findById(widget_id, WidgetRatingsMapReduceResult.class, 
WIDGET_RATINGS);
+
+        int userCount = userResult == null ? 0 : userResult.getValue().size();
+        WidgetStatistics stats;
+        if(ratingResult == null) {
+            stats = new WidgetStatistics();
+            stats.setUserRating(-1);
+        } else {
+            stats = createWidgetStatisticsFromResults(user_id, ratingResult);
         }
+        stats.setTotalUserCount(userCount);
+        return stats;
     }
 
     @Override
     public Map<Long, WidgetStatistics> getAllWidgetStatistics(long userId) {
-        List<WidgetRatingsMapReduceResult> widgetStats = 
mongoOperations.findAll(WidgetRatingsMapReduceResult.class, STATS_COLLECTION);
-        List<WidgetUsersMapReduceResult> widgetUsers = 
mongoOperations.findAll(WidgetUsersMapReduceResult.class, STATS_COLLECTION);
+        List<WidgetRatingsMapReduceResult> widgetStats = 
mongoOperations.findAll(WidgetRatingsMapReduceResult.class, WIDGET_RATINGS);
+        List<WidgetUsersMapReduceResult> widgetUsers = 
mongoOperations.findAll(WidgetUsersMapReduceResult.class, WIDGET_USERS);
 
         Map<Long, WidgetStatistics> stats = Maps.newHashMap();
         Map<Long, Integer> userStats = mapUsersResults(widgetUsers);
@@ -111,7 +99,7 @@ public class MongoDbMapReduceStatisticsA
     }
 
     public void buildStats() {
-        RunStatistics runStats = mongoOperations.findById(ID, 
RunStatistics.class, STATS_COLLECTION);
+        RunStatistics runStats = mongoOperations.findById(ID, 
RunStatistics.class, OPERATIONS);
         if(runStats == null || (System.currentTimeMillis() - 
runStats.getRefreshedTimeStamp() > DEFAULT_RESULT_VALIDITY)) {
             queryForUserStats();
         }
@@ -121,7 +109,7 @@ public class MongoDbMapReduceStatisticsA
         synchronized (this) {
             executeUsersMapReduce();
             executeRatingsMapReduce();
-            mongoOperations.save(new RunStatistics(ID, 
System.currentTimeMillis()), STATS_COLLECTION);
+            mongoOperations.save(new RunStatistics(ID, 
System.currentTimeMillis()), OPERATIONS);
         }
     }
 
@@ -135,34 +123,48 @@ public class MongoDbMapReduceStatisticsA
         return map;
     }
 
-    private MapReduceOptions getOptions() {
-        return 
MapReduceOptions.options().javaScriptMode(true).outputCollection(STATS_COLLECTION).outputTypeReplace();
+    private MapReduceOptions getOptions(String collection) {
+        return 
MapReduceOptions.options().javaScriptMode(true).outputCollection(collection).outputTypeReplace();
     }
 
     private MapReduceResults<WidgetUsersMapReduceResult> 
executeUsersMapReduce() {
-        return mongoOperations.mapReduce(PAGE_COLLECTION, USERS_MAP, 
USERS_REDUCE, getOptions(), WidgetUsersMapReduceResult.class);
+        return mongoOperations.mapReduce(PAGE_COLLECTION, USERS_MAP, 
USERS_REDUCE, getOptions(WIDGET_USERS), WidgetUsersMapReduceResult.class);
     }
 
     private MapReduceResults<WidgetRatingsMapReduceResult> 
executeRatingsMapReduce() {
-        return mongoOperations.mapReduce(WIDGET_COLLECTION, RATINGS_MAP, 
RATINGS_REDUCE, getOptions(), WidgetRatingsMapReduceResult.class);
+        return mongoOperations.mapReduce(WIDGET_COLLECTION, RATINGS_MAP, 
RATINGS_REDUCE, getOptions(WIDGET_RATINGS), WidgetRatingsMapReduceResult.class);
     }
 
     private void addUserCount(Map<Long, Integer> users, Map<Long, 
WidgetStatistics> stats) {
         for (Map.Entry<Long, Integer> result : users.entrySet()) {
-            WidgetStatistics widgetStatistics = new WidgetStatistics();
-            widgetStatistics.setTotalUserCount(result.getValue());
-            widgetStatistics.setUserRating(-1);
+            WidgetStatistics widgetStatistics = 
getTotalUserOnlyWidgetStatistics(result.getValue());
             stats.put(result.getKey(), widgetStatistics);
         }
     }
 
     private void addCombinedStats(long userId, 
List<WidgetRatingsMapReduceResult> widgetStats, Map<Long, Integer> usersMap, 
Map<Long, WidgetStatistics> stats) {
         for (WidgetRatingsMapReduceResult result : widgetStats) {
-            stats.put(result.getId(), 
createWidgetStatisticsFromResults(userId, result, 
usersMap.get(result.getId())));
+            stats.put(result.getId(), 
createWidgetStatisticsFromResults(userId, result));
+        }
+        for(Map.Entry<Long, Integer> id : usersMap.entrySet()) {
+            Integer value = id.getValue();
+            if(stats.containsKey(id.getKey())) {
+                stats.get(id.getKey()).setTotalUserCount(value);
+            } else {
+                WidgetStatistics stat = 
getTotalUserOnlyWidgetStatistics(value);
+                stats.put(id.getKey(), stat);
+            }
         }
     }
 
-    private WidgetStatistics createWidgetStatisticsFromResults(long user_id, 
WidgetRatingsMapReduceResult statsResult, Integer userResult) {
+    private WidgetStatistics getTotalUserOnlyWidgetStatistics(Integer value) {
+        WidgetStatistics stat = new WidgetStatistics();
+        stat.setTotalUserCount(value);
+        stat.setUserRating(-1);
+        return stat;
+    }
+
+    private WidgetStatistics createWidgetStatisticsFromResults(long user_id, 
WidgetRatingsMapReduceResult statsResult) {
         WidgetStatistics statistics = new WidgetStatistics();
         WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult result = 
statsResult.getValue();
         if (result != null) {
@@ -172,21 +174,9 @@ public class MongoDbMapReduceStatisticsA
         } else {
             statistics.setUserRating(-1);
         }
-        statistics.setTotalUserCount(userResult == null ? 0 : userResult);
         return statistics;
     }
 
-    private Set<Long> getUserCount(List<MongoDbPage> pages) {
-        Set<Long> set = Sets.newHashSet();
-        for (Page page : pages) {
-            Long id = page.getOwner().getId();
-            if (!set.contains(id)) {
-                set.add(id);
-            }
-        }
-        return set;
-    }
-
     public static class RunStatistics {
         private String id;
         private Long refreshedTimeStamp;

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java?rev=1423245&r1=1423244&r2=1423245&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/util/CollectionNames.java
 Tue Dec 18 01:29:38 2012
@@ -20,6 +20,7 @@
 package org.apache.rave.portal.repository.util;
 
 public class CollectionNames {
+
     private CollectionNames() {}
 
     public static final String WIDGET_COLLECTION = "widget";
@@ -34,5 +35,7 @@ public class CollectionNames {
     public static final String OAUTH_CONSUMER_COLLECTION = 
"oauthConsumerStore";
     public static final String OAUTH_TOKEN_COLLECTION = "oauthTokenInfo";
     public static final String PAGE_LAYOUT_COLLECTION = "pageLayout";
-    public static final String STATS_COLLECTION = "statistics";
+    public static final String WIDGET_RATINGS = "rating_statistics";
+    public static final String WIDGET_USERS = "user_statistics";
+    public static final String OPERATIONS = "ops";
 }

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=1423245&r1=1423244&r2=1423245&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
 Tue Dec 18 01:29:38 2012
@@ -21,21 +21,19 @@ package org.apache.rave.portal.repositor
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import org.apache.rave.portal.model.*;
-import org.apache.rave.portal.model.impl.UserImpl;
+import org.apache.rave.portal.model.WidgetRatingsMapReduceResult;
+import org.apache.rave.portal.model.WidgetUsersMapReduceResult;
 import org.apache.rave.portal.model.util.WidgetStatistics;
 import org.apache.rave.portal.repository.StatisticsAggregator;
 import org.apache.rave.portal.repository.util.CollectionNames;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.springframework.data.mongodb.core.MongoOperations;
-import org.springframework.data.mongodb.core.mapreduce.MapReduceCounts;
 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 java.util.*;
+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.*;
@@ -43,9 +41,6 @@ import static org.easymock.EasyMock.*;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.springframework.data.mongodb.core.query.Criteria.where;
-import static org.springframework.data.mongodb.core.query.Query.query;
 
 public class MonogoDbMapReduceStatisticsAggregatorTest {
 
@@ -59,66 +54,6 @@ public class MonogoDbMapReduceStatistics
     }
 
     @Test
-    public void getStatistics_Case0(){
-        long widget_id = 123;
-        long user_id = 321;
-        Query statsQuery = query(where("widgetId").is(widget_id));
-        Query pageQuery = 
query(where("regions").elemMatch(where("regionWidgets").elemMatch(where("widgetId").is(widget_id))));
-        MapReduceResults<WidgetRatingsMapReduceResult> widgetStats = 
createMock(MapReduceResults.class);
-        MapReduceCounts mapReduceCounts = createMock(MapReduceCounts.class);
-        List<MongoDbPage> pages = new ArrayList<MongoDbPage>();
-
-        expect(mongoOperations.mapReduce(statsQuery, WIDGET_COLLECTION, 
RATINGS_MAP, RATINGS_REDUCE, 
WidgetRatingsMapReduceResult.class)).andReturn(widgetStats);
-        expect(mongoOperations.find(pageQuery, MongoDbPage.class, 
PAGE_COLLECTION)).andReturn(pages);
-        expect(widgetStats.getCounts()).andReturn(mapReduceCounts);
-        expect(mapReduceCounts.getOutputCount()).andReturn(0);
-        replay(mongoOperations, widgetStats, mapReduceCounts);
-
-        WidgetStatistics result = aggregator.getWidgetStatistics(widget_id, 
user_id);
-
-        assertTrue(result.getTotalUserCount() == 0);
-    }
-
-    @Test
-    public void getStatistics_Case1(){
-        long widget_id = 123;
-        long user_id = 321;
-        Query statsQuery = query(where("widgetId").is(widget_id));
-        Query pageQuery = 
query(where("regions").elemMatch(where("regionWidgets").elemMatch(where("widgetId").is(widget_id))));
-        MapReduceResults<WidgetRatingsMapReduceResult> widgetStats = 
createMock(MapReduceResults.class);
-        MapReduceCounts mapReduceCounts = createMock(MapReduceCounts.class);
-        WidgetRatingsMapReduceResult statsResult = new 
WidgetRatingsMapReduceResult();
-        List<MongoDbPage> pages = new ArrayList<MongoDbPage>();
-        Iterator iter = createMock(Iterator.class);
-
-        //add page to pages
-        Page page = new MongoDbPage();
-        User owner = new UserImpl();
-        ((UserImpl)owner).setId(234L);
-        page.setOwner(owner);
-        pages.add((MongoDbPage)page);
-
-        //add same id to cover branches
-        Page page_2 = new MongoDbPage();
-        User owner_2 = new UserImpl();
-        ((UserImpl)owner_2).setId(234L);
-        page_2.setOwner(owner_2);
-        pages.add((MongoDbPage)page_2);
-
-        expect(mongoOperations.mapReduce(statsQuery, WIDGET_COLLECTION, 
RATINGS_MAP, RATINGS_REDUCE, 
WidgetRatingsMapReduceResult.class)).andReturn(widgetStats);
-        expect(mongoOperations.find(pageQuery, MongoDbPage.class, 
PAGE_COLLECTION)).andReturn(pages);
-        expect(widgetStats.getCounts()).andReturn(mapReduceCounts);
-        expect(mapReduceCounts.getOutputCount()).andReturn(1);
-        expect(widgetStats.iterator()).andReturn(iter);
-        expect(iter.next()).andReturn(statsResult);
-        replay(mongoOperations, widgetStats, mapReduceCounts, iter);
-
-        WidgetStatistics result = aggregator.getWidgetStatistics(widget_id, 
user_id);
-
-        assertThat(result.getTotalUserCount(), is(equalTo(1)));
-    }
-
-    @Test
     public void getAllStatistics_valid() {
 
         Map<Long, Long> userRatings = getRatingsMap();
@@ -136,8 +71,8 @@ public class MonogoDbMapReduceStatistics
                 new WidgetUsersMapReduceResult(26L, users)
         );
 
-        expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class, 
CollectionNames.STATS_COLLECTION)).andReturn(ratings);
-        expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class, 
CollectionNames.STATS_COLLECTION)).andReturn(usersMapReduceResults);
+        expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class, 
CollectionNames.WIDGET_RATINGS)).andReturn(ratings);
+        expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class, 
CollectionNames.WIDGET_USERS)).andReturn(usersMapReduceResults);
         replay(mongoOperations);
 
         Map<Long, WidgetStatistics> stats = 
aggregator.getAllWidgetStatistics(1L);
@@ -170,8 +105,8 @@ public class MonogoDbMapReduceStatistics
                 new WidgetUsersMapReduceResult(26L, users)
         );
 
-        expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class, 
CollectionNames.STATS_COLLECTION)).andReturn(ratings);
-        expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class, 
CollectionNames.STATS_COLLECTION)).andReturn(usersMapReduceResults);
+        expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class, 
CollectionNames.WIDGET_RATINGS)).andReturn(ratings);
+        expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class, 
CollectionNames.WIDGET_USERS)).andReturn(usersMapReduceResults);
         replay(mongoOperations);
 
         Map<Long, WidgetStatistics> stats = 
aggregator.getAllWidgetStatistics(5L);
@@ -204,8 +139,8 @@ public class MonogoDbMapReduceStatistics
                 new WidgetUsersMapReduceResult(26L, users)
         );
 
-        expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class, 
CollectionNames.STATS_COLLECTION)).andReturn(ratings);
-        expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class, 
CollectionNames.STATS_COLLECTION)).andReturn(usersMapReduceResults);
+        expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class, 
CollectionNames.WIDGET_RATINGS)).andReturn(ratings);
+        expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class, 
CollectionNames.WIDGET_USERS)).andReturn(usersMapReduceResults);
         replay(mongoOperations);
 
         Map<Long, WidgetStatistics> stats = 
aggregator.getAllWidgetStatistics(5L);
@@ -233,8 +168,8 @@ public class MonogoDbMapReduceStatistics
                 new WidgetUsersMapReduceResult(26L, users)
         );
 
-        expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class, 
CollectionNames.STATS_COLLECTION)).andReturn(ratings);
-        expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class, 
CollectionNames.STATS_COLLECTION)).andReturn(usersMapReduceResults);
+        expect(mongoOperations.findAll(WidgetRatingsMapReduceResult.class, 
CollectionNames.WIDGET_RATINGS)).andReturn(ratings);
+        expect(mongoOperations.findAll(WidgetUsersMapReduceResult.class, 
CollectionNames.WIDGET_USERS)).andReturn(usersMapReduceResults);
         replay(mongoOperations);
 
         Map<Long, WidgetStatistics> stats = 
aggregator.getAllWidgetStatistics(5L);
@@ -250,11 +185,95 @@ public class MonogoDbMapReduceStatistics
     }
 
     @Test
-    @Ignore
+    public void getWidgetStatistics_valid() {
+        long widget_id = 1L;
+        Map<Long, Long> userMap = Maps.newHashMap();
+        userMap.put(20L, 10L);
+        userMap.put(21L, 10L);
+        WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult stats = 
new WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userMap, 20L, 
0L);
+        WidgetUsersMapReduceResult usersResult = new 
WidgetUsersMapReduceResult(widget_id, userMap);
+        WidgetRatingsMapReduceResult ratingsResult = new 
WidgetRatingsMapReduceResult(widget_id, stats);
+
+        expect(mongoOperations.findById(widget_id, 
WidgetRatingsMapReduceResult.class, WIDGET_RATINGS)).andReturn(ratingsResult);
+        expect(mongoOperations.findById(widget_id, 
WidgetUsersMapReduceResult.class, WIDGET_USERS)).andReturn(usersResult);
+        replay(mongoOperations);
+
+        WidgetStatistics result = aggregator.getWidgetStatistics(widget_id, 
21L);
+
+        assertThat(result.getTotalDislike(), is(equalTo(0)));
+        assertThat(result.getTotalLike(), is(equalTo(20)));
+        assertThat(result.getUserRating(), is(equalTo(10)));
+        assertThat(result.getTotalUserCount(), is(equalTo(2)));
+    }
+
+    @Test
+    public void getWidgetStatistics_noUser() {
+        long widget_id = 1L;
+        Map<Long, Long> userMap = Maps.newHashMap();
+        userMap.put(20L, 10L);
+        userMap.put(21L, 10L);
+        WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult stats = 
new WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userMap, 20L, 
0L);
+        WidgetUsersMapReduceResult usersResult = new 
WidgetUsersMapReduceResult(widget_id, userMap);
+        WidgetRatingsMapReduceResult ratingsResult = new 
WidgetRatingsMapReduceResult(widget_id, stats);
+
+        expect(mongoOperations.findById(widget_id, 
WidgetRatingsMapReduceResult.class, WIDGET_RATINGS)).andReturn(ratingsResult);
+        expect(mongoOperations.findById(widget_id, 
WidgetUsersMapReduceResult.class, WIDGET_USERS)).andReturn(usersResult);
+        replay(mongoOperations);
+
+        WidgetStatistics result = aggregator.getWidgetStatistics(widget_id, 
23L);
+
+        assertThat(result.getTotalDislike(), is(equalTo(0)));
+        assertThat(result.getTotalLike(), is(equalTo(20)));
+        assertThat(result.getUserRating(), is(equalTo(-1)));
+        assertThat(result.getTotalUserCount(), is(equalTo(2)));
+    }
+
+    @Test
+    public void getWidgetStatistics_nullRatings() {
+        long widget_id = 1L;
+        Map<Long, Long> userMap = Maps.newHashMap();
+        userMap.put(20L, 10L);
+        userMap.put(21L, 10L);
+        WidgetUsersMapReduceResult usersResult = new 
WidgetUsersMapReduceResult(widget_id, userMap);
+
+        expect(mongoOperations.findById(widget_id, 
WidgetRatingsMapReduceResult.class, WIDGET_RATINGS)).andReturn(null);
+        expect(mongoOperations.findById(widget_id, 
WidgetUsersMapReduceResult.class, WIDGET_USERS)).andReturn(usersResult);
+        replay(mongoOperations);
+
+        WidgetStatistics result = aggregator.getWidgetStatistics(widget_id, 
21L);
+
+        assertThat(result.getTotalDislike(), is(equalTo(0)));
+        assertThat(result.getTotalLike(), is(equalTo(0)));
+        assertThat(result.getUserRating(), is(equalTo(-1)));
+        assertThat(result.getTotalUserCount(), is(equalTo(2)));
+    }
+
+    @Test
+    public void getWidgetStatistics_nullUsers() {
+        long widget_id = 1L;
+        Map<Long, Long> userMap = Maps.newHashMap();
+        userMap.put(20L, 10L);
+        userMap.put(21L, 10L);
+        WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult stats = 
new WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult(userMap, 20L, 
0L);
+        WidgetRatingsMapReduceResult ratingsResult = new 
WidgetRatingsMapReduceResult(widget_id, stats);
+
+        expect(mongoOperations.findById(widget_id, 
WidgetRatingsMapReduceResult.class, WIDGET_RATINGS)).andReturn(ratingsResult);
+        expect(mongoOperations.findById(widget_id, 
WidgetUsersMapReduceResult.class, WIDGET_USERS)).andReturn(null);
+        replay(mongoOperations);
+
+        WidgetStatistics result = aggregator.getWidgetStatistics(widget_id, 
21L);
+
+        assertThat(result.getTotalDislike(), is(equalTo(0)));
+        assertThat(result.getTotalLike(), is(equalTo(20)));
+        assertThat(result.getUserRating(), is(equalTo(10)));
+        assertThat(result.getTotalUserCount(), is(equalTo(0)));
+    }
+
+    @Test
     public void init_existing() {
-        expect(mongoOperations.findById(ID, RunStatistics.class, 
STATS_COLLECTION)).andReturn(new RunStatistics(ID, System.currentTimeMillis() - 
DEFAULT_RESULT_VALIDITY));
+        expect(mongoOperations.findById(eq(ID), eq(RunStatistics.class), 
eq(OPERATIONS))).andReturn(new RunStatistics(ID, System.currentTimeMillis() - 
DEFAULT_RESULT_VALIDITY));
         setMapReduceExpectations();
-        mongoOperations.save(isA(RunStatistics.class), eq(STATS_COLLECTION));
+        mongoOperations.save(isA(RunStatistics.class), eq(OPERATIONS));
         expectLastCall();
         replay(mongoOperations);
 
@@ -264,9 +283,9 @@ public class MonogoDbMapReduceStatistics
 
     @Test
     public void init_empty() {
-        expect(mongoOperations.findById(ID, RunStatistics.class, 
STATS_COLLECTION)).andReturn(null);
+        expect(mongoOperations.findById(ID, RunStatistics.class, 
OPERATIONS)).andReturn(null);
         setMapReduceExpectations();
-        mongoOperations.save(isA(RunStatistics.class), eq(STATS_COLLECTION));
+        mongoOperations.save(isA(RunStatistics.class), eq(OPERATIONS));
         expectLastCall();
         replay(mongoOperations);
 
@@ -276,16 +295,28 @@ public class MonogoDbMapReduceStatistics
 
     @Test
     public void init_tooEarly() {
-        expect(mongoOperations.findById(ID, RunStatistics.class, 
STATS_COLLECTION)).andReturn(new RunStatistics(ID, System.currentTimeMillis() - 
1000L));
+        expect(mongoOperations.findById(ID, RunStatistics.class, 
OPERATIONS)).andReturn(new RunStatistics(ID, System.currentTimeMillis() - 
1000L));
         replay(mongoOperations);
 
         ((MongoDbMapReduceStatisticsAggregator)aggregator).buildStats();
         verify(mongoOperations);
     }
 
+    @Test
+    public void runStats() {
+        String id = "BOO";
+        long timestamp = 1234L;
+        RunStatistics stats = new RunStatistics();
+        stats.setId(id);
+        stats.setRefreshedTimeStamp(timestamp);
+
+        assertThat(stats.getId(), is(equalTo(id)));
+        assertThat(stats.getRefreshedTimeStamp(), is(equalTo(timestamp)));
+    }
+
     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);
+        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() {


Reply via email to