Author: mfranklin
Date: Wed Oct 17 13:14:44 2012
New Revision: 1399219

URL: http://svn.apache.org/viewvc?rev=1399219&view=rev
Log:
Added Map Reduce jobs for statistics gathering

Modified:
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoWidgetOperations.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/impl/MongoWidgetTemplate.java
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsMap.js
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsReduce.js
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersMap.js
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersReduce.js

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoWidgetOperations.java
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoWidgetOperations.java?rev=1399219&r1=1399218&r2=1399219&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoWidgetOperations.java
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/MongoWidgetOperations.java
 Wed Oct 17 13:14:44 2012
@@ -21,7 +21,9 @@ package org.apache.rave.portal.repositor
 
 import org.apache.rave.portal.model.Widget;
 import org.springframework.data.mongodb.core.mapreduce.MapReduceResults;
+import org.springframework.data.mongodb.core.query.Query;
 
 public interface MongoWidgetOperations extends MongoModelOperations<Widget> {
     <T> MapReduceResults<T> mapReduce(String mapFunction, String 
reduceFunction, Class<T> entityClass);
+    <T> MapReduceResults<T> mapReduce(Query query, String mapFunction, String 
reduceFunction, Class<T> entityClass);
 }

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=1399219&r1=1399218&r2=1399219&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
 Wed Oct 17 13:14:44 2012
@@ -19,11 +19,13 @@
 
 package org.apache.rave.portal.repository.impl;
 
+import com.google.common.collect.Maps;
 import org.apache.rave.portal.model.*;
 import org.apache.rave.portal.model.util.WidgetStatistics;
 import org.apache.rave.portal.repository.MongoWidgetOperations;
 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;
