DATAMONGO-493 - Fixed broken $ne handling in QueryMapper.

$ne expressions are now only being tried to be converted into an ObjectId in case they follow an id property. Previously they tried in every case which might have led to Strings being converted into ObjectIds that accidentally were valid ObjectIds but didn't represent an id at all.
This commit is contained in:
Oliver Gierke
2012-07-24 20:43:52 +02:00
parent 726b0b1bcc
commit 761d725fce
2 changed files with 9 additions and 7 deletions

View File

@@ -85,6 +85,8 @@ public class QueryMapper {
ids.add(convertId(id));
}
valueDbo.put(inKey, ids.toArray(new Object[ids.size()]));
} else if (valueDbo.containsField("$ne")) {
valueDbo.put("$ne", convertId(valueDbo.get("$ne")));
} else {
value = getMappedObject((DBObject) value, null);
}
@@ -101,8 +103,6 @@ public class QueryMapper {
newConditions.add(getMappedObject((DBObject) iter.next(), null));
}
value = newConditions;
} else if (key.equals("$ne")) {
value = convertId(value);
}
newDbo.put(newKey, convertSimpleOrDBObject(value, null));

View File

@@ -218,17 +218,19 @@ public class QueryMapperUnitTests {
* @see DATAMONGO-493
*/
@Test
@SuppressWarnings({ "unchecked", "rawtypes" })
public void foo() {
public void doesNotTranslateNonIdPropertiesFor$NeCriteria() {
Query query = Query.query(Criteria.where("id").is("id_value").and("publishers").ne("a_string_value"));
ObjectId accidentallyAnObjectId = new ObjectId();
Query query = Query.query(Criteria.where("id").is("id_value").and("publishers")
.ne(accidentallyAnObjectId.toString()));
DBObject dbObject = mapper.getMappedObject(query.getQueryObject(), context.getPersistentEntity(UserEntity.class));
assertThat(dbObject.get("publishers"), isA((Class) DBObject.class));
assertThat(dbObject.get("publishers"), is(instanceOf(DBObject.class)));
DBObject publishers = (DBObject) dbObject.get("publishers");
assertThat(publishers.containsField("$ne"), is(true));
assertThat(publishers.get("$ne"), is((Object) "a_string_value"));
assertThat(publishers.get("$ne"), is(instanceOf(String.class)));
}
class IdWrapper {