project count by user and count by username implemented using mongodb aggregation framework
--- a/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java Wed Apr 24 14:08:19 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java Fri Apr 26 19:45:37 2013 +0200
@@ -1,27 +1,24 @@
package org.iri_research.renkan.repositories;
+import static org.springframework.data.mongodb.core.query.Criteria.where;
+import static org.springframework.data.mongodb.core.query.Query.query;
+
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-import org.eclipse.jetty.util.component.AggregateLifeCycle;
-import org.iri_research.renkan.RenkanProperties;
import org.iri_research.renkan.models.Project;
import org.iri_research.renkan.models.ProjectRevision;
-import org.iri_research.renkan.models.RenkanUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.stereotype.Component;
-import static org.springframework.data.mongodb.core.query.Query.query;
-import static org.springframework.data.mongodb.core.query.Criteria.where;
-
import org.springframework.data.mongodb.core.mapreduce.GroupBy;
import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Component;
import com.mongodb.AggregationOutput;
import com.mongodb.BasicDBObject;
@@ -30,6 +27,7 @@
@Component
public class ProjectsRepositoryImpl implements ProjectsRepositoryCustom {
+ @SuppressWarnings("unused")
private final Logger logger = LoggerFactory.getLogger(ProjectsRepositoryImpl.class);
@Autowired
@@ -49,11 +47,6 @@
public String space_id;
public int count;
}
-
- private class GroupUsernameResult {
- public String username;
- public int count;
- }
@Autowired
private MongoTemplate mongoTemplate;
@@ -155,14 +148,25 @@
if(userIds != null) {
filter = Criteria.where("users.user_id").in(userIds);
}
-
+
DBObject projectOp = new BasicDBObject("$project", new BasicDBObject("users", 1));
DBObject unwindOp = new BasicDBObject("$unwind","$users");
DBObject groupOpFields = new BasicDBObject("_id", "$users.user_id");
groupOpFields.put("count", new BasicDBObject("$sum", 1));
DBObject groupOp = new BasicDBObject("$group",groupOpFields);
+ DBObject matchOp = null;
+ if(filter != null) {
+ matchOp = new BasicDBObject("$match", filter.getCriteriaObject());
+ }
- AggregationOutput output = this.projectsRepository.getCollection().aggregate(projectOp, unwindOp, groupOp);
+ AggregationOutput output = null;
+ if(filter!=null) {
+ output = this.projectsRepository.getCollection().aggregate(matchOp, projectOp, unwindOp, matchOp, groupOp);
+ }
+ else {
+ output = this.projectsRepository.getCollection().aggregate(projectOp, unwindOp, groupOp);
+ }
+
HashMap<String, Integer> res = new HashMap<>();
for (DBObject groupRes : output.results()) {
@@ -181,7 +185,38 @@
@Override
public Map<String, Integer> getCountByUsername(Collection<String> usernames) {
- // TODO Auto-generated method stub
- return null;
+
+ Criteria filter = null;
+
+ if(usernames != null) {
+ filter = Criteria.where("users.username").in(usernames);
+ }
+
+ DBObject projectOp = new BasicDBObject("$project", new BasicDBObject("users", 1));
+ DBObject unwindOp = new BasicDBObject("$unwind","$users");
+ DBObject groupOpFields = new BasicDBObject("_id", "$users.username");
+ groupOpFields.put("count", new BasicDBObject("$sum", 1));
+ DBObject groupOp = new BasicDBObject("$group",groupOpFields);
+ DBObject matchOp = null;
+ if(filter != null) {
+ matchOp = new BasicDBObject("$match", filter.getCriteriaObject());
+ }
+
+ AggregationOutput output = null;
+ if(filter!=null) {
+ output = this.projectsRepository.getCollection().aggregate(matchOp, projectOp, unwindOp, matchOp, groupOp);
+ }
+ else {
+ output = this.projectsRepository.getCollection().aggregate(projectOp, unwindOp, groupOp);
+ }
+
+ HashMap<String, Integer> res = new HashMap<>();
+
+ for (DBObject groupRes : output.results()) {
+ res.put((String)groupRes.get("_id"), (Integer)groupRes.get("count"));
+ }
+
+ return res;
+
}
}
--- a/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java Wed Apr 24 14:08:19 2013 +0200
+++ b/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java Fri Apr 26 19:45:37 2013 +0200
@@ -273,7 +273,7 @@
Assert.assertNotNull("count not null", count);
Assert.assertEquals("Nb of user/project", testProjects.size()-i, count.intValue());
}
- Assert.assertNull("Last user id has no project i.e count is null", groupRes.get(this.testUsers.get(nu-1)));
+ Assert.assertNull("Last user id has no project i.e count is null", groupRes.get(this.testUsers.get(nu-1).getId()));
Integer count = groupRes.get(null);
Assert.assertNotNull("count not null", count);
@@ -283,21 +283,62 @@
@Test
public void testGetCountByUserFilter() {
- List<String> spacesIdsFilter = Arrays.asList(this.spaceIds.get(0));
+ List<String> userIdsFilter = Arrays.asList(this.testUsers.get(0).getId());
- Map<String, Integer> groupRes = projectsRepository.getCountBySpace(spacesIdsFilter);
+ Map<String, Integer> groupRes = projectsRepository.getCountByUser(userIdsFilter);
Assert.assertNotNull("GroupRes not null", groupRes);
Assert.assertEquals("Group res size", 1, groupRes.size());
- Integer count = groupRes.get(this.spaceIds.get(0));
+ Integer count = groupRes.get(this.testUsers.get(0).getId());
Assert.assertNotNull("count not null", count);
- Assert.assertEquals("Nb of project/space", 2, count.intValue());
+ Assert.assertEquals("Nb of user/project", testProjects.size(), count.intValue());
+
+ }
+
+ @Test
+ public void testGetCountByUsername() {
+
+ Map<String, Integer> groupRes = projectsRepository.getCountByUsername();
+ int nu = this.testUsers.size() - 1;
+ int nb_username = this.testUsers.size() + (SPACE_NB-1)*SPACE_NB/2 -2;
+
+ Assert.assertNotNull("GroupRes not null", groupRes);
+ Assert.assertEquals("Group res size", nb_username, groupRes.size());
+
+ for(int i=0;i<nu-1;i++) {
+ Integer count = groupRes.get(this.testUsers.get(i).getUsername());
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of user/project", testProjects.size()-i, count.intValue());
+ }
+ Assert.assertNull("Last user id has no project i.e count is null", groupRes.get(this.testUsers.get(nu).getUsername()));
- for(int i=1; i<SPACE_NB; i++) {
- Assert.assertNull("other space id has no project i.e count is null", groupRes.get(this.spaceIds.get(i)));
+ for(int i=1;i<nu;i++) {
+ String anonymous_username = String.format("Anonymous-%d", i);
+ Integer count = groupRes.get(anonymous_username);
+ Assert.assertEquals("Nb of anonymous user/project", nu-i, count.intValue());
}
+
+
}
+
+
+ @Test
+ public void testGetCountByUsernameFilter() {
+
+ List<String> usernamesFilter = Arrays.asList(this.testUsers.get(0).getUsername());
+
+ Map<String, Integer> groupRes = projectsRepository.getCountByUsername(usernamesFilter);
+
+ Assert.assertNotNull("GroupRes not null", groupRes);
+ Assert.assertEquals("Group res size", 1, groupRes.size());
+
+ Integer count = groupRes.get(this.testUsers.get(0).getUsername());
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of user/project", testProjects.size(), count.intValue());
+
+ }
+
@Test