Browse Source

Added include() and exclude() methods that accept Collection in field projection.

Closes: #4625
Original Pull Request: #4668
pull/4791/head
Kirill Egorov 2 years ago committed by Christoph Strobl
parent
commit
d2a974462d
No known key found for this signature in database
GPG Key ID: E6054036D0C37A4B
  1. 28
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Field.java
  2. 3
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java
  3. 3
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleReactiveMongoRepository.java
  4. 21
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/FieldUnitTests.java

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

@ -16,6 +16,7 @@
package org.springframework.data.mongodb.core.query; package org.springframework.data.mongodb.core.query;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
@ -35,6 +36,7 @@ import org.springframework.util.ObjectUtils;
* @author Christoph Strobl * @author Christoph Strobl
* @author Mark Paluch * @author Mark Paluch
* @author Owen Q * @author Owen Q
* @author Kirill Egorov
*/ */
public class Field { public class Field {
@ -124,6 +126,17 @@ public class Field {
*/ */
public Field include(String... fields) { public Field include(String... fields) {
return include(Arrays.asList(fields));
}
/**
* Include one or more {@code fields} to be returned by the query operation.
*
* @param fields the document field names to be included.
* @return {@code this} field projection instance.
*/
public Field include(Collection<String> fields) {
Assert.notNull(fields, "Keys must not be null"); Assert.notNull(fields, "Keys must not be null");
for (String key : fields) { for (String key : fields) {
@ -136,7 +149,7 @@ public class Field {
/** /**
* Exclude a single {@code field} from being returned by the query operation. * Exclude a single {@code field} from being returned by the query operation.
* *
* @param field the document field name to be included. * @param field the document field name to be excluded.
* @return {@code this} field projection instance. * @return {@code this} field projection instance.
*/ */
public Field exclude(String field) { public Field exclude(String field) {
@ -151,12 +164,23 @@ public class Field {
/** /**
* Exclude one or more {@code fields} from being returned by the query operation. * Exclude one or more {@code fields} from being returned by the query operation.
* *
* @param fields the document field names to be included. * @param fields the document field names to be excluded.
* @return {@code this} field projection instance. * @return {@code this} field projection instance.
* @since 3.1 * @since 3.1
*/ */
public Field exclude(String... fields) { public Field exclude(String... fields) {
return exclude(Arrays.asList(fields));
}
/**
* Exclude one or more {@code fields} from being returned by the query operation.
*
* @param fields the document field names to be excluded.
* @return {@code this} field projection instance.
*/
public Field exclude(Collection<String> fields) {
Assert.notNull(fields, "Keys must not be null"); Assert.notNull(fields, "Keys must not be null");
for (String key : fields) { for (String key : fields) {

3
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java

@ -60,6 +60,7 @@ import com.mongodb.client.result.DeleteResult;
* @author Mark Paluch * @author Mark Paluch
* @author Mehran Behnam * @author Mehran Behnam
* @author Jens Schauder * @author Jens Schauder
* @author Kirill Egorov
*/ */
public class SimpleMongoRepository<T, ID> implements MongoRepository<T, ID> { public class SimpleMongoRepository<T, ID> implements MongoRepository<T, ID> {
@ -485,7 +486,7 @@ public class SimpleMongoRepository<T, ID> implements MongoRepository<T, ID> {
query.limit(getLimit()); query.limit(getLimit());
if (!getFieldsToInclude().isEmpty()) { if (!getFieldsToInclude().isEmpty()) {
query.fields().include(getFieldsToInclude().toArray(new String[0])); query.fields().include(getFieldsToInclude());
} }
getReadPreference().ifPresent(query::withReadPreference); getReadPreference().ifPresent(query::withReadPreference);

3
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleReactiveMongoRepository.java

@ -63,6 +63,7 @@ import com.mongodb.client.result.DeleteResult;
* @author Ruben J Garcia * @author Ruben J Garcia
* @author Jens Schauder * @author Jens Schauder
* @author Clément Petit * @author Clément Petit
* @author Kirill Egorov
* @since 2.0 * @since 2.0
*/ */
public class SimpleReactiveMongoRepository<T, ID extends Serializable> implements ReactiveMongoRepository<T, ID> { public class SimpleReactiveMongoRepository<T, ID extends Serializable> implements ReactiveMongoRepository<T, ID> {
@ -555,7 +556,7 @@ public class SimpleReactiveMongoRepository<T, ID extends Serializable> implement
query.limit(getLimit()); query.limit(getLimit());
if (!getFieldsToInclude().isEmpty()) { if (!getFieldsToInclude().isEmpty()) {
query.fields().include(getFieldsToInclude().toArray(new String[0])); query.fields().include(getFieldsToInclude());
} }
readPreference.ifPresent(query::withReadPreference); readPreference.ifPresent(query::withReadPreference);

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

@ -19,12 +19,15 @@ import static org.springframework.data.mongodb.test.util.Assertions.*;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.List;
/** /**
* Unit tests for {@link Field}. * Unit tests for {@link Field}.
* *
* @author Oliver Gierke * @author Oliver Gierke
* @author Owen Q * @author Owen Q
* @author Mark Paluch * @author Mark Paluch
* @author Kirill Egorov
*/ */
class FieldUnitTests { class FieldUnitTests {
@ -64,4 +67,22 @@ class FieldUnitTests {
assertThat(fields.getFieldsObject()).isEqualTo("{foo:0, bar:0, baz:0}"); assertThat(fields.getFieldsObject()).isEqualTo("{foo:0, bar:0, baz:0}");
} }
@Test // GH-4625
void overriddenInclusionMethodsCreateEqualFields() {
Field left = new Field().include("foo", "bar");
Field right = new Field().include(List.of("foo", "bar"));
assertThat(left).isEqualTo(right);
}
@Test // GH-4625
void overriddenExclusionMethodsCreateEqualFields() {
Field left = new Field().exclude("foo", "bar");
Field right = new Field().exclude(List.of("foo", "bar"));
assertThat(left).isEqualTo(right);
}
} }

Loading…
Cancel
Save