DATAMONGO-1762 - Polishing.

Add missing Nullable annotations. Provide getRequired…() methods for values known to exist. Update javadoc according to null-allowance/non-null requirements. Remove superfluous null-checks for values known to be non-null. Remove license from package Javadoc. Update license headers, remove trailing whitespaces.
This commit is contained in:
Mark Paluch
2017-08-28 16:29:31 +02:00
parent bdd5c9dec7
commit 0be4d1345e
104 changed files with 1082 additions and 945 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2012 the original author or authors.
* Copyright 2010-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,16 +17,18 @@ package org.springframework.data.mongodb;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.data.authentication.UserCredentials;
import org.springframework.lang.Nullable;
/**
* Exception being thrown in case we cannot connect to a MongoDB instance.
*
*
* @author Oliver Gierke
* @author Mark Paluch
*/
public class CannotGetMongoDbConnectionException extends DataAccessResourceFailureException {
private final UserCredentials credentials;
private final String database;
private final @Nullable String database;
private static final long serialVersionUID = 1172099106475265589L;
@@ -40,7 +42,7 @@ public class CannotGetMongoDbConnectionException extends DataAccessResourceFailu
this(msg, null, UserCredentials.NO_CREDENTIALS);
}
public CannotGetMongoDbConnectionException(String msg, String database, UserCredentials credentials) {
public CannotGetMongoDbConnectionException(String msg, @Nullable String database, UserCredentials credentials) {
super(msg);
this.database = database;
this.credentials = credentials;
@@ -48,7 +50,7 @@ public class CannotGetMongoDbConnectionException extends DataAccessResourceFailu
/**
* Returns the {@link UserCredentials} that were used when trying to connect to the MongoDB instance.
*
*
* @return
*/
public UserCredentials getCredentials() {
@@ -57,9 +59,10 @@ public class CannotGetMongoDbConnectionException extends DataAccessResourceFailu
/**
* Returns the name of the database trying to be accessed.
*
*
* @return
*/
@Nullable
public String getDatabase() {
return database;
}

View File

@@ -24,6 +24,7 @@ import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.lang.Nullable;
import com.mongodb.MongoClient;
@@ -84,6 +85,7 @@ AbstractMongoConfiguration extends MongoConfigurationSupport {
* @deprecated use {@link #getMappingBasePackages()} instead.
*/
@Deprecated
@Nullable
protected String getMappingBasePackage() {
Package mappingBasePackage = getClass().getPackage();

View File

@@ -1,11 +1,11 @@
/*
* Copyright 2011-2017 by the original author(s).
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -33,6 +33,7 @@ import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.data.config.BeanComponentDefinitionBuilder;
import org.springframework.data.mongodb.core.MongoClientFactoryBean;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
@@ -42,12 +43,13 @@ import com.mongodb.MongoURI;
/**
* {@link BeanDefinitionParser} to parse {@code db-factory} elements into {@link BeanDefinition}s.
*
*
* @author Jon Brisbin
* @author Oliver Gierke
* @author Thomas Darimont
* @author Christoph Strobl
* @author Viktor Khoroshko
* @author Mark Paluch
*/
public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
@@ -62,7 +64,7 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES = Collections.unmodifiableSet(mongoUriAllowedAdditionalAttributes);
}
/*
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#resolveId(org.w3c.dom.Element, org.springframework.beans.factory.support.AbstractBeanDefinition, org.springframework.beans.factory.xml.ParserContext)
*/
@@ -74,7 +76,7 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
return StringUtils.hasText(id) ? id : BeanNames.DB_FACTORY_BEAN_NAME;
}
/*
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#parseInternal(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
*/
@@ -119,7 +121,7 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
/**
* Registers a default {@link BeanDefinition} of a {@link Mongo} instance and returns the name under which the
* {@link Mongo} instance was registered under.
*
*
* @param element must not be {@literal null}.
* @param parserContext must not be {@literal null}.
* @return
@@ -138,11 +140,12 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
* attributes. <br />
* Errors when configured element contains {@literal uri} or {@literal client-uri} along with other attributes except
* {@literal write-concern} and/or {@literal id}.
*
*
* @param element must not be {@literal null}.
* @param parserContext
* @return {@literal null} in case no client-/uri defined.
*/
@Nullable
private BeanDefinition getMongoUri(Element element, ParserContext parserContext) {
boolean hasClientUri = element.hasAttribute("client-uri");

View File

@@ -31,7 +31,7 @@ import com.mongodb.ServerAddress;
/**
* Parse a {@link String} to a {@link ServerAddress} array. The format is host1:port1,host2:port2,host3:port3.
*
*
* @author Mark Pollack
* @author Oliver Gierke
* @author Thomas Darimont
@@ -80,10 +80,11 @@ public class ServerAddressPropertyEditor extends PropertyEditorSupport {
/**
* Parses the given source into a {@link ServerAddress}.
*
*
* @param source
* @return the
*/
@Nullable
private ServerAddress parseServerAddress(String source) {
if (!StringUtils.hasText(source)) {
@@ -114,7 +115,7 @@ public class ServerAddressPropertyEditor extends PropertyEditorSupport {
/**
* Extract the host and port from the given {@link String}.
*
*
* @param addressAndPortSource must not be {@literal null}.
* @return
*/

View File

@@ -98,10 +98,6 @@ public class DefaultIndexOperations implements IndexOperations {
Document indexOptions = indexDefinition.getIndexOptions();
if (indexOptions == null) {
return collection.createIndex(indexDefinition.getIndexKeys());
}
IndexOptions ops = IndexConverters.indexDefinitionToIndexOptionsConverter().convert(indexDefinition);
if (indexOptions.containsKey(PARTIAL_FILTER_EXPRESSION_KEY)) {

View File

@@ -15,8 +15,6 @@
*/
package org.springframework.data.mongodb.core;
import org.springframework.data.mongodb.core.index.ReactiveIndexOperations;
import org.springframework.lang.Nullable;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -27,7 +25,9 @@ import org.bson.Document;
import org.springframework.data.mongodb.core.convert.QueryMapper;
import org.springframework.data.mongodb.core.index.IndexDefinition;
import org.springframework.data.mongodb.core.index.IndexInfo;
import org.springframework.data.mongodb.core.index.ReactiveIndexOperations;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.mongodb.client.model.IndexOptions;
@@ -69,7 +69,7 @@ public class DefaultReactiveIndexOperations implements ReactiveIndexOperations {
* @param type used for mapping potential partial index filter expression, must not be {@literal null}.
*/
public DefaultReactiveIndexOperations(ReactiveMongoOperations mongoOperations, String collectionName,
QueryMapper queryMapper, @Nullable Class<?> type) {
QueryMapper queryMapper, Class<?> type) {
this(mongoOperations, collectionName, queryMapper, Optional.of(type));
}
@@ -96,10 +96,6 @@ public class DefaultReactiveIndexOperations implements ReactiveIndexOperations {
Document indexOptions = indexDefinition.getIndexOptions();
if (indexOptions == null) {
return collection.createIndex(indexDefinition.getIndexKeys());
}
IndexOptions ops = IndexConverters.indexDefinitionToIndexOptionsConverter().convert(indexDefinition);
if (indexOptions.containsKey(PARTIAL_FILTER_EXPRESSION_KEY)) {

View File

@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.mongodb.core;
import java.util.concurrent.TimeUnit;

View File

@@ -34,8 +34,9 @@ import com.mongodb.ServerAddress;
/**
* Convenient factory for configuring MongoDB.
*
*
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.7
*/
public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> implements PersistenceExceptionTranslator {
@@ -52,7 +53,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
/**
* Set the {@link MongoClientOptions} to be used when creating {@link MongoClient}.
*
*
* @param mongoClientOptions
*/
public void setMongoClientOptions(@Nullable MongoClientOptions mongoClientOptions) {
@@ -61,7 +62,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
/**
* Set the list of credentials to be used when creating {@link MongoClient}.
*
*
* @param credentials can be {@literal null}.
*/
public void setCredentials(@Nullable MongoCredential[] credentials) {
@@ -70,7 +71,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
/**
* Set the list of {@link ServerAddress} to build up a replica set for.
*
*
* @param replicaSetSeeds can be {@literal null}.
*/
public void setReplicaSetSeeds(@Nullable ServerAddress[] replicaSetSeeds) {
@@ -79,7 +80,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
/**
* Configures the host to connect to.
*
*
* @param host
*/
public void setHost(@Nullable String host) {
@@ -88,7 +89,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
/**
* Configures the port to connect to.
*
*
* @param port
*/
public void setPort(int port) {
@@ -97,7 +98,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
/**
* Configures the {@link PersistenceExceptionTranslator} to use.
*
*
* @param exceptionTranslator
*/
public void setExceptionTranslator(@Nullable PersistenceExceptionTranslator exceptionTranslator) {
@@ -121,7 +122,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
return exceptionTranslator.translateExceptionIfPossible(ex);
}
/*
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance()
*/
@@ -132,14 +133,10 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
mongoClientOptions = MongoClientOptions.builder().build();
}
if (credentials == null) {
credentials = Collections.emptyList();
}
return createMongoClient();
}
/*
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.config.AbstractFactoryBean#destroyInstance(java.lang.Object)
*/
@@ -170,7 +167,7 @@ public class MongoClientFactoryBean extends AbstractFactoryBean<MongoClient> imp
/**
* Returns the given array as {@link List} with all {@literal null} elements removed.
*
*
* @param elements the elements to filter <T>, can be {@literal null}.
* @return a new unmodifiable {@link List#} from the given elements without {@literal null}s.
*/

View File

@@ -20,6 +20,7 @@ import javax.net.ssl.SSLSocketFactory;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.lang.Nullable;
import com.mongodb.DBDecoderFactory;
import com.mongodb.DBEncoderFactory;
@@ -27,7 +28,6 @@ import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ReadPreference;
import com.mongodb.WriteConcern;
import org.springframework.lang.Nullable;
/**
* A factory bean for construction of a {@link MongoClientOptions} instance.
@@ -41,7 +41,7 @@ public class MongoClientOptionsFactoryBean extends AbstractFactoryBean<MongoClie
private static final MongoClientOptions DEFAULT_MONGO_OPTIONS = MongoClientOptions.builder().build();
private String description = DEFAULT_MONGO_OPTIONS.getDescription();
private @Nullable String description = DEFAULT_MONGO_OPTIONS.getDescription();
private int minConnectionsPerHost = DEFAULT_MONGO_OPTIONS.getMinConnectionsPerHost();
private int connectionsPerHost = DEFAULT_MONGO_OPTIONS.getConnectionsPerHost();
private int threadsAllowedToBlockForConnectionMultiplier = DEFAULT_MONGO_OPTIONS
@@ -52,11 +52,11 @@ public class MongoClientOptionsFactoryBean extends AbstractFactoryBean<MongoClie
private int connectTimeout = DEFAULT_MONGO_OPTIONS.getConnectTimeout();
private int socketTimeout = DEFAULT_MONGO_OPTIONS.getSocketTimeout();
private boolean socketKeepAlive = DEFAULT_MONGO_OPTIONS.isSocketKeepAlive();
private ReadPreference readPreference = DEFAULT_MONGO_OPTIONS.getReadPreference();
private @Nullable ReadPreference readPreference = DEFAULT_MONGO_OPTIONS.getReadPreference();
private DBDecoderFactory dbDecoderFactory = DEFAULT_MONGO_OPTIONS.getDbDecoderFactory();
private DBEncoderFactory dbEncoderFactory = DEFAULT_MONGO_OPTIONS.getDbEncoderFactory();
private WriteConcern writeConcern = DEFAULT_MONGO_OPTIONS.getWriteConcern();
private SocketFactory socketFactory = DEFAULT_MONGO_OPTIONS.getSocketFactory();
private @Nullable WriteConcern writeConcern = DEFAULT_MONGO_OPTIONS.getWriteConcern();
private @Nullable SocketFactory socketFactory = DEFAULT_MONGO_OPTIONS.getSocketFactory();
private boolean cursorFinalizerEnabled = DEFAULT_MONGO_OPTIONS.isCursorFinalizerEnabled();
private boolean alwaysUseMBeans = DEFAULT_MONGO_OPTIONS.isAlwaysUseMBeans();
private int heartbeatFrequency = DEFAULT_MONGO_OPTIONS.getHeartbeatFrequency();
@@ -74,7 +74,7 @@ public class MongoClientOptionsFactoryBean extends AbstractFactoryBean<MongoClie
*
* @param description
*/
public void setDescription(@Nullable String description) {
public void setDescription(@Nullable String description) {
this.description = description;
}
@@ -270,11 +270,13 @@ public class MongoClientOptionsFactoryBean extends AbstractFactoryBean<MongoClie
* (non-Javadoc)
* @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance()
*/
@SuppressWarnings("ConstantConditions")
@Override
protected MongoClientOptions createInstance() throws Exception {
SocketFactory socketFactoryToUse = ssl
? (sslSocketFactory != null ? sslSocketFactory : SSLSocketFactory.getDefault()) : this.socketFactory;
? (sslSocketFactory != null ? sslSocketFactory : SSLSocketFactory.getDefault())
: this.socketFactory;
return MongoClientOptions.builder() //
.alwaysUseMBeans(this.alwaysUseMBeans) //

View File

@@ -236,7 +236,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
// We always have a mapping context in the converter, whether it's a simple one or not
mappingContext = this.mongoConverter.getMappingContext();
// We create indexes based on mapping events
if (null != mappingContext && mappingContext instanceof MongoMappingContext) {
if (mappingContext instanceof MongoMappingContext) {
indexCreator = new MongoPersistentEntityIndexCreator((MongoMappingContext) mappingContext, this);
eventPublisher = new MongoMappingEventPublisher(indexCreator);
if (mappingContext instanceof ApplicationEventPublisherAware) {
@@ -251,7 +251,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
*
* @param resultChecking
*/
public void setWriteResultChecking(WriteResultChecking resultChecking) {
public void setWriteResultChecking(@Nullable WriteResultChecking resultChecking) {
this.writeResultChecking = resultChecking == null ? DEFAULT_WRITE_RESULT_CHECKING : resultChecking;
}
@@ -272,7 +272,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
* @param writeConcernResolver
*/
public void setWriteConcernResolver(@Nullable WriteConcernResolver writeConcernResolver) {
this.writeConcernResolver = writeConcernResolver;
this.writeConcernResolver = writeConcernResolver == null ? DefaultWriteConcernResolver.INSTANCE
: writeConcernResolver;
}
/**
@@ -324,7 +325,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
}
}
if (context instanceof ConfigurableApplicationContext) {
if (context instanceof ConfigurableApplicationContext && indexCreator != null) {
((ConfigurableApplicationContext) context).addApplicationListener(indexCreator);
}
}
@@ -392,7 +393,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.MongoOperations#executeCommand(java.lang.String)
* @see org.springframework.data.mongodb.core.MongoOperations#executeCommand(java.lang.String)
*/
@Override
public Document executeCommand(final String jsonCommand) {
@@ -408,7 +409,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.MongoOperations#executeCommand(org.bson.Document)
* @see org.springframework.data.mongodb.core.MongoOperations#executeCommand(org.bson.Document)
*/
@Override
public Document executeCommand(final Document command) {
@@ -445,7 +446,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.MongoOperations#executeQuery(org.springframework.data.mongodb.core.query.Query, java.lang.String, org.springframework.data.mongodb.core.DocumentCallbackHandler)
* @see org.springframework.data.mongodb.core.MongoOperations#executeQuery(org.springframework.data.mongodb.core.query.Query, java.lang.String, org.springframework.data.mongodb.core.DocumentCallbackHandler)
*/
@Override
public void executeQuery(Query query, String collectionName, DocumentCallbackHandler dch) {
@@ -991,7 +992,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
doInsert(collectionName, objectToSave, this.mongoConverter);
}
protected void ensureNotIterable(Object o) {
protected void ensureNotIterable(@Nullable Object o) {
if (null != o) {
if (o.getClass().isArray() || ITERABLE_CLASSES.contains(o.getClass().getName())) {
throw new IllegalArgumentException("Cannot use a collection here.");
@@ -1455,7 +1456,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
});
}
private void increaseVersionForUpdateIfNecessary(MongoPersistentEntity<?> persistentEntity, Update update) {
private void increaseVersionForUpdateIfNecessary(@Nullable MongoPersistentEntity<?> persistentEntity, Update update) {
if (persistentEntity != null && persistentEntity.hasVersionProperty()) {
String versionFieldName = persistentEntity.getRequiredVersionProperty().getFieldName();
@@ -1465,18 +1466,6 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
}
}
private boolean documentContainsVersionProperty(Document document, MongoPersistentEntity<?> persistentEntity) {
if (persistentEntity != null && persistentEntity.hasVersionProperty()) {
MongoPersistentProperty property = persistentEntity.getRequiredVersionProperty();
return document.containsKey(property.getFieldName());
}
return false;
}
@Override
public DeleteResult remove(Object object) {
@@ -2191,7 +2180,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityClass);
Document mappedQuery = queryMapper.getMappedObject(query, entity);
Document mappedFields = fields == null ? null : queryMapper.getMappedObject(fields, entity);
Document mappedFields = queryMapper.getMappedObject(fields, entity);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("findOne using query: {} fields: {} for class: {} in collection: {}", serializeToJsonSafely(query),
@@ -2318,7 +2307,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
}
protected <T> T doFindAndModify(String collectionName, Document query, Document fields, Document sort,
Class<T> entityClass, Update update, FindAndModifyOptions options) {
Class<T> entityClass, Update update, @Nullable FindAndModifyOptions options) {
EntityReader<? super T, Bson> readerToUse = this.mongoConverter;
@@ -2469,7 +2458,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
}
private void executeQueryInternal(CollectionCallback<FindIterable<Document>> collectionCallback,
CursorPreparer preparer, DocumentCallbackHandler callbackHandler, String collectionName) {
@Nullable CursorPreparer preparer, DocumentCallbackHandler callbackHandler, String collectionName) {
try {
@@ -2502,17 +2491,20 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
return exceptionTranslator;
}
@Nullable
private MongoPersistentEntity<?> getPersistentEntity(@Nullable Class<?> type) {
return type != null ? mappingContext.getPersistentEntity(type) : null;
}
@Nullable
private MongoPersistentProperty getIdPropertyFor(Class<?> type) {
MongoPersistentEntity<?> persistentEntity = getPersistentEntity(type);
return persistentEntity != null ? persistentEntity.getIdProperty() : null;
}
private <T> String determineEntityCollectionName(T obj) {
@Nullable
private <T> String determineEntityCollectionName(@Nullable T obj) {
if (null != obj) {
return determineCollectionName(obj.getClass());
}
@@ -2520,7 +2512,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
return null;
}
String determineCollectionName(Class<?> entityClass) {
String determineCollectionName(@Nullable Class<?> entityClass) {
if (entityClass == null) {
throw new InvalidDataAccessApiUsageException(
@@ -2530,7 +2522,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
return mappingContext.getRequiredPersistentEntity(entityClass).getCollection();
}
private static final MongoConverter getDefaultMongoConverter(MongoDbFactory factory) {
private static MongoConverter getDefaultMongoConverter(MongoDbFactory factory) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList());
@@ -2570,8 +2562,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
*/
private Document addFieldsForProjection(Document fields, Class<?> domainType, Class<?> targetType) {
if ((fields != null && !fields.isEmpty()) || !targetType.isInterface()
|| ClassUtils.isAssignable(domainType, targetType)) {
if (!fields.isEmpty() || !targetType.isInterface() || ClassUtils.isAssignable(domainType, targetType)) {
return fields;
}
@@ -2615,7 +2606,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
public FindOneCallback(Document query, Document fields) {
this.query = query;
this.fields = Optional.ofNullable(fields).filter(it -> !ObjectUtils.isEmpty(fields));
this.fields = Optional.of(fields).filter(it -> !ObjectUtils.isEmpty(fields));
}
public Document doInCollection(MongoCollection<Document> collection) throws MongoException, DataAccessException {
@@ -2701,7 +2692,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
private final Document sort;
private final Optional<Collation> collation;
public FindAndRemoveCallback(Document query, Document fields, Document sort, Collation collation) {
public FindAndRemoveCallback(Document query, Document fields, Document sort, @Nullable Collation collation) {
this.query = query;
this.fields = fields;
@@ -2790,7 +2781,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
}
@Nullable
public T doWith(@Nullable Document object) {
public T doWith(Document object) {
if (null != object) {
maybeEmitEvent(new AfterLoadEvent<T>(object, type, collectionName));
}
@@ -2878,8 +2869,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
class QueryCursorPreparer implements CursorPreparer {
private final Query query;
private final Class<?> type;
private final @Nullable Query query;
private final @Nullable Class<?> type;
public QueryCursorPreparer(@Nullable Query query, @Nullable Class<?> type) {
@@ -3001,7 +2992,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@AllArgsConstructor(access = AccessLevel.PACKAGE)
static class CloseableIterableCursorAdapter<T> implements CloseableIterator<T> {
private volatile MongoCursor<Document> cursor;
private volatile @Nullable MongoCursor<Document> cursor;
private PersistenceExceptionTranslator exceptionTranslator;
private DocumentCallback<T> objectReadCallback;
@@ -3023,6 +3014,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@Override
public boolean hasNext() {
MongoCursor<Document> cursor = this.cursor;
if (cursor == null) {
return false;
}
@@ -3034,6 +3027,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
}
}
@Nullable
@Override
public T next() {

View File

@@ -230,7 +230,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
mappingContext = this.mongoConverter.getMappingContext();
// We create indexes based on mapping events
if (null != mappingContext && mappingContext instanceof MongoMappingContext) {
if (mappingContext instanceof MongoMappingContext) {
indexCreator = new MongoPersistentEntityIndexCreator((MongoMappingContext) mappingContext,
(collectionName) -> IndexOperationsAdapter.blocking(indexOps(collectionName)));
eventPublisher = new MongoMappingEventPublisher(indexCreator);
@@ -643,7 +643,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveMongoOperations#find(org.springframework.data.mongodb.core.query.Query, java.lang.Class, java.lang.String)
*/
public <T> Flux<T> find(final Query query, Class<T> entityClass, String collectionName) {
public <T> Flux<T> find(@Nullable Query query, Class<T> entityClass, String collectionName) {
if (query == null) {
return findAll(entityClass, collectionName);
@@ -908,7 +908,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.ReactiveMongoOperations#count(org.springframework.data.mongodb.core.query.Query, java.lang.Class, java.lang.String)
*/
public Mono<Long> count(final Query query, @Nullable Class<?> entityClass, String collectionName) {
public Mono<Long> count(@Nullable Query query, @Nullable Class<?> entityClass, String collectionName) {
Assert.hasText(collectionName, "Collection name must not be null or empty!");
@@ -1055,7 +1055,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
Mono<List<Tuple2<T, Document>>> prepareDocuments = Flux.fromIterable(batchToSave)
.flatMap(new Function<T, Flux<Tuple2<T, Document>>>() {
@Override
public Flux<Tuple2<T, Document>> apply(@Nullable T o) {
public Flux<Tuple2<T, Document>> apply(T o) {
initializeVersionProperty(o);
maybeEmitEvent(new BeforeConvertEvent<T>(o, collectionName));
@@ -1245,7 +1245,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
}
private MongoCollection<Document> prepareCollection(MongoCollection<Document> collection,
WriteConcern writeConcernToUse) {
@Nullable WriteConcern writeConcernToUse) {
MongoCollection<Document> collectionToUse = collection;
if (writeConcernToUse != null) {
@@ -1359,7 +1359,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
return doUpdate(collectionName, query, update, entityClass, false, true);
}
protected Mono<UpdateResult> doUpdate(final String collectionName, final Query query, final Update update,
protected Mono<UpdateResult> doUpdate(final String collectionName, @Nullable Query query, @Nullable Update update,
@Nullable Class<?> entityClass, final boolean upsert, final boolean multi) {
MongoPersistentEntity<?> entity = entityClass == null ? null : getPersistentEntity(entityClass);
@@ -1411,7 +1411,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
return result.next();
}
private void increaseVersionForUpdateIfNecessary(MongoPersistentEntity<?> persistentEntity, Update update) {
private void increaseVersionForUpdateIfNecessary(@Nullable MongoPersistentEntity<?> persistentEntity, Update update) {
if (persistentEntity != null && persistentEntity.hasVersionProperty()) {
String versionFieldName = persistentEntity.getRequiredVersionProperty().getFieldName();
@@ -1421,7 +1421,8 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
}
}
private boolean dbObjectContainsVersionProperty(Document document, MongoPersistentEntity<?> persistentEntity) {
private boolean dbObjectContainsVersionProperty(Document document,
@Nullable MongoPersistentEntity<?> persistentEntity) {
if (persistentEntity == null || !persistentEntity.hasVersionProperty()) {
return false;
@@ -1894,15 +1895,14 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
* For cases where {@code fields} is {@literal null} or {@literal empty} add fields required for creating the
* projection (target) type if the {@code targetType} is a {@literal closed interface projection}.
*
* @param fields can be {@literal null}.
* @param fields must not be {@literal null}.
* @param domainType must not be {@literal null}.
* @param targetType must not be {@literal null}.
* @return {@link Document} with fields to be included.
*/
private Document addFieldsForProjection(Document fields, Class<?> domainType, Class<?> targetType) {
if ((fields != null && !fields.isEmpty()) || !targetType.isInterface()
|| ClassUtils.isAssignable(domainType, targetType)) {
if (!fields.isEmpty() || !targetType.isInterface() || ClassUtils.isAssignable(domainType, targetType)) {
return fields;
}
@@ -1915,9 +1915,10 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
return fields;
}
protected CreateCollectionOptions convertToCreateCollectionOptions(CollectionOptions collectionOptions) {
protected CreateCollectionOptions convertToCreateCollectionOptions(@Nullable CollectionOptions collectionOptions) {
CreateCollectionOptions result = new CreateCollectionOptions();
if (collectionOptions != null) {
collectionOptions.getCapped().ifPresent(result::capped);
@@ -1925,6 +1926,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
collectionOptions.getMaxDocuments().ifPresent(result::maxDocuments);
collectionOptions.getCollation().map(Collation::toMongoCollation).ifPresent(result::collation);
}
return result;
}
@@ -2071,18 +2073,20 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
* The returned {@link WriteConcern} will be defaulted to {@link WriteConcern#ACKNOWLEDGED} when
* {@link WriteResultChecking} is set to {@link WriteResultChecking#EXCEPTION}.
*
* @param mongoAction any WriteConcern already configured or null
* @return The prepared WriteConcern or null
* @param mongoAction any WriteConcern already configured or {@literal null}.
* @return The prepared WriteConcern or {@literal null}.
* @see #setWriteConcern(WriteConcern)
* @see #setWriteConcernResolver(WriteConcernResolver)
*/
@Nullable
protected WriteConcern prepareWriteConcern(MongoAction mongoAction) {
WriteConcern wc = writeConcernResolver.resolve(mongoAction);
return potentiallyForceAcknowledgedWrite(wc);
}
private WriteConcern potentiallyForceAcknowledgedWrite(WriteConcern wc) {
@Nullable
private WriteConcern potentiallyForceAcknowledgedWrite(@Nullable WriteConcern wc) {
if (ObjectUtils.nullSafeEquals(WriteResultChecking.EXCEPTION, writeResultChecking)
&& MongoClientVersion.isMongo3Driver()) {
@@ -2126,7 +2130,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
*
* @param collectionCallback the callback to retrieve the {@link FindPublisher} with, must not be {@literal null}.
* @param preparer the {@link FindPublisherPreparer} to potentially modify the {@link FindPublisher} before iterating
* over it, may be {@literal null}
* over it, may be {@literal null}.
* @param objectCallback the {@link DocumentCallback} to transform {@link Document}s into the actual domain type, must
* not be {@literal null}.
* @param collectionName the collection to be queried, must not be {@literal null}.
@@ -2189,17 +2193,23 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
return resolved == null ? ex : resolved;
}
private MongoPersistentEntity<?> getPersistentEntity(Class<?> type) {
@Nullable
private MongoPersistentEntity<?> getPersistentEntity(@Nullable Class<?> type) {
return type == null ? null : mappingContext.getPersistentEntity(type);
}
private MongoPersistentProperty getIdPropertyFor(Class<?> type) {
@Nullable
private MongoPersistentProperty getIdPropertyFor(@Nullable Class<?> type) {
if (type == null) {
return null;
}
MongoPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(type);
return persistentEntity != null ? persistentEntity.getIdProperty() : null;
}
private <T> String determineEntityCollectionName(T obj) {
private <T> String determineEntityCollectionName(@Nullable T obj) {
if (null != obj) {
return determineCollectionName(obj.getClass());
@@ -2296,7 +2306,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
private final Optional<Document> fields;
private final Optional<Collation> collation;
FindOneCallback(Document query, Document fields, Collation collation) {
FindOneCallback(Document query, @Nullable Document fields, @Nullable Collation collation) {
this.query = query;
this.fields = Optional.ofNullable(fields);
this.collation = Optional.ofNullable(collation);
@@ -2332,8 +2342,8 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
*/
private static class FindCallback implements ReactiveCollectionQueryCallback<Document> {
private final Document query;
private final Document fields;
private final @Nullable Document query;
private final @Nullable Document fields;
FindCallback(@Nullable Document query) {
this(query, null);
@@ -2375,7 +2385,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
private final Document sort;
private final Optional<Collation> collation;
FindAndRemoveCallback(Document query, Document fields, Document sort, Collation collation) {
FindAndRemoveCallback(Document query, Document fields, Document sort, @Nullable Collation collation) {
this.query = query;
this.fields = fields;
@@ -2514,7 +2524,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
this.collectionName = collectionName;
}
public T doWith(Document object) {
public T doWith(@Nullable Document object) {
if (null != object) {
maybeEmitEvent(new AfterLoadEvent<T>(object, type, collectionName));
@@ -2545,7 +2555,8 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
private final @NonNull Class<T> targetType;
private final @NonNull String collectionName;
public T doWith(Document object) {
@Nullable
public T doWith(@Nullable Document object) {
if (object == null) {
return null;
@@ -2609,10 +2620,10 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
*/
class QueryFindPublisherPreparer implements FindPublisherPreparer {
private final Query query;
private final Class<?> type;
private final @Nullable Query query;
private final @Nullable Class<?> type;
QueryFindPublisherPreparer(Query query, Class<?> type) {
QueryFindPublisherPreparer(@Nullable Query query, @Nullable Class<?> type) {
this.query = query;
this.type = type;
@@ -2699,6 +2710,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
}
@Override
@Nullable
public DBRef createDbRef(org.springframework.data.mongodb.core.mapping.DBRef annotation,
MongoPersistentEntity<?> entity, Object id) {
return null;
@@ -2711,7 +2723,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@Override
public List<Document> bulkFetch(List<DBRef> dbRefs) {
return null;
return Collections.emptyList();
}
}
}

View File

@@ -32,6 +32,7 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.CriteriaDefinition;
import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.data.mongodb.core.query.SerializationUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -619,7 +620,7 @@ public class Aggregation {
* @param fieldRef may be {@literal null}.
* @return
*/
public static boolean isReferingToSystemVariable(String fieldRef) {
public static boolean isReferingToSystemVariable(@Nullable String fieldRef) {
if (fieldRef == null || !fieldRef.startsWith(PREFIX) || fieldRef.length() <= 2) {
return false;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013 the original author or authors.
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,14 +21,16 @@ import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldRefe
import org.springframework.data.mongodb.core.spel.ExpressionNode;
import org.springframework.data.mongodb.core.spel.ExpressionTransformationContextSupport;
import org.springframework.data.mongodb.core.spel.ExpressionTransformer;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
* Interface to type an {@link ExpressionTransformer} to the contained
* {@link AggregationExpressionTransformationContext}.
*
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.4
*/
interface AggregationExpressionTransformer
@@ -36,7 +38,7 @@ interface AggregationExpressionTransformer
/**
* A special {@link ExpressionTransformationContextSupport} to be aware of the {@link AggregationOperationContext}.
*
*
* @author Oliver Gierke
* @author Thomas Darimont
*/
@@ -47,14 +49,14 @@ interface AggregationExpressionTransformer
/**
* Creates an {@link AggregationExpressionTransformationContext}.
*
*
* @param currentNode must not be {@literal null}.
* @param parentNode
* @param previousOperationObject
* @param parentNode may be {@literal null}.
* @param previousOperationObject may be {@literal null}.
* @param aggregationContext must not be {@literal null}.
*/
public AggregationExpressionTransformationContext(T currentNode, ExpressionNode parentNode,
Document previousOperationObject, AggregationOperationContext context) {
public AggregationExpressionTransformationContext(T currentNode, @Nullable ExpressionNode parentNode,
@Nullable Document previousOperationObject, AggregationOperationContext context) {
super(currentNode, parentNode, previousOperationObject);
@@ -64,7 +66,7 @@ interface AggregationExpressionTransformer
/**
* Returns the underlying {@link AggregationOperationContext}.
*
*
* @return
*/
public AggregationOperationContext getAggregationContext() {
@@ -73,7 +75,7 @@ interface AggregationExpressionTransformer
/**
* Returns the {@link FieldReference} for the current {@link ExpressionNode}.
*
*
* @return
*/
public FieldReference getFieldReference() {

View File

@@ -71,7 +71,8 @@ public class AggregationOptions {
* @param collation collation for string comparison. Can be {@literal null}.
* @since 2.0
*/
public AggregationOptions(boolean allowDiskUse, boolean explain, Document cursor, Collation collation) {
public AggregationOptions(boolean allowDiskUse, boolean explain, @Nullable Document cursor,
@Nullable Collation collation) {
this.allowDiskUse = allowDiskUse;
this.explain = explain;
@@ -301,7 +302,7 @@ public class AggregationOptions {
* @param collation can be {@literal null}.
* @return
*/
public Builder collation(Collation collation) {
public Builder collation(@Nullable Collation collation) {
this.collation = collation;
return this;

View File

@@ -20,11 +20,12 @@ import java.util.Iterator;
import java.util.List;
import org.bson.Document;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
* Collects the results of executing an aggregation operation.
*
*
* @author Tobias Trelle
* @author Oliver Gierke
* @author Thomas Darimont
@@ -37,11 +38,11 @@ public class AggregationResults<T> implements Iterable<T> {
private final List<T> mappedResults;
private final Document rawResults;
private final String serverUsed;
private final @Nullable String serverUsed;
/**
* Creates a new {@link AggregationResults} instance from the given mapped and raw results.
*
*
* @param mappedResults must not be {@literal null}.
* @param rawResults must not be {@literal null}.
*/
@@ -57,7 +58,7 @@ public class AggregationResults<T> implements Iterable<T> {
/**
* Returns the aggregation results.
*
*
* @return
*/
public List<T> getMappedResults() {
@@ -66,10 +67,11 @@ public class AggregationResults<T> implements Iterable<T> {
/**
* Returns the unique mapped result. Assumes no result or exactly one.
*
*
* @return
* @throws IllegalArgumentException in case more than one result is available.
*/
@Nullable
public T getUniqueMappedResult() {
Assert.isTrue(mappedResults.size() < 2, "Expected unique result or null, but got more than one!");
return mappedResults.size() == 1 ? mappedResults.get(0) : null;
@@ -85,16 +87,17 @@ public class AggregationResults<T> implements Iterable<T> {
/**
* Returns the server that has been used to perform the aggregation.
*
*
* @return
*/
@Nullable
public String getServerUsed() {
return serverUsed;
}
/**
* Returns the raw result that was returned by the server.
*
*
* @return
* @since 1.6
*/
@@ -102,6 +105,7 @@ public class AggregationResults<T> implements Iterable<T> {
return rawResults;
}
@Nullable
private String parseServerUsed() {
Object object = rawResults.get("serverUsed");

View File

@@ -92,7 +92,7 @@ public class ArithmeticOperators {
* @return
*/
public Abs abs() {
return fieldReference != null ? Abs.absoluteValueOf(fieldReference) : Abs.absoluteValueOf(expression);
return usesFieldRef() ? Abs.absoluteValueOf(fieldReference) : Abs.absoluteValueOf(expression);
}
/**
@@ -134,7 +134,7 @@ public class ArithmeticOperators {
}
private Add createAdd() {
return fieldReference != null ? Add.valueOf(fieldReference) : Add.valueOf(expression);
return usesFieldRef() ? Add.valueOf(fieldReference) : Add.valueOf(expression);
}
/**
@@ -144,7 +144,7 @@ public class ArithmeticOperators {
* @return
*/
public Ceil ceil() {
return fieldReference != null ? Ceil.ceilValueOf(fieldReference) : Ceil.ceilValueOf(expression);
return usesFieldRef() ? Ceil.ceilValueOf(fieldReference) : Ceil.ceilValueOf(expression);
}
/**
@@ -186,7 +186,7 @@ public class ArithmeticOperators {
}
private Divide createDivide() {
return fieldReference != null ? Divide.valueOf(fieldReference) : Divide.valueOf(expression);
return usesFieldRef() ? Divide.valueOf(fieldReference) : Divide.valueOf(expression);
}
/**
@@ -195,7 +195,7 @@ public class ArithmeticOperators {
* @return
*/
public Exp exp() {
return fieldReference != null ? Exp.expValueOf(fieldReference) : Exp.expValueOf(expression);
return usesFieldRef() ? Exp.expValueOf(fieldReference) : Exp.expValueOf(expression);
}
/**
@@ -205,7 +205,7 @@ public class ArithmeticOperators {
* @return
*/
public Floor floor() {
return fieldReference != null ? Floor.floorValueOf(fieldReference) : Floor.floorValueOf(expression);
return usesFieldRef() ? Floor.floorValueOf(fieldReference) : Floor.floorValueOf(expression);
}
/**
@@ -215,7 +215,7 @@ public class ArithmeticOperators {
* @return
*/
public Ln ln() {
return fieldReference != null ? Ln.lnValueOf(fieldReference) : Ln.lnValueOf(expression);
return usesFieldRef() ? Ln.lnValueOf(fieldReference) : Ln.lnValueOf(expression);
}
/**
@@ -258,7 +258,7 @@ public class ArithmeticOperators {
}
private Log createLog() {
return fieldReference != null ? Log.valueOf(fieldReference) : Log.valueOf(expression);
return usesFieldRef() ? Log.valueOf(fieldReference) : Log.valueOf(expression);
}
/**
@@ -267,7 +267,7 @@ public class ArithmeticOperators {
* @return
*/
public Log10 log10() {
return fieldReference != null ? Log10.log10ValueOf(fieldReference) : Log10.log10ValueOf(expression);
return usesFieldRef() ? Log10.log10ValueOf(fieldReference) : Log10.log10ValueOf(expression);
}
/**
@@ -310,7 +310,7 @@ public class ArithmeticOperators {
}
private Mod createMod() {
return fieldReference != null ? Mod.valueOf(fieldReference) : Mod.valueOf(expression);
return usesFieldRef() ? Mod.valueOf(fieldReference) : Mod.valueOf(expression);
}
/**
@@ -350,7 +350,7 @@ public class ArithmeticOperators {
}
private Multiply createMultiply() {
return fieldReference != null ? Multiply.valueOf(fieldReference) : Multiply.valueOf(expression);
return usesFieldRef() ? Multiply.valueOf(fieldReference) : Multiply.valueOf(expression);
}
/**
@@ -390,7 +390,7 @@ public class ArithmeticOperators {
}
private Pow createPow() {
return fieldReference != null ? Pow.valueOf(fieldReference) : Pow.valueOf(expression);
return usesFieldRef() ? Pow.valueOf(fieldReference) : Pow.valueOf(expression);
}
/**
@@ -399,7 +399,7 @@ public class ArithmeticOperators {
* @return
*/
public Sqrt sqrt() {
return fieldReference != null ? Sqrt.sqrtOf(fieldReference) : Sqrt.sqrtOf(expression);
return usesFieldRef() ? Sqrt.sqrtOf(fieldReference) : Sqrt.sqrtOf(expression);
}
/**
@@ -439,7 +439,7 @@ public class ArithmeticOperators {
}
private Subtract createSubtract() {
return fieldReference != null ? Subtract.valueOf(fieldReference) : Subtract.valueOf(expression);
return usesFieldRef() ? Subtract.valueOf(fieldReference) : Subtract.valueOf(expression);
}
/**
@@ -448,7 +448,7 @@ public class ArithmeticOperators {
* @return
*/
public Trunc trunc() {
return fieldReference != null ? Trunc.truncValueOf(fieldReference) : Trunc.truncValueOf(expression);
return usesFieldRef() ? Trunc.truncValueOf(fieldReference) : Trunc.truncValueOf(expression);
}
/**
@@ -457,7 +457,7 @@ public class ArithmeticOperators {
* @return
*/
public Sum sum() {
return fieldReference != null ? AccumulatorOperators.Sum.sumOf(fieldReference)
return usesFieldRef() ? AccumulatorOperators.Sum.sumOf(fieldReference)
: AccumulatorOperators.Sum.sumOf(expression);
}
@@ -467,7 +467,7 @@ public class ArithmeticOperators {
* @return
*/
public Avg avg() {
return fieldReference != null ? AccumulatorOperators.Avg.avgOf(fieldReference)
return usesFieldRef() ? AccumulatorOperators.Avg.avgOf(fieldReference)
: AccumulatorOperators.Avg.avgOf(expression);
}
@@ -477,7 +477,7 @@ public class ArithmeticOperators {
* @return
*/
public Max max() {
return fieldReference != null ? AccumulatorOperators.Max.maxOf(fieldReference)
return usesFieldRef() ? AccumulatorOperators.Max.maxOf(fieldReference)
: AccumulatorOperators.Max.maxOf(expression);
}
@@ -487,7 +487,7 @@ public class ArithmeticOperators {
* @return
*/
public Min min() {
return fieldReference != null ? AccumulatorOperators.Min.minOf(fieldReference)
return usesFieldRef() ? AccumulatorOperators.Min.minOf(fieldReference)
: AccumulatorOperators.Min.minOf(expression);
}
@@ -497,7 +497,7 @@ public class ArithmeticOperators {
* @return
*/
public StdDevPop stdDevPop() {
return fieldReference != null ? AccumulatorOperators.StdDevPop.stdDevPopOf(fieldReference)
return usesFieldRef() ? AccumulatorOperators.StdDevPop.stdDevPopOf(fieldReference)
: AccumulatorOperators.StdDevPop.stdDevPopOf(expression);
}
@@ -507,9 +507,13 @@ public class ArithmeticOperators {
* @return
*/
public StdDevSamp stdDevSamp() {
return fieldReference != null ? AccumulatorOperators.StdDevSamp.stdDevSampOf(fieldReference)
return usesFieldRef() ? AccumulatorOperators.StdDevSamp.stdDevSampOf(fieldReference)
: AccumulatorOperators.StdDevSamp.stdDevSampOf(expression);
}
private boolean usesFieldRef() {
return fieldReference != null;
}
}
/**

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2016. the original author or authors.
* Copyright 2016-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2016 the original author or authors.
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,14 +22,14 @@ import java.util.Iterator;
import java.util.List;
import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField;
import org.springframework.data.mongodb.core.aggregation.Fields.AggregationField;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.CompositeIterator;
import org.springframework.util.ObjectUtils;
/**
* Value object to capture the fields exposed by an {@link AggregationOperation}.
*
*
* @author Oliver Gierke
* @author Thomas Darimont
* @author Mark Paluch
@@ -43,9 +43,19 @@ public final class ExposedFields implements Iterable<ExposedField> {
private final List<ExposedField> originalFields;
private final List<ExposedField> syntheticFields;
/**
* Returns an empty {@link ExposedFields} instance.
*
* @return
* @since 2.0
*/
public static ExposedFields empty() {
return EMPTY;
}
/**
* Creates a new {@link ExposedFields} instance from the given {@link ExposedField}s.
*
*
* @param fields must not be {@literal null}.
* @return
*/
@@ -55,7 +65,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates a new {@link ExposedFields} instance from the given {@link ExposedField}s.
*
*
* @param fields must not be {@literal null}.
* @return
*/
@@ -72,7 +82,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates synthetic {@link ExposedFields} from the given {@link Fields}.
*
*
* @param fields must not be {@literal null}.
* @return
*/
@@ -82,7 +92,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates non-synthetic {@link ExposedFields} from the given {@link Fields}.
*
*
* @param fields must not be {@literal null}.
* @return
*/
@@ -92,7 +102,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates a new {@link ExposedFields} instance for the given fields in either synthetic or non-synthetic way.
*
*
* @param fields must not be {@literal null}.
* @param synthetic
* @return
@@ -111,7 +121,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates a new {@link ExposedFields} with the given originals and synthetics.
*
*
* @param originals must not be {@literal null}.
* @param synthetic must not be {@literal null}.
*/
@@ -123,7 +133,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates a new {@link ExposedFields} adding the given {@link ExposedField}.
*
*
* @param field must not be {@literal null}.
* @return
*/
@@ -140,10 +150,11 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Returns the field with the given name or {@literal null} if no field with the given name is available.
*
*
* @param name
* @return
*/
@Nullable
public ExposedField getField(String name) {
for (ExposedField field : this) {
@@ -157,7 +168,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Returns whether the {@link ExposedFields} exposes no non-synthetic fields at all.
*
*
* @return
*/
boolean exposesNoNonSyntheticFields() {
@@ -166,7 +177,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Returns whether the {@link ExposedFields} exposes a single non-synthetic field only.
*
*
* @return
*/
boolean exposesSingleNonSyntheticFieldOnly() {
@@ -175,7 +186,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Returns whether the {@link ExposedFields} exposes no fields at all.
*
*
* @return
*/
boolean exposesNoFields() {
@@ -184,7 +195,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Returns whether the {@link ExposedFields} exposes a single field only.
*
*
* @return
*/
boolean exposesSingleFieldOnly() {
@@ -198,7 +209,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
return originalFields.size() + syntheticFields.size();
}
/*
/*
* (non-Javadoc)
* @see java.lang.Iterable#iterator()
*/
@@ -219,7 +230,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* A single exposed field.
*
*
* @author Oliver Gierke
*/
static class ExposedField implements Field {
@@ -229,7 +240,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates a new {@link ExposedField} with the given key.
*
*
* @param key must not be {@literal null} or empty.
* @param synthetic whether the exposed field is synthetic.
*/
@@ -239,7 +250,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates a new {@link ExposedField} for the given {@link Field}.
*
*
* @param delegate must not be {@literal null}.
* @param synthetic whether the exposed field is synthetic.
*/
@@ -249,7 +260,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
this.synthetic = synthetic;
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.Field#getKey()
*/
@@ -285,7 +296,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Returns whether the field can be referred to using the given name.
*
*
* @param name
* @return
*/
@@ -302,7 +313,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
return String.format("AggregationField: %s, synthetic: %s", field, synthetic);
}
/*
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@@ -364,7 +375,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* A reference to an {@link ExposedField}.
*
*
* @author Oliver Gierke
*/
static class DirectFieldReference implements FieldReference {
@@ -373,7 +384,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
/**
* Creates a new {@link FieldReference} for the given {@link ExposedField}.
*
*
* @param field must not be {@literal null}.
*/
public DirectFieldReference(ExposedField field) {
@@ -408,14 +419,14 @@ public final class ExposedFields implements Iterable<ExposedField> {
@Override
public String toString() {
if(getRaw().startsWith("$")) {
if (getRaw().startsWith("$")) {
return getRaw();
}
return String.format("$%s", getRaw());
}
/*
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@@ -435,7 +446,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
return this.field.equals(that.field);
}
/*
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2016 the original author or authors.
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,9 +16,10 @@
package org.springframework.data.mongodb.core.aggregation;
import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField;
import org.springframework.data.mongodb.core.aggregation.ExposedFields.DirectFieldReference;
import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField;
import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -53,7 +54,7 @@ class ExposedFieldsAggregationOperationContext implements AggregationOperationCo
this.rootContext = rootContext;
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getMappedObject(org.bson.Document)
*/
@@ -62,7 +63,7 @@ class ExposedFieldsAggregationOperationContext implements AggregationOperationCo
return rootContext.getMappedObject(document);
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getReference(org.springframework.data.mongodb.core.aggregation.ExposedFields.AvailableField)
*/
@@ -71,7 +72,7 @@ class ExposedFieldsAggregationOperationContext implements AggregationOperationCo
return getReference(field, field.getTarget());
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getReference(java.lang.String)
*/
@@ -83,11 +84,11 @@ class ExposedFieldsAggregationOperationContext implements AggregationOperationCo
/**
* Returns a {@link FieldReference} to the given {@link Field} with the given {@code name}.
*
* @param field may be {@literal null}
* @param name must not be {@literal null}
* @param field may be {@literal null}.
* @param name must not be {@literal null}.
* @return
*/
private FieldReference getReference(Field field, String name) {
private FieldReference getReference(@Nullable Field field, String name) {
Assert.notNull(name, "Name must not be null!");
@@ -100,13 +101,15 @@ class ExposedFieldsAggregationOperationContext implements AggregationOperationCo
}
/**
* Resolves a {@link field}/{@link name} for a {@link FieldReference} if possible.
* Resolves a {@link Field}/{@code name} for a {@link FieldReference} if possible.
*
* @param field may be {@literal null}
* @param name must not be {@literal null}
* @return the resolved reference or {@literal null}
* @param field may be {@literal null}.
* @param name must not be {@literal null}.
* @return the resolved reference or {@literal null}.
*/
protected FieldReference resolveExposedField(Field field, String name) {
@Nullable
protected FieldReference resolveExposedField(@Nullable Field field, String name) {
ExposedField exposedField = exposedFields.getField(name);
if (exposedField != null) {

View File

@@ -23,13 +23,14 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
* Value object to capture a list of {@link Field} instances.
*
*
* @author Oliver Gierke
* @author Thomas Darimont
* @since 1.3
@@ -46,7 +47,7 @@ public final class Fields implements Iterable<Field> {
/**
* Creates a new {@link Fields} instance from the given {@link Fields}.
*
*
* @param fields must not be {@literal null} or empty.
* @return
*/
@@ -58,7 +59,7 @@ public final class Fields implements Iterable<Field> {
/**
* Creates a new {@link Fields} instance for {@link Field}s with the given names.
*
*
* @param names must not be {@literal null}.
* @return
*/
@@ -77,7 +78,7 @@ public final class Fields implements Iterable<Field> {
/**
* Creates a {@link Field} with the given name.
*
*
* @param name must not be {@literal null} or empty.
* @return
*/
@@ -101,7 +102,7 @@ public final class Fields implements Iterable<Field> {
/**
* Creates a new {@link Fields} instance using the given {@link Field}s.
*
*
* @param fields must not be {@literal null}.
*/
private Fields(List<Field> fields) {
@@ -139,7 +140,7 @@ public final class Fields implements Iterable<Field> {
/**
* Creates a new {@link Fields} instance with a new {@link Field} of the given name added.
*
*
* @param name must not be {@literal null}.
* @return
*/
@@ -166,6 +167,7 @@ public final class Fields implements Iterable<Field> {
return result;
}
@Nullable
public Field getField(String name) {
for (Field field : fields) {
@@ -177,7 +179,7 @@ public final class Fields implements Iterable<Field> {
return null;
}
/*
/*
* (non-Javadoc)
* @see java.lang.Iterable#iterator()
*/
@@ -196,7 +198,7 @@ public final class Fields implements Iterable<Field> {
/**
* Value object to encapsulate a field in an aggregation operation.
*
*
* @author Oliver Gierke
*/
static class AggregationField implements Field {
@@ -207,7 +209,7 @@ public final class Fields implements Iterable<Field> {
/**
* Creates an aggregation field with the given {@code name}.
*
*
* @see AggregationField#AggregationField(String, String).
* @param name must not be {@literal null} or empty
*/
@@ -220,15 +222,15 @@ public final class Fields implements Iterable<Field> {
* <p>
* The {@code name} serves as an alias for the actual backing document field denoted by {@code target}. If no target
* is set explicitly, the name will be used as target.
*
*
* @param name must not be {@literal null} or empty
* @param target
*/
public AggregationField(String name, String target) {
public AggregationField(String name, @Nullable String target) {
raw = name;
String nameToSet = cleanUp(name);
String targetToSet = cleanUp(target);
String nameToSet = name != null ? cleanUp(name) : null;
String targetToSet = target != null ? cleanUp(target) : null;
Assert.hasText(nameToSet, "AggregationField name must not be null or empty!");
@@ -241,11 +243,7 @@ public final class Fields implements Iterable<Field> {
}
}
private static final String cleanUp(String source) {
if (source == null) {
return source;
}
private static String cleanUp(String source) {
if (Aggregation.SystemVariable.isReferingToSystemVariable(source)) {
return source;
@@ -301,7 +299,7 @@ public final class Fields implements Iterable<Field> {
return raw;
}
/*
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@@ -310,7 +308,7 @@ public final class Fields implements Iterable<Field> {
return String.format("AggregationField - name: %s, target: %s", name, target);
}
/*
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@@ -330,7 +328,7 @@ public final class Fields implements Iterable<Field> {
return this.name.equals(that.name) && ObjectUtils.nullSafeEquals(this.target, that.target);
}
/*
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/

View File

@@ -36,8 +36,6 @@ public interface FieldsExposingAggregationOperation extends AggregationOperation
/**
* Marker interface for {@link AggregationOperation} that inherits fields from previous operations.
*/
static interface InheritsFieldsAggregationOperation extends FieldsExposingAggregationOperation {
}
interface InheritsFieldsAggregationOperation extends FieldsExposingAggregationOperation {}
}

View File

@@ -19,25 +19,25 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField;
import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* Encapsulates the aggregation framework {@code $group}-operation.
* <p>
* We recommend to use the static factory method {@link Aggregation#group(Fields)} instead of creating instances of this
* class directly.
*
*
* @author Sebastian Herold
* @author Thomas Darimont
* @author Oliver Gierke
* @author Gustavo de Geus
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.3
* @see <a href="https://docs.mongodb.org/manual/reference/aggregation/group/">MongoDB Aggregation Framework: $group</a>
*/
@@ -52,7 +52,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link GroupOperation} including the given {@link Fields}.
*
*
* @param fields must not be {@literal null}.
*/
public GroupOperation(Fields fields) {
@@ -63,7 +63,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link GroupOperation} from the given {@link GroupOperation}.
*
*
* @param groupOperation must not be {@literal null}.
*/
protected GroupOperation(GroupOperation groupOperation) {
@@ -72,7 +72,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link GroupOperation} from the given {@link GroupOperation} and the given {@link Operation}s.
*
*
* @param groupOperation
* @param nextOperations
*/
@@ -89,7 +89,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link GroupOperation} from the current one adding the given {@link Operation}.
*
*
* @param operation must not be {@literal null}.
* @return
*/
@@ -99,7 +99,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Builder for {@link GroupOperation}s on a field.
*
*
* @author Thomas Darimont
*/
public static final class GroupOperationBuilder {
@@ -109,7 +109,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link GroupOperationBuilder} from the given {@link GroupOperation} and {@link Operation}.
*
*
* @param groupOperation
* @param operation
*/
@@ -124,7 +124,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Allows to specify an alias for the new-operation operation.
*
*
* @param alias
* @return
*/
@@ -138,7 +138,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
* <p>
* Count expressions are emulated via {@code $sum: 1}.
* <p>
*
*
* @return
*/
public GroupOperationBuilder count() {
@@ -147,7 +147,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for a {@code $sum}-expression for the given field-reference.
*
*
* @param reference
* @return
*/
@@ -155,13 +155,13 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
return sum(reference, null);
}
private GroupOperationBuilder sum(String reference, Object value) {
private GroupOperationBuilder sum(@Nullable String reference, @Nullable Object value) {
return newBuilder(GroupOps.SUM, reference, value);
}
/**
* Generates an {@link GroupOperationBuilder} for an {@code $add_to_set}-expression for the given field-reference.
*
*
* @param reference
* @return
*/
@@ -171,7 +171,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $add_to_set}-expression for the given value.
*
*
* @param value
* @return
*/
@@ -179,13 +179,13 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
return addToSet(null, value);
}
private GroupOperationBuilder addToSet(String reference, Object value) {
private GroupOperationBuilder addToSet(@Nullable String reference, @Nullable Object value) {
return newBuilder(GroupOps.ADD_TO_SET, reference, value);
}
/**
* Generates an {@link GroupOperationBuilder} for an {@code $last}-expression for the given field-reference.
*
*
* @param reference
* @return
*/
@@ -196,7 +196,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $last}-expression for the given
* {@link AggregationExpression}.
*
*
* @param expr
* @return
*/
@@ -206,7 +206,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for a {@code $first}-expression for the given field-reference.
*
*
* @param reference
* @return
*/
@@ -217,7 +217,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for a {@code $first}-expression for the given
* {@link AggregationExpression}.
*
*
* @param expr
* @return
*/
@@ -227,7 +227,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $avg}-expression for the given field-reference.
*
*
* @param reference
* @return
*/
@@ -238,7 +238,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $avg}-expression for the given
* {@link AggregationExpression}.
*
*
* @param expr
* @return
*/
@@ -248,7 +248,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $push}-expression for the given field-reference.
*
*
* @param reference
* @return
*/
@@ -258,7 +258,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $push}-expression for the given value.
*
*
* @param value
* @return
*/
@@ -266,13 +266,13 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
return push(null, value);
}
private GroupOperationBuilder push(String reference, Object value) {
private GroupOperationBuilder push(@Nullable String reference, @Nullable Object value) {
return newBuilder(GroupOps.PUSH, reference, value);
}
/**
* Generates an {@link GroupOperationBuilder} for an {@code $min}-expression that for the given field-reference.
*
*
* @param reference
* @return
*/
@@ -283,7 +283,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $min}-expression that for the given
* {@link AggregationExpression}.
*
*
* @param expr
* @return
*/
@@ -293,7 +293,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $max}-expression that for the given field-reference.
*
*
* @param reference
* @return
*/
@@ -304,7 +304,7 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@link GroupOperationBuilder} for an {@code $max}-expression that for the given
* {@link AggregationExpression}.
*
*
* @param expr
* @return
*/
@@ -325,7 +325,8 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
}
/**
* Generates an {@link GroupOperationBuilder} for an {@code $stdDevSamp}-expression that for the given {@link AggregationExpression}.
* Generates an {@link GroupOperationBuilder} for an {@code $stdDevSamp}-expression that for the given
* {@link AggregationExpression}.
*
* @param expr must not be {@literal null}.
* @return never {@literal null}.
@@ -347,7 +348,8 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
}
/**
* Generates an {@link GroupOperationBuilder} for an {@code $stdDevPop}-expression that for the given {@link AggregationExpression}.
* Generates an {@link GroupOperationBuilder} for an {@code $stdDevPop}-expression that for the given
* {@link AggregationExpression}.
*
* @param expr must not be {@literal null}.
* @return never {@literal null}.
@@ -357,11 +359,11 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
return newBuilder(GroupOps.STD_DEV_POP, null, expr);
}
private GroupOperationBuilder newBuilder(Keyword keyword, String reference, Object value) {
private GroupOperationBuilder newBuilder(Keyword keyword, @Nullable String reference, @Nullable Object value) {
return new GroupOperationBuilder(this, new Operation(keyword, null, reference, value));
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getFields()
*/
@@ -421,7 +423,8 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
private static enum GroupOps implements Keyword {
SUM("$sum"), LAST("$last"), FIRST("$first"), PUSH("$push"), AVG("$avg"), MIN("$min"), MAX("$max"), ADD_TO_SET("$addToSet"), STD_DEV_POP("$stdDevPop"), STD_DEV_SAMP("$stdDevSamp");
SUM("$sum"), LAST("$last"), FIRST("$first"), PUSH("$push"), AVG("$avg"), MIN("$min"), MAX("$max"), ADD_TO_SET(
"$addToSet"), STD_DEV_POP("$stdDevPop"), STD_DEV_SAMP("$stdDevSamp");
private String mongoOperator;
@@ -429,7 +432,6 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
this.mongoOperator = mongoOperator;
}
@Override
public String toString() {
return mongoOperator;
@@ -439,11 +441,11 @@ public class GroupOperation implements FieldsExposingAggregationOperation {
static class Operation implements AggregationOperation {
private final Keyword op;
private final String key;
private final String reference;
private final Object value;
private final @Nullable String key;
private final @Nullable String reference;
private final @Nullable Object value;
public Operation(Keyword op, String key, String reference, Object value) {
public Operation(Keyword op, @Nullable String key, @Nullable String reference, @Nullable Object value) {
this.op = op;
this.key = key;

View File

@@ -22,13 +22,13 @@ import java.util.Collections;
import java.util.List;
import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.ExpressionVariable;
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond;
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.IfNull;
import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField;
import org.springframework.data.mongodb.core.aggregation.Fields.AggregationField;
import org.springframework.data.mongodb.core.aggregation.ProjectionOperation.ProjectionOperationBuilder.FieldProjection;
import org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.ExpressionVariable;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -39,14 +39,15 @@ import org.springframework.util.Assert;
* <p>
* We recommend to use the static factory method {@link Aggregation#project(Fields)} instead of creating instances of
* this class directly.
*
*
* @author Tobias Trelle
* @author Thomas Darimont
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.3
* @see <a href="https://docs.mongodb.com/manual/reference/operator/aggregation/project/">MongoDB Aggregation Framework: $project</a>
* @see <a href="https://docs.mongodb.com/manual/reference/operator/aggregation/project/">MongoDB Aggregation Framework:
* $project</a>
*/
public class ProjectionOperation implements FieldsExposingAggregationOperation {
@@ -65,7 +66,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link ProjectionOperation} including the given {@link Fields}.
*
*
* @param fields must not be {@literal null}.
*/
public ProjectionOperation(Fields fields) {
@@ -75,7 +76,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Copy constructor to allow building up {@link ProjectionOperation} instances from already existing
* {@link Projection}s.
*
*
* @param current must not be {@literal null}.
* @param projections must not be {@literal null}.
*/
@@ -91,18 +92,18 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link ProjectionOperation} with the current {@link Projection}s and the given one.
*
*
* @param projection must not be {@literal null}.
* @return
*/
private ProjectionOperation and(Projection projection) {
return new ProjectionOperation(this.projections, Arrays.asList(projection));
return new ProjectionOperation(this.projections, Collections.singletonList(projection));
}
/**
* Creates a new {@link ProjectionOperation} with the current {@link Projection}s replacing the last current one with
* the given one.
*
*
* @param projection must not be {@literal null}.
* @return
*/
@@ -110,12 +111,12 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
List<Projection> projections = this.projections.isEmpty() ? Collections.<Projection> emptyList()
: this.projections.subList(0, this.projections.size() - 1);
return new ProjectionOperation(projections, Arrays.asList(projection));
return new ProjectionOperation(projections, Collections.singletonList(projection));
}
/**
* Creates a new {@link ProjectionOperationBuilder} to define a projection for the field with the given name.
*
*
* @param name must not be {@literal null} or empty.
* @return
*/
@@ -133,7 +134,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Excludes the given fields from the projection.
*
*
* @param fieldNames must not be {@literal null}.
* @return
*/
@@ -150,7 +151,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Includes the given fields into the projection.
*
*
* @param fieldNames must not be {@literal null}.
* @return
*/
@@ -162,7 +163,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Includes the given fields into the projection.
*
*
* @param fields must not be {@literal null}.
* @return
*/
@@ -184,7 +185,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
fields = fields == null ? ExposedFields.from(field) : fields.and(field);
}
return fields;
return fields != null ? fields : ExposedFields.empty();
}
/*
@@ -205,7 +206,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Base class for {@link ProjectionOperationBuilder}s.
*
*
* @author Thomas Darimont
*/
private static abstract class AbstractProjectionOperationBuilder implements AggregationOperation {
@@ -215,7 +216,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link AbstractProjectionOperationBuilder} fot the given value and {@link ProjectionOperation}.
*
*
* @param value must not be {@literal null}.
* @param operation must not be {@literal null}.
*/
@@ -228,7 +229,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
this.operation = operation;
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@@ -239,7 +240,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Returns the finally to be applied {@link ProjectionOperation} with the given alias.
*
*
* @param alias will never be {@literal null} or empty.
* @return
*/
@@ -266,7 +267,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* An {@link ProjectionOperationBuilder} that is used for SpEL expression based projections.
*
*
* @author Thomas Darimont
*/
public static class ExpressionProjectionOperationBuilder extends ProjectionOperationBuilder {
@@ -277,7 +278,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link ExpressionProjectionOperationBuilder} for the given value, {@link ProjectionOperation} and
* parameters.
*
*
* @param expression must not be {@literal null}.
* @param operation must not be {@literal null}.
* @param parameters
@@ -325,7 +326,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* A {@link Projection} based on a SpEL expression.
*
*
* @author Thomas Darimont
* @author Oliver Gierke
*/
@@ -338,7 +339,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link ExpressionProjection} for the given field, SpEL expression and parameters.
*
*
* @param field must not be {@literal null}.
* @param expression must not be {@literal null} or empty.
* @param parameters must not be {@literal null}.
@@ -354,7 +355,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
this.params = parameters.clone();
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ProjectionOperation.Projection#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@@ -372,7 +373,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Builder for {@link ProjectionOperation}s on a field.
*
*
* @author Oliver Gierke
* @author Thomas Darimont
* @author Christoph Strobl
@@ -382,19 +383,19 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
private static final String NUMBER_NOT_NULL = "Number must not be null!";
private static final String FIELD_REFERENCE_NOT_NULL = "Field reference must not be null!";
private final String name;
private final OperationProjection previousProjection;
private final @Nullable String name;
private final @Nullable OperationProjection previousProjection;
/**
* Creates a new {@link ProjectionOperationBuilder} for the field with the given name on top of the given
* {@link ProjectionOperation}.
*
*
* @param name must not be {@literal null} or empty.
* @param operation must not be {@literal null}.
* @param previousProjection the previous operation projection, may be {@literal null}.
*/
public ProjectionOperationBuilder(String name, ProjectionOperation operation,
OperationProjection previousProjection) {
@Nullable OperationProjection previousProjection) {
super(name, operation);
this.name = name;
@@ -404,13 +405,13 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link ProjectionOperationBuilder} for the field with the given value on top of the given
* {@link ProjectionOperation}.
*
*
* @param value
* @param operation
* @param previousProjection
*/
protected ProjectionOperationBuilder(Object value, ProjectionOperation operation,
OperationProjection previousProjection) {
@Nullable OperationProjection previousProjection) {
super(value, operation);
@@ -421,28 +422,28 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Projects the result of the previous operation onto the current field. Will automatically add an exclusion for
* {@code _id} as what would be held in it by default will now go into the field just projected into.
*
*
* @return
*/
public ProjectionOperation previousOperation() {
return this.operation.andExclude(Fields.UNDERSCORE_ID) //
.and(new PreviousOperationProjection(name));
.and(new PreviousOperationProjection(getRequiredName()));
}
/**
* Defines a nested field binding for the current field.
*
*
* @param fields must not be {@literal null}.
* @return
*/
public ProjectionOperation nested(Fields fields) {
return this.operation.and(new NestedFieldProjection(name, fields));
return this.operation.and(new NestedFieldProjection(getRequiredName(), fields));
}
/**
* Allows to specify an alias for the previous projection operation.
*
*
* @param alias
* @return
*/
@@ -457,7 +458,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
return this.operation.and(new ExpressionProjection(Fields.field(alias), (AggregationExpression) value));
}
return this.operation.and(new FieldProjection(Fields.field(alias, name), null));
return this.operation.and(new FieldProjection(Fields.field(alias, getRequiredName()), null));
}
/*
@@ -468,7 +469,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
public ProjectionOperation applyCondition(Cond cond) {
Assert.notNull(cond, "ConditionalOperator must not be null!");
return this.operation.and(new ExpressionProjection(Fields.field(name), cond));
return this.operation.and(new ExpressionProjection(Fields.field(getRequiredName()), cond));
}
/*
@@ -479,12 +480,12 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
public ProjectionOperation applyCondition(IfNull ifNull) {
Assert.notNull(ifNull, "IfNullOperator must not be null!");
return this.operation.and(new ExpressionProjection(Fields.field(name), ifNull));
return this.operation.and(new ExpressionProjection(Fields.field(getRequiredName()), ifNull));
}
/**
* Generates an {@code $add} expression that adds the given number to the previously mentioned field.
*
*
* @param number
* @return
*/
@@ -496,7 +497,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@code $add} expression that adds the value of the given field to the previously mentioned field.
*
*
* @param fieldReference
* @return
*/
@@ -508,7 +509,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@code $subtract} expression that subtracts the given number to the previously mentioned field.
*
*
* @param number
* @return
*/
@@ -521,7 +522,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@code $subtract} expression that subtracts the value of the given field to the previously mentioned
* field.
*
*
* @param fieldReference
* @return
*/
@@ -547,7 +548,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@code $multiply} expression that multiplies the given number with the previously mentioned field.
*
*
* @param number
* @return
*/
@@ -560,7 +561,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@code $multiply} expression that multiplies the value of the given field with the previously
* mentioned field.
*
*
* @param fieldReference
* @return
*/
@@ -586,7 +587,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@code $divide} expression that divides the previously mentioned field by the given number.
*
*
* @param number
* @return
*/
@@ -600,7 +601,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@code $divide} expression that divides the value of the given field by the previously mentioned
* field.
*
*
* @param fieldReference
* @return
*/
@@ -627,7 +628,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Generates an {@code $mod} expression that divides the previously mentioned field by the given number and returns
* the remainder.
*
*
* @param number
* @return
*/
@@ -789,7 +790,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder filter(String as, AggregationExpression condition) {
return this.operation.and(ArrayOperators.Filter.filter(name).as(as).by(condition));
return this.operation.and(ArrayOperators.Filter.filter(getRequiredName()).as(as).by(condition));
}
// SET OPERATORS
@@ -894,7 +895,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder absoluteValue() {
return this.operation.and(ArithmeticOperators.Abs.absoluteValueOf(name));
return this.operation.and(ArithmeticOperators.Abs.absoluteValueOf(getRequiredName()));
}
/**
@@ -905,7 +906,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder ceil() {
return this.operation.and(ArithmeticOperators.Ceil.ceilValueOf(name));
return this.operation.and(ArithmeticOperators.Ceil.ceilValueOf(getRequiredName()));
}
/**
@@ -916,7 +917,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder exp() {
return this.operation.and(ArithmeticOperators.Exp.expValueOf(name));
return this.operation.and(ArithmeticOperators.Exp.expValueOf(getRequiredName()));
}
/**
@@ -927,7 +928,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder floor() {
return this.operation.and(ArithmeticOperators.Floor.floorValueOf(name));
return this.operation.and(ArithmeticOperators.Floor.floorValueOf(getRequiredName()));
}
/**
@@ -938,7 +939,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder ln() {
return this.operation.and(ArithmeticOperators.Ln.lnValueOf(name));
return this.operation.and(ArithmeticOperators.Ln.lnValueOf(getRequiredName()));
}
/**
@@ -950,7 +951,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder log(String baseFieldRef) {
return this.operation.and(ArithmeticOperators.Log.valueOf(name).log(baseFieldRef));
return this.operation.and(ArithmeticOperators.Log.valueOf(getRequiredName()).log(baseFieldRef));
}
/**
@@ -962,7 +963,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder log(Number base) {
return this.operation.and(ArithmeticOperators.Log.valueOf(name).log(base));
return this.operation.and(ArithmeticOperators.Log.valueOf(getRequiredName()).log(base));
}
/**
@@ -974,7 +975,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder log(AggregationExpression base) {
return this.operation.and(ArithmeticOperators.Log.valueOf(name).log(base));
return this.operation.and(ArithmeticOperators.Log.valueOf(getRequiredName()).log(base));
}
/**
@@ -985,7 +986,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder log10() {
return this.operation.and(ArithmeticOperators.Log10.log10ValueOf(name));
return this.operation.and(ArithmeticOperators.Log10.log10ValueOf(getRequiredName()));
}
/**
@@ -997,7 +998,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder pow(String exponentFieldRef) {
return this.operation.and(ArithmeticOperators.Pow.valueOf(name).pow(exponentFieldRef));
return this.operation.and(ArithmeticOperators.Pow.valueOf(getRequiredName()).pow(exponentFieldRef));
}
/**
@@ -1009,7 +1010,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder pow(Number exponent) {
return this.operation.and(ArithmeticOperators.Pow.valueOf(name).pow(exponent));
return this.operation.and(ArithmeticOperators.Pow.valueOf(getRequiredName()).pow(exponent));
}
/**
@@ -1021,7 +1022,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder pow(AggregationExpression exponentExpression) {
return this.operation.and(ArithmeticOperators.Pow.valueOf(name).pow(exponentExpression));
return this.operation.and(ArithmeticOperators.Pow.valueOf(getRequiredName()).pow(exponentExpression));
}
/**
@@ -1032,7 +1033,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder sqrt() {
return this.operation.and(ArithmeticOperators.Sqrt.sqrtOf(name));
return this.operation.and(ArithmeticOperators.Sqrt.sqrtOf(getRequiredName()));
}
/**
@@ -1042,7 +1043,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder trunc() {
return this.operation.and(ArithmeticOperators.Trunc.truncValueOf(name));
return this.operation.and(ArithmeticOperators.Trunc.truncValueOf(getRequiredName()));
}
/**
@@ -1089,7 +1090,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder toLower() {
return this.operation.and(StringOperators.ToLower.lowerValueOf(name));
return this.operation.and(StringOperators.ToLower.lowerValueOf(getRequiredName()));
}
/**
@@ -1100,7 +1101,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder toUpper() {
return this.operation.and(StringOperators.ToUpper.upperValueOf(name));
return this.operation.and(StringOperators.ToUpper.upperValueOf(getRequiredName()));
}
/**
@@ -1171,7 +1172,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder isArray() {
return this.operation.and(ArrayOperators.IsArray.isArray(name));
return this.operation.and(ArrayOperators.IsArray.isArray(getRequiredName()));
}
/**
@@ -1181,7 +1182,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder asLiteral() {
return this.operation.and(LiteralOperators.Literal.asLiteral(name));
return this.operation.and(LiteralOperators.Literal.asLiteral(getRequiredName()));
}
/**
@@ -1193,7 +1194,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
* @since 1.10
*/
public ProjectionOperationBuilder dateAsFormattedString(String format) {
return this.operation.and(DateOperators.DateToString.dateOf(name).toString(format));
return this.operation.and(DateOperators.DateToString.dateOf(getRequiredName()).toString(format));
}
/**
@@ -1225,6 +1226,13 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
return this.operation.and(VariableOperators.Let.define(variables).andApply(in));
}
private String getRequiredName() {
Assert.state(name != null, "Projection field name must not be null!");
return name;
}
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
@@ -1236,7 +1244,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Adds a generic projection for the current field.
*
*
* @param operation the operation key, e.g. {@code $add}.
* @param values the values to be set for the projection operation.
* @return
@@ -1249,7 +1257,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* A {@link Projection} to pull in the result of the previous operation.
*
*
* @author Oliver Gierke
*/
static class PreviousOperationProjection extends Projection {
@@ -1258,7 +1266,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link PreviousOperationProjection} for the field with the given name.
*
*
* @param name must not be {@literal null} or empty.
*/
public PreviousOperationProjection(String name) {
@@ -1266,7 +1274,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
this.name = name;
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ProjectionOperation.Projection#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@@ -1278,7 +1286,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* A {@link FieldProjection} to map a result of a previous {@link AggregationOperation} to a new field.
*
*
* @author Oliver Gierke
* @author Thomas Darimont
* @author Mark Paluch
@@ -1286,11 +1294,11 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
static class FieldProjection extends Projection {
private final Field field;
private final Object value;
private final @Nullable Object value;
/**
* Creates a new {@link FieldProjection} for the field of the given name, assigning the given value.
*
*
* @param name must not be {@literal null} or empty.
* @param value
*/
@@ -1298,7 +1306,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
this(Fields.field(name), value);
}
private FieldProjection(Field field, Object value) {
private FieldProjection(Field field, @Nullable Object value) {
super(new ExposedField(field.getName(), true));
@@ -1309,7 +1317,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Factory method to easily create {@link FieldProjection}s for the given {@link Fields}. Fields are projected as
* references with their given name. A field {@code foo} will be projected as: {@code foo : 1 } .
*
*
* @param fields the {@link Fields} to in- or exclude, must not be {@literal null}.
* @return
*/
@@ -1319,12 +1327,12 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Factory method to easily create {@link FieldProjection}s for the given {@link Fields}.
*
*
* @param fields the {@link Fields} to in- or exclude, must not be {@literal null}.
* @param value to use for the given field.
* @return
*/
public static List<FieldProjection> from(Fields fields, Object value) {
public static List<FieldProjection> from(Fields fields, @Nullable Object value) {
Assert.notNull(fields, "Fields must not be null!");
List<FieldProjection> projections = new ArrayList<FieldProjection>();
@@ -1336,7 +1344,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
return projections;
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ProjectionOperation.Projection#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@@ -1375,12 +1383,12 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link OperationProjection} for the given field.
*
*
* @param field the name of the field to add the operation projection for, must not be {@literal null} or empty.
* @param operation the actual operation key, must not be {@literal null} or empty.
* @param values the values to pass into the operation, must not be {@literal null}.
*/
public OperationProjection(Field field, String operation, Object[] values) {
OperationProjection(Field field, String operation, Object[] values) {
super(field);
@@ -1429,7 +1437,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Returns the field that holds the {@link OperationProjection}.
*
*
* @return
*/
protected Field getField() {
@@ -1452,11 +1460,11 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new instance of this {@link OperationProjection} with the given alias.
*
*
* @param alias the alias to set
* @return
*/
public OperationProjection withAlias(String alias) {
OperationProjection withAlias(String alias) {
final Field aliasedField = Fields.field(alias, this.field.getName());
return new OperationProjection(aliasedField, operation, values.toArray()) {
@@ -1486,14 +1494,14 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
private final String name;
private final Fields fields;
public NestedFieldProjection(String name, Fields fields) {
NestedFieldProjection(String name, Fields fields) {
super(Fields.field(name));
this.name = name;
this.fields = fields;
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.ProjectionOperation.Projection#toDocument(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@@ -1512,7 +1520,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the minute from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractMinute() {
@@ -1521,7 +1529,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the hour from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractHour() {
@@ -1530,7 +1538,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the second from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractSecond() {
@@ -1539,7 +1547,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the millisecond from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractMillisecond() {
@@ -1548,7 +1556,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the year from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractYear() {
@@ -1557,7 +1565,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the month from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractMonth() {
@@ -1566,7 +1574,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the week from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractWeek() {
@@ -1575,7 +1583,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the dayOfYear from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractDayOfYear() {
@@ -1584,7 +1592,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the dayOfMonth from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractDayOfMonth() {
@@ -1593,7 +1601,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Extracts the dayOfWeek from a date expression.
*
*
* @return
*/
public ProjectionOperationBuilder extractDayOfWeek() {
@@ -1603,7 +1611,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Base class for {@link Projection} implementations.
*
*
* @author Oliver Gierke
*/
private static abstract class Projection {
@@ -1612,7 +1620,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates new {@link Projection} for the given {@link Field}.
*
*
* @param field must not be {@literal null}.
*/
public Projection(Field field) {
@@ -1623,7 +1631,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Returns the field exposed by the {@link Projection}.
*
*
* @return will never be {@literal null}.
*/
public ExposedField getExposedField() {
@@ -1633,7 +1641,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Renders the current {@link Projection} into a {@link Document} based on the given
* {@link AggregationOperationContext}.
*
*
* @param context will never be {@literal null}.
* @return
*/
@@ -1650,7 +1658,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation {
/**
* Creates a new {@link ExpressionProjection}.
*
*
* @param field
* @param expression
*/

View File

@@ -43,6 +43,7 @@ import org.springframework.expression.spel.ast.PropertyOrFieldReference;
import org.springframework.expression.spel.standard.SpelExpression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.NumberUtils;
import org.springframework.util.ObjectUtils;
@@ -64,7 +65,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
/**
* Creates a new {@link SpelExpressionTransformer}.
*/
public SpelExpressionTransformer() {
SpelExpressionTransformer() {
List<ExpressionNodeConversion<? extends ExpressionNode>> conversions = new ArrayList<ExpressionNodeConversion<? extends ExpressionNode>>();
conversions.add(new OperatorNodeConversion(this));
@@ -190,12 +191,12 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
* the previous context.
*
* @param node must not be {@literal null}.
* @param parent
* @param operation
* @param parent may be {@literal null}.
* @param operation may be {@literal null}.
* @param context must not be {@literal null}.
* @return
*/
protected Object transform(ExpressionNode node, ExpressionNode parent, Document operation,
protected Object transform(ExpressionNode node, @Nullable ExpressionNode parent, @Nullable Document operation,
AggregationExpressionTransformationContext<?> context) {
Assert.notNull(node, "ExpressionNode must not be null!");
@@ -290,7 +291,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
}
private Object convertUnaryMinusOp(ExpressionTransformationContextSupport<OperatorNode> context,
Object leftResult) {
@Nullable Object leftResult) {
Object result = leftResult instanceof Number ? leftResult
: new Document("$multiply", Arrays.<Object> asList(Integer.valueOf(-1), leftResult));
@@ -320,7 +321,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
*/
private static class IndexerNodeConversion extends ExpressionNodeConversion<ExpressionNode> {
public IndexerNodeConversion(AggregationExpressionTransformer transformer) {
IndexerNodeConversion(AggregationExpressionTransformer transformer) {
super(transformer);
}
@@ -350,7 +351,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
*/
private static class InlineListNodeConversion extends ExpressionNodeConversion<ExpressionNode> {
public InlineListNodeConversion(AggregationExpressionTransformer transformer) {
InlineListNodeConversion(AggregationExpressionTransformer transformer) {
super(transformer);
}
@@ -358,6 +359,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext)
*/
@Nullable
@Override
protected Object convert(AggregationExpressionTransformationContext<ExpressionNode> context) {
@@ -389,7 +391,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
*/
private static class PropertyOrFieldReferenceNodeConversion extends ExpressionNodeConversion<ExpressionNode> {
public PropertyOrFieldReferenceNodeConversion(AggregationExpressionTransformer transformer) {
PropertyOrFieldReferenceNodeConversion(AggregationExpressionTransformer transformer) {
super(transformer);
}
@@ -422,7 +424,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
*/
private static class LiteralNodeConversion extends ExpressionNodeConversion<LiteralNode> {
public LiteralNodeConversion(AggregationExpressionTransformer transformer) {
LiteralNodeConversion(AggregationExpressionTransformer transformer) {
super(transformer);
}
@@ -469,7 +471,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
*/
private static class MethodReferenceNodeConversion extends ExpressionNodeConversion<MethodReferenceNode> {
public MethodReferenceNodeConversion(AggregationExpressionTransformer transformer) {
MethodReferenceNodeConversion(AggregationExpressionTransformer transformer) {
super(transformer);
}
@@ -483,6 +485,8 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
MethodReferenceNode node = context.getCurrentNode();
AggregationMethodReference methodReference = node.getMethodReference();
Assert.state(methodReference != null, "Cannot resolve current node to AggregationMethodReference!");
Object args = null;
if (ObjectUtils.nullSafeEquals(methodReference.getArgumentType(), ArgumentType.SINGLE)) {
@@ -519,7 +523,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
*/
private static class CompoundExpressionNodeConversion extends ExpressionNodeConversion<ExpressionNode> {
public CompoundExpressionNodeConversion(AggregationExpressionTransformer transformer) {
CompoundExpressionNodeConversion(AggregationExpressionTransformer transformer) {
super(transformer);
}
@@ -561,7 +565,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
*
* @param transformer must not be {@literal null}.
*/
public NotOperatorNodeConversion(AggregationExpressionTransformer transformer) {
NotOperatorNodeConversion(AggregationExpressionTransformer transformer) {
super(transformer);
}
@@ -603,7 +607,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer {
*
* @param transformer must not be {@literal null}.
*/
public ValueRetrievingNodeConversion(AggregationExpressionTransformer transformer) {
ValueRetrievingNodeConversion(AggregationExpressionTransformer transformer) {
super(transformer);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2016. the original author or authors.
* Copyright 2016-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@ import org.springframework.util.Assert;
* Gateway to {@literal String} aggregation operations.
*
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.10
*/
public class StringOperators {
@@ -122,7 +123,7 @@ public class StringOperators {
}
private Concat createConcat() {
return fieldReference != null ? Concat.valueOf(fieldReference) : Concat.valueOf(expression);
return usesFieldRef() ? Concat.valueOf(fieldReference) : Concat.valueOf(expression);
}
/**
@@ -149,7 +150,7 @@ public class StringOperators {
}
private Substr createSubstr() {
return fieldReference != null ? Substr.valueOf(fieldReference) : Substr.valueOf(expression);
return usesFieldRef() ? Substr.valueOf(fieldReference) : Substr.valueOf(expression);
}
/**
@@ -158,7 +159,7 @@ public class StringOperators {
* @return
*/
public ToLower toLower() {
return fieldReference != null ? ToLower.lowerValueOf(fieldReference) : ToLower.lowerValueOf(expression);
return usesFieldRef() ? ToLower.lowerValueOf(fieldReference) : ToLower.lowerValueOf(expression);
}
/**
@@ -167,7 +168,7 @@ public class StringOperators {
* @return
*/
public ToUpper toUpper() {
return fieldReference != null ? ToUpper.upperValueOf(fieldReference) : ToUpper.upperValueOf(expression);
return usesFieldRef() ? ToUpper.upperValueOf(fieldReference) : ToUpper.upperValueOf(expression);
}
/**
@@ -210,7 +211,7 @@ public class StringOperators {
}
private StrCaseCmp createStrCaseCmp() {
return fieldReference != null ? StrCaseCmp.valueOf(fieldReference) : StrCaseCmp.valueOf(expression);
return usesFieldRef() ? StrCaseCmp.valueOf(fieldReference) : StrCaseCmp.valueOf(expression);
}
/**
@@ -256,7 +257,7 @@ public class StringOperators {
}
private IndexOfBytes.SubstringBuilder createIndexOfBytesSubstringBuilder() {
return fieldReference != null ? IndexOfBytes.valueOf(fieldReference) : IndexOfBytes.valueOf(expression);
return usesFieldRef() ? IndexOfBytes.valueOf(fieldReference) : IndexOfBytes.valueOf(expression);
}
/**
@@ -302,7 +303,7 @@ public class StringOperators {
}
private IndexOfCP.SubstringBuilder createIndexOfCPSubstringBuilder() {
return fieldReference != null ? IndexOfCP.valueOf(fieldReference) : IndexOfCP.valueOf(expression);
return usesFieldRef() ? IndexOfCP.valueOf(fieldReference) : IndexOfCP.valueOf(expression);
}
/**
@@ -339,7 +340,7 @@ public class StringOperators {
}
private Split createSplit() {
return fieldReference != null ? Split.valueOf(fieldReference) : Split.valueOf(expression);
return usesFieldRef() ? Split.valueOf(fieldReference) : Split.valueOf(expression);
}
/**
@@ -349,7 +350,7 @@ public class StringOperators {
* @return
*/
public StrLenBytes length() {
return fieldReference != null ? StrLenBytes.stringLengthOf(fieldReference)
return usesFieldRef() ? StrLenBytes.stringLengthOf(fieldReference)
: StrLenBytes.stringLengthOf(expression);
}
@@ -360,7 +361,7 @@ public class StringOperators {
* @return
*/
public StrLenCP lengthCP() {
return fieldReference != null ? StrLenCP.stringLengthOfCP(fieldReference) : StrLenCP.stringLengthOfCP(expression);
return usesFieldRef() ? StrLenCP.stringLengthOfCP(fieldReference) : StrLenCP.stringLengthOfCP(expression);
}
/**
@@ -387,7 +388,11 @@ public class StringOperators {
}
private SubstrCP createSubstrCP() {
return fieldReference != null ? SubstrCP.valueOf(fieldReference) : SubstrCP.valueOf(expression);
return usesFieldRef() ? SubstrCP.valueOf(fieldReference) : SubstrCP.valueOf(expression);
}
private boolean usesFieldRef() {
return fieldReference != null;
}
}

View File

@@ -22,6 +22,7 @@ import java.util.List;
import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.ExpressionVariable;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -334,8 +335,8 @@ public class VariableOperators {
*/
public static class ExpressionVariable {
private final String variableName;
private final Object expression;
private final @Nullable String variableName;
private final @Nullable Object expression;
/**
* Creates new {@link ExpressionVariable}.
@@ -343,7 +344,7 @@ public class VariableOperators {
* @param variableName can be {@literal null}.
* @param expression can be {@literal null}.
*/
private ExpressionVariable(String variableName, Object expression) {
private ExpressionVariable(@Nullable String variableName, @Nullable Object expression) {
this.variableName = variableName;
this.expression = expression;

View File

@@ -102,7 +102,7 @@ public abstract class AbstractMongoConverter implements MongoConverter, Initiali
*/
@Override
public ConversionService getConversionService() {
return conversionService != null ? conversionService : new DefaultConversionService();
return conversionService;
}
/* (non-Javadoc)

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,13 +16,15 @@
package org.springframework.data.mongodb.core.convert;
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.lang.Nullable;
import com.mongodb.DBRef;
/**
* @author Oliver Gierke
* @author Mark Paluch
*/
public interface DbRefProxyHandler {
Object populateId(MongoPersistentProperty property, DBRef source, Object proxy);
Object populateId(MongoPersistentProperty property, @Nullable DBRef source, Object proxy);
}

View File

@@ -23,6 +23,7 @@ import org.springframework.data.mapping.model.SpELContext;
import org.springframework.data.mapping.model.SpELExpressionEvaluator;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.lang.Nullable;
import com.mongodb.DBRef;
@@ -56,7 +57,7 @@ class DefaultDbRefProxyHandler implements DbRefProxyHandler {
* @see org.springframework.data.mongodb.core.convert.DbRefProxyHandler#populateId(com.mongodb.DBRef, java.lang.Object)
*/
@Override
public Object populateId(MongoPersistentProperty property, DBRef source, Object proxy) {
public Object populateId(MongoPersistentProperty property, @Nullable DBRef source, Object proxy) {
if (source == null) {
return proxy;

View File

@@ -32,7 +32,6 @@ import java.util.stream.Stream;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.bson.Document;
import org.jetbrains.annotations.NotNull;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
@@ -91,7 +90,7 @@ public class DefaultDbRefResolver implements DbRefResolver {
*/
@Override
public Object resolveDbRef(MongoPersistentProperty property, DBRef dbref, DbRefResolverCallback callback,
DbRefProxyHandler handler) {
DbRefProxyHandler handler) {
Assert.notNull(property, "Property must not be null!");
Assert.notNull(callback, "Callback must not be null!");
@@ -179,8 +178,8 @@ public class DefaultDbRefResolver implements DbRefResolver {
* @param callback must not be {@literal null}.
* @return
*/
private Object createLazyLoadingProxy(MongoPersistentProperty property, DBRef dbref, DbRefResolverCallback callback,
DbRefProxyHandler handler) {
private Object createLazyLoadingProxy(MongoPersistentProperty property, @Nullable DBRef dbref,
DbRefResolverCallback callback, DbRefProxyHandler handler) {
Class<?> propertyType = property.getType();
LazyLoadingInterceptor interceptor = new LazyLoadingInterceptor(property, dbref, exceptionTranslator, callback);
@@ -234,7 +233,7 @@ public class DefaultDbRefResolver implements DbRefResolver {
/**
* Returns document with the given identifier from the given list of {@link Document}s.
*
*
* @param identifier
* @param documents
* @return
@@ -265,8 +264,8 @@ public class DefaultDbRefResolver implements DbRefResolver {
private final PersistenceExceptionTranslator exceptionTranslator;
private volatile boolean resolved;
private final @Nullable DBRef dbref;
private @Nullable Object result;
private DBRef dbref;
static {
try {
@@ -286,7 +285,7 @@ public class DefaultDbRefResolver implements DbRefResolver {
* @param dbref can be {@literal null}.
* @param callback must not be {@literal null}.
*/
public LazyLoadingInterceptor(MongoPersistentProperty property, DBRef dbref,
public LazyLoadingInterceptor(MongoPersistentProperty property, @Nullable DBRef dbref,
PersistenceExceptionTranslator exceptionTranslator, DbRefResolverCallback callback) {
Assert.notNull(property, "Property must not be null!");
@@ -312,8 +311,9 @@ public class DefaultDbRefResolver implements DbRefResolver {
* (non-Javadoc)
* @see org.springframework.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], org.springframework.cglib.proxy.MethodProxy)
*/
@Nullable
@Override
public Object intercept(@Nullable Object obj, @Nullable Method method, @Nullable Object[] args, @Nullable MethodProxy proxy) throws Throwable {
public Object intercept(Object obj, Method method, Object[] args, @Nullable MethodProxy proxy) throws Throwable {
if (INITIALIZE_METHOD.equals(method)) {
return ensureResolved();
@@ -360,7 +360,7 @@ public class DefaultDbRefResolver implements DbRefResolver {
* @param proxy
* @return
*/
private String proxyToString(Object proxy) {
private String proxyToString(@Nullable Object proxy) {
StringBuilder description = new StringBuilder();
if (dbref != null) {
@@ -381,7 +381,7 @@ public class DefaultDbRefResolver implements DbRefResolver {
* @param proxy
* @return
*/
private int proxyHashCode(Object proxy) {
private int proxyHashCode(@Nullable Object proxy) {
return proxyToString(proxy).hashCode();
}
@@ -392,7 +392,7 @@ public class DefaultDbRefResolver implements DbRefResolver {
* @param that
* @return
*/
private boolean proxyEquals(Object proxy, Object that) {
private boolean proxyEquals(@Nullable Object proxy, Object that) {
if (!(that instanceof LazyLoadingProxy)) {
return false;
@@ -410,6 +410,7 @@ public class DefaultDbRefResolver implements DbRefResolver {
*
* @return
*/
@Nullable
private Object ensureResolved() {
if (!resolved) {
@@ -453,6 +454,7 @@ public class DefaultDbRefResolver implements DbRefResolver {
*
* @return
*/
@Nullable
private synchronized Object resolve() {
if (!resolved) {

View File

@@ -18,7 +18,6 @@ package org.springframework.data.mongodb.core.convert;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.bson.Document;
@@ -32,6 +31,7 @@ import org.springframework.data.mapping.PersistentEntity;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.util.ClassTypeInformation;
import org.springframework.data.util.TypeInformation;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
import com.mongodb.BasicDBList;
@@ -57,26 +57,27 @@ public class DefaultMongoTypeMapper extends DefaultTypeMapper<Bson> implements M
private static final TypeInformation<Map> MAP_TYPE_INFO = ClassTypeInformation.from(Map.class);
private final TypeAliasAccessor<Bson> accessor;
private final String typeKey;
private final @Nullable String typeKey;
public DefaultMongoTypeMapper() {
this(DEFAULT_TYPE_KEY);
}
public DefaultMongoTypeMapper(String typeKey) {
public DefaultMongoTypeMapper(@Nullable String typeKey) {
this(typeKey, Arrays.asList(new SimpleTypeInformationMapper()));
}
public DefaultMongoTypeMapper(String typeKey, MappingContext<? extends PersistentEntity<?, ?>, ?> mappingContext) {
public DefaultMongoTypeMapper(@Nullable String typeKey,
MappingContext<? extends PersistentEntity<?, ?>, ?> mappingContext) {
this(typeKey, new DocumentTypeAliasAccessor(typeKey), mappingContext,
Arrays.asList(new SimpleTypeInformationMapper()));
}
public DefaultMongoTypeMapper(String typeKey, List<? extends TypeInformationMapper> mappers) {
public DefaultMongoTypeMapper(@Nullable String typeKey, List<? extends TypeInformationMapper> mappers) {
this(typeKey, new DocumentTypeAliasAccessor(typeKey), null, mappers);
}
private DefaultMongoTypeMapper(String typeKey, TypeAliasAccessor<Bson> accessor,
private DefaultMongoTypeMapper(@Nullable String typeKey, TypeAliasAccessor<Bson> accessor,
MappingContext<? extends PersistentEntity<?, ?>, ?> mappingContext,
List<? extends TypeInformationMapper> mappers) {
@@ -99,9 +100,9 @@ public class DefaultMongoTypeMapper extends DefaultTypeMapper<Bson> implements M
* @see org.springframework.data.mongodb.core.convert.MongoTypeMapper#writeTypeRestrictions(java.util.Set)
*/
@Override
public void writeTypeRestrictions(Document result, Set<Class<?>> restrictedTypes) {
public void writeTypeRestrictions(Document result, @Nullable Set<Class<?>> restrictedTypes) {
if (restrictedTypes == null || restrictedTypes.isEmpty()) {
if (ObjectUtils.isEmpty(restrictedTypes)) {
return;
}
@@ -111,7 +112,7 @@ public class DefaultMongoTypeMapper extends DefaultTypeMapper<Bson> implements M
Alias typeAlias = getAliasFor(ClassTypeInformation.from(restrictedType));
if (typeAlias != null && !ObjectUtils.nullSafeEquals(Alias.NONE, typeAlias) && typeAlias.isPresent()) {
if (!ObjectUtils.nullSafeEquals(Alias.NONE, typeAlias) && typeAlias.isPresent()) {
restrictedMappedTypes.add(typeAlias.getValue());
}
}
@@ -135,9 +136,9 @@ public class DefaultMongoTypeMapper extends DefaultTypeMapper<Bson> implements M
*/
public static final class DocumentTypeAliasAccessor implements TypeAliasAccessor<Bson> {
private final String typeKey;
private final @Nullable String typeKey;
public DocumentTypeAliasAccessor(String typeKey) {
public DocumentTypeAliasAccessor(@Nullable String typeKey) {
this.typeKey = typeKey;
}

View File

@@ -23,6 +23,7 @@ import org.bson.Document;
import org.bson.conversions.Bson;
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;
@@ -65,7 +66,7 @@ class DocumentAccessor {
* @param prop must not be {@literal null}.
* @param value
*/
public void put(MongoPersistentProperty prop, Object value) {
public void put(MongoPersistentProperty prop, @Nullable Object value) {
Assert.notNull(prop, "MongoPersistentProperty must not be null!");
String fieldName = prop.getFieldName();
@@ -98,6 +99,7 @@ class DocumentAccessor {
* @param property must not be {@literal null}.
* @return
*/
@Nullable
public Object get(MongoPersistentProperty property) {
String fieldName = property.getFieldName();
@@ -176,6 +178,7 @@ class DocumentAccessor {
* @param source can be {@literal null}.
* @return
*/
@Nullable
@SuppressWarnings("unchecked")
private static Map<String, Object> getAsMap(Object source) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,21 +16,23 @@
package org.springframework.data.mongodb.core.convert;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver.LazyLoadingInterceptor;
import org.springframework.lang.Nullable;
import com.mongodb.DBRef;
/**
* Allows direct interaction with the underlying {@link LazyLoadingInterceptor}.
*
*
* @author Thomas Darimont
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.5
*/
public interface LazyLoadingProxy {
/**
* Initializes the proxy and returns the wrapped value.
*
*
* @return
* @since 1.5
*/
@@ -38,9 +40,10 @@ public interface LazyLoadingProxy {
/**
* Returns the {@link DBRef} represented by this {@link LazyLoadingProxy}, may be null.
*
*
* @return
* @since 1.5
*/
@Nullable
DBRef toDBRef();
}

View File

@@ -147,7 +147,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
*/
public void setTypeMapper(@Nullable MongoTypeMapper typeMapper) {
this.typeMapper = typeMapper == null
? new DefaultMongoTypeMapper(DefaultMongoTypeMapper.DEFAULT_TYPE_KEY, mappingContext) : typeMapper;
? new DefaultMongoTypeMapper(DefaultMongoTypeMapper.DEFAULT_TYPE_KEY, mappingContext)
: typeMapper;
}
/*
@@ -201,8 +202,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
return read(type, bson, ObjectPath.ROOT);
}
@Nullable
@SuppressWarnings("unchecked")
private <S extends Object> S read(TypeInformation<S> type, Bson bson, ObjectPath path) {
private <S extends Object> S read(TypeInformation<S> type, @Nullable Bson bson, ObjectPath path) {
if (null == bson) {
return null;
@@ -262,6 +264,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
path);
}
@Nullable
private <S extends Object> S read(final MongoPersistentEntity<S> entity, final Document bson, final ObjectPath path) {
DefaultSpELExpressionEvaluator evaluator = new DefaultSpELExpressionEvaluator(bson, spELContext);
@@ -307,8 +310,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
}
private void readProperties(MongoPersistentEntity<?> entity, PersistentPropertyAccessor accessor,
MongoPersistentProperty idProperty, DocumentAccessor documentAccessor, MongoDbPropertyValueProvider valueProvider,
DbRefResolverCallback callback) {
@Nullable MongoPersistentProperty idProperty, DocumentAccessor documentAccessor,
MongoDbPropertyValueProvider valueProvider, DbRefResolverCallback callback) {
for (MongoPersistentProperty prop : entity) {
@@ -554,7 +557,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
}
MongoPersistentEntity<?> entity = isSubtype(prop.getType(), obj.getClass())
? mappingContext.getRequiredPersistentEntity(obj.getClass()) : mappingContext.getRequiredPersistentEntity(type);
? mappingContext.getRequiredPersistentEntity(obj.getClass())
: mappingContext.getRequiredPersistentEntity(type);
Object existingValue = accessor.get(prop);
Document document = existingValue instanceof Document ? (Document) existingValue : new Document();
@@ -773,7 +777,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
}
return conversions.hasCustomWriteTarget(key.getClass(), String.class)
? (String) getPotentiallyConvertedSimpleWrite(key) : key.toString();
? (String) getPotentiallyConvertedSimpleWrite(key)
: key.toString();
}
/**
@@ -795,7 +800,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
* @param value must not be {@literal null}.
* @param bson must not be {@literal null}.
*/
protected void addCustomTypeKeyIfNecessary(TypeInformation<?> type, Object value, Bson bson) {
protected void addCustomTypeKeyIfNecessary(@Nullable TypeInformation<?> type, Object value, Bson bson) {
Class<?> reference = type != null ? type.getActualType().getType() : Object.class;
Class<?> valueType = ClassUtils.getUserClass(value.getClass());
@@ -829,7 +834,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
* @param value
* @return
*/
private Object getPotentiallyConvertedSimpleWrite(Object value) {
@Nullable
private Object getPotentiallyConvertedSimpleWrite(@Nullable Object value) {
if (value == null) {
return null;
@@ -860,8 +866,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
* @param target must not be {@literal null}.
* @return
*/
@Nullable
@SuppressWarnings({ "rawtypes", "unchecked" })
private Object getPotentiallyConvertedSimpleRead(Object value, Class<?> target) {
private Object getPotentiallyConvertedSimpleRead(@Nullable Object value, Class<?> target) {
if (value == null || target == null || target.isAssignableFrom(value.getClass())) {
return value;
@@ -1063,7 +1070,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
String.format("Cannot read %s. as map. Given Bson must be a Document or DBObject!", bson.getClass()));
}
private static void addToMap(Bson bson, String key, Object value) {
private static void addToMap(Bson bson, String key, @Nullable Object value) {
if (bson instanceof Document) {
((Document) bson).put(key, value);
@@ -1114,9 +1121,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.convert.MongoWriter#convertToMongoType(java.lang.Object, org.springframework.data.util.TypeInformation)
*/
@Nullable
@SuppressWarnings("unchecked")
@Override
public Object convertToMongoType(Object obj, TypeInformation<?> typeInformation) {
public Object convertToMongoType(@Nullable Object obj, TypeInformation<?> typeInformation) {
if (obj == null) {
return null;
@@ -1274,7 +1282,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
*
* @param source must not be {@literal null}.
* @param evaluator must not be {@literal null}.
* @param path can be {@literal null}.
* @param path must not be {@literal null}.
*/
public MongoDbPropertyValueProvider(Bson source, SpELExpressionEvaluator evaluator, ObjectPath path) {
@@ -1293,7 +1301,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
*
* @param accessor must not be {@literal null}.
* @param evaluator must not be {@literal null}.
* @param path can be {@literal null}.
* @param path must not be {@literal null}.
*/
public MongoDbPropertyValueProvider(DocumentAccessor accessor, SpELExpressionEvaluator evaluator, ObjectPath path) {
@@ -1310,6 +1318,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
* (non-Javadoc)
* @see org.springframework.data.convert.PropertyValueProvider#getPropertyValue(org.springframework.data.mapping.PersistentProperty)
*/
@Nullable
public <T> T getPropertyValue(MongoPersistentProperty property) {
String expression = property.getSpelExpression();
@@ -1359,6 +1368,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
}
}
@Nullable
@SuppressWarnings("unchecked")
<T> T readValue(Object value, TypeInformation<?> type, ObjectPath path) {
@@ -1379,8 +1389,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
}
}
@Nullable
@SuppressWarnings("unchecked")
private <T> T potentiallyReadOrResolveDbRef(DBRef dbref, TypeInformation<?> type, ObjectPath path, Class<?> rawType) {
private <T> T potentiallyReadOrResolveDbRef(@Nullable DBRef dbref, TypeInformation<?> type, ObjectPath path,
Class<?> rawType) {
if (rawType.equals(DBRef.class)) {
return (T) dbref;
@@ -1390,7 +1402,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
return object != null ? object : readAndConvertDBRef(dbref, type, path, rawType);
}
private <T> T readAndConvertDBRef(DBRef dbref, TypeInformation<?> type, ObjectPath path, final Class<?> rawType) {
@Nullable
private <T> T readAndConvertDBRef(@Nullable DBRef dbref, TypeInformation<?> type, ObjectPath path,
final Class<?> rawType) {
List<T> result = bulkReadAndConvertDBRefs(Collections.singletonList(dbref), type, path, rawType);
return CollectionUtils.isEmpty(result) ? null : result.iterator().next();
@@ -1420,7 +1434,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
}
List<Document> referencedRawDocuments = dbrefs.size() == 1
? Collections.singletonList(readRef(dbrefs.iterator().next())) : bulkReadRefs(dbrefs);
? Collections.singletonList(readRef(dbrefs.iterator().next()))
: bulkReadRefs(dbrefs);
String collectionName = dbrefs.iterator().next().getCollectionName();
List<T> targeList = new ArrayList<>(dbrefs.size());

View File

@@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.List;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
@@ -54,7 +55,7 @@ class ObjectPath {
* Creates a new {@link ObjectPath} from the given parent {@link ObjectPath} by adding the provided
* {@link ObjectPathItem} to it.
*
* @param parent can be {@literal null}.
* @param parent must not be {@literal null}.
* @param item
*/
private ObjectPath(ObjectPath parent, ObjectPath.ObjectPathItem item) {
@@ -74,7 +75,7 @@ class ObjectPath {
* @param id must not be {@literal null}.
* @return new instance of {@link ObjectPath}.
*/
ObjectPath push(Object object, MongoPersistentEntity<?> entity, Object id) {
ObjectPath push(Object object, MongoPersistentEntity<?> entity, @Nullable Object id) {
Assert.notNull(object, "Object must not be null!");
Assert.notNull(entity, "MongoPersistentEntity must not be null!");
@@ -92,6 +93,7 @@ class ObjectPath {
* @return
* @deprecated use {@link #getPathItem(Object, String, Class)}.
*/
@Nullable
@Deprecated
Object getPathItem(Object id, String collection) {
@@ -124,6 +126,7 @@ class ObjectPath {
* @return {@literal null} when no match found.
* @since 2.0
*/
@Nullable
<T> T getPathItem(Object id, String collection, Class<T> type) {
Assert.notNull(id, "Id must not be null!");
@@ -152,6 +155,7 @@ class ObjectPath {
*
* @return
*/
@Nullable
Object getCurrentObject() {
return items.length == 0 ? null : items[items.length - 1].getObject();
}
@@ -187,7 +191,7 @@ class ObjectPath {
private static class ObjectPathItem {
Object object;
Object idValue;
@Nullable Object idValue;
String collection;
}
}

View File

@@ -240,7 +240,7 @@ public class QueryMapper {
* @param mappingContext
* @return
*/
protected Field createPropertyField(MongoPersistentEntity<?> entity, String key,
protected Field createPropertyField(@Nullable MongoPersistentEntity<?> entity, String key,
MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext) {
return entity == null ? new Field(key) : new MetadataBackedField(key, entity, mappingContext);
}
@@ -252,7 +252,7 @@ public class QueryMapper {
* @param entity
* @return
*/
protected Document getMappedKeyword(Keyword keyword, MongoPersistentEntity<?> entity) {
protected Document getMappedKeyword(Keyword keyword, @Nullable MongoPersistentEntity<?> entity) {
// $or/$nor
if (keyword.isOrOrNor() || (keyword.hasIterableValue() && !keyword.isGeometry())) {
@@ -302,6 +302,7 @@ public class QueryMapper {
* @param newKey the key the value will be bound to eventually
* @return
*/
@Nullable
@SuppressWarnings("unchecked")
protected Object getMappedValue(Field documentField, Object value) {
@@ -401,7 +402,8 @@ public class QueryMapper {
* @param entity
* @return
*/
protected Object convertSimpleOrDocument(Object source, MongoPersistentEntity<?> entity) {
@Nullable
protected Object convertSimpleOrDocument(Object source, @Nullable MongoPersistentEntity<?> entity) {
if (source instanceof List) {
return delegateConvertToMongoType(source, entity);
@@ -434,6 +436,7 @@ public class QueryMapper {
* @param entity
* @return the converted mongo type or null if source is null
*/
@Nullable
protected Object delegateConvertToMongoType(Object source, @Nullable MongoPersistentEntity<?> entity) {
return converter.convertToMongoType(source, entity == null ? null : entity.getTypeInformation());
}
@@ -449,7 +452,8 @@ public class QueryMapper {
* @param property
* @return
*/
protected Object convertAssociation(Object source, MongoPersistentProperty property) {
@Nullable
protected Object convertAssociation(@Nullable Object source, @Nullable MongoPersistentProperty property) {
if (property == null || source == null || source instanceof Document || source instanceof DBObject) {
return source;
@@ -516,7 +520,7 @@ public class QueryMapper {
* Creates a new {@link Entry} with the given key and value.
*
* @param key must not be {@literal null} or empty.
* @param value can be {@literal null}
* @param value can be {@literal null}.
* @return
*/
private Entry<String, Object> createMapEntry(String key, @Nullable Object value) {
@@ -777,8 +781,8 @@ public class QueryMapper {
private final MongoPersistentEntity<?> entity;
private final MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext;
private final MongoPersistentProperty property;
private final PersistentPropertyPath<MongoPersistentProperty> path;
private final Association<MongoPersistentProperty> association;
private final @Nullable PersistentPropertyPath<MongoPersistentProperty> path;
private final @Nullable Association<MongoPersistentProperty> association;
/**
* Creates a new {@link MetadataBackedField} with the given name, {@link MongoPersistentEntity} and
@@ -911,6 +915,7 @@ public class QueryMapper {
return path == null ? name : path.toDotPath(isAssociation() ? getAssociationConverter() : getPropertyConverter());
}
@Nullable
protected PersistentPropertyPath<MongoPersistentProperty> getPath() {
return path;
}

View File

@@ -35,7 +35,7 @@ import org.springframework.lang.Nullable;
/**
* A subclass of {@link QueryMapper} that retains type information on the mongo types.
*
*
* @author Thomas Darimont
* @author Oliver Gierke
* @author Christoph Strobl
@@ -47,7 +47,7 @@ public class UpdateMapper extends QueryMapper {
/**
* Creates a new {@link UpdateMapper} using the given {@link MongoConverter}.
*
*
* @param converter must not be {@literal null}.
*/
public UpdateMapper(MongoConverter converter) {
@@ -102,7 +102,7 @@ public class UpdateMapper extends QueryMapper {
/**
* Returns {@literal true} if the given {@link Document} is an update object that uses update operators.
*
*
* @param updateObj can be {@literal null}.
* @return {@literal true} if the given {@link Document} is an update object.
*/
@@ -124,7 +124,7 @@ public class UpdateMapper extends QueryMapper {
/**
* Converts the given source object to a mongo type retaining the original type information of the source type on the
* mongo type.
*
*
* @see org.springframework.data.mongodb.core.convert.QueryMapper#delegateConvertToMongoType(java.lang.Object,
* org.springframework.data.mongodb.core.mapping.MongoPersistentEntity)
*/
@@ -217,7 +217,7 @@ public class UpdateMapper extends QueryMapper {
return converter.convertToMongoType(value, typeHint);
}
private TypeInformation<?> getTypeHintForEntity(Object source, MongoPersistentEntity<?> entity) {
private TypeInformation<?> getTypeHintForEntity(@Nullable Object source, MongoPersistentEntity<?> entity) {
TypeInformation<?> info = entity.getTypeInformation();
Class<?> type = info.getActualType().getType();
@@ -233,7 +233,7 @@ public class UpdateMapper extends QueryMapper {
return NESTED_DOCUMENT;
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.convert.QueryMapper#createPropertyField(org.springframework.data.mongodb.core.mapping.MongoPersistentEntity, java.lang.String, org.springframework.data.mapping.context.MappingContext)
*/
@@ -261,7 +261,7 @@ public class UpdateMapper extends QueryMapper {
* containing a {@literal $} before handing it to the super class to make sure property lookups and transformations
* continue to work as expected. We provide a custom property converter to re-applied the cleaned up {@literal $}s
* when constructing the mapped key.
*
*
* @author Thomas Darimont
* @author Oliver Gierke
*/
@@ -273,7 +273,7 @@ public class UpdateMapper extends QueryMapper {
* Creates a new {@link MetadataBackedField} with the given {@link MongoPersistentEntity}, key and
* {@link MappingContext}. We clean up the key before handing it up to the super class to make sure it continues to
* work as expected.
*
*
* @param entity must not be {@literal null}.
* @param key must not be {@literal null} or empty.
* @param mappingContext must not be {@literal null}.
@@ -294,7 +294,7 @@ public class UpdateMapper extends QueryMapper {
return this.getPath() == null ? key : super.getMappedKey();
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.convert.QueryMapper.MetadataBackedField#getPropertyConverter()
*/
@@ -314,7 +314,7 @@ public class UpdateMapper extends QueryMapper {
/**
* {@link Converter} retaining positional parameter {@literal $} for {@link Association}s.
*
*
* @author Christoph Strobl
*/
protected static class UpdateAssociationConverter extends AssociationConverter {
@@ -323,7 +323,7 @@ public class UpdateMapper extends QueryMapper {
/**
* Creates a new {@link AssociationConverter} for the given {@link Association}.
*
*
* @param association must not be {@literal null}.
*/
public UpdateAssociationConverter(Association<MongoPersistentProperty> association, String key) {
@@ -332,7 +332,7 @@ public class UpdateMapper extends QueryMapper {
this.mapper = new KeyMapper(key);
}
/*
/*
* (non-Javadoc)
* @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object)
*/

View File

@@ -35,9 +35,10 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
/**
* A Jackson {@link Module} to register custom {@link JsonSerializer} and {@link JsonDeserializer}s for GeoJSON types.
*
*
* @author Christoph Strobl
* @author Oliver Gierke
* @author Mark Paluch
* @since 1.7
*/
public class GeoJsonModule extends SimpleModule {
@@ -64,6 +65,7 @@ public class GeoJsonModule extends SimpleModule {
* (non-Javadoc)
* @see com.fasterxml.jackson.databind.JsonDeserializer#deserialize(com.fasterxml.jackson.core.JsonParser, com.fasterxml.jackson.databind.DeserializationContext)
*/
@Nullable
@Override
public T deserialize(@Nullable JsonParser jp, @Nullable DeserializationContext ctxt)
throws IOException, JsonProcessingException {
@@ -79,20 +81,22 @@ public class GeoJsonModule extends SimpleModule {
/**
* Perform the actual deserialization given the {@literal coordinates} as {@link ArrayNode}.
*
*
* @param coordinates
* @return
*/
@Nullable
protected abstract T doDeserialize(ArrayNode coordinates);
/**
* Get the {@link GeoJsonPoint} representation of given {@link ArrayNode} assuming {@code node.[0]} represents
* {@literal x - coordinate} and {@code node.[1]} is {@literal y}.
*
*
* @param node can be {@literal null}.
* @return {@literal null} when given a {@code null} value.
*/
protected GeoJsonPoint toGeoJsonPoint(ArrayNode node) {
@Nullable
protected GeoJsonPoint toGeoJsonPoint(@Nullable ArrayNode node) {
if (node == null) {
return null;
@@ -104,11 +108,12 @@ public class GeoJsonModule extends SimpleModule {
/**
* Get the {@link Point} representation of given {@link ArrayNode} assuming {@code node.[0]} represents
* {@literal x - coordinate} and {@code node.[1]} is {@literal y}.
*
*
* @param node can be {@literal null}.
* @return {@literal null} when given a {@code null} value.
*/
protected Point toPoint(ArrayNode node) {
@Nullable
protected Point toPoint(@Nullable ArrayNode node) {
if (node == null) {
return null;
@@ -119,11 +124,11 @@ public class GeoJsonModule extends SimpleModule {
/**
* Get the points nested within given {@link ArrayNode}.
*
*
* @param node can be {@literal null}.
* @return {@literal empty list} when given a {@code null} value.
*/
protected List<Point> toPoints(ArrayNode node) {
protected List<Point> toPoints(@Nullable ArrayNode node) {
if (node == null) {
return Collections.emptyList();
@@ -146,13 +151,13 @@ public class GeoJsonModule extends SimpleModule {
/**
* {@link JsonDeserializer} converting GeoJSON representation of {@literal Point}.
*
*
* <pre>
* <code>
* { "type": "Point", "coordinates": [10.0, 20.0] }
* </code>
* </pre>
*
*
* @author Christoph Strobl
* @since 1.7
*/
@@ -162,6 +167,7 @@ public class GeoJsonModule extends SimpleModule {
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.geo.GeoJsonModule.GeoJsonDeserializer#doDeserialize(com.fasterxml.jackson.databind.node.ArrayNode)
*/
@Nullable
@Override
protected GeoJsonPoint doDeserialize(ArrayNode coordinates) {
return toGeoJsonPoint(coordinates);
@@ -170,18 +176,18 @@ public class GeoJsonModule extends SimpleModule {
/**
* {@link JsonDeserializer} converting GeoJSON representation of {@literal LineString}.
*
*
* <pre>
* <code>
* {
* "type": "LineString",
* "coordinates": [
* {
* "type": "LineString",
* "coordinates": [
* [10.0, 20.0], [30.0, 40.0], [50.0, 60.0]
* ]
* }
* </code>
* </pre>
*
*
* @author Christoph Strobl
* @since 1.7
*/
@@ -199,18 +205,18 @@ public class GeoJsonModule extends SimpleModule {
/**
* {@link JsonDeserializer} converting GeoJSON representation of {@literal MultiPoint}.
*
*
* <pre>
* <code>
* {
* "type": "MultiPoint",
* "coordinates": [
* {
* "type": "MultiPoint",
* "coordinates": [
* [10.0, 20.0], [30.0, 40.0], [50.0, 60.0]
* ]
* }
* </code>
* </pre>
*
*
* @author Christoph Strobl
* @since 1.7
*/
@@ -228,19 +234,19 @@ public class GeoJsonModule extends SimpleModule {
/**
* {@link JsonDeserializer} converting GeoJSON representation of {@literal MultiLineString}.
*
*
* <pre>
* <code>
* {
* "type": "MultiLineString",
* {
* "type": "MultiLineString",
* "coordinates": [
* [ [10.0, 20.0], [30.0, 40.0] ],
* [ [10.0, 20.0], [30.0, 40.0] ],
* [ [50.0, 60.0] , [70.0, 80.0] ]
* ]
* }
* </code>
* </pre>
*
*
* @author Christoph Strobl
* @since 1.7
*/
@@ -267,18 +273,18 @@ public class GeoJsonModule extends SimpleModule {
/**
* {@link JsonDeserializer} converting GeoJSON representation of {@literal Polygon}.
*
*
* <pre>
* <code>
* {
* "type": "Polygon",
* "coordinates": [
* [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
* {
* "type": "Polygon",
* "coordinates": [
* [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
* ]
* }
* </code>
* </pre>
*
*
* @author Christoph Strobl
* @since 1.7
*/
@@ -288,6 +294,7 @@ public class GeoJsonModule extends SimpleModule {
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.geo.GeoJsonModule.GeoJsonDeserializer#doDeserialize(com.fasterxml.jackson.databind.node.ArrayNode)
*/
@Nullable
@Override
protected GeoJsonPolygon doDeserialize(ArrayNode coordinates) {
@@ -303,11 +310,11 @@ public class GeoJsonModule extends SimpleModule {
/**
* {@link JsonDeserializer} converting GeoJSON representation of {@literal MultiPolygon}.
*
*
* <pre>
* <code>
* {
* "type": "MultiPolygon",
* {
* "type": "MultiPolygon",
* "coordinates": [
* [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
* [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
@@ -316,7 +323,7 @@ public class GeoJsonModule extends SimpleModule {
* }
* </code>
* </pre>
*
*
* @author Christoph Strobl
* @since 1.7
*/
@@ -332,7 +339,7 @@ public class GeoJsonModule extends SimpleModule {
List<GeoJsonPolygon> polygones = new ArrayList<GeoJsonPolygon>(coordinates.size());
for (JsonNode polygon : coordinates) {
for (JsonNode ring : (ArrayNode) polygon) {
for (JsonNode ring : polygon) {
polygones.add(new GeoJsonPolygon(toPoints((ArrayNode) ring)));
}
}

View File

@@ -30,6 +30,7 @@ import org.springframework.util.Assert;
* closed border. Which means that the first and last {@link Point} have to have same coordinate pairs.
*
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.7
* @see <a href="http://geojson.org/geojson-spec.html#polygon">http://geojson.org/geojson-spec.html#polygon</a>
*/
@@ -47,9 +48,9 @@ public class GeoJsonPolygon extends Polygon implements GeoJson<List<GeoJsonLineS
* @param second must not be {@literal null}.
* @param third must not be {@literal null}.
* @param fourth must not be {@literal null}.
* @param others can be {@literal null}.
* @param others can be empty.
*/
public GeoJsonPolygon(Point first, Point second, Point third, Point fourth, final Point... others) {
public GeoJsonPolygon(Point first, Point second, Point third, Point fourth, Point... others) {
this(asList(first, second, third, fourth, others));
}
@@ -71,11 +72,11 @@ public class GeoJsonPolygon extends Polygon implements GeoJson<List<GeoJsonLineS
* @param second must not be {@literal null}.
* @param third must not be {@literal null}.
* @param fourth must not be {@literal null}.
* @param others can be {@literal null}.
* @param others can be empty.
* @return new {@link GeoJsonPolygon}.
* @since 1.10
*/
public GeoJsonPolygon withInnerRing(Point first, Point second, Point third, Point fourth, final Point... others) {
public GeoJsonPolygon withInnerRing(Point first, Point second, Point third, Point fourth, Point... others) {
return withInnerRing(asList(first, second, third, fourth, others));
}
@@ -129,7 +130,7 @@ public class GeoJsonPolygon extends Polygon implements GeoJson<List<GeoJsonLineS
return Collections.unmodifiableList(this.coordinates);
}
private static List<Point> asList(Point first, Point second, Point third, Point fourth, final Point... others) {
private static List<Point> asList(Point first, Point second, Point third, Point fourth, Point... others) {
ArrayList<Point> result = new ArrayList<Point>(3 + others.length);

View File

@@ -1,18 +1,3 @@
/*
* Copyright 2011-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Support for MongoDB geo-spatial queries.
*/

View File

@@ -25,11 +25,12 @@ import org.springframework.util.StringUtils;
/**
* Value object to capture data to create a geo index.
*
*
* @author Jon Brisbin
* @author Oliver Gierke
* @author Laurent Canet
* @author Christoph Strobl
* @author Mark Paluch
*/
public class GeospatialIndex implements IndexDefinition {
@@ -46,7 +47,7 @@ public class GeospatialIndex implements IndexDefinition {
/**
* Creates a new {@link GeospatialIndex} for the given field.
*
*
* @param field must not be empty or {@literal null}.
*/
public GeospatialIndex(String field) {
@@ -132,7 +133,7 @@ public class GeospatialIndex implements IndexDefinition {
* "https://docs.mongodb.com/manual/core/index-partial/">https://docs.mongodb.com/manual/core/index-partial/</a>
* @since 1.10
*/
public GeospatialIndex partial(IndexFilter filter) {
public GeospatialIndex partial(@Nullable IndexFilter filter) {
this.filter = Optional.ofNullable(filter);
return this;
@@ -148,7 +149,7 @@ public class GeospatialIndex implements IndexDefinition {
* @return
* @since 2.0
*/
public GeospatialIndex collation(Collation collation) {
public GeospatialIndex collation(@Nullable Collation collation) {
this.collation = Optional.ofNullable(collation);
return this;
@@ -183,12 +184,9 @@ public class GeospatialIndex implements IndexDefinition {
return document;
}
@Nullable
public Document getIndexOptions() {
if (!StringUtils.hasText(name) && min == null && max == null && bucketSize == null) {
return null;
}
Document document = new Document();
if (StringUtils.hasText(name)) {
document.put("name", name);
@@ -215,9 +213,7 @@ public class GeospatialIndex implements IndexDefinition {
case GEO_HAYSTACK:
if (bucketSize != null) {
document.put("bucketSize", bucketSize);
}
document.put("bucketSize", bucketSize);
break;
}

View File

@@ -137,7 +137,7 @@ public class Index implements IndexDefinition {
* "https://docs.mongodb.com/manual/core/index-partial/">https://docs.mongodb.com/manual/core/index-partial/</a>
* @since 1.10
*/
public Index partial(IndexFilter filter) {
public Index partial(@Nullable IndexFilter filter) {
this.filter = Optional.ofNullable(filter);
return this;
@@ -153,7 +153,7 @@ public class Index implements IndexDefinition {
* @return
* @since 2.0
*/
public Index collation(Collation collation) {
public Index collation(@Nullable Collation collation) {
this.collation = Optional.ofNullable(collation);
return this;

View File

@@ -1,11 +1,11 @@
/*
* Copyright (c) 2011-2016 by the original author(s).
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.mongodb.core.index;
import org.bson.Document;
@@ -21,6 +20,7 @@ import org.bson.Document;
/**
* @author Jon Brisbin <jbrisbin@vmware.com>
* @author Christoph Strobl
* @author Mark Paluch
*/
public interface IndexDefinition {

View File

@@ -16,12 +16,13 @@
package org.springframework.data.mongodb.core.index;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
/**
* Value object for an index field.
*
*
* @author Oliver Gierke
* @author Christoph Strobl
*/
@@ -33,20 +34,20 @@ public final class IndexField {
}
private final String key;
private final Direction direction;
private final @Nullable Direction direction;
private final Type type;
private final Float weight;
private IndexField(String key, Direction direction, Type type) {
private IndexField(String key, @Nullable Direction direction, @Nullable Type type) {
this(key, direction, type, Float.NaN);
}
private IndexField(String key, Direction direction, Type type, Float weight) {
private IndexField(String key, @Nullable Direction direction, @Nullable Type type, @Nullable Float weight) {
Assert.hasText(key, "Key must not be null or empty");
if (Type.GEO.equals(type) || Type.TEXT.equals(type)) {
Assert.isTrue(direction == null, "Geo/Text indexes must not have a direction!");
Assert.isNull(direction, "Geo/Text indexes must not have a direction!");
} else {
Assert.notNull(direction, "Default indexes require a direction");
}
@@ -58,7 +59,7 @@ public final class IndexField {
}
public static IndexField create(String key, Direction order) {
Assert.notNull(order, "Direction must not be null!");
return new IndexField(key, order, Type.DEFAULT);
@@ -66,7 +67,7 @@ public final class IndexField {
/**
* Creates a geo {@link IndexField} for the given key.
*
*
* @param key must not be {@literal null} or empty.
* @return
*/
@@ -76,7 +77,7 @@ public final class IndexField {
/**
* Creates a text {@link IndexField} for the given key.
*
*
* @since 1.6
*/
public static IndexField text(String key, Float weight) {
@@ -92,16 +93,17 @@ public final class IndexField {
/**
* Returns the direction of the {@link IndexField} or {@literal null} in case we have a geo index field.
*
*
* @return the direction
*/
@Nullable
public Direction getDirection() {
return direction;
}
/**
* Returns whether the {@link IndexField} is a geo index field.
*
*
* @return true if type is {@link Type#GEO}.
*/
public boolean isGeo() {
@@ -110,7 +112,7 @@ public final class IndexField {
/**
* Returns whether the {@link IndexField} is a text index field.
*
*
* @return true if type is {@link Type#TEXT}
* @since 1.6
*/

View File

@@ -33,6 +33,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.util.MongoDbErrorCodes;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
@@ -175,7 +176,8 @@ public class MongoPersistentEntityIndexCreator implements ApplicationListener<Ma
return this.mappingContext.equals(context);
}
private IndexInfo fetchIndexInformation(IndexDefinitionHolder indexDefinition) {
@Nullable
private IndexInfo fetchIndexInformation(@Nullable IndexDefinitionHolder indexDefinition) {
if (indexDefinition == null) {
return null;

View File

@@ -31,8 +31,8 @@ import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.domain.Sort;
import org.springframework.data.mapping.Association;
import org.springframework.data.mapping.AssociationHandler;
import org.springframework.data.mapping.PropertyHandler;
import org.springframework.data.mapping.MappingException;
import org.springframework.data.mapping.PropertyHandler;
import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver.TextIndexIncludeOptions.IncludeStrategy;
import org.springframework.data.mongodb.core.index.TextIndexDefinition.TextIndexDefinitionBuilder;
import org.springframework.data.mongodb.core.index.TextIndexDefinition.TextIndexedFieldSpec;
@@ -41,6 +41,7 @@ import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.data.util.TypeInformation;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
@@ -54,6 +55,7 @@ import org.springframework.util.StringUtils;
* @author Christoph Strobl
* @author Thomas Darimont
* @author Martin Macko
* @author Mark Paluch
* @since 1.5
*/
public class MongoPersistentEntityIndexResolver implements IndexResolver {
@@ -109,8 +111,9 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
try {
if (persistentProperty.isEntity()) {
indexInformation.addAll(resolveIndexForClass(persistentProperty.getTypeInformation().getActualType(),
persistentProperty.getFieldName(), root.getCollection(), guard));
indexInformation
.addAll(resolveIndexForClass(persistentProperty.getTypeInformation().getRequiredActualType(),
persistentProperty.getFieldName(), root.getCollection(), guard));
}
IndexDefinitionHolder indexDefinitionHolder = createIndexDefinitionHolderForProperty(
@@ -176,6 +179,7 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
return indexInformation;
}
@Nullable
private IndexDefinitionHolder createIndexDefinitionHolderForProperty(String dotPath, String collection,
MongoPersistentProperty persistentProperty) {
@@ -261,8 +265,9 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
String propertyDotPath = (StringUtils.hasText(dotPath) ? dotPath + "." : "")
+ persistentProperty.getFieldName();
TextIndexedFieldSpec parentFieldSpec = includeOptions.getParentFieldSpec();
Float weight = indexed != null ? indexed.weight()
: (includeOptions.getParentFieldSpec() != null ? includeOptions.getParentFieldSpec().getWeight() : 1.0F);
: (parentFieldSpec != null ? parentFieldSpec.getWeight() : 1.0F);
if (persistentProperty.isEntity()) {
@@ -274,7 +279,8 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
try {
appendTextIndexInformation(propertyDotPath, indexDefinitionBuilder,
mappingContext.getRequiredPersistentEntity(persistentProperty.getActualType()), optionsForNestedType, guard);
mappingContext.getRequiredPersistentEntity(persistentProperty.getActualType()), optionsForNestedType,
guard);
} catch (CyclicPropertyReferenceException e) {
LOGGER.info(e.getMessage());
} catch (InvalidDataAccessApiUsageException e) {
@@ -321,8 +327,8 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
}
@SuppressWarnings("deprecation")
protected IndexDefinitionHolder createCompoundIndexDefinition(String dotPath, String collection,
CompoundIndex index, MongoPersistentEntity<?> entity) {
protected IndexDefinitionHolder createCompoundIndexDefinition(String dotPath, String collection, CompoundIndex index,
MongoPersistentEntity<?> entity) {
CompoundIndexDefinition indexDefinition = new CompoundIndexDefinition(
resolveCompoundIndexKeyFromStringDefinition(dotPath, index.def()));
@@ -444,7 +450,7 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
return new IndexDefinitionHolder(dotPath, indexDefinition, collection);
}
private String pathAwareIndexName(String indexName, String dotPath, MongoPersistentProperty property) {
private String pathAwareIndexName(String indexName, String dotPath, @Nullable MongoPersistentProperty property) {
String nameToUse = StringUtils.hasText(indexName) ? indexName : "";
@@ -611,10 +617,10 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
private static final long serialVersionUID = -3762979307658772277L;
private final String propertyName;
private final Class<?> type;
private final @Nullable Class<?> type;
private final String dotPath;
public CyclicPropertyReferenceException(String propertyName, Class<?> type, String dotPath) {
public CyclicPropertyReferenceException(String propertyName, @Nullable Class<?> type, String dotPath) {
this.propertyName = propertyName;
this.type = type;
@@ -710,9 +716,9 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
private final IncludeStrategy strategy;
private final TextIndexedFieldSpec parentFieldSpec;
private final @Nullable TextIndexedFieldSpec parentFieldSpec;
public TextIndexIncludeOptions(IncludeStrategy strategy, TextIndexedFieldSpec parentFieldSpec) {
public TextIndexIncludeOptions(IncludeStrategy strategy, @Nullable TextIndexedFieldSpec parentFieldSpec) {
this.strategy = strategy;
this.parentFieldSpec = parentFieldSpec;
}
@@ -725,6 +731,7 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver {
return strategy;
}
@Nullable
public TextIndexedFieldSpec getParentFieldSpec() {
return parentFieldSpec;
}

View File

@@ -28,8 +28,9 @@ import org.springframework.util.StringUtils;
/**
* {@link IndexDefinition} to span multiple keys for text search.
*
*
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.6
*/
public class TextIndexDefinition implements IndexDefinition {
@@ -46,7 +47,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Creates a {@link TextIndexDefinition} for all fields in the document.
*
*
* @return
*/
public static TextIndexDefinition forAllFields() {
@@ -55,7 +56,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Get {@link TextIndexDefinitionBuilder} to create {@link TextIndexDefinition}.
*
*
* @return
*/
public static TextIndexDefinitionBuilder builder() {
@@ -78,7 +79,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Returns if the {@link TextIndexDefinition} has fields assigned.
*
*
* @return
*/
public boolean hasFieldSpec() {
@@ -143,11 +144,11 @@ public class TextIndexDefinition implements IndexDefinition {
public static class TextIndexedFieldSpec {
private final String fieldname;
private final @Nullable Float weight;
private final Float weight;
/**
* Create new {@link TextIndexedFieldSpec} for given fieldname without any weight.
*
*
* @param fieldname
*/
public TextIndexedFieldSpec(String fieldname) {
@@ -156,7 +157,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Create new {@link TextIndexedFieldSpec} for given fieldname and weight.
*
*
* @param fieldname
* @param weight
*/
@@ -169,7 +170,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Get the fieldname associated with the {@link TextIndexedFieldSpec}.
*
*
* @return
*/
public String getFieldname() {
@@ -178,10 +179,9 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Get the weight associated with the {@link TextIndexedFieldSpec}.
*
*
* @return
*/
@Nullable
public Float getWeight() {
return weight;
}
@@ -190,7 +190,7 @@ public class TextIndexDefinition implements IndexDefinition {
* @return true if {@link #weight} has a value that is a valid number.
*/
public boolean isWeighted() {
return this.weight != null && this.weight.compareTo(1.0F) != 0;
return this.weight.compareTo(1.0F) != 0;
}
@Override
@@ -220,7 +220,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* {@link TextIndexDefinitionBuilder} helps defining options for creating {@link TextIndexDefinition}.
*
*
* @author Christoph Strobl
* @since 1.6
*/
@@ -235,7 +235,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Define the name to be used when creating the index in the store.
*
*
* @param name
* @return
*/
@@ -245,9 +245,9 @@ public class TextIndexDefinition implements IndexDefinition {
}
/**
* Define the index to span all fields using wilcard. <br/>
* Define the index to span all fields using wildcard. <br/>
* <strong>NOTE</strong> {@link TextIndexDefinition} cannot contain any other fields when defined with wildcard.
*
*
* @return
*/
public TextIndexDefinitionBuilder onAllFields() {
@@ -262,7 +262,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Include given fields with default weight.
*
*
* @param fieldnames
* @return
*/
@@ -276,7 +276,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Include given field with default weight.
*
*
* @param fieldname
* @return
*/
@@ -286,7 +286,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Include given field with weight.
*
*
* @param fieldname
* @return
*/
@@ -303,7 +303,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Define the default language to be used when indexing documents.
*
*
* @param language
* @return
* @see <a href=
@@ -317,7 +317,7 @@ public class TextIndexDefinition implements IndexDefinition {
/**
* Define field for language override.
*
*
* @param fieldname
* @return
*/
@@ -342,7 +342,7 @@ public class TextIndexDefinition implements IndexDefinition {
* "https://docs.mongodb.com/manual/core/index-partial/">https://docs.mongodb.com/manual/core/index-partial/</a>
* @since 1.10
*/
public TextIndexDefinitionBuilder partial(IndexFilter filter) {
public TextIndexDefinitionBuilder partial(@Nullable IndexFilter filter) {
this.instance.filter = filter;
return this;

View File

@@ -64,7 +64,7 @@ public class BasicMongoPersistentEntity<T> extends BasicPersistentEntity<T, Mong
private final String language;
private final StandardEvaluationContext context;
private final Expression expression;
private final @Nullable Expression expression;
/**
* Creates a new {@link BasicMongoPersistentEntity} with the given {@link TypeInformation}. Will default the
@@ -82,11 +82,11 @@ public class BasicMongoPersistentEntity<T> extends BasicPersistentEntity<T, Mong
this.context = new StandardEvaluationContext();
if (this.isAnnotationPresent(Document.class)) {
Document document = this.findAnnotation(Document.class);
Document document = this.getRequiredAnnotation(Document.class);
this.collection = StringUtils.hasText(document.collection()) ? document.collection() : fallback;
this.language = StringUtils.hasText(document.language()) ? document.language() : "";
this.expression = document != null ? detectExpression(document) : null;
this.expression = detectExpression(document);
} else {
this.collection = fallback;
@@ -127,6 +127,7 @@ public class BasicMongoPersistentEntity<T> extends BasicPersistentEntity<T, Mong
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.mapping.MongoPersistentEntity#getTextScoreProperty()
*/
@Nullable
@Override
public MongoPersistentProperty getTextScoreProperty() {
return getPersistentProperty(TextScore.class);
@@ -257,12 +258,9 @@ public class BasicMongoPersistentEntity<T> extends BasicPersistentEntity<T, Mong
* @param document can be {@literal null}
* @return
*/
@Nullable
private static Expression detectExpression(Document document) {
if (document == null) {
return null;
}
String collection = document.collection();
if (!StringUtils.hasText(collection)) {

View File

@@ -24,12 +24,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.annotation.Id;
import org.springframework.data.mapping.Association;
import org.springframework.data.mapping.MappingException;
import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty;
import org.springframework.data.mapping.model.FieldNamingStrategy;
import org.springframework.data.mapping.MappingException;
import org.springframework.data.mapping.model.Property;
import org.springframework.data.mapping.model.PropertyNameFieldNamingStrategy;
import org.springframework.data.mapping.model.SimpleTypeHolder;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
/**
@@ -73,7 +74,7 @@ public class BasicMongoPersistentProperty extends AnnotationBasedPersistentPrope
* @param fieldNamingStrategy
*/
public BasicMongoPersistentProperty(Property property, MongoPersistentEntity<?> owner,
SimpleTypeHolder simpleTypeHolder, FieldNamingStrategy fieldNamingStrategy) {
SimpleTypeHolder simpleTypeHolder, @Nullable FieldNamingStrategy fieldNamingStrategy) {
super(property, owner, simpleTypeHolder);
this.fieldNamingStrategy = fieldNamingStrategy == null ? PropertyNameFieldNamingStrategy.INSTANCE
@@ -152,6 +153,7 @@ public class BasicMongoPersistentProperty extends AnnotationBasedPersistentPrope
return StringUtils.hasText(getAnnotatedFieldName());
}
@Nullable
private String getAnnotatedFieldName() {
org.springframework.data.mongodb.core.mapping.Field annotation = findAnnotation(
@@ -193,6 +195,7 @@ public class BasicMongoPersistentProperty extends AnnotationBasedPersistentPrope
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.mapping.MongoPersistentProperty#getDBRef()
*/
@Nullable
public DBRef getDBRef() {
return findAnnotation(DBRef.class);
}

View File

@@ -32,7 +32,7 @@ import org.springframework.lang.Nullable;
/**
* Default implementation of a {@link MappingContext} for MongoDB using {@link BasicMongoPersistentEntity} and
* {@link BasicMongoPersistentProperty} as primary abstractions.
*
*
* @author Jon Brisbin
* @author Oliver Gierke
*/
@@ -54,11 +54,11 @@ public class MongoMappingContext extends AbstractMappingContext<BasicMongoPersis
/**
* Configures the {@link FieldNamingStrategy} to be used to determine the field name if no manual mapping is applied.
* Defaults to a strategy using the plain property name.
*
*
* @param fieldNamingStrategy the {@link FieldNamingStrategy} to be used to determine the field name if no manual
* mapping is applied.
*/
public void setFieldNamingStrategy(FieldNamingStrategy fieldNamingStrategy) {
public void setFieldNamingStrategy(@Nullable FieldNamingStrategy fieldNamingStrategy) {
this.fieldNamingStrategy = fieldNamingStrategy == null ? DEFAULT_NAMING_STRATEGY : fieldNamingStrategy;
}

View File

@@ -16,10 +16,11 @@
package org.springframework.data.mongodb.core.mapping;
import org.springframework.data.mapping.PersistentEntity;
import org.springframework.lang.Nullable;
/**
* MongoDB specific {@link PersistentEntity} abstraction.
*
*
* @author Oliver Gierke
* @author Christoph Strobl
*/
@@ -27,14 +28,14 @@ public interface MongoPersistentEntity<T> extends PersistentEntity<T, MongoPersi
/**
* Returns the collection the entity shall be persisted to.
*
*
* @return
*/
String getCollection();
/**
* Returns the default language to be used for this entity.
*
*
* @since 1.6
* @return
*/
@@ -42,16 +43,17 @@ public interface MongoPersistentEntity<T> extends PersistentEntity<T, MongoPersi
/**
* Returns the property holding text score value.
*
*
* @since 1.6
* @see #hasTextScoreProperty()
* @return {@literal null} if not present.
*/
@Nullable
MongoPersistentProperty getTextScoreProperty();
/**
* Returns whether the entity has a {@link TextScore} property.
*
*
* @since 1.6
* @return true if property annotated with {@link TextScore} is present.
*/

View File

@@ -19,10 +19,11 @@ import org.springframework.core.convert.converter.Converter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mapping.PersistentEntity;
import org.springframework.data.mapping.PersistentProperty;
import org.springframework.lang.Nullable;
/**
* MongoDB specific {@link org.springframework.data.mapping.PersistentProperty} extension.
*
*
* @author Oliver Gierke
* @author Patryk Wasik
* @author Thomas Darimont
@@ -32,14 +33,14 @@ public interface MongoPersistentProperty extends PersistentProperty<MongoPersist
/**
* Returns the name of the field a property is persisted to.
*
*
* @return
*/
String getFieldName();
/**
* Returns the order of the field if defined. Will return -1 if undefined.
*
*
* @return
*/
int getFieldOrder();
@@ -47,7 +48,7 @@ public interface MongoPersistentProperty extends PersistentProperty<MongoPersist
/**
* Returns whether the property is a {@link com.mongodb.DBRef}. If this returns {@literal true} you can expect
* {@link #getDBRef()} to return an non-{@literal null} value.
*
*
* @return
*/
boolean isDbReference();
@@ -55,7 +56,7 @@ public interface MongoPersistentProperty extends PersistentProperty<MongoPersist
/**
* Returns whether the property is explicitly marked as an identifier property of the owning {@link PersistentEntity}.
* A property is an explicit id property if it is annotated with @see {@link Id}.
*
*
* @return
*/
boolean isExplicitIdProperty();
@@ -63,7 +64,7 @@ public interface MongoPersistentProperty extends PersistentProperty<MongoPersist
/**
* Returns true whether the property indicates the documents language either by having a {@link #getFieldName()} equal
* to {@literal language} or being annotated with {@link Language}.
*
*
* @return
* @since 1.6
*/
@@ -71,7 +72,7 @@ public interface MongoPersistentProperty extends PersistentProperty<MongoPersist
/**
* Returns true when property being annotated with {@link Language}.
*
*
* @return
* @since 1.6.1
*/
@@ -80,7 +81,7 @@ public interface MongoPersistentProperty extends PersistentProperty<MongoPersist
/**
* Returns whether the property holds the documents score calculated by text search. <br/>
* It's marked with {@link TextScore}.
*
*
* @return
* @since 1.6
*/
@@ -88,15 +89,16 @@ public interface MongoPersistentProperty extends PersistentProperty<MongoPersist
/**
* Returns the {@link DBRef} if the property is a reference.
*
*
* @see #isDbReference()
* @return
*/
@Nullable
DBRef getDBRef();
/**
* Simple {@link Converter} implementation to transform a {@link MongoPersistentProperty} into its field name.
*
*
* @author Oliver Gierke
*/
public enum PropertyToFieldNameConverter implements Converter<MongoPersistentProperty, String> {
@@ -115,7 +117,7 @@ public interface MongoPersistentProperty extends PersistentProperty<MongoPersist
/**
* Returns whether property access shall be used for reading the property value. This means it will use the getter
* instead of field access.
*
*
* @return
*/
boolean usePropertyAccess();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2016 by the original author(s).
* Copyright 2013-2017 by the original author(s).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,27 +16,29 @@
package org.springframework.data.mongodb.core.mapping.event;
import org.bson.Document;
import org.springframework.lang.Nullable;
/**
* Base class for delete events.
*
*
* @author Martin Baumgartner
* @author Christoph Strobl
* @author Mark Paluch
*/
public abstract class AbstractDeleteEvent<T> extends MongoMappingEvent<Document> {
private static final long serialVersionUID = 1L;
private final Class<T> type;
private final @Nullable Class<T> type;
/**
* Creates a new {@link AbstractDeleteEvent} for the given {@link Document} and type.
*
*
* @param document must not be {@literal null}.
* @param type can be {@literal null}.
* @param collectionName can be {@literal null}.
* @param type may be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public AbstractDeleteEvent(Document document, Class<T> type, String collectionName) {
public AbstractDeleteEvent(Document document, @Nullable Class<T> type, String collectionName) {
super(document, document, collectionName);
this.type = type;
@@ -44,9 +46,10 @@ public abstract class AbstractDeleteEvent<T> extends MongoMappingEvent<Document>
/**
* Returns the type for which the {@link AbstractDeleteEvent} shall be invoked for.
*
*
* @return
*/
@Nullable
public Class<T> getType() {
return type;
}

View File

@@ -1,11 +1,11 @@
/*
* Copyright (c) 2011-2016 by the original author(s).
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -19,9 +19,10 @@ import org.bson.Document;
/**
* {@link MongoMappingEvent} thrown after convert of a document.
*
* @author Jon Brisbin <jbrisbin@vmware.com>
*
* @author Jon Brisbin
* @author Christoph Strobl
* @author Mark Paluch
*/
public class AfterConvertEvent<E> extends MongoMappingEvent<E> {
@@ -29,10 +30,10 @@ public class AfterConvertEvent<E> extends MongoMappingEvent<E> {
/**
* Creates new {@link AfterConvertEvent}.
*
* @param document can be {@literal null}.
*
* @param document must not be {@literal null}.
* @param source must not be {@literal null}.
* @param collectionName can be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public AfterConvertEvent(Document document, E source, String collectionName) {

View File

@@ -16,13 +16,15 @@
package org.springframework.data.mongodb.core.mapping.event;
import org.bson.Document;
import org.springframework.lang.Nullable;
/**
* Event being thrown after a single or a set of documents has/have been deleted. The {@link Document} held in the event
* will be the query document <em>after</am> it has been mapped onto the domain type handled.
*
*
* @author Martin Baumgartner
* @author Christoph Strobl
* @author Mark Paluch
*/
public class AfterDeleteEvent<T> extends AbstractDeleteEvent<T> {
@@ -30,13 +32,13 @@ public class AfterDeleteEvent<T> extends AbstractDeleteEvent<T> {
/**
* Creates a new {@link AfterDeleteEvent} for the given {@link Document}, type and collectionName.
*
*
* @param dbo must not be {@literal null}.
* @param type can be {@literal null}.
* @param collectionName can be {@literal null}.
* @param type may be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public AfterDeleteEvent(Document document, Class<T> type, String collectionName) {
public AfterDeleteEvent(Document document, @Nullable Class<T> type, String collectionName) {
super(document, type, collectionName);
}
}

View File

@@ -1,11 +1,11 @@
/*
* Copyright (c) 2011-2016 by the original author(s).
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.mongodb.core.mapping.event;
import org.bson.Document;
@@ -21,11 +20,12 @@ import org.springframework.util.Assert;
/**
* Event to be triggered after loading {@link Document}s to be mapped onto a given type.
*
*
* @author Oliver Gierke
* @author Jon Brisbin
* @author Christoph Leiter
* @author Christoph Strobl
* @author Mark Paluch
*/
public class AfterLoadEvent<T> extends MongoMappingEvent<Document> {
@@ -34,10 +34,10 @@ public class AfterLoadEvent<T> extends MongoMappingEvent<Document> {
/**
* Creates a new {@link AfterLoadEvent} for the given {@link Document}, type and collectionName.
*
*
* @param document must not be {@literal null}.
* @param type must not be {@literal null}.
* @param collectionName can be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public AfterLoadEvent(Document document, Class<T> type, String collectionName) {
@@ -50,7 +50,7 @@ public class AfterLoadEvent<T> extends MongoMappingEvent<Document> {
/**
* Returns the type for which the {@link AfterLoadEvent} shall be invoked for.
*
*
* @return
*/
public Class<T> getType() {

View File

@@ -1,11 +1,11 @@
/*
* Copyright (c) 2011-2016 by the original author(s).
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,16 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.mongodb.core.mapping.event;
import org.bson.Document;
/**
* {@link MongoMappingEvent} triggered after save of a document.
*
* @author Jon Brisbin <jbrisbin@vmware.com>
*
* @author Jon Brisbin
* @author Christoph Strobl
* @author Mark Paluch
*/
public class AfterSaveEvent<E> extends MongoMappingEvent<E> {
@@ -30,10 +30,10 @@ public class AfterSaveEvent<E> extends MongoMappingEvent<E> {
/**
* Creates new {@link AfterSaveEvent}.
*
*
* @param source must not be {@literal null}.
* @param document can be {@literal null}.
* @param collectionName can be {@literal null}.
* @param document must not be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public AfterSaveEvent(E source, Document document, String collectionName) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2011-2015 the original author or authors.
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,10 +17,11 @@ package org.springframework.data.mongodb.core.mapping.event;
/**
* Event being thrown before a domain object is converted to be persisted.
*
*
* @author Jon Brisbin
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
*/
public class BeforeConvertEvent<T> extends MongoMappingEvent<T> {
@@ -28,9 +29,9 @@ public class BeforeConvertEvent<T> extends MongoMappingEvent<T> {
/**
* Creates new {@link BeforeConvertEvent}.
*
*
* @param source must not be {@literal null}.
* @param collectionName can be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public BeforeConvertEvent(T source, String collectionName) {

View File

@@ -1,11 +1,11 @@
/*
* Copyright 2013-2016 by the original author(s).
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,13 +16,15 @@
package org.springframework.data.mongodb.core.mapping.event;
import org.bson.Document;
import org.springframework.lang.Nullable;
/**
* Event being thrown before a document is deleted. The {@link Document} held in the event will represent the query
* document <em>before</em> being mapped based on the domain class handled.
*
*
* @author Martin Baumgartner
* @author Christoph Strobl
* @author Mark Paluch
*/
public class BeforeDeleteEvent<T> extends AbstractDeleteEvent<T> {
@@ -30,13 +32,13 @@ public class BeforeDeleteEvent<T> extends AbstractDeleteEvent<T> {
/**
* Creates a new {@link BeforeDeleteEvent} for the given {@link Document}, type and collectionName.
*
*
* @param document must not be {@literal null}.
* @param type can be {@literal null}.
* @param collectionName can be {@literal null}.
* @param type may be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public BeforeDeleteEvent(Document document, Class<T> type, String collectionName) {
public BeforeDeleteEvent(Document document, @Nullable Class<T> type, String collectionName) {
super(document, type, collectionName);
}
}

View File

@@ -1,11 +1,11 @@
/*
* Copyright (c) 2011-2016 by the original author(s).
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,16 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.mongodb.core.mapping.event;
import org.bson.Document;
/**
* {@link MongoMappingEvent} triggered before save of a document.
*
* @author Jon Brisbin <jbrisbin@vmware.com>
*
* @author Jon Brisbin
* @author Christoph Strobl
* @author Mark Paluch
*/
public class BeforeSaveEvent<E> extends MongoMappingEvent<E> {
@@ -30,10 +30,10 @@ public class BeforeSaveEvent<E> extends MongoMappingEvent<E> {
/**
* Creates new {@link BeforeSaveEvent}.
*
*
* @param source must not be {@literal null}.
* @param document can be {@literal null}.
* @param collectionName can be {@literal null}.
* @param document must not be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public BeforeSaveEvent(E source, Document document, String collectionName) {

View File

@@ -1,11 +1,11 @@
/*
* Copyright (c) 2011-2016 by the original author(s).
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,32 +13,33 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.mongodb.core.mapping.event;
import org.bson.Document;
import org.springframework.context.ApplicationEvent;
import org.springframework.lang.Nullable;
/**
* Base {@link ApplicationEvent} triggered by Spring Data MongoDB.
*
* @author Jon Brisbin <jbrisbin@vmware.com>
*
* @author Jon Brisbin
* @author Christoph Strobl
* @author Mark Paluch
*/
public class MongoMappingEvent<T> extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private final Document document;
private final String collectionName;
private final @Nullable Document document;
private final @Nullable String collectionName;
/**
* Creates new {@link MongoMappingEvent}.
*
*
* @param source must not be {@literal null}.
* @param document can be {@literal null}.
* @param collectionName can be {@literal null}.
*/
public MongoMappingEvent(T source, Document document, String collectionName) {
public MongoMappingEvent(T source, @Nullable Document document, @Nullable String collectionName) {
super(source);
this.document = document;
@@ -48,17 +49,17 @@ public class MongoMappingEvent<T> extends ApplicationEvent {
/**
* @return {@literal null} if not set.
*/
public Document getDocument() {
public @Nullable Document getDocument() {
return document;
}
/**
* Get the collection the event refers to.
*
*
* @return {@literal null} if not set.
* @since 1.8
*/
public String getCollectionName() {
public @Nullable String getCollectionName() {
return collectionName;
}

View File

@@ -28,6 +28,7 @@ import org.springframework.lang.Nullable;
*
* @author Mark Pollack
* @author Christoph Strobl
* @author Mark Paluch
*/
public class GroupBy {
@@ -52,7 +53,7 @@ public class GroupBy {
// NOTE GroupByCommand does not handle keyfunction.
public GroupBy(String key, boolean isKeyFunction) {
public GroupBy(@Nullable String key, boolean isKeyFunction) {
Document document = new Document();
if (isKeyFunction) {
@@ -89,7 +90,7 @@ public class GroupBy {
* @param initialDocument can be {@literal null}.
* @return
*/
public GroupBy initialDocument(String initialDocument) {
public GroupBy initialDocument(@Nullable String initialDocument) {
initial = Optional.ofNullable(initialDocument);
return this;
@@ -101,7 +102,7 @@ public class GroupBy {
* @param initialDocument can be {@literal null}.
* @return
*/
public GroupBy initialDocument(Document initialDocument) {
public GroupBy initialDocument(@Nullable Document initialDocument) {
this.initialDocument = initialDocument;
return this;
@@ -125,7 +126,7 @@ public class GroupBy {
* @param finalizeFunction
* @return
*/
public GroupBy finalizeFunction(String finalizeFunction) {
public GroupBy finalizeFunction(@Nullable String finalizeFunction) {
finalize = Optional.ofNullable(finalizeFunction);
return this;
@@ -138,7 +139,7 @@ public class GroupBy {
* @return
* @since 2.0
*/
public GroupBy collation(Collation collation) {
public GroupBy collation(@Nullable Collation collation) {
this.collation = Optional.ofNullable(collation);
return this;

View File

@@ -21,14 +21,15 @@ import java.util.Optional;
import org.bson.Document;
import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.lang.Nullable;
import com.mongodb.MapReduceCommand;
import org.springframework.lang.Nullable;
/**
* @author Mark Pollack
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
*/
public class MapReduceOptions {
@@ -48,7 +49,7 @@ public class MapReduceOptions {
/**
* Static factory method to create a MapReduceOptions instance
*
*
* @return a new instance
*/
public static MapReduceOptions options() {
@@ -58,7 +59,7 @@ public class MapReduceOptions {
/**
* Limit the number of objects to return from the collection that is fed into the map reduce operation Often used in
* conjunction with a query and sort option so as to reduce the portion of the data that will be processed.
*
*
* @param limit Limit the number of objects to process
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
@@ -71,7 +72,7 @@ public class MapReduceOptions {
/**
* The collection where the results from the map-reduce operation will be stored. Note, you can set the database name
* as well with the outputDatabase option.
*
*
* @param collectionName The name of the collection where the results of the map-reduce operation will be stored.
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
@@ -84,11 +85,11 @@ public class MapReduceOptions {
/**
* The database where the results from the map-reduce operation will be stored. Note, you ca set the collection name
* as well with the outputCollection option.
*
*
* @param outputDatabase The name of the database where the results of the map-reduce operation will be stored.
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
public MapReduceOptions outputDatabase(String outputDatabase) {
public MapReduceOptions outputDatabase(@Nullable String outputDatabase) {
this.outputDatabase = Optional.ofNullable(outputDatabase);
return this;
@@ -98,7 +99,7 @@ public class MapReduceOptions {
* With this option, no collection will be created, and the whole map-reduce operation will happen in RAM. Also, the
* results of the map-reduce will be returned within the result object. Note that this option is possible only when
* the result set fits within the 16MB limit of a single document.
*
*
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
public MapReduceOptions outputTypeInline() {
@@ -110,7 +111,7 @@ public class MapReduceOptions {
/**
* This option will merge new data into the old output collection. In other words, if the same key exists in both the
* result set and the old collection, the new key will overwrite the old one.
*
*
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
public MapReduceOptions outputTypeMerge() {
@@ -123,7 +124,7 @@ public class MapReduceOptions {
* If documents exists for a given key in the result set and in the old collection, then a reduce operation (using the
* specified reduce function) will be performed on the two values and the result will be written to the output
* collection. If a finalize function was provided, this will be run after the reduce as well.
*
*
* @return
*/
public MapReduceOptions outputTypeReduce() {
@@ -134,7 +135,7 @@ public class MapReduceOptions {
/**
* The output will be inserted into a collection which will atomically replace any existing collection with the same
* name. Note, the default is MapReduceCommand.OutputType.REPLACE
*
*
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
public MapReduceOptions outputTypeReplace() {
@@ -146,7 +147,7 @@ public class MapReduceOptions {
/**
* If true and combined with an output mode that writes to a collection, the output collection will be sharded using
* the _id field. For MongoDB 1.9+
*
*
* @param outputShared if true, output will be sharded based on _id key.
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
@@ -158,11 +159,11 @@ public class MapReduceOptions {
/**
* Sets the finalize function
*
*
* @param finalizeFunction The finalize function. Can be a JSON string or a Spring Resource URL
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
public MapReduceOptions finalizeFunction(String finalizeFunction) {
public MapReduceOptions finalizeFunction(@Nullable String finalizeFunction) {
this.finalizeFunction = Optional.ofNullable(finalizeFunction);
return this;
@@ -171,7 +172,7 @@ public class MapReduceOptions {
/**
* Key-value pairs that are placed into JavaScript global scope and can be accessed from map, reduce, and finalize
* scripts.
*
*
* @param scopeVariables variables that can be accessed from map, reduce, and finalize scripts
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
@@ -184,7 +185,7 @@ public class MapReduceOptions {
/**
* Flag that toggles behavior in the map-reduce operation so as to avoid intermediate conversion to BSON between the
* map and reduce steps. For MongoDB 1.9+
*
*
* @param javaScriptMode if true, have the execution of map-reduce stay in JavaScript
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
@@ -196,7 +197,7 @@ public class MapReduceOptions {
/**
* Flag to set that will provide statistics on job execution time.
*
*
* @return MapReduceOptions so that methods can be chained in a fluent API style
*/
public MapReduceOptions verbose(boolean verbose) {
@@ -209,7 +210,7 @@ public class MapReduceOptions {
* Add additional extra options that may not have a method on this class. This method will help if you use a version
* of this client library with a server version that has added additional map-reduce options that do not yet have an
* method for use in setting them. options
*
*
* @param key The key option
* @param value The value of the option
* @return MapReduceOptions so that methods can be chained in a fluent API style
@@ -229,7 +230,7 @@ public class MapReduceOptions {
* @return
* @since 2.0
*/
public MapReduceOptions collation(Collation collation) {
public MapReduceOptions collation(@Nullable Collation collation) {
this.collation = Optional.ofNullable(collation);
return this;
@@ -248,6 +249,7 @@ public class MapReduceOptions {
return this.finalizeFunction;
}
@Nullable
public Boolean getJavaScriptMode() {
return this.jsMode;
}
@@ -275,7 +277,7 @@ public class MapReduceOptions {
/**
* Get the maximum number of documents for the input into the map function.
*
*
* @return {@literal null} if not set.
*/
@Nullable

View File

@@ -19,13 +19,14 @@ import java.util.Iterator;
import java.util.List;
import org.bson.Document;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.mongodb.MapReduceOutput;
/**
* Collects the results of performing a MapReduce operations.
*
*
* @author Mark Pollack
* @author Oliver Gierke
* @author Christoph Strobl
@@ -35,14 +36,14 @@ import com.mongodb.MapReduceOutput;
public class MapReduceResults<T> implements Iterable<T> {
private final List<T> mappedResults;
private final Document rawResults;
private final String outputCollection;
private final @Nullable Document rawResults;
private final @Nullable String outputCollection;
private final MapReduceTiming mapReduceTiming;
private final MapReduceCounts mapReduceCounts;
/**
* Creates a new {@link MapReduceResults} from the given mapped results and the raw one.
*
*
* @param mappedResults must not be {@literal null}.
* @param rawResults must not be {@literal null}.
* @deprecated since 1.7. Please use {@link #MapReduceResults(List, MapReduceOutput)}
@@ -62,7 +63,7 @@ public class MapReduceResults<T> implements Iterable<T> {
/**
* Creates a new {@link MapReduceResults} from the given mapped results and the {@link MapReduceOutput}.
*
*
* @param mappedResults must not be {@literal null}.
* @param mapReduceOutput must not be {@literal null}.
* @since 1.7
@@ -95,6 +96,7 @@ public class MapReduceResults<T> implements Iterable<T> {
return mapReduceCounts;
}
@Nullable
public String getOutputCollection() {
return outputCollection;
}
@@ -121,7 +123,7 @@ public class MapReduceResults<T> implements Iterable<T> {
/**
* Returns the value of the source's field with the given key as {@link Long}.
*
*
* @param source
* @param key
* @return
@@ -135,7 +137,7 @@ public class MapReduceResults<T> implements Iterable<T> {
/**
* Parses the raw {@link Document} result into a {@link MapReduceCounts} value object.
*
*
* @param rawResults
* @return
*/
@@ -156,10 +158,11 @@ public class MapReduceResults<T> implements Iterable<T> {
/**
* Parses the output collection from the raw {@link Document} result.
*
*
* @param rawResults
* @return
*/
@Nullable
private static String parseOutputCollection(Document rawResults) {
Object resultField = rawResults.get("result");

View File

@@ -18,6 +18,7 @@ package org.springframework.data.mongodb.core.query;
import static org.springframework.util.ObjectUtils.*;
import org.bson.Document;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -42,14 +43,14 @@ public class BasicQuery extends Query {
*
* @param query may be {@literal null}.
*/
public BasicQuery(String query) {
public BasicQuery(@Nullable String query) {
this(query, null);
}
/**
* Create a new {@link BasicQuery} given a query {@link Document}.
*
* @param queryObject may be {@literal null}.
* @param queryObject must not be {@literal null}.
*/
public BasicQuery(Document queryObject) {
this(queryObject, new Document());
@@ -61,7 +62,7 @@ public class BasicQuery extends Query {
* @param query may be {@literal null}.
* @param fields may be {@literal null}.
*/
public BasicQuery(String query, String fields) {
public BasicQuery(@Nullable String query, @Nullable String fields) {
this(query != null ? Document.parse(query) : new Document(),
fields != null ? Document.parse(fields) : new Document());

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2016 the original author or authors.
* Copyright 2010-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,10 +25,11 @@ import org.bson.Document;
* @author John Brisbin
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
*/
public class BasicUpdate extends Update {
private Document updateObject = null;
private Document updateObject;
public BasicUpdate(String updateString) {
super();

View File

@@ -15,6 +15,11 @@
*/
package org.springframework.data.mongodb.core.query;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Locale;
import java.util.Optional;
@@ -29,11 +34,6 @@ import com.mongodb.client.model.CollationCaseFirst;
import com.mongodb.client.model.CollationMaxVariable;
import com.mongodb.client.model.CollationStrength;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* Central abstraction for MongoDB collation support. <br />
* Allows fluent creation of a collation {@link Document} that can be used for creating collections & indexes as well as
@@ -274,7 +274,7 @@ public class Collation {
public Collation alternate(Alternate alternate) {
Collation newInstance = copy();
newInstance.alternate = Optional.ofNullable(alternate);
newInstance.alternate = Optional.of(alternate);
return newInstance;
}
@@ -302,10 +302,10 @@ public class Collation {
* @param backwards must not be {@literal null}.
* @return new {@link Collation}.
*/
public Collation backwards(Boolean backwards) {
public Collation backwards(boolean backwards) {
Collation newInstance = copy();
newInstance.backwards = Optional.ofNullable(backwards);
newInstance.backwards = Optional.of(backwards);
return newInstance;
}
@@ -333,10 +333,10 @@ public class Collation {
* @param normalization must not be {@literal null}.
* @return new {@link Collation}.
*/
public Collation normalization(Boolean normalization) {
public Collation normalization(boolean normalization) {
Collation newInstance = copy();
newInstance.normalization = Optional.ofNullable(normalization);
newInstance.normalization = Optional.of(normalization);
return newInstance;
}

View File

@@ -63,7 +63,7 @@ public class Criteria implements CriteriaDefinition {
private @Nullable String key;
private List<Criteria> criteriaChain;
private LinkedHashMap<String, Object> criteria = new LinkedHashMap<String, Object>();
private Object isValue = NOT_SET;
private @Nullable Object isValue = NOT_SET;
public Criteria() {
this.criteriaChain = new ArrayList<Criteria>();
@@ -130,7 +130,7 @@ public class Criteria implements CriteriaDefinition {
* @param o
* @return
*/
public Criteria is(Object o) {
public Criteria is(@Nullable Object o) {
if (!isValue.equals(NOT_SET)) {
throw new InvalidMongoDbApiUsageException(
@@ -156,7 +156,7 @@ public class Criteria implements CriteriaDefinition {
* @return
* @see <a href="https://docs.mongodb.com/manual/reference/operator/query/ne/">MongoDB Query operator: $ne</a>
*/
public Criteria ne(Object o) {
public Criteria ne(@Nullable Object o) {
criteria.put("$ne", o);
return this;
}
@@ -352,7 +352,7 @@ public class Criteria implements CriteriaDefinition {
* @return
* @see <a href="https://docs.mongodb.com/manual/reference/operator/query/not/">MongoDB Query operator: $not</a>
*/
private Criteria not(Object value) {
private Criteria not(@Nullable Object value) {
criteria.put("$not", value);
return this;
}
@@ -376,7 +376,7 @@ public class Criteria implements CriteriaDefinition {
* @return
* @see <a href="https://docs.mongodb.com/manual/reference/operator/query/regex/">MongoDB Query operator: $regex</a>
*/
public Criteria regex(String re, String options) {
public Criteria regex(String re, @Nullable String options) {
return regex(toPattern(re, options));
}
@@ -408,7 +408,7 @@ public class Criteria implements CriteriaDefinition {
return this;
}
private Pattern toPattern(String regex, String options) {
private Pattern toPattern(String regex, @Nullable String options) {
Assert.notNull(regex, "Regex string must not be null!");

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,13 +23,14 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
* Meta-data for {@link Query} instances.
*
*
* @author Christoph Strobl
* @author Oliver Gierke
* @author Mark Paluch
@@ -53,13 +54,14 @@ public class Meta {
/**
* @return {@literal null} if not set.
*/
@Nullable
public Long getMaxTimeMsec() {
return getValue(MetaKey.MAX_TIME_MS.key);
}
/**
* Set the maximum time limit in milliseconds for processing operations.
*
*
* @param maxTimeMsec
*/
public void setMaxTimeMsec(long maxTimeMsec) {
@@ -68,24 +70,25 @@ public class Meta {
/**
* Set the maximum time limit for processing operations.
*
*
* @param timeout
* @param timeUnit
*/
public void setMaxTime(long timeout, TimeUnit timeUnit) {
public void setMaxTime(long timeout, @Nullable TimeUnit timeUnit) {
setValue(MetaKey.MAX_TIME_MS.key, (timeUnit != null ? timeUnit : TimeUnit.MILLISECONDS).toMillis(timeout));
}
/**
* @return {@literal null} if not set.
*/
@Nullable
public Long getMaxScan() {
return getValue(MetaKey.MAX_SCAN.key);
}
/**
* Only scan the specified number of documents.
*
*
* @param maxScan
*/
public void setMaxScan(long maxScan) {
@@ -94,7 +97,7 @@ public class Meta {
/**
* Add a comment to the query.
*
*
* @param comment
*/
public void setComment(String comment) {
@@ -104,13 +107,14 @@ public class Meta {
/**
* @return {@literal null} if not set.
*/
@Nullable
public String getComment() {
return getValue(MetaKey.COMMENT.key);
}
/**
* Using snapshot prevents the cursor from returning a document more than once.
*
*
* @param useSnapshot
*/
public void setSnapshot(boolean useSnapshot) {
@@ -154,7 +158,7 @@ public class Meta {
/**
* Get {@link Iterable} of set meta values.
*
*
* @return
*/
public Iterable<Entry<String, Object>> values() {
@@ -163,11 +167,11 @@ public class Meta {
/**
* Sets or removes the value in case of {@literal null} or empty {@link String}.
*
*
* @param key must not be {@literal null} or empty.
* @param value
*/
private void setValue(String key, Object value) {
private void setValue(String key, @Nullable Object value) {
Assert.hasText(key, "Meta key must not be 'null' or blank.");
@@ -177,6 +181,7 @@ public class Meta {
this.values.put(key, value);
}
@Nullable
@SuppressWarnings("unchecked")
private <T> T getValue(String key) {
return (T) this.values.get(key);

View File

@@ -17,6 +17,8 @@ package org.springframework.data.mongodb.core.query;
import java.util.regex.Pattern;
import org.springframework.lang.Nullable;
/**
* @author Christoph Strobl
* @author Mark Paluch
@@ -77,7 +79,8 @@ public enum MongoRegexCreator {
* @param matcherType the type of matching to perform
* @return {@literal source} when {@literal source} or {@literal matcherType} is {@literal null}.
*/
public String toRegularExpression(String source, MatchMode matcherType) {
@Nullable
public String toRegularExpression(@Nullable String source, @Nullable MatchMode matcherType) {
if (matcherType == null || source == null) {
return source;

View File

@@ -30,10 +30,11 @@ import org.springframework.util.ObjectUtils;
/**
* Builder class to build near-queries.
*
*
* @author Oliver Gierke
* @author Thomas Darimont
* @author Christoph Strobl
* @author Mark Paluch
*/
public final class NearQuery {
@@ -48,7 +49,7 @@ public final class NearQuery {
/**
* Creates a new {@link NearQuery}.
*
*
* @param point must not be {@literal null}.
* @param metric must not be {@literal null}.
*/
@@ -64,7 +65,7 @@ public final class NearQuery {
/**
* Creates a new {@link NearQuery} starting near the given coordinates.
*
*
* @param x
* @param y
* @return
@@ -77,7 +78,7 @@ public final class NearQuery {
* Creates a new {@link NearQuery} starting at the given coordinates using the given {@link Metric} to adapt given
* values to further configuration. E.g. setting a {@link #maxDistance(double)} will be interpreted as a value of the
* initially set {@link Metric}.
*
*
* @param x
* @param y
* @param metric must not be {@literal null}.
@@ -89,7 +90,7 @@ public final class NearQuery {
/**
* Creates a new {@link NearQuery} starting at the given {@link Point}.
*
*
* @param point must not be {@literal null}.
* @return
*/
@@ -101,7 +102,7 @@ public final class NearQuery {
* Creates a {@link NearQuery} starting near the given {@link Point} using the given {@link Metric} to adapt given
* values to further configuration. E.g. setting a {@link #maxDistance(double)} will be interpreted as a value of the
* initially set {@link Metric}.
*
*
* @param point must not be {@literal null}.
* @param metric must not be {@literal null}.
* @return
@@ -113,7 +114,7 @@ public final class NearQuery {
/**
* Returns the {@link Metric} underlying the actual query. If no metric was set explicitly {@link Metrics#NEUTRAL}
* will be returned.
*
*
* @return will never be {@literal null}.
*/
public Metric getMetric() {
@@ -122,7 +123,7 @@ public final class NearQuery {
/**
* Configures the maximum number of results to return.
*
*
* @param num
* @return
*/
@@ -133,7 +134,7 @@ public final class NearQuery {
/**
* Configures the number of results to skip.
*
*
* @param skip
* @return
*/
@@ -144,7 +145,7 @@ public final class NearQuery {
/**
* Configures the {@link Pageable} to use.
*
*
* @param pageable must not be {@literal null}
* @return
*/
@@ -161,13 +162,13 @@ public final class NearQuery {
/**
* Sets the max distance results shall have from the configured origin. If a {@link Metric} was set before the given
* value will be interpreted as being a value in that metric. E.g.
*
*
* <pre>
* NearQuery query = near(10.0, 20.0, Metrics.KILOMETERS).maxDistance(150);
* </pre>
*
*
* Will set the maximum distance to 150 kilometers.
*
*
* @param maxDistance
* @return
*/
@@ -178,7 +179,7 @@ public final class NearQuery {
/**
* Sets the maximum distance supplied in a given metric. Will normalize the distance but not reconfigure the query's
* result {@link Metric} if one was configured before.
*
*
* @param maxDistance
* @param metric must not be {@literal null}.
* @return
@@ -193,7 +194,7 @@ public final class NearQuery {
/**
* Sets the maximum distance to the given {@link Distance}. Will set the returned {@link Metric} to be the one of the
* given {@link Distance} if {@link Metric} was {@link Metrics#NEUTRAL} before.
*
*
* @param distance must not be {@literal null}.
* @return
*/
@@ -216,13 +217,13 @@ public final class NearQuery {
/**
* Sets the minimum distance results shall have from the configured origin. If a {@link Metric} was set before the
* given value will be interpreted as being a value in that metric. E.g.
*
*
* <pre>
* NearQuery query = near(10.0, 20.0, Metrics.KILOMETERS).minDistance(150);
* </pre>
*
*
* Will set the minimum distance to 150 kilometers.
*
*
* @param minDistance
* @return
* @since 1.7
@@ -234,7 +235,7 @@ public final class NearQuery {
/**
* Sets the minimum distance supplied in a given metric. Will normalize the distance but not reconfigure the query's
* result {@link Metric} if one was configured before.
*
*
* @param minDistance
* @param metric must not be {@literal null}.
* @return
@@ -250,7 +251,7 @@ public final class NearQuery {
/**
* Sets the minimum distance to the given {@link Distance}. Will set the returned {@link Metric} to be the one of the
* given {@link Distance} if no {@link Metric} was set before.
*
*
* @param distance must not be {@literal null}.
* @return
* @since 1.7
@@ -273,7 +274,7 @@ public final class NearQuery {
/**
* Returns the maximum {@link Distance}.
*
*
* @return
*/
@Nullable
@@ -283,7 +284,7 @@ public final class NearQuery {
/**
* Returns the maximum {@link Distance}.
*
*
* @return
* @since 1.7
*/
@@ -294,7 +295,7 @@ public final class NearQuery {
/**
* Configures a {@link CustomMetric} with the given multiplier.
*
*
* @param distanceMultiplier
* @return
*/
@@ -306,7 +307,7 @@ public final class NearQuery {
/**
* Configures whether to return spherical values for the actual distance.
*
*
* @param spherical
* @return
*/
@@ -317,7 +318,7 @@ public final class NearQuery {
/**
* Returns whether spharical values will be returned.
*
*
* @return
*/
public boolean isSpherical() {
@@ -327,7 +328,7 @@ public final class NearQuery {
/**
* Will cause the results' distances being returned in kilometers. Sets {@link #distanceMultiplier(double)} and
* {@link #spherical(boolean)} accordingly.
*
*
* @return
*/
public NearQuery inKilometers() {
@@ -337,7 +338,7 @@ public final class NearQuery {
/**
* Will cause the results' distances being returned in miles. Sets {@link #distanceMultiplier(double)} and
* {@link #spherical(boolean)} accordingly.
*
*
* @return
*/
public NearQuery inMiles() {
@@ -347,19 +348,19 @@ public final class NearQuery {
/**
* Will cause the results' distances being returned in the given metric. Sets {@link #distanceMultiplier(double)}
* accordingly as well as {@link #spherical(boolean)} if the given {@link Metric} is not {@link Metrics#NEUTRAL}.
*
*
* @param metric the metric the results shall be returned in. Uses {@link Metrics#NEUTRAL} if {@literal null} is
* passed.
* @return
*/
public NearQuery in(Metric metric) {
public NearQuery in(@Nullable Metric metric) {
return adaptMetric(metric == null ? Metrics.NEUTRAL : metric);
}
/**
* Configures the given {@link Metric} to be used as base on for this query and recalculate the maximum distance if no
* metric was set before.
*
*
* @param metric
*/
private NearQuery adaptMetric(Metric metric) {
@@ -374,7 +375,7 @@ public final class NearQuery {
/**
* Adds an actual query to the {@link NearQuery} to restrict the objects considered for the actual near operation.
*
*
* @param query must not be {@literal null}.
* @return
*/
@@ -401,7 +402,7 @@ public final class NearQuery {
/**
* Returns the {@link Document} built by the {@link NearQuery}.
*
*
* @return
*/
public Document toDocument() {

View File

@@ -20,7 +20,6 @@ import static org.springframework.util.ObjectUtils.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
@@ -52,7 +51,7 @@ public class Query {
private final Set<Class<?>> restrictedTypes = new HashSet<>();
private final Map<String, CriteriaDefinition> criteria = new LinkedHashMap<>();
private Field fieldSpec = null;
private @Nullable Field fieldSpec = null;
private Sort sort = Sort.unsorted();
private long skip;
private int limit;
@@ -199,7 +198,7 @@ public class Query {
* @return the restrictedTypes
*/
public Set<Class<?>> getRestrictedTypes() {
return restrictedTypes == null ? Collections.emptySet() : restrictedTypes;
return restrictedTypes;
}
/**
@@ -417,7 +416,7 @@ public class Query {
* @return
* @since 2.0
*/
public Query collation(Collation collation) {
public Query collation(@Nullable Collation collation) {
this.collation = Optional.ofNullable(collation);
return this;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2016 the original author or authors.
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,14 +24,16 @@ import java.util.Map.Entry;
import org.bson.Document;
import org.springframework.core.convert.converter.Converter;
import org.springframework.lang.Nullable;
import com.mongodb.util.JSON;
/**
* Utility methods for JSON serialization.
*
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
*/
public abstract class SerializationUtils {
@@ -41,7 +43,7 @@ public abstract class SerializationUtils {
/**
* Flattens out a given {@link Document}.
*
*
* <pre>
* <code>
* {
@@ -49,7 +51,7 @@ public abstract class SerializationUtils {
* nested : { value : "conflux"}
* }
* </code>
* will result in
* will result in
* <code>
* {
* _id : 1
@@ -57,12 +59,12 @@ public abstract class SerializationUtils {
* }
* </code>
* </pre>
*
*
* @param source can be {@literal null}.
* @return {@link Collections#emptyMap()} when source is {@literal null}
* @since 1.8
*/
public static Map<String, Object> flattenMap(Document source) {
public static Map<String, Object> flattenMap(@Nullable Document source) {
if (source == null) {
return Collections.emptyMap();
@@ -105,11 +107,12 @@ public abstract class SerializationUtils {
* Serializes the given object into pseudo-JSON meaning it's trying to create a JSON representation as far as possible
* but falling back to the given object's {@link Object#toString()} method if it's not serializable. Useful for
* printing raw {@link Document}s containing complex values before actually converting them into Mongo native types.
*
*
* @param value
* @return
*/
public static String serializeToJsonSafely(Object value) {
@Nullable
public static String serializeToJsonSafely(@Nullable Object value) {
if (value == null) {
return null;
@@ -122,8 +125,6 @@ public abstract class SerializationUtils {
return toString((Collection<?>) value);
} else if (value instanceof Map) {
return toString((Map<?, ?>) value);
} else if (value instanceof Document) {
return toString(((Document) value));
} else {
return String.format("{ $java : %s }", value.toString());
}
@@ -150,7 +151,7 @@ public abstract class SerializationUtils {
* Creates a string representation from the given {@link Iterable} prepending the postfix, applying the given
* {@link Converter} to each element before adding it to the result {@link String}, concatenating each element with
* {@literal ,} and applying the postfix.
*
*
* @param source
* @param prefix
* @param postfix

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,11 +15,14 @@
*/
package org.springframework.data.mongodb.core.query;
import org.springframework.lang.Nullable;
/**
* A {@link Term} defines one or multiple words {@link Type#WORD} or phrases {@link Type#PHRASE} to be used in the
* context of full text search.
*
*
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.6
*/
public class Term {
@@ -34,7 +37,7 @@ public class Term {
/**
* Creates a new {@link Term} of {@link Type#WORD}.
*
*
* @param raw
*/
public Term(String raw) {
@@ -43,18 +46,18 @@ public class Term {
/**
* Creates a new {@link Term} of given {@link Type}.
*
*
* @param raw
* @param type defaulted to {@link Type#WORD} if {@literal null}.
*/
public Term(String raw, Type type) {
public Term(String raw, @Nullable Type type) {
this.raw = raw;
this.type = type == null ? Type.WORD : type;
}
/**
* Negates the term.
*
*
* @return
*/
public Term negate() {
@@ -78,7 +81,7 @@ public class Term {
/**
* Get formatted representation of term.
*
*
* @return
*/
public String getFormatted() {

View File

@@ -25,21 +25,22 @@ import org.springframework.util.StringUtils;
/**
* Implementation of {@link CriteriaDefinition} to be used for full text search.
*
*
* @author Christoph Strobl
* @author Oliver Gierke
* @author Mark Paluch
* @since 1.6
*/
public class TextCriteria implements CriteriaDefinition {
private final List<Term> terms;
private String language;
private @Nullable String language;
private @Nullable Boolean caseSensitive;
private @Nullable Boolean diacriticSensitive;
/**
* Creates a new {@link TextCriteria}.
*
*
* @see #forDefaultLanguage()
* @see #forLanguage(String)
*/
@@ -47,7 +48,7 @@ public class TextCriteria implements CriteriaDefinition {
this(null);
}
private TextCriteria(String language) {
private TextCriteria(@Nullable String language) {
this.language = language;
this.terms = new ArrayList<Term>();
@@ -55,7 +56,7 @@ public class TextCriteria implements CriteriaDefinition {
/**
* Returns a new {@link TextCriteria} for the default language.
*
*
* @return
*/
public static TextCriteria forDefaultLanguage() {
@@ -65,7 +66,7 @@ public class TextCriteria implements CriteriaDefinition {
/**
* For a full list of supported languages see the mongodb reference manual for
* <a href="https://docs.mongodb.org/manual/reference/text-search-languages/">Text Search Languages</a>.
*
*
* @param language
* @return
*/
@@ -77,7 +78,7 @@ public class TextCriteria implements CriteriaDefinition {
/**
* Configures the {@link TextCriteria} to match any of the given words.
*
*
* @param words the words to match.
* @return
*/
@@ -92,7 +93,7 @@ public class TextCriteria implements CriteriaDefinition {
/**
* Adds given {@link Term} to criteria.
*
*
* @param term must not be {@literal null}.
*/
public TextCriteria matching(Term term) {
@@ -141,7 +142,7 @@ public class TextCriteria implements CriteriaDefinition {
/**
* Given value will treated as a single phrase.
*
*
* @param phrase
* @return
*/
@@ -155,7 +156,7 @@ public class TextCriteria implements CriteriaDefinition {
/**
* Given value will treated as a single phrase.
*
*
* @param phrase
* @return
*/

View File

@@ -18,6 +18,7 @@ package org.springframework.data.mongodb.core.query;
import java.util.Locale;
import org.bson.Document;
import org.springframework.lang.Nullable;
/**
* {@link Query} implementation to be used to for performing full text searches.
@@ -55,7 +56,7 @@ public class TextQuery extends Query {
* @see TextCriteria#forLanguage(String)
* @see TextCriteria#matching(String)
*/
public TextQuery(String wordsAndPhrases, String language) {
public TextQuery(String wordsAndPhrases, @Nullable String language) {
super(TextCriteria.forLanguage(language).matching(wordsAndPhrases));
}
@@ -67,7 +68,7 @@ public class TextQuery extends Query {
* @param wordsAndPhrases
* @param locale
*/
public TextQuery(String wordsAndPhrases, Locale locale) {
public TextQuery(String wordsAndPhrases, @Nullable Locale locale) {
this(wordsAndPhrases, locale != null ? locale.getLanguage() : (String) null);
}
@@ -158,10 +159,6 @@ public class TextQuery extends Query {
Document fields = super.getFieldsObject();
if (fields == null) {
fields = new Document();
}
fields.put(getScoreFieldName(), META_TEXT_SCORE);
return fields;
}

View File

@@ -31,6 +31,7 @@ import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -848,7 +849,7 @@ public class Update {
* @return never {@literal null}.
* @since 1.7
*/
public PushOperatorBuilder atPosition(Position position) {
public PushOperatorBuilder atPosition(@Nullable Position position) {
if (position == null || Position.LAST.equals(position)) {
return this;

View File

@@ -24,11 +24,12 @@ import org.springframework.expression.spel.ast.Literal;
import org.springframework.expression.spel.ast.MethodReference;
import org.springframework.expression.spel.ast.Operator;
import org.springframework.expression.spel.ast.OperatorNot;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
* A value object for nodes in an expression. Allows iterating ove potentially available child {@link ExpressionNode}s.
*
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
@@ -42,7 +43,7 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Creates a new {@link ExpressionNode} from the given {@link SpelNode} and {@link ExpressionState}.
*
*
* @param node must not be {@literal null}.
* @param state must not be {@literal null}.
*/
@@ -58,7 +59,7 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Factory method to create {@link ExpressionNode}'s according to the given {@link SpelNode} and
* {@link ExpressionState}.
*
*
* @param node
* @param state must not be {@literal null}.
* @return an {@link ExpressionNode} for the given {@link SpelNode} or {@literal null} if {@literal null} was given
@@ -66,10 +67,6 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
*/
public static ExpressionNode from(SpelNode node, ExpressionState state) {
if (node == null) {
return null;
}
if (node instanceof Operator) {
return new OperatorNode((Operator) node, state);
}
@@ -91,7 +88,7 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Returns the name of the {@link ExpressionNode}.
*
*
* @return
*/
public String getName() {
@@ -100,7 +97,7 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Returns whether the current {@link ExpressionNode} is backed by the given type.
*
*
* @param type must not be {@literal null}.
* @return
*/
@@ -112,17 +109,17 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Returns whether the given {@link ExpressionNode} is representing the same backing node type as the current one.
*
*
* @param node
* @return
*/
boolean isOfSameTypeAs(ExpressionNode node) {
boolean isOfSameTypeAs(@Nullable ExpressionNode node) {
return node == null ? false : this.node.getClass().equals(node.node.getClass());
}
/**
* Returns whether the {@link ExpressionNode} is a mathematical operation.
*
*
* @return
*/
public boolean isMathematicalOperation() {
@@ -141,7 +138,7 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Returns whether the {@link ExpressionNode} is a literal.
*
*
* @return
*/
public boolean isLiteral() {
@@ -150,16 +147,17 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Returns the value of the current node.
*
*
* @return
*/
@Nullable
public Object getValue() {
return node.getValue(state);
}
/**
* Returns whether the current node has child nodes.
*
*
* @return
*/
public boolean hasChildren() {
@@ -168,7 +166,7 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Returns the child {@link ExpressionNode} with the given index.
*
*
* @param index must not be negative.
* @return
*/
@@ -180,7 +178,7 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Returns whether the {@link ExpressionNode} has a first child node that is not of the given type.
*
*
* @param type must not be {@literal null}.
* @return
*/
@@ -192,7 +190,7 @@ public class ExpressionNode implements Iterable<ExpressionNode> {
/**
* Creates a new {@link ExpressionNode} from the given {@link SpelNode}.
*
*
* @param node
* @return
*/

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2016 the original author or authors.
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,31 +18,33 @@ package org.springframework.data.mongodb.core.spel;
import java.util.List;
import org.bson.Document;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
* The context for an {@link ExpressionNode} transformation.
*
*
* @author Thomas Darimont
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
*/
public class ExpressionTransformationContextSupport<T extends ExpressionNode> {
private final T currentNode;
private final ExpressionNode parentNode;
private final Document previousOperationObject;
private final @Nullable ExpressionNode parentNode;
private final @Nullable Document previousOperationObject;
/**
* Creates a new {@link ExpressionTransformationContextSupport} for the given {@link ExpressionNode}s and an optional
* previous operation.
*
*
* @param currentNode must not be {@literal null}.
* @param parentNode
* @param previousOperationObject
* @param parentNode may be {@literal null}.
* @param previousOperationObject may be {@literal null}.
*/
public ExpressionTransformationContextSupport(T currentNode, ExpressionNode parentNode,
Document previousOperationObject) {
public ExpressionTransformationContextSupport(T currentNode, @Nullable ExpressionNode parentNode,
@Nullable Document previousOperationObject) {
Assert.notNull(currentNode, "currentNode must not be null!");
@@ -53,7 +55,7 @@ public class ExpressionTransformationContextSupport<T extends ExpressionNode> {
/**
* Returns the current {@link ExpressionNode}.
*
*
* @return
*/
public T getCurrentNode() {
@@ -62,29 +64,31 @@ public class ExpressionTransformationContextSupport<T extends ExpressionNode> {
/**
* Returns the parent {@link ExpressionNode} or {@literal null} if none available.
*
*
* @return
*/
@Nullable
public ExpressionNode getParentNode() {
return parentNode;
}
/**
* Returns the previously accumulated operaton object or {@literal null} if none available. Rather than manually
* Returns the previously accumulated operation object or {@literal null} if none available. Rather than manually
* adding stuff to the object prefer using {@link #addToPreviousOrReturn(Object)} to transparently do if one is
* present.
*
*
* @see #hasPreviousOperation()
* @see #addToPreviousOrReturn(Object)
* @return
*/
@Nullable
public Document getPreviousOperationObject() {
return previousOperationObject;
}
/**
* Returns whether a previous operation is present.
*
*
* @return
*/
public boolean hasPreviousOperation() {
@@ -93,27 +97,30 @@ public class ExpressionTransformationContextSupport<T extends ExpressionNode> {
/**
* Returns whether the parent node is of the same operation as the current node.
*
*
* @return
*/
public boolean parentIsSameOperation() {
return parentNode == null ? false : currentNode.isOfSameTypeAs(parentNode);
return parentNode != null && currentNode.isOfSameTypeAs(parentNode);
}
/**
* Adds the given value to the previous operation and returns it.
*
*
* @param value
* @return
*/
public Document addToPreviousOperation(Object value) {
Assert.state(previousOperationObject != null, "No previous operation available!");
extractArgumentListFrom(previousOperationObject).add(value);
return previousOperationObject;
}
/**
* Adds the given value to the previous operation if one is present or returns the value to add as is.
*
*
* @param value
* @return
*/

View File

@@ -28,6 +28,7 @@ import org.springframework.expression.spel.ast.LongLiteral;
import org.springframework.expression.spel.ast.NullLiteral;
import org.springframework.expression.spel.ast.RealLiteral;
import org.springframework.expression.spel.ast.StringLiteral;
import org.springframework.lang.Nullable;
/**
* A node representing a literal in an expression.
@@ -72,7 +73,7 @@ public class LiteralNode extends ExpressionNode {
* @param parent
* @return
*/
public boolean isUnaryMinus(ExpressionNode parent) {
public boolean isUnaryMinus(@Nullable ExpressionNode parent) {
if (!(parent instanceof OperatorNode)) {
return false;

View File

@@ -23,6 +23,7 @@ import java.util.Map;
import org.springframework.expression.spel.ExpressionState;
import org.springframework.expression.spel.ast.MethodReference;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
@@ -33,6 +34,7 @@ import org.springframework.util.ObjectUtils;
* @author Thomas Darimont
* @author Sebastien Gerard
* @author Christoph Strobl
* @author Mark Paluch
*/
public class MethodReferenceNode extends ExpressionNode {
@@ -172,6 +174,7 @@ public class MethodReferenceNode extends ExpressionNode {
*
* @Deprecated since 1.10. Please use {@link #getMethodReference()}.
*/
@Nullable
@Deprecated
public String getMethodName() {
@@ -185,6 +188,7 @@ public class MethodReferenceNode extends ExpressionNode {
* @return can be {@literal null}.
* @since 1.10
*/
@Nullable
public AggregationMethodReference getMethodReference() {
String name = getName();
@@ -198,9 +202,9 @@ public class MethodReferenceNode extends ExpressionNode {
*/
public static final class AggregationMethodReference {
private final String mongoOperator;
private final ArgumentType argumentType;
private final String[] argumentMap;
private final @Nullable String mongoOperator;
private final @Nullable ArgumentType argumentType;
private final @Nullable String[] argumentMap;
/**
* Creates new {@link AggregationMethodReference}.
@@ -209,7 +213,8 @@ public class MethodReferenceNode extends ExpressionNode {
* @param argumentType can be {@literal null}.
* @param argumentMap can be {@literal null}.
*/
private AggregationMethodReference(String mongoOperator, ArgumentType argumentType, String[] argumentMap) {
private AggregationMethodReference(@Nullable String mongoOperator, @Nullable ArgumentType argumentType,
@Nullable String[] argumentMap) {
this.mongoOperator = mongoOperator;
this.argumentType = argumentType;
@@ -221,6 +226,7 @@ public class MethodReferenceNode extends ExpressionNode {
*
* @return can be {@literal null}.
*/
@Nullable
public String getMongoOperator() {
return this.mongoOperator;
}
@@ -230,6 +236,7 @@ public class MethodReferenceNode extends ExpressionNode {
*
* @return never {@literal null}.
*/
@Nullable
public ArgumentType getArgumentType() {
return this.argumentType;
}

View File

@@ -31,7 +31,7 @@ import org.springframework.util.Assert;
/**
* {@link CdiRepositoryBean} to create Mongo repository instances.
*
*
* @author Oliver Gierke
* @author Mark Paluch
*/
@@ -41,13 +41,13 @@ public class MongoRepositoryBean<T> extends CdiRepositoryBean<T> {
/**
* Creates a new {@link MongoRepositoryBean}.
*
*
* @param operations must not be {@literal null}.
* @param qualifiers must not be {@literal null}.
* @param repositoryType must not be {@literal null}.
* @param beanManager must not be {@literal null}.
* @param detector detector for the custom {@link org.springframework.data.repository.Repository} implementations
* {@link CustomRepositoryImplementationDetector}, can be {@literal null}.
* {@link CustomRepositoryImplementationDetector}, can be {@link Optional#empty()}.
*/
public MongoRepositoryBean(Bean<MongoOperations> operations, Set<Annotation> qualifiers, Class<T> repositoryType,
BeanManager beanManager, Optional<CustomRepositoryImplementationDetector> detector) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2011-2014 the original author or authors.
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@ import org.springframework.data.repository.cdi.CdiRepositoryExtensionSupport;
/**
* CDI extension to export Mongo repositories.
*
*
* @author Oliver Gierke
* @author Mark Paluch
*/
@@ -93,7 +93,7 @@ public class MongoRepositoryExtension extends CdiRepositoryExtensionSupport {
/**
* Creates a {@link CdiRepositoryBean} for the repository of the given type.
*
*
* @param <T> the type of the repository.
* @param repositoryType the class representing the repository.
* @param qualifiers the qualifiers to be applied to the bean.
@@ -113,6 +113,6 @@ public class MongoRepositoryExtension extends CdiRepositoryExtensionSupport {
// Construct and return the repository bean.
return new MongoRepositoryBean<T>(mongoOperations, qualifiers, repositoryType, beanManager,
Optional.ofNullable(getCustomImplementationDetector()));
Optional.of(getCustomImplementationDetector()));
}
}

View File

@@ -32,6 +32,7 @@ import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.data.mongodb.core.query.TextCriteria;
import org.springframework.data.repository.query.ParameterAccessor;
import org.springframework.data.util.TypeInformation;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
@@ -39,7 +40,7 @@ import com.mongodb.DBRef;
/**
* Custom {@link ParameterAccessor} that uses a {@link MongoWriter} to serialize parameters into Mongo format.
*
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Thomas Darimont
@@ -52,7 +53,7 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
/**
* Creates a new {@link ConvertingParameterAccessor} with the given {@link MongoWriter} and delegate.
*
*
* @param writer must not be {@literal null}.
* @param delegate must not be {@literal null}.
*/
@@ -136,12 +137,13 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
/**
* Converts the given value with the underlying {@link MongoWriter}.
*
*
* @param value can be {@literal null}.
* @param typeInformation can be {@literal null}.
* @return
*/
private Object getConvertedValue(Object value, TypeInformation<?> typeInformation) {
@Nullable
private Object getConvertedValue(Object value, @Nullable TypeInformation<?> typeInformation) {
return writer.convertToMongoType(value, typeInformation == null ? null : typeInformation.getActualType());
}
@@ -155,7 +157,7 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
/**
* Custom {@link Iterator} to convert items before returning them.
*
*
* @author Oliver Gierke
*/
private class ConvertingIterator implements PotentiallyConvertingIterator {
@@ -164,7 +166,7 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
/**
* Creates a new {@link ConvertingIterator} for the given delegate.
*
*
* @param delegate
*/
public ConvertingIterator(Iterator<Object> delegate) {
@@ -229,11 +231,11 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
* Returns the given object as {@link Collection}. Will do a copy of it if it implements {@link Iterable} or is an
* array. Will return an empty {@link Collection} in case {@literal null} is given. Will wrap all other types into a
* single-element collection.
*
*
* @param source
* @return
*/
private static Collection<?> asCollection(Object source) {
private static Collection<?> asCollection(@Nullable Object source) {
if (source instanceof Iterable) {
@@ -263,14 +265,14 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
/**
* Custom {@link Iterator} that adds a method to access elements in a converted manner.
*
*
* @author Oliver Gierke
*/
public interface PotentiallyConvertingIterator extends Iterator<Object> {
/**
* Returns the next element which has already been converted.
*
*
* @return
*/
Object nextConverted(MongoPersistentProperty property);

View File

@@ -35,6 +35,7 @@ import org.springframework.data.repository.query.EvaluationContextProvider;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -77,7 +78,7 @@ class ExpressionEvaluatingParameterBinder {
* Bind values provided by {@link MongoParameterAccessor} to placeholders in {@literal raw} while considering
* potential conversions and parameter types.
*
* @param raw can be {@literal null} or empty.
* @param raw can be empty.
* @param accessor must not be {@literal null}.
* @param bindingContext must not be {@literal null}.
* @return {@literal null} if given {@code raw} value is empty.
@@ -85,7 +86,7 @@ class ExpressionEvaluatingParameterBinder {
public String bind(String raw, MongoParameterAccessor accessor, BindingContext bindingContext) {
if (!StringUtils.hasText(raw)) {
return null;
return raw;
}
return replacePlaceholders(raw, accessor, bindingContext);
@@ -147,7 +148,8 @@ class ExpressionEvaluatingParameterBinder {
* @param raw the raw binding value
* @param isExpression {@literal true} if the binding value results from a SpEL expression.
*/
private void postProcessQuotedBinding(StringBuffer buffer, String valueForBinding, Object raw, boolean isExpression) {
private void postProcessQuotedBinding(StringBuffer buffer, String valueForBinding, @Nullable Object raw,
boolean isExpression) {
int quotationMarkIndex = buffer.length() - valueForBinding.length() - 1;
char quotationMark = buffer.charAt(quotationMarkIndex);
@@ -230,6 +232,7 @@ class ExpressionEvaluatingParameterBinder {
* @param parameterValues must not be {@literal null}.
* @return
*/
@Nullable
private Object evaluateExpression(String expressionString, MongoParameters parameters, Object[] parameterValues) {
EvaluationContext evaluationContext = evaluationContextProvider.getEvaluationContext(parameters, parameterValues);
@@ -390,7 +393,7 @@ class ExpressionEvaluatingParameterBinder {
private int parameterIndex;
private final String parameter;
private final boolean quoted;
private final String suffix;
private final @Nullable String suffix;
/*
* (non-Javadoc)

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2011-2015 the original author or authors.
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,19 +20,21 @@ import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.query.TextCriteria;
import org.springframework.data.repository.query.ParameterAccessor;
import org.springframework.lang.Nullable;
/**
* Mongo-specific {@link ParameterAccessor} exposing a maximum distance parameter.
*
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Thomas Darimont
* @author Mark Paluch
*/
public interface MongoParameterAccessor extends ParameterAccessor {
/**
* Returns a {@link Distance} to be applied to Mongo geo queries.
*
*
* @return the maximum distance to apply to the geo query or {@literal null} if there's no {@link Distance} parameter
* at all or the given value for it was {@literal null}.
*/
@@ -40,22 +42,23 @@ public interface MongoParameterAccessor extends ParameterAccessor {
/**
* Returns the {@link Point} to use for a geo-near query.
*
*
* @return
*/
Point getGeoNearLocation();
/**
* Returns the {@link TextCriteria} to be used for full text query.
*
*
* @return null if not set.
* @since 1.6
*/
@Nullable
TextCriteria getFullText();
/**
* Returns the raw parameter values of the underlying query method.
*
*
* @return
* @since 1.8
*/

View File

@@ -29,23 +29,22 @@ import org.springframework.data.mongodb.repository.query.MongoParameters.MongoPa
import org.springframework.data.repository.query.Parameter;
import org.springframework.data.repository.query.Parameters;
import org.springframework.data.util.ClassTypeInformation;
import org.springframework.data.util.ReflectionUtils;
import org.springframework.data.util.TypeInformation;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
/**
* Custom extension of {@link Parameters} discovering additional
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
*/
public class MongoParameters extends Parameters<MongoParameters, MongoParameter> {
private final int rangeIndex;
private final int maxDistanceIndex;
private final Integer fullTextIndex;
private final Integer nearIndex;
private final @Nullable Integer fullTextIndex;
private final @Nullable Integer nearIndex;
/**
* Creates a new {@link MongoParameters} instance from the given {@link Method} and {@link MongoQueryMethod}.
@@ -74,8 +73,8 @@ public class MongoParameters extends Parameters<MongoParameters, MongoParameter>
this.nearIndex = index;
}
private MongoParameters(List<MongoParameter> parameters, int maxDistanceIndex, Integer nearIndex,
Integer fullTextIndex, int rangeIndex) {
private MongoParameters(List<MongoParameter> parameters, int maxDistanceIndex, @Nullable Integer nearIndex,
@Nullable Integer fullTextIndex, int rangeIndex) {
super(parameters);

View File

@@ -24,15 +24,17 @@ import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.query.Term;
import org.springframework.data.mongodb.core.query.TextCriteria;
import org.springframework.data.repository.query.ParametersParameterAccessor;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
/**
* Mongo-specific {@link ParametersParameterAccessor} to allow access to the {@link Distance} parameter.
*
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Thomas Darimont
* @author Mark Paluch
*/
public class MongoParametersParameterAccessor extends ParametersParameterAccessor implements MongoParameterAccessor {
@@ -41,7 +43,7 @@ public class MongoParametersParameterAccessor extends ParametersParameterAccesso
/**
* Creates a new {@link MongoParametersParameterAccessor}.
*
*
* @param method must not be {@literal null}.
* @param values must not be {@literal null}.
*/
@@ -103,6 +105,7 @@ public class MongoParametersParameterAccessor extends ParametersParameterAccesso
* (non-Javadoc)
* @see org.springframework.data.mongodb.repository.query.MongoParameterAccessor#getFullText()
*/
@Nullable
@Override
public TextCriteria getFullText() {
int index = method.getParameters().getFullTextParameterIndex();
@@ -130,7 +133,7 @@ public class MongoParametersParameterAccessor extends ParametersParameterAccesso
ClassUtils.getShortName(fullText.getClass())));
}
/*
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.repository.query.MongoParameterAccessor#getValues()
*/

View File

@@ -164,10 +164,7 @@ interface MongoQueryExecution {
distances.getUpperBound().getValue().ifPresent(it -> nearQuery.maxDistance(it).in(it.getMetric()));
Pageable pageable = accessor.getPageable();
if (pageable != null) {
nearQuery.with(pageable);
}
nearQuery.with(pageable);
return (GeoResults<Object>) operation.near(nearQuery).all();
}

View File

@@ -103,6 +103,7 @@ public class MongoQueryMethod extends QueryMethod {
*
* @return
*/
@Nullable
String getAnnotatedQuery() {
return findAnnotatedQuery().orElse(null);
}
@@ -204,6 +205,7 @@ public class MongoQueryMethod extends QueryMethod {
*
* @return
*/
@Nullable
Query getQueryAnnotation() {
return AnnotatedElementUtils.findMergedAnnotation(method, Query.class);
}
@@ -226,6 +228,7 @@ public class MongoQueryMethod extends QueryMethod {
* @return
* @since 1.6
*/
@Nullable
Meta getMetaAnnotation() {
return AnnotatedElementUtils.findMergedAnnotation(method, Meta.class);
}
@@ -236,6 +239,7 @@ public class MongoQueryMethod extends QueryMethod {
* @return
* @since 2.0
*/
@Nullable
Tailable getTailableAnnotation() {
return AnnotatedElementUtils.findMergedAnnotation(method, Tailable.class);
}

View File

@@ -33,6 +33,7 @@ import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.data.repository.query.ReturnedType;
import org.springframework.data.repository.util.ReactiveWrappers;
import org.springframework.data.util.TypeInformation;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
import com.mongodb.client.result.DeleteResult;
@@ -124,7 +125,7 @@ interface ReactiveMongoQueryExecution {
}
@SuppressWarnings({ "unchecked", "rawtypes" })
protected Flux<GeoResult<Object>> doExecuteQuery(Query query, Class<?> type, String collection) {
protected Flux<GeoResult<Object>> doExecuteQuery(@Nullable Query query, Class<?> type, String collection) {
Point nearLocation = accessor.getGeoNearLocation();
NearQuery nearQuery = NearQuery.near(nearLocation);
@@ -138,10 +139,7 @@ interface ReactiveMongoQueryExecution {
distances.getLowerBound().getValue().ifPresent(it -> nearQuery.minDistance(it).in(it.getMetric()));
Pageable pageable = accessor.getPageable();
if (pageable != null) {
nearQuery.with(pageable);
}
nearQuery.with(pageable);
return (Flux) operations.geoNear(nearQuery, type, collection);
}

View File

@@ -30,6 +30,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.repository.query.ExpressionEvaluatingParameterBinder.BindingContext;
import org.springframework.data.repository.query.EvaluationContextProvider;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -213,7 +214,7 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
* Returns a list of {@link ParameterBinding}s found in the given {@code input} or an
* {@link Collections#emptyList()}.
*
* @param input can be {@literal null} or empty.
* @param input can be empty.
* @param bindings must not be {@literal null}.
* @return
*/
@@ -372,7 +373,7 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
private final int parameterIndex;
private final boolean quoted;
private final String expression;
private final @Nullable String expression;
/**
* Creates a new {@link ParameterBinding} with the given {@code parameterIndex} and {@code quoted} information.
@@ -384,7 +385,7 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
this(parameterIndex, quoted, null);
}
public ParameterBinding(int parameterIndex, boolean quoted, String expression) {
public ParameterBinding(int parameterIndex, boolean quoted, @Nullable String expression) {
this.parameterIndex = parameterIndex;
this.quoted = quoted;
@@ -403,6 +404,7 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
return "?" + (isExpression() ? "expr" : "") + parameterIndex;
}
@Nullable
public String getExpression() {
return expression;
}

View File

@@ -38,7 +38,7 @@ import org.springframework.util.Assert;
/**
* {@link QueryCreationListener} inspecting {@link PartTreeMongoQuery}s and creating an index for the properties it
* refers to.
*
*
* @author Oliver Gierke
* @author Mark Paluch
* @author Christoph Strobl
@@ -52,7 +52,7 @@ class IndexEnsuringQueryCreationListener implements QueryCreationListener<PartTr
/**
* Creates a new {@link IndexEnsuringQueryCreationListener} using the given {@link MongoOperations}.
*
*
* @param indexOperationsProvider must not be {@literal null}.
*/
public IndexEnsuringQueryCreationListener(IndexOperationsProvider indexOperationsProvider) {
@@ -87,7 +87,7 @@ class IndexEnsuringQueryCreationListener implements QueryCreationListener<PartTr
}
// Add fixed sorting criteria to index
if (sort != null) {
if (sort.isSorted()) {
for (Order order : sort) {
index.on(order.getProperty(), order.getDirection());
}
@@ -100,7 +100,7 @@ class IndexEnsuringQueryCreationListener implements QueryCreationListener<PartTr
private static Direction toDirection(Sort sort, String property) {
if (sort == null) {
if (sort.isUnsorted()) {
return Direction.DESC;
}

View File

@@ -19,6 +19,7 @@ import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.repository.core.support.PersistentEntityInformation;
import org.springframework.lang.Nullable;
/**
* {@link MongoEntityInformation} implementation using a {@link MongoPersistentEntity} instance to lookup the necessary
@@ -33,7 +34,7 @@ public class MappingMongoEntityInformation<T, ID> extends PersistentEntityInform
implements MongoEntityInformation<T, ID> {
private final MongoPersistentEntity<T> entityMetadata;
private final String customCollectionName;
private final @Nullable String customCollectionName;
private final Class<ID> fallbackIdType;
/**
@@ -52,7 +53,7 @@ public class MappingMongoEntityInformation<T, ID> extends PersistentEntityInform
* @param entity must not be {@literal null}.
* @param fallbackIdType can be {@literal null}.
*/
public MappingMongoEntityInformation(MongoPersistentEntity<T> entity, Class<ID> fallbackIdType) {
public MappingMongoEntityInformation(MongoPersistentEntity<T> entity, @Nullable Class<ID> fallbackIdType) {
this(entity, null, fallbackIdType);
}
@@ -76,8 +77,8 @@ public class MappingMongoEntityInformation<T, ID> extends PersistentEntityInform
* @param idType can be {@literal null}.
*/
@SuppressWarnings("unchecked")
private MappingMongoEntityInformation(MongoPersistentEntity<T> entity, String customCollectionName,
Class<ID> idType) {
private MappingMongoEntityInformation(MongoPersistentEntity<T> entity, @Nullable String customCollectionName,
@Nullable Class<ID> idType) {
super(entity);
@@ -112,6 +113,6 @@ public class MappingMongoEntityInformation<T, ID> extends PersistentEntityInform
return super.getIdType();
}
return fallbackIdType != null ? fallbackIdType : (Class<ID>) ObjectId.class;
return fallbackIdType;
}
}

View File

@@ -18,6 +18,7 @@ package org.springframework.data.mongodb.repository.support;
import org.springframework.data.domain.Persistable;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
@@ -26,6 +27,7 @@ import org.springframework.util.ClassUtils;
* {@link MongoPersistentEntity}.
*
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.10
*/
final class MongoEntityInformationSupport {
@@ -40,7 +42,8 @@ final class MongoEntityInformationSupport {
* @return never {@literal null}.
*/
@SuppressWarnings("unchecked")
static <T, ID> MongoEntityInformation<T, ID> entityInformationFor(MongoPersistentEntity<?> entity, Class<?> idType) {
static <T, ID> MongoEntityInformation<T, ID> entityInformationFor(MongoPersistentEntity<?> entity,
@Nullable Class<?> idType) {
Assert.notNull(entity, "Entity must not be null!");

View File

@@ -144,7 +144,7 @@ public class MongoRepositoryFactory extends RepositoryFactorySupport {
}
private <T, ID> MongoEntityInformation<T, ID> getEntityInformation(Class<T> domainClass,
RepositoryMetadata metadata) {
@Nullable RepositoryMetadata metadata) {
MongoPersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(domainClass);
return MongoEntityInformationSupport.<T, ID> entityInformationFor(entity,

View File

@@ -113,7 +113,7 @@ public class ReactiveMongoRepositoryFactory extends ReactiveRepositoryFactorySup
@SuppressWarnings("unchecked")
private <T, ID> MongoEntityInformation<T, ID> getEntityInformation(Class<T> domainClass,
RepositoryInformation information) {
@Nullable RepositoryInformation information) {
MongoPersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(domainClass);

View File

@@ -36,6 +36,7 @@ import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.repository.support.PageableExecutionUtils;
import org.springframework.data.util.StreamUtils;
import org.springframework.data.util.Streamable;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -355,7 +356,7 @@ public class SimpleMongoRepository<T, ID> implements MongoRepository<T, ID> {
return where(entityInformation.getIdAttribute()).is(id);
}
private List<T> findAll(Query query) {
private List<T> findAll(@Nullable Query query) {
if (query == null) {
return Collections.emptyList();

View File

@@ -380,7 +380,7 @@ public class SimpleReactiveMongoRepository<T, ID extends Serializable> implement
Assert.notNull(entityStream, "The given Publisher of entities must not be null!");
return Flux.from(entityStream)//
.map(it -> entityInformation.getRequiredId(it))//
.map(entityInformation::getRequiredId)//
.flatMap(this::deleteById)//
.then();
}
@@ -404,10 +404,6 @@ public class SimpleReactiveMongoRepository<T, ID extends Serializable> implement
private Flux<T> findAll(Query query) {
if (query == null) {
return Flux.empty();
}
return mongoOperations.find(query, entityInformation.getJavaType(), entityInformation.getCollectionName());
}
}

View File

@@ -27,9 +27,10 @@ import com.mongodb.DBObject;
import com.querydsl.mongodb.AbstractMongodbQuery;
/**
* Spring Data specific {@link MongodbQuery} implementation.
*
* Spring Data specific {@link AbstractMongodbQuery} implementation.
*
* @author Oliver Gierke
* @author Mark Paluch
*/
public class SpringDataMongodbQuery<T> extends AbstractMongodbQuery<T, SpringDataMongodbQuery<T>> {
@@ -37,7 +38,7 @@ public class SpringDataMongodbQuery<T> extends AbstractMongodbQuery<T, SpringDat
/**
* Creates a new {@link SpringDataMongodbQuery}.
*
*
* @param operations must not be {@literal null}.
* @param type must not be {@literal null}.
*/
@@ -47,7 +48,7 @@ public class SpringDataMongodbQuery<T> extends AbstractMongodbQuery<T, SpringDat
/**
* Creates a new {@link SpringDataMongodbQuery} to query the given collection.
*
*
* @param operations must not be {@literal null}.
* @param type must not be {@literal null}.
* @param collectionName must not be {@literal null} or empty.
@@ -72,7 +73,7 @@ public class SpringDataMongodbQuery<T> extends AbstractMongodbQuery<T, SpringDat
* @see com.querydsl.mongodb.AbstractMongodbQuery#getCollection(java.lang.Class)
*/
@Override
protected DBCollection getCollection(@Nullable Class<?> type) {
protected DBCollection getCollection(Class<?> type) {
return ((MongoTemplate) operations).getMongoDbFactory().getLegacyDb()
.getCollection(operations.getCollectionName(type));
}

Some files were not shown because too many files have changed in this diff Show More