Author: mfranklin
Date: Mon Nov 19 22:27:17 2012
New Revision: 1411459

URL: http://svn.apache.org/viewvc?rev=1411459&view=rev
Log:
Refactored widget statistics into separate helper class

Added:
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetRatingsMapReduceResult.java
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetUsersMapReduceResult.java
Modified:
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/StatisticsAggregator.java
    
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/impl/MongoDbWidgetRepository.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

Added: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetRatingsMapReduceResult.java
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetRatingsMapReduceResult.java?rev=1411459&view=auto
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetRatingsMapReduceResult.java
 (added)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetRatingsMapReduceResult.java
 Mon Nov 19 22:27:17 2012
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.rave.portal.model;
+
+import java.util.Map;
+
+/**
+*/
+public class WidgetRatingsMapReduceResult {
+    private Long id;
+    private WidgetStatisticsMapReduceResult value;
+
+    public WidgetRatingsMapReduceResult() {  }
+
+    public WidgetRatingsMapReduceResult(Long id, 
WidgetStatisticsMapReduceResult value) {
+        this.id = id;
+        this.value = value;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public WidgetStatisticsMapReduceResult getValue() {
+        return value;
+    }
+
+    public void setValue(WidgetStatisticsMapReduceResult value) {
+        this.value = value;
+    }
+
+    public static class WidgetStatisticsMapReduceResult {
+        private Map<Long, Long> userRatings;
+        private Long like;
+        private Long dislike;
+
+        public WidgetStatisticsMapReduceResult() { }
+
+        public WidgetStatisticsMapReduceResult(Map<Long, Long> userRatings, 
Long like, Long dislike) {
+            this.userRatings = userRatings;
+            this.like = like;
+            this.dislike = dislike;
+        }
+
+        public Map<Long, Long> getUserRatings() {
+            return userRatings;
+        }
+
+        public void setUserRatings(Map<Long, Long> userRatings) {
+            this.userRatings = userRatings;
+        }
+
+        public Long getLike() {
+            return like;
+        }
+
+        public void setLike(Long like) {
+            this.like = like;
+        }
+
+        public Long getDislike() {
+            return dislike;
+        }
+
+        public void setDislike(Long dislike) {
+            this.dislike = dislike;
+        }
+    }
+
+}

Added: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetUsersMapReduceResult.java
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetUsersMapReduceResult.java?rev=1411459&view=auto
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetUsersMapReduceResult.java
 (added)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/WidgetUsersMapReduceResult.java
 Mon Nov 19 22:27:17 2012
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.rave.portal.model;
+
+import java.util.Map;
+
+public class WidgetUsersMapReduceResult {
+    private Long id;
+    private Map<Long, Long> value;
+
+    public WidgetUsersMapReduceResult() { }
+
+    public WidgetUsersMapReduceResult(Long id, Map<Long, Long> value) {
+        this.id = id;
+        this.value = value;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Map<Long, Long> getValue() {
+        return value;
+    }
+
+    public void setValue(Map<Long, Long> value) {
+        this.value = value;
+    }
+}

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/StatisticsAggregator.java
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/StatisticsAggregator.java?rev=1411459&r1=1411458&r2=1411459&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/StatisticsAggregator.java
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/StatisticsAggregator.java
 Mon Nov 19 22:27:17 2012
@@ -19,8 +19,14 @@
 
 package org.apache.rave.portal.repository;
 
+import org.apache.rave.portal.model.util.WidgetStatistics;
+
+import java.util.Map;
+
 /**
  * Manages statistics for various attributes of the Rave
  */
 public interface StatisticsAggregator {
+    Map<Long,WidgetStatistics> getAllWidgetStatistics(long userId);
+    WidgetStatistics getWidgetStatistics(long widget_id, long user_id);
 }

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=1411459&r1=1411458&r2=1411459&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 22:27:17 2012
@@ -19,10 +19,185 @@
 
 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;
 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.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;
 
 /**
  * Provides Statistics via MapReduce jobs
  */
+@Component
 public class MongoDbMapReduceStatisticsAggregator implements 
StatisticsAggregator {
+    public static final String RATINGS_MAP = 
"classpath:/org/apache/rave/WidgetRatingsMap.js";
+    public static final String RATINGS_REDUCE = 
"classpath:/org/apache/rave/WidgetRatingsReduce.js";
+    public static final String USERS_MAP = 
"classpath:/org/apache/rave/WidgetUsersMap.js";
+    public static final String USERS_REDUCE = 
"classpath:/org/apache/rave/WidgetUsersReduce.js";
+    public static final int DEFAULT_RESULT_VALIDITY = 60000;
+    public static final String ID = "metadata";
+
+    private final MongoOperations mongoOperations;
+
+    @Autowired
+    public MongoDbMapReduceStatisticsAggregator(MongoOperations 
mongoOperations) {
+        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");
+        }
+    }
+
+    @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);
+
+        Map<Long, WidgetStatistics> stats = Maps.newHashMap();
+        Map<Long, Integer> userStats = mapUsersResults(widgetUsers);
+
+        if (widgetStats.size() > 0) {
+            addCombinedStats(userId, widgetStats, userStats, stats);
+        } else {
+            addUserCount(userStats, stats);
+        }
+        return stats;
+    }
+
+    @PostConstruct
+    private 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);
+                }
+            }
+        }, 0, DEFAULT_RESULT_VALIDITY, TimeUnit.MILLISECONDS);
+    }
+
+    private void queryForUserStats(RunStatistics runStats) {
+        synchronized (this) {
+            if(System.currentTimeMillis() - runStats.getRefreshedTimeStamp() > 
DEFAULT_RESULT_VALIDITY) {
+                executeUsersMapReduce();
+                executeRatingsMapReduce();
+                runStats.setRefreshedTimeStamp(System.currentTimeMillis());
+                mongoOperations.save(runStats, STATS_COLLECTION);
+            }
+        }
+    }
+
+    private Map<Long, Integer> 
mapUsersResults(List<WidgetUsersMapReduceResult> widgetUsersMapReduceResults) {
+        Map<Long, Integer> map = Maps.newHashMap();
+        for (WidgetUsersMapReduceResult result : widgetUsersMapReduceResults) {
+            if (result.getId() != null) {
+                map.put(result.getId(), result.getValue().size());
+            }
+        }
+        return map;
+    }
+
+    private MapReduceResults<WidgetUsersMapReduceResult> 
executeUsersMapReduce() {
+        return mongoOperations.mapReduce(PAGE_COLLECTION, USERS_MAP, 
USERS_REDUCE, WidgetUsersMapReduceResult.class);
+    }
+
+    private MapReduceResults<WidgetRatingsMapReduceResult> 
executeRatingsMapReduce() {
+        return mongoOperations.mapReduce(PAGE_COLLECTION, RATINGS_MAP, 
RATINGS_REDUCE, 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);
+            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())));
+        }
+    }
+
+    private WidgetStatistics createWidgetStatisticsFromResults(long user_id, 
WidgetRatingsMapReduceResult statsResult, Integer userResult) {
+        WidgetStatistics statistics = new WidgetStatistics();
+        WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult result = 
statsResult.getValue();
+        if (result != null) {
+            statistics.setTotalDislike(result.getDislike().intValue());
+            statistics.setTotalLike(result.getLike().intValue());
+            
statistics.setUserRating(result.getUserRatings().containsKey(user_id) ? 
result.getUserRatings().get(user_id).intValue() : -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;
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public Long getRefreshedTimeStamp() {
+            return refreshedTimeStamp;
+        }
+
+        public void setRefreshedTimeStamp(Long refreshedTimeStamp) {
+            this.refreshedTimeStamp = refreshedTimeStamp;
+        }
+    }
+
 }

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java?rev=1411459&r1=1411458&r2=1411459&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbWidgetRepository.java
 Mon Nov 19 22:27:17 2012
@@ -20,25 +20,19 @@
 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.*;
 import org.apache.rave.portal.model.util.WidgetStatistics;
-import org.apache.rave.portal.repository.MongoPageOperations;
 import org.apache.rave.portal.repository.MongoWidgetOperations;
+import org.apache.rave.portal.repository.StatisticsAggregator;
 import org.apache.rave.portal.repository.WidgetRepository;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.mapreduce.MapReduceResults;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Order;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Repository;
 
-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 java.util.regex.Pattern;
 
 import static org.springframework.data.mongodb.core.query.Criteria.where;
@@ -50,21 +44,12 @@ import static org.springframework.data.m
  */
 @Repository
 public class MongoDbWidgetRepository implements WidgetRepository {
-    ///org/apache/rave/WidgetRatingsMap.js
-    public static final String RATINGS_MAP = 
"classpath:/org/apache/rave/WidgetRatingsMap.js";
-    public static final String RATINGS_REDUCE = 
"classpath:/org/apache/rave/WidgetRatingsReduce.js";
-    public static final String USERS_MAP = 
"classpath:/org/apache/rave/WidgetUsersMap.js";
-    public static final String USERS_REDUCE = 
"classpath:/org/apache/rave/WidgetUsersReduce.js";
-    public static final int DEFAULT_RESULT_VALIDITY = 60000;
-
-    private Map<Long, Integer> widgetUsers = Maps.newHashMap();
-    private long usersTimestamp = System.currentTimeMillis();
 
     @Autowired
     private MongoWidgetOperations template;
 
     @Autowired
-    private MongoPageOperations pageTemplate;
+    private StatisticsAggregator statsAggregator;
 
     @Override
     public List<Widget> getAll() {
@@ -132,34 +117,12 @@ public class MongoDbWidgetRepository imp
 
     @Override
     public WidgetStatistics getWidgetStatistics(long widget_id, long user_id) {
-        Query statsQuery = query(where("widgetId").is(widget_id));
-        MapReduceResults<WidgetRatingsMapReduceResult> widgetStats = 
template.mapReduce(statsQuery, RATINGS_MAP, RATINGS_REDUCE, 
WidgetRatingsMapReduceResult.class);
-        List<Page> pages = 
pageTemplate.find(query(where("regions").elemMatch(where("regionWidgets").elemMatch(where("widgetId").is(widget_id)))));
-
-        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");
-        }
+        return statsAggregator.getWidgetStatistics(widget_id, user_id);
     }
 
     @Override
     public Map<Long, WidgetStatistics> getAllWidgetStatistics(long userId) {
-        MapReduceResults<WidgetRatingsMapReduceResult> widgetStats = 
template.mapReduce(RATINGS_MAP, RATINGS_REDUCE, 
WidgetRatingsMapReduceResult.class);
-        Map<Long, WidgetStatistics> stats = Maps.newHashMap();
-        if (widgetStats.getCounts().getOutputCount() > 0) {
-            addCombinedStats(userId, widgetStats, widgetUsers, stats);
-        } else {
-            addUserCount(widgetUsers, stats);
-        }
-        return stats;
+        return statsAggregator.getAllWidgetStatistics(userId);
     }
 
     @Override
@@ -214,39 +177,6 @@ public class MongoDbWidgetRepository imp
         template.remove(new Query(where("_id").is(item.getId())));
     }
 
-    @PostConstruct
-    private void init() {
-        Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new 
Runnable() {
-            @Override
-            public void run() {
-                if(System.currentTimeMillis() - usersTimestamp > 
DEFAULT_RESULT_VALIDITY) {
-                    queryForUserStats();
-                }
-            }
-        }, 0, DEFAULT_RESULT_VALIDITY, TimeUnit.MILLISECONDS);
-    }
-
-    private Map<Long, Integer> queryForUserStats() {
-        synchronized (this) {
-            if(System.currentTimeMillis() - usersTimestamp > 
DEFAULT_RESULT_VALIDITY) {
-                MapReduceResults<WidgetUsersMapReduceResult> users = 
pageTemplate.mapReduce(USERS_MAP, USERS_REDUCE, 
WidgetUsersMapReduceResult.class);
-                widgetUsers = mapUsersResults(users);
-                usersTimestamp = System.currentTimeMillis();
-            }
-        }
-        return widgetUsers;
-    }
-
-    private Map<Long, Integer> 
mapUsersResults(MapReduceResults<WidgetUsersMapReduceResult> 
widgetUsersMapReduceResults) {
-        Map<Long, Integer> map = Maps.newHashMap();
-        for (WidgetUsersMapReduceResult result : widgetUsersMapReduceResults) {
-            if (result.getId() != null) {
-                map.put(result.getId(), result.getValue().size());
-            }
-        }
-        return map;
-    }
-
     private Query getWidgetStatusFreeTextQuery(WidgetStatus widgetStatus, 
String type, String searchTerm) {
         Criteria criteria = addFreeTextClause(searchTerm, new Criteria());
         if (type != null && !type.isEmpty()) {
@@ -272,33 +202,6 @@ public class MongoDbWidgetRepository imp
         return 
query(where("tags").elemMatch(where("tag.keyword").is(tagKeyWord)));
     }
 
-    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);
-            stats.put(result.getKey(), widgetStatistics);
-        }
-    }
-
-    private void addCombinedStats(long userId, 
MapReduceResults<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())));
-        }
-    }
-
-    private WidgetStatistics createWidgetStatisticsFromResults(long user_id, 
WidgetRatingsMapReduceResult statsResult, Integer userResult) {
-        WidgetStatistics statistics = new WidgetStatistics();
-        WidgetRatingsMapReduceResult.WidgetStatisticsMapReduceResult result = 
statsResult.getValue();
-        if (result != null) {
-            statistics.setTotalDislike(result.getDislike().intValue());
-            statistics.setTotalLike(result.getLike().intValue());
-            
statistics.setUserRating(result.getUserRatings().containsKey(user_id) ? 
result.getUserRatings().get(user_id).intValue() : -1);
-        }
-        statistics.setTotalUserCount(userResult == null ? 0 : userResult);
-        return statistics;
-    }
-
     private String getWidgetStatusString(WidgetStatus widgetStatus) {
         return widgetStatus.getWidgetStatus().toUpperCase();
     }
