Trim BindlableMongoExpression input.

Trim the given source so that wrapping checks still work for text blocks.
Fix a typo in Javadoc.

Resolves: #4821
Original Pull Request: #4822
This commit is contained in:
Giacomo Baso
2024-10-25 23:34:23 +02:00
committed by Christoph Strobl
parent 9e18fa4a6d
commit 2955aab3b8
2 changed files with 22 additions and 2 deletions

View File

@@ -23,13 +23,14 @@ import org.bson.codecs.configuration.CodecRegistry;
import org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec;
import org.springframework.data.util.Lazy;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
* A {@link MongoExpression} using the {@link ParameterBindingDocumentCodec} for parsing a raw ({@literal json})
* expression. The expression will be wrapped within <code>{ ... }</code> if necessary. The actual parsing and parameter
* binding of placeholders like {@code ?0} is delayed upon first call on the the target {@link Document} via
* binding of placeholders like {@code ?0} is delayed upon first call on the target {@link Document} via
* {@link #toDocument()}.
* <br />
*
@@ -45,6 +46,7 @@ import org.springframework.util.StringUtils;
* containing the required {@link org.bson.codecs.Codec codec} via {@link #withCodecRegistry(CodecRegistry)}.
*
* @author Christoph Strobl
* @author Giacomo Baso
* @since 3.2
*/
public class BindableMongoExpression implements MongoExpression {
@@ -77,7 +79,9 @@ public class BindableMongoExpression implements MongoExpression {
public BindableMongoExpression(String expression, @Nullable CodecRegistryProvider codecRegistryProvider,
@Nullable Object[] args) {
this.expressionString = expression;
Assert.notNull(expression, "Expression must not be null");
this.expressionString = expression.trim();
this.codecRegistryProvider = codecRegistryProvider;
this.args = args;
this.target = Lazy.of(this::parse);

View File

@@ -42,6 +42,7 @@ import org.springframework.data.mongodb.test.util.Template;
*
* @author Christoph Strobl
* @author Mark Paluch
* @author Giacomo Baso
*/
@ExtendWith(MongoTemplateExtension.class)
@EnableIfMongoServerVersion(isGreaterThanEqual = "4.4")
@@ -89,6 +90,21 @@ class MongoTemplateFieldProjectionTests {
assertThat(result).isEqualTo(luke.upperCaseLastnameClone());
}
@Test // GH-4821
void usesMongoExpressionWithLineBreaksAsIs() {
Person result = findLuke(fields -> {
fields.include("firstname").project(MongoExpression.create("""
{
'$toUpper' : '$last_name'
}
"""))
.as("last_name");
});
assertThat(result).isEqualTo(luke.upperCaseLastnameClone());
}
@Test // GH-3583
void mapsAggregationExpressionToDomainType() {