From 61b0fbdad2f6ea1879b88868650b2ae1277dfff2 Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Mon, 6 Dec 2010 11:24:10 -0500 Subject: [PATCH] completed the set of modifier operations for UpdateBuilder --- .../data/document/mongodb/UpdateBuilder.java | 43 +++++++++++ .../document/mongodb/UpdateBuilderTests.java | 74 ++++++++++++++++++- 2 files changed, 114 insertions(+), 3 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/UpdateBuilder.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/UpdateBuilder.java index 91173e931..e67606e59 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/UpdateBuilder.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/UpdateBuilder.java @@ -23,6 +23,10 @@ import com.mongodb.DBObject; public class UpdateBuilder { + public enum Position { + LAST, FIRST + } + private LinkedHashMap criteria = new LinkedHashMap(); public UpdateBuilder set(String key, Object value) { @@ -40,6 +44,45 @@ public class UpdateBuilder { return this; } + public UpdateBuilder push(String key, Object value) { + criteria.put("$push", Collections.singletonMap(key, value)); + return this; + } + + public UpdateBuilder pushAll(String key, Object[] values) { + DBObject keyValue = new BasicDBObject(); + keyValue.put(key, values); + criteria.put("$pushAll", keyValue); + return this; + } + + public UpdateBuilder addToSet(String key, Object value) { + criteria.put("$addToSet", Collections.singletonMap(key, value)); + return this; + } + + public UpdateBuilder pop(String key, Position pos) { + criteria.put("$pop", Collections.singletonMap(key, (pos == Position.FIRST ? -1 : 1))); + return this; + } + + public UpdateBuilder pull(String key, Object value) { + criteria.put("$pull", Collections.singletonMap(key, value)); + return this; + } + + public UpdateBuilder pullAll(String key, Object[] values) { + DBObject keyValue = new BasicDBObject(); + keyValue.put(key, values); + criteria.put("$pullAll", keyValue); + return this; + } + + public UpdateBuilder rename(String oldName, String newName) { + criteria.put("$rename", Collections.singletonMap(oldName, newName)); + return this; + } + public DBObject build() { DBObject dbo = new BasicDBObject(); for (String k : criteria.keySet()) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/UpdateBuilderTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/UpdateBuilderTests.java index 31c579da6..56551057f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/UpdateBuilderTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/UpdateBuilderTests.java @@ -15,27 +15,30 @@ */ package org.springframework.data.document.mongodb; +import java.util.HashMap; +import java.util.Map; + import org.junit.Assert; import org.junit.Test; public class UpdateBuilderTests { @Test - public void testSetUpdate() { + public void testSet() { UpdateBuilder ub = new UpdateBuilder() .set("directory", "/Users/Test/Desktop"); Assert.assertEquals("{ \"$set\" : { \"directory\" : \"/Users/Test/Desktop\"}}", ub.build().toString()); } @Test - public void testIncUpdate() { + public void testInc() { UpdateBuilder ub = new UpdateBuilder() .inc("size", 1); Assert.assertEquals("{ \"$inc\" : { \"size\" : 1}}", ub.build().toString()); } @Test - public void testIncAndSetUpdate() { + public void testIncAndSet() { UpdateBuilder ub = new UpdateBuilder() .inc("size", 1) .set("directory", "/Users/Test/Desktop"); @@ -50,4 +53,69 @@ public class UpdateBuilderTests { Assert.assertEquals("{ \"$unset\" : { \"directory\" : 1}}", ub.build().toString()); } + @Test + public void testPush() { + Map m = new HashMap(); + m.put("name", "Sven"); + UpdateBuilder ub = new UpdateBuilder() + .push("authors", m); + Assert.assertEquals("{ \"$push\" : { \"authors\" : { \"name\" : \"Sven\"}}}", ub.build().toString()); + } + + @Test + public void testPushAll() { + Map m1 = new HashMap(); + m1.put("name", "Sven"); + Map m2 = new HashMap(); + m2.put("name", "Maria"); + UpdateBuilder ub = new UpdateBuilder() + .pushAll("authors", new Object[] {m1, m2}); + Assert.assertEquals("{ \"$pushAll\" : { \"authors\" : [ { \"name\" : \"Sven\"} , { \"name\" : \"Maria\"}]}}", ub.build().toString()); + } + + @Test + public void testAddToSet() { + Map m = new HashMap(); + m.put("name", "Sven"); + UpdateBuilder ub = new UpdateBuilder() + .addToSet("authors", m); + Assert.assertEquals("{ \"$addToSet\" : { \"authors\" : { \"name\" : \"Sven\"}}}", ub.build().toString()); + } + + @Test + public void testPop() { + UpdateBuilder ub = new UpdateBuilder() + .pop("authors", UpdateBuilder.Position.FIRST); + Assert.assertEquals("{ \"$pop\" : { \"authors\" : -1}}", ub.build().toString()); + ub = new UpdateBuilder() + .pop("authors", UpdateBuilder.Position.LAST); + Assert.assertEquals("{ \"$pop\" : { \"authors\" : 1}}", ub.build().toString()); + } + + @Test + public void testPull() { + Map m = new HashMap(); + m.put("name", "Sven"); + UpdateBuilder ub = new UpdateBuilder() + .pull("authors", m); + Assert.assertEquals("{ \"$pull\" : { \"authors\" : { \"name\" : \"Sven\"}}}", ub.build().toString()); + } + + @Test + public void testPullAll() { + Map m1 = new HashMap(); + m1.put("name", "Sven"); + Map m2 = new HashMap(); + m2.put("name", "Maria"); + UpdateBuilder ub = new UpdateBuilder() + .pullAll("authors", new Object[] {m1, m2}); + Assert.assertEquals("{ \"$pullAll\" : { \"authors\" : [ { \"name\" : \"Sven\"} , { \"name\" : \"Maria\"}]}}", ub.build().toString()); + } + + @Test + public void testRename() { + UpdateBuilder ub = new UpdateBuilder() + .rename("directory", "folder"); + Assert.assertEquals("{ \"$rename\" : { \"directory\" : \"folder\"}}", ub.build().toString()); + } }