@@ -308,87 +211,4 @@ public class MongoDbWidgetRepository imp
         return query;
     }
 
-    private Set<Long> getUserCount(List<Page> 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 WidgetUsersMapReduceResult {
-        private Long id;
-        private Map<Long, Long> value;
-
-        public Long getId() {
-            return id;
-        }
-
-        public void setId(Long id) {
-            this.id = id;
-        }
-
-        public Map<Long, Long> getValue() {
-            return value;
-        }
-
-        public void setValue(Map<Long, Long> value) {
-            this.value = value;
-        }
-    }
-
-    public static class WidgetRatingsMapReduceResult {
-        private Long id;
-        private WidgetStatisticsMapReduceResult value;
-
-        public Long getId() {
-            return id;
-        }
-
-        public void setId(Long id) {
-            this.id = id;
-        }
-
-        public WidgetStatisticsMapReduceResult getValue() {
-            return value;
-        }
-
-        public void setValue(WidgetStatisticsMapReduceResult value) {
-            this.value = value;
-        }
-
-        public static class WidgetStatisticsMapReduceResult {
-            private Map<Long, Long> userRatings;
-            private Long like;
-            private Long dislike;
-
-            public Map<Long, Long> getUserRatings() {
-                return userRatings;
-            }
-
-            public void setUserRatings(Map<Long, Long> userRatings) {
-                this.userRatings = userRatings;
-            }
-
-            public Long getLike() {
-                return like;
-            }
-
-            public void setLike(Long like) {
-                this.like = like;
-            }
-
-            public Long getDislike() {
-                return dislike;
-            }
-
-            public void setDislike(Long dislike) {
-                this.dislike = dislike;
-            }
-        }
-
-    }
 }

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=1411459&r1=1411458&r2=1411459&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
 Mon Nov 19 22:27:17 2012
