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