Skip to content

Commit ac7e3a7

Browse files
christophstroblodrotbohm
authored andcommitted
DATAMONGO-1166 - ReadPreference is now be used for aggregations.
We now use MongoTemplate.readPreference(…) when executing commands such as geoNear(…) and aggregate(…). Original pull request: spring-projects#303.
1 parent fa50f74 commit ac7e3a7

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ public CommandResult executeCommand(final DBObject command, final int options) {
335335

336336
CommandResult result = execute(new DbCallback<CommandResult>() {
337337
public CommandResult doInDB(DB db) throws MongoException, DataAccessException {
338-
return db.command(command, options);
338+
return readPreference != null ? db.command(command, readPreference) : db.command(command);
339339
}
340340
});
341341

@@ -566,7 +566,7 @@ public <T> GeoResults<T> geoNear(NearQuery near, Class<T> entityClass, String co
566566
BasicDBObject command = new BasicDBObject("geoNear", collection);
567567
command.putAll(near.toDBObject());
568568

569-
CommandResult commandResult = executeCommand(command);
569+
CommandResult commandResult = executeCommand(command, getDb().getOptions());
570570
List<Object> results = (List<Object>) commandResult.get("results");
571571
results = results == null ? Collections.emptyList() : results;
572572

@@ -1422,7 +1422,7 @@ protected <O> AggregationResults<O> aggregate(Aggregation aggregation, String co
14221422
LOGGER.debug("Executing aggregation: {}", serializeToJsonSafely(command));
14231423
}
14241424

1425-
CommandResult commandResult = executeCommand(command);
1425+
CommandResult commandResult = executeCommand(command, getDb().getOptions());
14261426
handleCommandError(commandResult, command);
14271427

14281428
// map results

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@
4343
import org.springframework.data.annotation.Id;
4444
import org.springframework.data.annotation.Version;
4545
import org.springframework.data.domain.Sort;
46+
import org.springframework.data.geo.Point;
4647
import org.springframework.data.mongodb.MongoDbFactory;
48+
import org.springframework.data.mongodb.core.aggregation.Aggregation;
4749
import org.springframework.data.mongodb.core.convert.CustomConversions;
4850
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
4951
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
@@ -52,18 +54,21 @@
5254
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
5355
import org.springframework.data.mongodb.core.query.BasicQuery;
5456
import org.springframework.data.mongodb.core.query.Criteria;
57+
import org.springframework.data.mongodb.core.query.NearQuery;
5558
import org.springframework.data.mongodb.core.query.Query;
5659
import org.springframework.data.mongodb.core.query.Update;
5760
import org.springframework.test.util.ReflectionTestUtils;
5861

5962
import com.mongodb.BasicDBObject;
6063
import com.mongodb.BasicDBObjectBuilder;
64+
import com.mongodb.CommandResult;
6165
import com.mongodb.DB;
6266
import com.mongodb.DBCollection;
6367
import com.mongodb.DBCursor;
6468
import com.mongodb.DBObject;
6569
import com.mongodb.Mongo;
6670
import com.mongodb.MongoException;
71+
import com.mongodb.ReadPreference;
6772

6873
/**
6974
* Unit tests for {@link MongoTemplate}.
@@ -352,6 +357,74 @@ public void processDocument(DBObject dbObject) throws MongoException, DataAccess
352357
assertThat(captor.getValue(), equalTo(new BasicDBObjectBuilder().add("foo", 1).get()));
353358
}
354359

360+
/**
361+
* @see DATAMONGO-1166
362+
*/
363+
@Test
364+
public void aggregateShouldHonorReadPreferenceWhenSet() {
365+
366+
CommandResult result = mock(CommandResult.class);
367+
368+
when(result.get("result")).thenReturn(Collections.emptySet());
369+
when(db.command(Mockito.any(DBObject.class), Mockito.any(ReadPreference.class))).thenReturn(result);
370+
when(db.command(Mockito.any(DBObject.class))).thenReturn(result);
371+
template.setReadPreference(ReadPreference.secondary());
372+
373+
template.aggregate(Aggregation.newAggregation(Aggregation.unwind("foo")), "collection-1", Wrapper.class);
374+
375+
verify(this.db, times(1)).command(Mockito.any(DBObject.class), eq(ReadPreference.secondary()));
376+
}
377+
378+
/**
379+
* @see DATAMONGO-1166
380+
*/
381+
@Test
382+
public void aggregateShouldIgnoreReadPreferenceWhenNotSet() {
383+
384+
CommandResult result = mock(CommandResult.class);
385+
386+
when(result.get("result")).thenReturn(Collections.emptySet());
387+
when(db.command(Mockito.any(DBObject.class), Mockito.any(ReadPreference.class))).thenReturn(result);
388+
when(db.command(Mockito.any(DBObject.class))).thenReturn(result);
389+
390+
template.aggregate(Aggregation.newAggregation(Aggregation.unwind("foo")), "collection-1", Wrapper.class);
391+
392+
verify(this.db, times(1)).command(Mockito.any(DBObject.class));
393+
}
394+
395+
/**
396+
* @see DATAMONGO-1166
397+
*/
398+
@Test
399+
public void geoNearShouldHonorReadPreferenceWhenSet() {
400+
401+
when(db.command(Mockito.any(DBObject.class), Mockito.any(ReadPreference.class)))
402+
.thenReturn(mock(CommandResult.class));
403+
when(db.command(Mockito.any(DBObject.class))).thenReturn(mock(CommandResult.class));
404+
template.setReadPreference(ReadPreference.secondary());
405+
406+
NearQuery query = NearQuery.near(new Point(1, 1));
407+
template.geoNear(query, Wrapper.class);
408+
409+
verify(this.db, times(1)).command(Mockito.any(DBObject.class), eq(ReadPreference.secondary()));
410+
}
411+
412+
/**
413+
* @see DATAMONGO-1166
414+
*/
415+
@Test
416+
public void geoNearShouldIgnoreReadPreferenceWhenNotSet() {
417+
418+
when(db.command(Mockito.any(DBObject.class), Mockito.any(ReadPreference.class)))
419+
.thenReturn(mock(CommandResult.class));
420+
when(db.command(Mockito.any(DBObject.class))).thenReturn(mock(CommandResult.class));
421+
422+
NearQuery query = NearQuery.near(new Point(1, 1));
423+
template.geoNear(query, Wrapper.class);
424+
425+
verify(this.db, times(1)).command(Mockito.any(DBObject.class));
426+
}
427+
355428
class AutogenerateableId {
356429

357430
@Id BigInteger id;

0 commit comments

Comments
 (0)