DATAMONGO-680, DATAMONGO-681 - Expose MongoOperations.exists(…).

We're now exposing dedicated exists(…) methods on MongoOperations which simply looks up a cursor and inspects it for the presence of at least one element. SimpleMongoRepository implementation now also uses this optimized exists check.
This commit is contained in:
Oliver Gierke
2013-05-24 09:34:37 +02:00
parent 818f739d5a
commit 97caba50bf
4 changed files with 42 additions and 11 deletions

View File

@@ -412,6 +412,12 @@ public interface MongoOperations {
*/
<T> T findOne(Query query, Class<T> entityClass, String collectionName);
boolean exists(Query query, String collectionName);
boolean exists(Query query, Class<?> entityClass);
boolean exists(Query query, Class<?> entityClass, String collectionName);
/**
* Map the results of an ad-hoc query on the collection for the entity class to a List of the specified type.
* <p/>

View File

@@ -481,6 +481,24 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware {
}
}
public boolean exists(Query query, Class<?> entityClass) {
return exists(query, entityClass, determineCollectionName(entityClass));
}
public boolean exists(Query query, String collectionName) {
return exists(query, null, collectionName);
}
public boolean exists(Query query, Class<?> entityClass, String collectionName) {
if (query == null) {
throw new InvalidDataAccessApiUsageException("Query passed in to exist can't be null");
}
DBObject mappedQuery = mapper.getMappedObject(query.getQueryObject(), getPersistentEntity(entityClass));
return execute(collectionName, new FindCallback(mappedQuery)).hasNext();
}
// Find methods that take a Query to express the query and that return a List of objects.
public <T> List<T> find(Query query, Class<T> entityClass) {

View File

@@ -49,13 +49,14 @@ public class SimpleMongoRepository<T, ID extends Serializable> implements MongoR
/**
* Creates a ew {@link SimpleMongoRepository} for the given {@link MongoEntityInformation} and {@link MongoTemplate}.
*
* @param metadata
* @param template
* @param metadata must not be {@literal null}.
* @param template must not be {@literal null}.
*/
public SimpleMongoRepository(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) {
Assert.notNull(mongoOperations);
Assert.notNull(metadata);
this.entityInformation = metadata;
this.mongoOperations = mongoOperations;
}
@@ -114,11 +115,8 @@ public class SimpleMongoRepository<T, ID extends Serializable> implements MongoR
public boolean exists(ID id) {
Assert.notNull(id, "The given id must not be null!");
final Query idQuery = getIdQuery(id);
idQuery.fields();
return mongoOperations.findOne(idQuery, entityInformation.getJavaType(), entityInformation.getCollectionName()) != null;
return mongoOperations.exists(getIdQuery(id), entityInformation.getJavaType(),
entityInformation.getCollectionName());
}
/*
@@ -126,7 +124,6 @@ public class SimpleMongoRepository<T, ID extends Serializable> implements MongoR
* @see org.springframework.data.repository.CrudRepository#count()
*/
public long count() {
return mongoOperations.getCollection(entityInformation.getCollectionName()).count();
}
@@ -166,7 +163,6 @@ public class SimpleMongoRepository<T, ID extends Serializable> implements MongoR
* @see org.springframework.data.repository.CrudRepository#deleteAll()
*/
public void deleteAll() {
mongoOperations.remove(new Query(), entityInformation.getCollectionName());
}
@@ -227,7 +223,6 @@ public class SimpleMongoRepository<T, ID extends Serializable> implements MongoR
* @return
*/
protected MongoOperations getMongoOperations() {
return this.mongoOperations;
}
@@ -235,7 +230,6 @@ public class SimpleMongoRepository<T, ID extends Serializable> implements MongoR
* @return the entityInformation
*/
protected MongoEntityInformation<T, ID> getEntityInformation() {
return entityInformation;
}
}

View File

@@ -1612,6 +1612,19 @@ public class MongoTemplateTests {
assertThat(result.get(0).containsField("first"), is(true));
}
@Test
public void executesExistsCorrectly() {
Sample sample = new Sample();
template.save(sample);
Query query = query(where("id").is(sample.id));
assertThat(template.exists(query, Sample.class), is(true));
assertThat(template.exists(query(where("_id").is(sample.id)), template.getCollectionName(Sample.class)), is(true));
assertThat(template.exists(query, Sample.class, template.getCollectionName(Sample.class)), is(true));
}
static class MyId {
String first;