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