Skip to content

Commit 85022d2

Browse files
owen-qmp911de
authored andcommitted
DATAMONGO-2294 - Support query projections with collection types.
Query include/exclude now accepts a vararg array of fields to specify multiple fields at once. Original pull request: #761.
1 parent b2927ab commit 85022d2

File tree

3 files changed

+77
-7
lines changed

3 files changed

+77
-7
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Field.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
*/
1616
package org.springframework.data.mongodb.core.query;
1717

18+
import java.util.Arrays;
1819
import java.util.HashMap;
1920
import java.util.Map;
2021
import java.util.Map.Entry;
2122

23+
import lombok.EqualsAndHashCode;
24+
2225
import org.bson.Document;
2326
import org.springframework.lang.Nullable;
2427
import org.springframework.util.Assert;
@@ -30,6 +33,7 @@
3033
* @author Patryk Wasik
3134
* @author Christoph Strobl
3235
* @author Mark Paluch
36+
* @author Owen Q
3337
*/
3438
public class Field {
3539

@@ -44,11 +48,27 @@ public Field include(String key) {
4448
return this;
4549
}
4650

51+
public Field includes(String... keys) {
52+
Assert.notNull(keys, "Keys must not be null!");
53+
Assert.notEmpty(keys, "Keys must not be empty!");
54+
55+
Arrays.asList(keys).stream().forEach(this::include);
56+
return this;
57+
}
58+
4759
public Field exclude(String key) {
4860
criteria.put(key, Integer.valueOf(0));
4961
return this;
5062
}
5163

64+
public Field excludes(String... keys) {
65+
Assert.notNull(keys, "Keys must not be null!");
66+
Assert.notEmpty(keys, "Keys must not be empty!");
67+
68+
Arrays.asList(keys).stream().forEach(this::exclude);
69+
return this;
70+
}
71+
5272
public Field slice(String key, int size) {
5373
slices.put(key, Integer.valueOf(size));
5474
return this;

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@
1515
*/
1616
package org.springframework.data.mongodb.core;
1717

18+
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.assertj.core.api.Assertions.fail;
20+
import static org.hamcrest.Matchers.not;
21+
import static org.hamcrest.Matchers.*;
22+
import static org.junit.Assert.assertThat;
23+
import static org.junit.Assert.*;
24+
import static org.junit.Assume.*;
1825
import static org.assertj.core.api.Assertions.*;
1926
import static org.springframework.data.mongodb.core.query.Criteria.*;
2027
import static org.springframework.data.mongodb.core.query.Query.*;
2128
import static org.springframework.data.mongodb.core.query.Update.*;
2229

23-
import lombok.AllArgsConstructor;
24-
import lombok.Data;
25-
import lombok.EqualsAndHashCode;
26-
import lombok.NoArgsConstructor;
27-
import lombok.Value;
28-
import lombok.experimental.Wither;
29-
3030
import java.lang.reflect.InvocationTargetException;
3131
import java.math.BigDecimal;
3232
import java.math.BigInteger;
@@ -38,6 +38,13 @@
3838
import java.util.stream.Collectors;
3939
import java.util.stream.IntStream;
4040

41+
import lombok.AllArgsConstructor;
42+
import lombok.Data;
43+
import lombok.EqualsAndHashCode;
44+
import lombok.NoArgsConstructor;
45+
import lombok.Value;
46+
import lombok.experimental.Wither;
47+
4148
import org.bson.types.ObjectId;
4249
import org.joda.time.DateTime;
4350
import org.junit.jupiter.api.AfterEach;
@@ -91,6 +98,7 @@
9198
import com.mongodb.BasicDBObject;
9299
import com.mongodb.DBObject;
93100
import com.mongodb.DBRef;
101+
import com.mongodb.MongoClient;
94102
import com.mongodb.MongoException;
95103
import com.mongodb.ReadPreference;
96104
import com.mongodb.WriteConcern;
@@ -3669,6 +3677,27 @@ public void shouldNotConvertStringToObjectIdForNonIdField() {
36693677
assertThat(target.inner.id).isEqualTo(innerId);
36703678
}
36713679

3680+
@Test // DATAMONGO-2294
3681+
public void shouldProjectWithCollections() {
3682+
3683+
MyPerson person = new MyPerson("Walter");
3684+
person.address = new Address("TX", "Austin");
3685+
template.save(person);
3686+
3687+
Query queryByChainedInclude = query(where("name").is("Walter"));
3688+
queryByChainedInclude.fields().include("id").include("name");
3689+
3690+
Query queryByCollectionInclude = query(where("name").is("Walter"));
3691+
queryByCollectionInclude.fields().includes("id", "name");
3692+
3693+
MyPerson first = template.findAndReplace(queryByChainedInclude, new MyPerson("Walter"));
3694+
MyPerson second = template.findAndReplace(queryByCollectionInclude, new MyPerson("Walter"));
3695+
3696+
assertThat(first).isEqualTo(second);
3697+
assertThat(first.address).isNull();
3698+
assertThat(second.address).isNull();
3699+
}
3700+
36723701
@Test // DATAMONGO-2451
36733702
public void sortOnIdFieldWithExplicitTypeShouldWork() {
36743703

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/FieldUnitTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
* Unit tests for {@link DocumentField}.
2424
*
2525
* @author Oliver Gierke
26+
* @author Owen Q
2627
*/
2728
public class FieldUnitTests {
2829

@@ -36,6 +37,16 @@ public void sameObjectSetupCreatesEqualField() {
3637
assertThat(right).isEqualTo(left);
3738
}
3839

40+
@Test // DATAMONGO-2294
41+
public void sameObjectSetupCreatesEqualFieldByCollections() {
42+
43+
Field left = new Field().includes("foo", "bar");
44+
Field right = new Field().include("foo").include("bar");
45+
46+
assertThat(left, is(right));
47+
assertThat(right, is(left));
48+
}
49+
3950
@Test
4051
public void differentObjectSetupCreatesEqualField() {
4152

@@ -45,4 +56,14 @@ public void differentObjectSetupCreatesEqualField() {
4556
assertThat(left).isNotEqualTo(right);
4657
assertThat(right).isNotEqualTo(left);
4758
}
59+
60+
@Test // DATAMONGO-2294
61+
public void differentObjectSetupCreatesEqualFieldByCollections() {
62+
63+
Field left = new Field().includes("foo", "bar");
64+
Field right = new Field().include("foo").include("zoo");
65+
66+
assertThat(left, is(not(right)));
67+
assertThat(right, is(not(left)));
68+
}
4869
}

0 commit comments

Comments
 (0)