Skip to content

Commit 4f04987

Browse files
committed
JAVA-812: Only set $readPreference on a query if the read preference is not primary.
This lets the slaveOK bit have precedence if it's set.
1 parent cf49522 commit 4f04987

File tree

4 files changed

+81
-70
lines changed

4 files changed

+81
-70
lines changed

src/main/com/mongodb/DBCollection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ public DBObject findOne( DBObject o, DBObject fields, DBObject orderBy, ReadPref
722722
QueryOpBuilder queryOpBuilder = new QueryOpBuilder().addQuery(o).addOrderBy(orderBy);
723723

724724
if (getDB().getMongo().isMongosConnection()) {
725-
queryOpBuilder.addReadPreference(readPref.toDBObject());
725+
queryOpBuilder.addReadPreference(readPref);
726726
}
727727

728728
Iterator<DBObject> i = __find(queryOpBuilder.get(), fields , 0 , -1 , 0, getOptions(), readPref, getDecoder() );

src/main/com/mongodb/DBCursor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ private void _check() {
362362
.addSpecialFields(_specialFields);
363363

364364
if (_collection.getDB().getMongo().isMongosConnection()) {
365-
builder.addReadPreference(_readPref.toDBObject());
365+
builder.addReadPreference(_readPref);
366366
}
367367

368368
_it = _collection.__find(builder.get(), _keysWanted, _skip, _batchSize, _limit,

src/main/com/mongodb/QueryOpBuilder.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class QueryOpBuilder {
1313
private String hintStr;
1414
private boolean explain;
1515
private boolean snapshot;
16-
private DBObject readPref;
16+
private ReadPreference readPref;
1717

1818
private DBObject specialFields;
1919

@@ -93,16 +93,17 @@ public QueryOpBuilder addSnapshot(boolean snapshot){
9393
}
9494

9595
/**
96-
* Adds ReadPreference to the operation
97-
* @param readPref
98-
* @return
96+
* Adds a read preference to the query operation
97+
*
98+
* @param readPref the read preference
99+
* @return this
99100
*/
100-
public QueryOpBuilder addReadPreference(DBObject readPref){
101+
public QueryOpBuilder addReadPreference(ReadPreference readPref) {
101102
this.readPref = readPref;
102103
return this;
103104
}
104-
105-
/**
105+
106+
/**
106107
* Constructs the query operation DBObject
107108
* @return DBObject representing the query command to be sent to server
108109
*/
@@ -128,8 +129,8 @@ public DBObject get() {
128129
queryop.put("$explain", true);
129130
if (snapshot)
130131
queryop.put("$snapshot", true);
131-
if (readPref != null)
132-
queryop.put(READ_PREFERENCE_META_OPERATOR, readPref);
132+
if (readPref != null && readPref != ReadPreference.primary())
133+
queryop.put(READ_PREFERENCE_META_OPERATOR, readPref.toDBObject());
133134

134135
return queryop;
135136
}

src/test/com/mongodb/QueryOpTest.java

Lines changed: 69 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,70 +4,80 @@
44
import org.testng.annotations.*;
55

66
/**
7-
* Test that QueryOpBuilder creates query operations that abide by
8-
* @author stevebriskin
7+
* Test that QueryOpBuilder creates query operations that abide by
98
*
9+
* @author stevebriskin
1010
*/
11-
public class QueryOpTest extends TestCase{
12-
13-
@Test
14-
public void testQueryOnly(){
15-
DBObject query = QueryBuilder.start("x").greaterThan(1).get();
16-
DBObject obj = new QueryOpBuilder().addQuery(QueryBuilder.start("x").greaterThan(1).get()).get();
17-
assertEquals(query, obj);
18-
19-
assertNotNull(new QueryOpBuilder().get());
20-
21-
}
22-
23-
@Test
24-
public void testQueryAndOthers(){
25-
DBObject query = QueryBuilder.start("x").greaterThan(1).get();
26-
DBObject orderBy = new BasicDBObject("x", 1);
27-
DBObject hintObj = new BasicDBObject("x_i", 1);
28-
DBObject readPref = new BasicDBObject("$readPreference",ReadPreference.primary().toDBObject());
29-
String hintStr = "y_i";
30-
31-
32-
DBObject queryOp = new QueryOpBuilder().addQuery(query).addOrderBy(orderBy).addHint(hintStr).get();
33-
assertEquals(queryOp.get("$query"), query);
34-
assertEquals(queryOp.get("$orderby"), orderBy);
35-
assertEquals(queryOp.get("$hint"), hintStr);
36-
assertNull(queryOp.get("$explain"));
37-
assertNull(queryOp.get("$snapshot"));
38-
39-
//orderby should only be there if added
40-
queryOp = new QueryOpBuilder().addQuery(query).addHint(hintStr).get();
41-
assertEquals(queryOp.get("$query"), query);
42-
assertNull(queryOp.get("$orderby"));
43-
44-
//hintObj takes precedence over hintStr
45-
queryOp = new QueryOpBuilder().addQuery(query).addOrderBy(orderBy).addHint(hintStr).addHint(hintObj).get();
46-
assertEquals(queryOp.get("$query"), query);
47-
assertEquals(queryOp.get("$orderby"), orderBy);
48-
assertEquals(queryOp.get("$hint"), hintObj);
49-
50-
queryOp = new QueryOpBuilder().addQuery(query).addExplain(true).addSnapshot(true).get();
51-
assertEquals(queryOp.get("$query"), query);
52-
assertNull(queryOp.get("$orderby"));
53-
assertNull(queryOp.get("$hint"));
54-
assertEquals(queryOp.get("$explain"), true);
55-
assertEquals(queryOp.get("$snapshot"), true);
56-
57-
queryOp = new QueryOpBuilder().addQuery(query).addSpecialFields(new BasicDBObject("flag", "val")).get();
58-
assertEquals(queryOp.get("flag"), "val");
59-
assertEquals(queryOp.get("$query"), query);
60-
assertNull(queryOp.get("$orderby"));
61-
assertNull(queryOp.get("$hint"));
62-
assertNull(queryOp.get("$explain"));
63-
assertNull(queryOp.get("$snapshot"));
64-
65-
queryOp = new QueryOpBuilder().addQuery(query).addReadPreference(readPref).get();
11+
public class QueryOpTest extends TestCase {
12+
13+
@Test
14+
public void testQueryOnly() {
15+
DBObject query = QueryBuilder.start("x").greaterThan(1).get();
16+
DBObject obj = new QueryOpBuilder().addQuery(QueryBuilder.start("x").greaterThan(1).get()).get();
17+
assertEquals(query, obj);
18+
19+
assertNotNull(new QueryOpBuilder().get());
20+
21+
}
22+
23+
@Test
24+
public void testQueryAndOthers() {
25+
DBObject query = QueryBuilder.start("x").greaterThan(1).get();
26+
DBObject orderBy = new BasicDBObject("x", 1);
27+
DBObject hintObj = new BasicDBObject("x_i", 1);
28+
String hintStr = "y_i";
29+
30+
31+
DBObject queryOp = new QueryOpBuilder().addQuery(query).addOrderBy(orderBy).addHint(hintStr).get();
32+
assertEquals(queryOp.get("$query"), query);
33+
assertEquals(queryOp.get("$orderby"), orderBy);
34+
assertEquals(queryOp.get("$hint"), hintStr);
35+
assertNull(queryOp.get("$explain"));
36+
assertNull(queryOp.get("$snapshot"));
37+
38+
//orderby should only be there if added
39+
queryOp = new QueryOpBuilder().addQuery(query).addHint(hintStr).get();
40+
assertEquals(queryOp.get("$query"), query);
41+
assertNull(queryOp.get("$orderby"));
42+
43+
//hintObj takes precedence over hintStr
44+
queryOp = new QueryOpBuilder().addQuery(query).addOrderBy(orderBy).addHint(hintStr).addHint(hintObj).get();
45+
assertEquals(queryOp.get("$query"), query);
46+
assertEquals(queryOp.get("$orderby"), orderBy);
47+
assertEquals(queryOp.get("$hint"), hintObj);
48+
49+
queryOp = new QueryOpBuilder().addQuery(query).addExplain(true).addSnapshot(true).get();
50+
assertEquals(queryOp.get("$query"), query);
51+
assertNull(queryOp.get("$orderby"));
52+
assertNull(queryOp.get("$hint"));
53+
assertEquals(queryOp.get("$explain"), true);
54+
assertEquals(queryOp.get("$snapshot"), true);
55+
56+
queryOp = new QueryOpBuilder().addQuery(query).addSpecialFields(new BasicDBObject("flag", "val")).get();
57+
assertEquals(queryOp.get("flag"), "val");
58+
assertEquals(queryOp.get("$query"), query);
59+
assertNull(queryOp.get("$orderby"));
60+
assertNull(queryOp.get("$hint"));
61+
assertNull(queryOp.get("$explain"));
62+
assertNull(queryOp.get("$snapshot"));
63+
64+
65+
// only append $readPreference if the read preference is not ReadPreference.primary()
66+
67+
queryOp = new QueryOpBuilder().addQuery(query).addReadPreference(ReadPreference.primary()).get();
68+
assertEquals(queryOp.get("$query"), query);
69+
assertNull(queryOp.get("$orderby"));
70+
assertNull(queryOp.get("$hint"));
71+
assertNull(queryOp.get("$explain"));
72+
assertNull(queryOp.get("$snapshot"));
73+
assertNull(queryOp.get("$readPreference"));
74+
75+
queryOp = new QueryOpBuilder().addQuery(query).addReadPreference(ReadPreference.secondary()).get();
6676
assertEquals(queryOp.get("$query"), query);
6777
assertNull(queryOp.get("$orderby"));
6878
assertNull(queryOp.get("$hint"));
6979
assertNull(queryOp.get("$explain"));
7080
assertNull(queryOp.get("$snapshot"));
71-
assertEquals(queryOp.get("$readPreference"), readPref);
72-
}
81+
assertEquals(ReadPreference.secondary().toDBObject(), queryOp.get("$readPreference"));
82+
}
7383
}

0 commit comments

Comments
 (0)