|
38 | 38 | import org.bson.types.ObjectId; |
39 | 39 | import org.junit.jupiter.api.BeforeEach; |
40 | 40 | import org.junit.jupiter.api.Test; |
41 | | - |
42 | 41 | import org.springframework.core.convert.converter.Converter; |
43 | 42 | import org.springframework.data.annotation.Id; |
44 | 43 | import org.springframework.data.annotation.Transient; |
|
58 | 57 | import org.springframework.data.mongodb.core.convert.MongoCustomConversions.MongoConverterConfigurationAdapter; |
59 | 58 | import org.springframework.data.mongodb.core.geo.GeoJsonPoint; |
60 | 59 | import org.springframework.data.mongodb.core.geo.GeoJsonPolygon; |
61 | | -import org.springframework.data.mongodb.core.mapping.DBRef; |
62 | | -import org.springframework.data.mongodb.core.mapping.Document; |
63 | | -import org.springframework.data.mongodb.core.mapping.DocumentReference; |
64 | | -import org.springframework.data.mongodb.core.mapping.Field; |
| 60 | +import org.springframework.data.mongodb.core.mapping.*; |
65 | 61 | import org.springframework.data.mongodb.core.mapping.FieldName.Type; |
66 | | -import org.springframework.data.mongodb.core.mapping.FieldType; |
67 | | -import org.springframework.data.mongodb.core.mapping.MongoId; |
68 | | -import org.springframework.data.mongodb.core.mapping.MongoMappingContext; |
69 | | -import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; |
70 | | -import org.springframework.data.mongodb.core.mapping.TextScore; |
71 | | -import org.springframework.data.mongodb.core.mapping.Unwrapped; |
72 | 62 | import org.springframework.data.mongodb.core.query.BasicQuery; |
73 | 63 | import org.springframework.data.mongodb.core.query.Criteria; |
74 | 64 | import org.springframework.data.mongodb.core.query.Query; |
@@ -98,7 +88,8 @@ public class QueryMapperUnitTests { |
98 | 88 | @BeforeEach |
99 | 89 | void beforeEach() { |
100 | 90 |
|
101 | | - MongoCustomConversions conversions = new MongoCustomConversions(new MongoConverterConfigurationAdapter().bigDecimal(BigDecimalRepresentation.DECIMAL128)); |
| 91 | + MongoCustomConversions conversions = new MongoCustomConversions( |
| 92 | + new MongoConverterConfigurationAdapter().bigDecimal(BigDecimalRepresentation.DECIMAL128)); |
102 | 93 | this.context = new MongoMappingContext(); |
103 | 94 | this.context.setSimpleTypeHolder(conversions.getSimpleTypeHolder()); |
104 | 95 |
|
@@ -133,7 +124,8 @@ void convertsStringIntoObjectId() { |
133 | 124 | void handlesBigIntegerIdsCorrectly/*in legacy string format*/() { |
134 | 125 |
|
135 | 126 | MappingMongoConverter converter = new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, context); |
136 | | - converter.setCustomConversions(MongoCustomConversions.create(adapter -> adapter.bigDecimal(BigDecimalRepresentation.STRING))); |
| 127 | + converter.setCustomConversions( |
| 128 | + MongoCustomConversions.create(adapter -> adapter.bigDecimal(BigDecimalRepresentation.STRING))); |
137 | 129 | converter.afterPropertiesSet(); |
138 | 130 |
|
139 | 131 | QueryMapper mapper = new QueryMapper(converter); |
@@ -1663,7 +1655,7 @@ void usageOfUntypedAggregationShouldRenderOperationsAsIs() { |
1663 | 1655 |
|
1664 | 1656 | Query query = query(expr(Expr.valueOf(ComparisonOperators.valueOf("field").greaterThan("budget")))); |
1665 | 1657 | org.bson.Document mappedObject = mapper.getMappedObject(query.getQueryObject(), |
1666 | | - context.getPersistentEntity(Object.class)); |
| 1658 | + context.getPersistentEntity(Object.class)); |
1667 | 1659 | assertThat(mappedObject).isEqualTo("{ $expr : { $expr : { $gt : [ '$field', '$budget'] } } }"); |
1668 | 1660 | } |
1669 | 1661 |
|
@@ -1730,11 +1722,49 @@ void allOperatorShouldConvertIdCollection() { |
1730 | 1722 | Criteria criteria = new Criteria().andOperator(where("name").isNull().and("id").all(List.of(oid.toString()))); |
1731 | 1723 |
|
1732 | 1724 | org.bson.Document mappedObject = mapper.getMappedObject(criteria.getCriteriaObject(), |
1733 | | - context.getPersistentEntity(Customer.class)); |
| 1725 | + context.getPersistentEntity(Customer.class)); |
1734 | 1726 |
|
1735 | 1727 | assertThat(mappedObject).containsEntry("$and.[0]._id.$all", List.of(oid)); |
1736 | 1728 | } |
1737 | 1729 |
|
| 1730 | + @Test // GH-4346 |
| 1731 | + void propertyValueConverterOnlyGetsInvokedOnMatchingType() { |
| 1732 | + |
| 1733 | + Criteria criteria = new Criteria().andOperator(where("text").regex("abc")); |
| 1734 | + org.bson.Document mappedObject = mapper.getMappedObject(criteria.getCriteriaObject(), |
| 1735 | + context.getPersistentEntity(WithPropertyValueConverter.class)); |
| 1736 | + |
| 1737 | + org.bson.Document parsedExpected = org.bson.Document.parse("{ '$and' : [{ 'text' : /abc/ }] }"); |
| 1738 | + |
| 1739 | + // We are comparing BsonDocument instances instead of Document instances, because Document.parse applies a Codec, |
| 1740 | + // which the ObjectMapper doesn't, yielding slightly different results. |
| 1741 | + // converting both to BsonDocuments applies the Codec to both. |
| 1742 | + assertThat(mappedObject.toBsonDocument()).isEqualTo(parsedExpected.toBsonDocument()); |
| 1743 | + } |
| 1744 | + |
| 1745 | + @Test // GH-4346 |
| 1746 | + void nullConversionIsApplied(){ |
| 1747 | + |
| 1748 | + org.bson.Document mappedObject = mapper.getMappedObject(new org.bson.Document("text", null), |
| 1749 | + context.getPersistentEntity(WithNullReplacingPropertyValueConverter.class)); |
| 1750 | + |
| 1751 | + assertThat(mappedObject).isEqualTo(new org.bson.Document("text", "W")); |
| 1752 | + } |
| 1753 | + |
| 1754 | + @Test // GH-4346 |
| 1755 | + void nullConversionIsAppliedToLists(){ |
| 1756 | + |
| 1757 | + List<String> listOfStrings = new ArrayList<>(); |
| 1758 | + listOfStrings.add("alpha"); |
| 1759 | + listOfStrings.add(null); |
| 1760 | + listOfStrings.add("beta"); |
| 1761 | + |
| 1762 | + org.bson.Document mappedObject = mapper.getMappedObject(new org.bson.Document("text", listOfStrings), |
| 1763 | + context.getPersistentEntity(WithNullReplacingPropertyValueConverter.class)); |
| 1764 | + |
| 1765 | + assertThat(mappedObject).isEqualTo(new org.bson.Document("text", List.of("alpha", "W", "beta"))); |
| 1766 | + } |
| 1767 | + |
1738 | 1768 | class WithSimpleMap { |
1739 | 1769 | Map<String, String> simpleMap; |
1740 | 1770 | } |
@@ -2021,6 +2051,16 @@ static class WithPropertyValueConverter { |
2021 | 2051 | @ValueConverter(ReversingValueConverter.class) String text; |
2022 | 2052 | } |
2023 | 2053 |
|
| 2054 | + static class WithNullReplacingPropertyValueConverter { |
| 2055 | + |
| 2056 | + @ValueConverter(NullReplacingValueConverter.class) String text; |
| 2057 | + } |
| 2058 | + |
| 2059 | + static class WithNullReplacingPropertyValueConverterOnList { |
| 2060 | + |
| 2061 | + @ValueConverter(NullReplacingValueConverter.class) List<String> text; |
| 2062 | + } |
| 2063 | + |
2024 | 2064 | @WritingConverter |
2025 | 2065 | public static class MyAddressToDocumentConverter implements Converter<MyAddress, org.bson.Document> { |
2026 | 2066 |
|
|
0 commit comments