diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java index 99be0830b..5865df61a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java @@ -324,6 +324,17 @@ public class Update { return this; } + /** + * The operator supports bitwise {@code and}, bitwise {@code or}, and bitwise {@code xor} operations. + * + * @param key + * @return + * @since 1.7 + */ + public BitwiseOperatorBuilder bitwise(String key) { + return new BitwiseOperatorBuilder(this, key); + } + public DBObject getUpdateObject() { DBObject dbo = new BasicDBObject(); @@ -683,4 +694,79 @@ public class Update { return Update.this.addToSet(this.key, value); } } + + /** + * @author Christoph Strobl + * @since 1.7 + */ + public static class BitwiseOperatorBuilder { + + private final String key; + private final Update reference; + private static final String BIT_OPERATOR = "$bit"; + + private enum BitwiseOperator { + AND, OR, XOR; + + @Override + public String toString() { + return super.toString().toLowerCase(); + }; + } + + /** + * Creates a new {@link BitwiseOperatorBuilder}. + * + * @param reference must not be {@literal null} + * @param key must not be {@literal null} + */ + protected BitwiseOperatorBuilder(Update reference, String key) { + + Assert.notNull(reference, "Reference must not be null!"); + Assert.notNull(key, "Key must not be null!"); + + this.reference = reference; + this.key = key; + } + + /** + * Updates to the result of a bitwise and operation between the current value and the given one. + * + * @param value + * @return + */ + public Update and(long value) { + + addFieldOperation(BitwiseOperator.AND, value); + return reference; + } + + /** + * Updates to the result of a bitwise or operation between the current value and the given one. + * + * @param value + * @return + */ + public Update or(long value) { + + addFieldOperation(BitwiseOperator.OR, value); + return reference; + } + + /** + * Updates to the result of a bitwise xor operation between the current value and the given one. + * + * @param value + * @return + */ + public Update xor(long value) { + + addFieldOperation(BitwiseOperator.XOR, value); + return reference; + } + + private void addFieldOperation(BitwiseOperator operator, Number value) { + reference.addMultiFieldOperation(BIT_OPERATOR, key, new BasicDBObject(operator.toString(), value)); + } + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/UpdateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/UpdateTests.java index 3e24e934a..57bc186e0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/UpdateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/UpdateTests.java @@ -440,4 +440,40 @@ public class UpdateTests { assertThat(update.getUpdateObject(), equalTo(new BasicDBObjectBuilder().add("$mul", new BasicDBObject("key", 10D)) .get())); } + + /** + * @see DATAMONGO-1101 + */ + @Test + public void getUpdateObjectShouldReturnCorrectRepresentationForBitwiseAnd() { + + Update update = new Update().bitwise("key").and(10L); + + assertThat(update.getUpdateObject(), + equalTo(new BasicDBObjectBuilder().add("$bit", new BasicDBObject("key", new BasicDBObject("and", 10L))).get())); + } + + /** + * @see DATAMONGO-1101 + */ + @Test + public void getUpdateObjectShouldReturnCorrectRepresentationForBitwiseOr() { + + Update update = new Update().bitwise("key").or(10L); + + assertThat(update.getUpdateObject(), + equalTo(new BasicDBObjectBuilder().add("$bit", new BasicDBObject("key", new BasicDBObject("or", 10L))).get())); + } + + /** + * @see DATAMONGO-1101 + */ + @Test + public void getUpdateObjectShouldReturnCorrectRepresentationForBitwiseXor() { + + Update update = new Update().bitwise("key").xor(10L); + + assertThat(update.getUpdateObject(), + equalTo(new BasicDBObjectBuilder().add("$bit", new BasicDBObject("key", new BasicDBObject("xor", 10L))).get())); + } }