@@ -42,6 +44,10 @@ import static org.springframework.data.m
 @Repository
 public class MongoDbWidgetRepository implements WidgetRepository {
 
+    public static final String RATINGS_MAP = "classpath:WidgetRatingsMap.js";
+    public static final String RATINGS_REDUCE = 
"classpath:WidgetRatingsReduce.js";
+    public static final String USERS_MAP = "WidgetUsersMap.js";
+    public static final String USERS_REDUCE = "WidgetUsersReduce.js";
     @Autowired
     private MongoWidgetOperations template;
 
@@ -112,12 +118,35 @@ public class MongoDbWidgetRepository imp
 
     @Override
     public WidgetStatistics getWidgetStatistics(long widget_id, long user_id) {
-        return null;  //To change body of implemented methods use File | 
Settings | File Templates.
+        Query query = query(where("widgetId").is(widget_id));
+        MapReduceResults<WidgetRatingsMapReduceResult> widgetStats = 
template.mapReduce(query, RATINGS_MAP, RATINGS_REDUCE, 
WidgetRatingsMapReduceResult.class);
+        MapReduceResults<WidgetUsersMapReduceResult> widgetUsers = 
template.mapReduce(query, USERS_MAP, USERS_REDUCE, 
WidgetUsersMapReduceResult.class);
+        if(widgetStats.getCounts().getOutputCount() != 1 || 
widgetUsers.getCounts().getOutputCount() != 1) {
+            throw new IllegalStateException("Invalid results returned from 
Map/Reduce");
+        }
+        WidgetRatingsMapReduceResult statsResult = 
widgetStats.iterator().next();
+        WidgetUsersMapReduceResult userResult = widgetUsers.iterator().next();
+
+        return createWidgetStatisticsFromResults(user_id, statsResult, 
userResult.getUsers());
     }
 
     @Override
     public Map<Long, WidgetStatistics> getAllWidgetStatistics(long userId) {
-        return null;  //To change body of implemented methods use File | 
Settings | File Templates.
+        MapReduceResults<WidgetRatingsMapReduceResult> widgetStats = 
template.mapReduce(RATINGS_MAP, RATINGS_REDUCE, 
WidgetRatingsMapReduceResult.class);
+        Map<Long, Long> usersMap = 
mapUsersResults(template.mapReduce(USERS_MAP, USERS_REDUCE, 
WidgetUsersMapReduceResult.class));
+        Map<Long, WidgetStatistics> stats = Maps.newHashMap();
+        for(WidgetRatingsMapReduceResult result : widgetStats) {
+            stats.put(result.getWidgetId(), 
createWidgetStatisticsFromResults(userId, result, usersMap.get(userId)));
+        }
+        return stats;
+    }
+
+    private Map<Long, Long> 
mapUsersResults(MapReduceResults<WidgetUsersMapReduceResult> 
widgetUsersMapReduceResults) {
+        Map<Long, Long> map = Maps.newHashMap();
+        for(WidgetUsersMapReduceResult result : widgetUsersMapReduceResults) {
+            map.put(result.getWidgetId(), result.getUsers());
+        }
+        return map;
     }
 
     @Override
@@ -180,4 +209,86 @@ public class MongoDbWidgetRepository imp
     private Query getTagQuery(String tagKeyWord) {
         return 
query(where("tags").elemMatch(where("tag.keyword").is(tagKeyWord)));
     }
+
+    private WidgetStatistics createWidgetStatisticsFromResults(long user_id, 
WidgetRatingsMapReduceResult statsResult, Long userResult) {
+        WidgetStatistics statistics = new WidgetStatistics();
+        
statistics.setTotalDislike(statsResult.getStatistics().getDislike().intValue());
+        
statistics.setTotalLike(statsResult.getStatistics().getLike().intValue());
+        
statistics.setUserRating(statsResult.getStatistics().getUserRatings().containsKey(user_id)
 ? statsResult.getStatistics().getUserRatings().get(user_id).intValue() : -1);
+        statistics.setTotalUserCount(userResult == null ? 0 : 
userResult.intValue());
+        return statistics;
+    }
+
+    public static class WidgetUsersMapReduceResult {
+        private Long widgetId;
+        private Long users;
+
+        public Long getWidgetId() {
+            return widgetId;
+        }
+
+        public void setWidgetId(Long widgetId) {
+            this.widgetId = widgetId;
+        }
+
+        public Long getUsers() {
+            return users;
+        }
+
+        public void setUsers(Long users) {
+            this.users = users;
+        }
+    }
+
+    public static class WidgetRatingsMapReduceResult {
+        private Long widgetId;
+        private WidgetStatisticsMapReduceResult statistics;
+
+        public Long getWidgetId() {
+            return widgetId;
+        }
+
+        public void setWidgetId(Long widgetId) {
+            this.widgetId = widgetId;
+        }
+
+        public WidgetStatisticsMapReduceResult getStatistics() {
+            return statistics;
+        }
+
+        public void setStatistics(WidgetStatisticsMapReduceResult statistics) {
+            this.statistics = statistics;
+        }
+
+        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/impl/MongoWidgetTemplate.java
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoWidgetTemplate.java?rev=1399219&r1=1399218&r2=1399219&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoWidgetTemplate.java
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoWidgetTemplate.java
 Wed Oct 17 13:14:44 2012
@@ -23,6 +23,7 @@ import org.apache.rave.portal.model.Mong
 import org.apache.rave.portal.model.Widget;
 import org.apache.rave.portal.repository.MongoWidgetOperations;
 import org.springframework.data.mongodb.core.mapreduce.MapReduceResults;
+import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Component;
 
 /**
@@ -40,4 +41,9 @@ public class MongoWidgetTemplate extends
     public <T> MapReduceResults<T> mapReduce(String mapFunction, String 
reduceFunction, Class<T> entityClass) {
         return mongoTemplate.mapReduce(COLLECTION, mapFunction, 
reduceFunction, entityClass);
     }
+
+    @Override
+    public <T> MapReduceResults<T> mapReduce(Query query, String mapFunction, 
String reduceFunction, Class<T> entityClass) {
+        return mongoTemplate.mapReduce(query, COLLECTION, mapFunction, 
reduceFunction, entityClass);
+    }
 }

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsMap.js
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsMap.js?rev=1399219&r1=1399218&r2=1399219&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsMap.js
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsMap.js
 Wed Oct 17 13:14:44 2012
@@ -20,9 +20,11 @@ function() {
     for(var i=0; i<this.ratings.length; i++) {
         var rating = this.ratings[i];
         emit(this._id, {
-            totalLike : rating.score == 10 ? 1 : 0,
-            totalDislike : rating.score == 0 ? 1: 0,
-            userRating : rating.score
-        });
+             widgetId : this._id,
+             statistics: {
+                like : rating.score == 10 ? 1 : 0,
+                dislike : rating.score == 0 ? 1: 0,
+                userRating : { userId: this.userId, value: rating.score }
+        }});
     }
 }

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsReduce.js
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsReduce.js?rev=1399219&r1=1399218&r2=1399219&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsReduce.js
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetRatingsReduce.js
 Wed Oct 17 13:14:44 2012
@@ -18,14 +18,18 @@
  */
 function(key, values) {
     var result = {
-        totalLike : 0,
-        totalDislike : 0,
-        userRating : 0
-    };
+        widgetId: key,
+        statistics: {
+            like : 0,
+            dislike : 0,
+            userRatings : {}
+    }};
     for(var i=0; i< values.length; i++) {
-        result.totalLike += values[i].totalLike;
-        result.totalDislike += values[i].totalDislike;
-        result.userRating += values[i].userRating;
+        result.statistics.totalLike += values[i].totalLike;
+        result.statistics.totalDislike += values[i].totalDislike;
+        for(var userRating in values[i].userRatings) {
+            result.statistics.userRatings[userRating.userId] += 
userRating.value;
+        }
     }
     return result;
 

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersMap.js
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersMap.js?rev=1399219&r1=1399218&r2=1399219&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersMap.js
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersMap.js
 Wed Oct 17 13:14:44 2012
@@ -23,7 +23,7 @@ function () {
             var regionWidget = this.regions[i].regionWidgets[j];
             if(!widgetMap[regionWidget.widgetId]) {
                 widgetMap[regionWidget.widgetId] = true;
-                emit(regionWidget.widgetId, 1)
+                emit(regionWidget.widgetId, { widgetId: regionWidget.widgetId, 
 users: 1 })
             }
         }
     }

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersReduce.js
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersReduce.js?rev=1399219&r1=1399218&r2=1399219&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersReduce.js
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/resources/org/apache/rave/WidgetUsersReduce.js
 Wed Oct 17 13:14:44 2012
@@ -17,9 +17,9 @@
  *  under the License.
  */
 function (key, values) {
-    var result=0;
+    var result={widgetId: key, users: 0};
     for(var i=0; i<values.length; i++) {
-        result += values[i];
+        result.users += values.users[i];
     }
     return result;
 }


Reply via email to