Skip to content

Commit b63d558

Browse files
DATAMONGO-941 - Add support for $min to Update.
Added minimal variant of property type check when dealing with keywords.
1 parent e399e26 commit b63d558

File tree

1 file changed

+42
-0
lines changed
  • spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert

1 file changed

+42
-0
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java

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

18+
import java.math.BigDecimal;
19+
import java.math.BigInteger;
1820
import java.util.Arrays;
21+
import java.util.HashMap;
22+
import java.util.HashSet;
1923
import java.util.Iterator;
24+
import java.util.Map;
2025
import java.util.Map.Entry;
26+
import java.util.Set;
2127

2228
import org.springframework.core.convert.converter.Converter;
29+
import org.springframework.dao.InvalidDataAccessApiUsageException;
2330
import org.springframework.data.mapping.Association;
2431
import org.springframework.data.mapping.context.MappingContext;
2532
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
@@ -43,6 +50,13 @@
4350
*/
4451
public class UpdateMapper extends QueryMapper {
4552

53+
@SuppressWarnings({ "rawtypes", "serial" })//
54+
private static final Map<String, Set<Class>> RESTRICTED_TYPES_PER_KEYWORD = new HashMap<String, Set<Class>>() {
55+
{
56+
put("$min", new HashSet<Class>(Arrays.<Class> asList(BigDecimal.class, BigInteger.class)));
57+
}
58+
};
59+
4660
private final MongoConverter converter;
4761

4862
/**
@@ -115,6 +129,34 @@ private Entry<String, Object> getMappedUpdateModifier(Field field, Object rawVal
115129
return createMapEntry(field, value);
116130
}
117131

132+
/*
133+
* (non-Javadoc)
134+
* @see org.springframework.data.mongodb.core.convert.QueryMapper#getMappedKeyword(org.springframework.data.mongodb.core.convert.QueryMapper.Keyword, org.springframework.data.mongodb.core.mapping.MongoPersistentEntity)
135+
*/
136+
protected DBObject getMappedKeyword(Keyword keyword, MongoPersistentEntity<?> entity) {
137+
138+
assertKeywordCanBeAppliedOnProperty(keyword, entity);
139+
return super.getMappedKeyword(keyword, entity);
140+
}
141+
142+
private void assertKeywordCanBeAppliedOnProperty(Keyword keyword, MongoPersistentEntity<?> entity) {
143+
144+
if (RESTRICTED_TYPES_PER_KEYWORD.containsKey(keyword.getKey()) && keyword.getValue() instanceof DBObject) {
145+
146+
for (String key : ((DBObject) keyword.getValue()).keySet()) {
147+
148+
Field field = createPropertyField(entity, key, converter.getMappingContext());
149+
150+
if (field != null && field.getProperty() != null) {
151+
if (RESTRICTED_TYPES_PER_KEYWORD.get(keyword.getKey()).contains(field.getProperty().getActualType())) {
152+
throw new InvalidDataAccessApiUsageException(String.format("%s is not supported for %s", field
153+
.getProperty().getActualType(), keyword.getKey()));
154+
}
155+
}
156+
}
157+
}
158+
}
159+
118160
/*
119161
* (non-Javadoc)
120162
* @see org.springframework.data.mongodb.core.convert.QueryMapper#isAssociationConversionNecessary(org.springframework.data.mongodb.core.convert.QueryMapper.Field, java.lang.Object)

0 commit comments

Comments
 (0)