@ -16,7 +16,6 @@
package org.springframework.data.mongodb.repository.query ;
package org.springframework.data.mongodb.repository.query ;
import org.bson.Document ;
import org.bson.Document ;
import org.bson.codecs.configuration.CodecRegistry ;
import org.slf4j.Logger ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import org.slf4j.LoggerFactory ;
import org.springframework.data.mapping.model.SpELExpressionEvaluator ;
import org.springframework.data.mapping.model.SpELExpressionEvaluator ;
@ -31,9 +30,6 @@ import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser ;
import org.springframework.expression.spel.standard.SpelExpressionParser ;
import org.springframework.util.Assert ;
import org.springframework.util.Assert ;
import com.mongodb.MongoClientSettings ;
import com.mongodb.client.MongoDatabase ;
/ * *
/ * *
* Query to use a plain JSON String to create the { @link Query } to actually execute .
* Query to use a plain JSON String to create the { @link Query } to actually execute .
*
*
@ -50,7 +46,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
private final String query ;
private final String query ;
private final String fieldSpec ;
private final String fieldSpec ;
private final ParameterBindingDocumentCodec codec ;
private final ExpressionParser expressionParser ;
private final ExpressionParser expressionParser ;
private final QueryMethodEvaluationContextProvider evaluationContextProvider ;
private final QueryMethodEvaluationContextProvider evaluationContextProvider ;
@ -112,10 +107,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
this . isExistsQuery = false ;
this . isExistsQuery = false ;
this . isDeleteQuery = false ;
this . isDeleteQuery = false ;
}
}
CodecRegistry codecRegistry = mongoOperations . execute ( MongoDatabase : : getCodecRegistry ) ;
this . codec = new ParameterBindingDocumentCodec (
codecRegistry ! = null ? codecRegistry : MongoClientSettings . getDefaultCodecRegistry ( ) ) ;
}
}
/ *
/ *
@ -125,8 +116,10 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@Override
@Override
protected Query createQuery ( ConvertingParameterAccessor accessor ) {
protected Query createQuery ( ConvertingParameterAccessor accessor ) {
Document queryObject = codec . decode ( this . query , getBindingContext ( accessor , expressionParser , this . query ) ) ;
ParameterBindingDocumentCodec codec = getParameterBindingCodec ( ) ;
Document fieldsObject = codec . decode ( this . fieldSpec , getBindingContext ( accessor , expressionParser , this . fieldSpec ) ) ;
Document queryObject = codec . decode ( this . query , getBindingContext ( this . query , accessor , codec ) ) ;
Document fieldsObject = codec . decode ( this . fieldSpec , getBindingContext ( this . fieldSpec , accessor , codec ) ) ;
Query query = new BasicQuery ( queryObject , fieldsObject ) . with ( accessor . getSort ( ) ) ;
Query query = new BasicQuery ( queryObject , fieldsObject ) . with ( accessor . getSort ( ) ) ;
@ -137,15 +130,13 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
return query ;
return query ;
}
}
private ParameterBindingContext getBindingContext ( ConvertingParameterAccessor accessor ,
private ParameterBindingContext getBindingContext ( String json , ConvertingParameterAccessor accessor ,
ExpressionParser expressionParser , String json ) {
ParameterBindingDocumentCodec codec ) {
ExpressionDependencies dependencies = codec . captureExpressionDependencies ( json , accessor : : getBindableValue ,
ExpressionDependencies dependencies = codec . captureExpressionDependencies ( json , accessor : : getBindableValue ,
expressionParser ) ;
expressionParser ) ;
SpELExpressionEvaluator evaluator = new DefaultSpELExpressionEvaluator ( expressionParser , evaluationContextProvider
SpELExpressionEvaluator evaluator = getSpELExpressionEvaluatorFor ( dependencies , accessor ) ;
. getEvaluationContext ( getQueryMethod ( ) . getParameters ( ) , accessor . getValues ( ) , dependencies ) ) ;
return new ParameterBindingContext ( accessor : : getBindableValue , evaluator ) ;
return new ParameterBindingContext ( accessor : : getBindableValue , evaluator ) ;
}
}
@ -189,4 +180,8 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
boolean isDeleteQuery ) {
boolean isDeleteQuery ) {
return BooleanUtil . countBooleanTrueValues ( isCountQuery , isExistsQuery , isDeleteQuery ) > 1 ;
return BooleanUtil . countBooleanTrueValues ( isCountQuery , isExistsQuery , isDeleteQuery ) > 1 ;
}
}
private ParameterBindingDocumentCodec getParameterBindingCodec ( ) {
return new ParameterBindingDocumentCodec ( getCodecRegistry ( ) ) ;
}
}
}