package org.springframework.data.document.mongodb.analytics; import java.util.Calendar; import java.util.Date; import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.data.document.analytics.ControllerCounter; import org.springframework.data.document.analytics.MvcEvent; import org.springframework.data.document.analytics.Parameters; import org.springframework.data.document.mongodb.MongoOperations; import org.springframework.data.document.mongodb.MongoTemplate; import org.springframework.data.document.mongodb.query.BasicQuery; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.QueryBuilder; import com.mongodb.WriteResult; public class MvcAnalyticsTest { MongoOperations operations; @Before public void setUp() throws Exception { Mongo m = new Mongo(); operations = new MongoTemplate(m, "mvc"); } @Test public void clean() { operations.dropCollection("mvc"); operations.createCollection("mvc"); operations.dropCollection("counters"); operations.createCollection("counters"); } @Test public void loadMvcEventData() { operations.dropCollection("mvc"); operations.createCollection("mvc"); // datasize, favoriteRestId createAndStoreMvcEvent(5, 1); createAndStoreMvcEvent(6, 2); createAndStoreMvcEvent(3, 3); createAndStoreMvcEvent(8, 4); List<MvcEvent> mvcEvents = operations.findAll(MvcEvent.class, "mvc"); Assert.assertEquals(22, mvcEvents.size()); operations.findAll(MvcEvent.class, "mvc"); } @Test public void loadCounterData() { for (int i = 0; i < 10; i++) { storeCounterData("SignUpController", "createForm"); storeCounterData("SignUpController", "create"); storeCounterData("SignUpController", "show"); storeCounterData("RestaurantController", "addFavoriteRestaurant"); } for (int i = 0; i < 5; i++) { storeCounterData("RestaurantController", "list"); storeCounterData("SignUpController", "show"); } } @Test public void queryCounterData() { DBObject query = QueryBuilder.start("name").is("SignUpController").get(); for (DBObject dbo : operations.getCollection("counters").find(query)) { System.out.println(dbo); } List<ControllerCounter> counters = operations.find( new BasicQuery("{ 'name' : 'SignUpController'} "), ControllerCounter.class, "counters"); for (ControllerCounter controllerCounter : counters) { System.out.println(controllerCounter); } } /* * * var start = new Date(2010,9,1); var end = new Date(2010,11,1); * db.mvc.group( { cond: {"action": "addFavoriteRestaurant", "date": {$gte: * start, $lt: end}} , key: {"parameters.p1": true} , initial: {count: 0} , * reduce: function(doc, out){ out.count++; } } ); */ @Test public void listAllMvcEvents() { List<MvcEvent> mvcEvents = operations.findAll(MvcEvent.class, "mvc"); for (MvcEvent mvcEvent : mvcEvents) { System.out.println(mvcEvent.getDate()); } } @Test public void groupQuery() { // This circumvents exception translation DBCollection collection = operations.getCollection("mvc"); // QueryBuilder qb = new QueryBuilder(); // qb.start("date").greaterThan(object) Calendar startDate = Calendar.getInstance(); startDate.clear(); startDate.set(Calendar.YEAR, 2010); startDate.set(Calendar.MONTH, 5); Calendar endDate = Calendar.getInstance(); endDate.clear(); endDate.set(Calendar.YEAR, 2010); endDate.set(Calendar.MONTH, 12); /* * QueryBuilder qb = new QueryBuilder(); Query q = * qb.find("date").gte(startDate * .getTime()).lt(endDate.getTime()).and("action" * ).is("addFavoriteRestaurant").build(); DBObject cond2 = * q.getQueryObject(); */ DBObject cond = QueryBuilder.start("date").greaterThanEquals(startDate.getTime()).lessThan(endDate.getTime()) .and("action").is("addFavoriteRestaurant").get(); DBObject key = new BasicDBObject("parameters.p1", true); /* * DBObject dateQ = new BasicDBObject(); dateQ.put("$gte", * startDate.getTime()); dateQ.put("$lt", endDate.getTime()); DBObject * cond = new BasicDBObject(); cond.put("action", * "addFavoriteRestaurant"); cond.put("date", dateQ); */ DBObject intitial = new BasicDBObject("count", 0); DBObject result = collection.group(key, cond, intitial, "function(doc, out){ out.count++; }"); if (result instanceof BasicDBList) { BasicDBList dbList = (BasicDBList) result; for (Object element : dbList) { DBObject dbo = (DBObject) element; System.out.println(dbo); } } System.out.println(result); } @Test public void storeControllerCounterInfo() { BasicDBObject query = new BasicDBObject("name", "controller1"); BasicDBObject changes = new BasicDBObject(); changes.put("$set", new BasicDBObject("name", "controller1")); changes.put("$inc", new BasicDBObject("count", 1)); // mongoTemplate.upsertAndModify(dbo("key","value"), inc("count",1)); // dbo(set("name","controller"), inc("count", 1)); // /mongoTemplate.update(collection("counters") WriteResult r = operations.getCollection("counters").update(query, changes, true, false); // { "err" : "Modifiers and non-modifiers cannot be mixed" , "code" : 10154 , "n" : 0 , "ok" : 1.0} // { "err" : null , "updatedExisting" : false , "upserted" : { "$oid" : "4cba814a5a4900000000495d"} , "n" : 1 , "ok" // : 1.0} // { "err" : null , "updatedExisting" : true , "n" : 1 , "ok" : 1.0} System.out.println(r); // changes = new BasicDBObject("methods", new BasicDBObject("find", 1)); // mongoTemplate.getCollection("counters").update(query, changes, true, // false); } @Test public void updateMethodCounter() { DBObject query = new BasicDBObject("name", "controller1"); DBObject changes = new BasicDBObject("$inc", new BasicDBObject("methods.find", 1)); operations.getCollection("counters").update(query, changes, true, false); } public void storeCounterData(String controllerName, String methodName) { BasicDBObject query = new BasicDBObject("name", controllerName); BasicDBObject changes = new BasicDBObject(); changes.put("$set", new BasicDBObject("name", controllerName)); changes.put("$inc", new BasicDBObject("count", 1)); WriteResult r = operations.getCollection("counters").update(query, changes, true, false); System.out.println(r); changes = new BasicDBObject("$inc", new BasicDBObject("methods." + methodName, 1)); r = operations.getCollection("counters").update(query, changes, true, false); System.out.println(r); } private void createAndStoreMvcEvent(int dataSize, int p1) { for (int i = 0; i < dataSize; i++) { MvcEvent event = generateEvent(p1); operations.save(event, "mvc"); } } private MvcEvent generateEvent(Integer p1) { MvcEvent event = new MvcEvent(); event.setController("RestaurantController"); event.setAction("addFavoriteRestaurant"); event.setDate(new Date()); event.setRemoteUser("mpollack"); event.setRequestAddress("127.0.0.1"); event.setRequestUri("/myrestaurants-analytics/restaurants"); Parameters params = new Parameters(); params.setP1(p1.toString()); params.setP2("2"); event.setParameters(params); return event; } }