Skip to content

Commit

Permalink
Polishing.
Browse files Browse the repository at this point in the history
Move hasValue(…) from DocumentAccessor to BsonUtils. Fix typo in tests.

See: #3590
Original pull request: #3591.
  • Loading branch information
mp911de committed Mar 15, 2021
1 parent af40f15 commit af4b178
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,16 @@

import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;

import org.bson.Document;
import org.bson.conversions.Bson;

import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.data.mongodb.util.BsonUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

/**
Expand Down Expand Up @@ -110,28 +109,7 @@ public void put(MongoPersistentProperty prop, @Nullable Object value) {
*/
@Nullable
public Object get(MongoPersistentProperty property) {

String fieldName = property.getFieldName();
Map<String, Object> map = BsonUtils.asMap(document);

if (!fieldName.contains(".")) {
return map.get(fieldName);
}

Iterator<String> parts = Arrays.asList(fieldName.split("\\.")).iterator();
Map<String, Object> source = map;
Object result = null;

while (source != null && parts.hasNext()) {

result = source.get(parts.next());

if (parts.hasNext()) {
source = getAsMap(result);
}
}

return result;
return BsonUtils.resolveValue(document, property.getFieldName());
}

/**
Expand All @@ -157,71 +135,7 @@ public boolean hasValue(MongoPersistentProperty property) {

Assert.notNull(property, "Property must not be null!");

String fieldName = property.getFieldName();


if (this.document instanceof Document) {

if (((Document) this.document).containsKey(fieldName)) {
return true;
}
} else if (this.document instanceof DBObject) {
if (((DBObject) this.document).containsField(fieldName)) {
return true;
}
}

if (!fieldName.contains(".")) {
return false;
}

String[] parts = fieldName.split("\\.");
Map<String, Object> source;

if (this.document instanceof Document) {
source = ((Document) this.document);
} else {
source = ((DBObject) this.document).toMap();
}

Object result = null;

for (int i = 1; i < parts.length; i++) {

result = source.get(parts[i - 1]);
source = getAsMap(result);

if (source == null) {
return false;
}
}

return source.containsKey(parts[parts.length - 1]);
}

/**
* Returns the given source object as map, i.e. {@link Document}s and maps as is or {@literal null} otherwise.
*
* @param source can be {@literal null}.
* @return can be {@literal null}.
*/
@Nullable
@SuppressWarnings("unchecked")
private static Map<String, Object> getAsMap(Object source) {

if (source instanceof Document) {
return (Document) source;
}

if (source instanceof BasicDBObject) {
return (BasicDBObject) source;
}

if (source instanceof Map) {
return (Map<String, Object>) source;
}

return null;
return BsonUtils.hasValue(document, property.getFieldName());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@ public static Document parse(String json, @Nullable CodecRegistryProvider codecR
* @param bson the source to inspect. Must not be {@literal null}.
* @param key the key to lookup. Must not be {@literal null}.
* @return can be {@literal null}.
* @since 3.0.8
*/
@Nullable
public static Object resolveValue(Bson bson, String key) {
Expand All @@ -307,7 +308,7 @@ public static Object resolveValue(Bson bson, String key) {

Object result = source.get(parts[i - 1]);

if (result == null || !(result instanceof Bson)) {
if (!(result instanceof Bson)) {
return null;
}

Expand All @@ -317,6 +318,73 @@ public static Object resolveValue(Bson bson, String key) {
return source.get(parts[parts.length - 1]);
}

/**
* Returns whether the underlying {@link Bson bson} has a value ({@literal null} or non-{@literal null}) for the given
* {@code key}.
*
* @param bson the source to inspect. Must not be {@literal null}.
* @param key the key to lookup. Must not be {@literal null}.
* @return {@literal true} if no non {@literal null} value present.
* @since 3.0.8
*/
public static boolean hasValue(Bson bson, String key) {

Map<String, Object> source = asMap(bson);

if (source.get(key) != null) {
return true;
}

if (!key.contains(".")) {
return false;
}

String[] parts = key.split("\\.");

Object result;

for (int i = 1; i < parts.length; i++) {

result = source.get(parts[i - 1]);
source = getAsMap(result);

if (source == null) {
return false;
}
}

return source.containsKey(parts[parts.length - 1]);
}

/**
* Returns the given source object as map, i.e. {@link Document}s and maps as is or {@literal null} otherwise.
*
* @param source can be {@literal null}.
* @return can be {@literal null}.
*/
@Nullable
@SuppressWarnings("unchecked")
private static Map<String, Object> getAsMap(Object source) {

if (source instanceof Document) {
return (Document) source;
}

if (source instanceof BasicDBObject) {
return (BasicDBObject) source;
}

if (source instanceof DBObject) {
return ((DBObject) source).toMap();
}

if (source instanceof Map) {
return (Map<String, Object>) source;
}

return null;
}

@Nullable
private static String toJson(@Nullable Object value) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1914,7 +1914,7 @@ void saveShouldAppendDefaultShardKeyIfNotPresentInFilter() {
@Test // GH-3590
void shouldIncludeValueFromNestedShardKeyPath() {

WithShardKeyPoitingToNested source = new WithShardKeyPoitingToNested();
WithShardKeyPointingToNested source = new WithShardKeyPointingToNested();
source.id = "id-1";
source.value = "v1";
source.nested = new WithNamedFields();
Expand Down Expand Up @@ -2266,7 +2266,7 @@ static class Sith {
}

@Sharded(shardKey = {"value", "nested.customName"})
static class WithShardKeyPoitingToNested {
static class WithShardKeyPointingToNested {
String id;
String value;
WithNamedFields nested;
Expand Down

0 comments on commit af4b178

Please sign in to comment.