@@ -34,4 +34,5 @@ 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";
 }

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=1411459&r1=1411458&r2=1411459&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 22:27:17 2012
@@ -19,6 +19,119 @@
 
 package org.apache.rave.portal.repository.impl;
 
+import com.google.common.collect.Maps;
+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.Test;
+import org.springframework.data.mongodb.core.MongoOperations;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.easymock.EasyMock.*;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
 public class MonogoDbMapReduceStatisticsAggregatorTest {
 
+    private MongoOperations mongoOperations;
+    private StatisticsAggregator aggregator;
+
+    @Before
+    public void setup() {
+        mongoOperations = createMock(MongoOperations.class);
+        aggregator = new MongoDbMapReduceStatisticsAggregator(mongoOperations);
+    }
+
+    @Test
+    public void getAllStatistics_valid_allPositive() {
+
+        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);
+
+        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))
+        );
+
+        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(1L);
+        assertThat(stats.size(), is(equalTo(3)));
+        assertThat(stats.get(24L).getTotalLike(), is(equalTo(20)));
+        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).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() {
+
+        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);
+
+        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))
+        );
+
+        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(1L);
+        assertThat(stats.size(), is(equalTo(3)));
+        assertThat(stats.get(24L).getTotalLike(), is(equalTo(20)));
+        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).getTotalDislike(), is(equalTo(0)));
+        assertThat(stats.get(26L).getUserRating(), is(equalTo(10)));
+        assertThat(stats.get(26L).getTotalUserCount(), 
is(equalTo(users.size())));
+    }
 }


Reply via email to