Skip to content
This repository has been archived by the owner on Jan 19, 2022. It is now read-only.

Commit

Permalink
property comparison query support implemented in MongoDB
Browse files Browse the repository at this point in the history
  • Loading branch information
Graeme Rocher authored and Graeme Rocher committed Sep 5, 2011
1 parent a7a00c1 commit 34a4543
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 22 deletions.
Expand Up @@ -642,19 +642,14 @@ public String getProperty() {
/**
* A Criterion that compares to properties
*/
public static class PropertyComparisonCriterion implements Criterion {
protected String name;
public static class PropertyComparisonCriterion extends PropertyNameCriterion{
protected String otherProperty;

public PropertyComparisonCriterion(String property, String otherProperty) {
this.name = property;
super(property);
this.otherProperty = otherProperty;
}

public String getProperty() {
return name;
}

public String getOtherProperty() {
return otherProperty;
}
Expand Down

This file was deleted.

Expand Up @@ -70,6 +70,9 @@ public class MongoQuery extends Query {
public static final String MONGO_NE_OPERATOR = "$ne";
public static final String MONGO_NIN_OPERATOR = "$nin";
public static final String MONGO_ID_REFERENCE_SUFFIX = ".$id";
public static final String MONGO_WHERE_OPERATOR = "$where";

private static final String MONGO_THIS_PREFIX = "this.";

static {
queryHandlers.put(IdEquals.class, new QueryHandler<IdEquals>() {
Expand All @@ -92,6 +95,50 @@ public void handle(PersistentEntity entity, Equals criterion, DBObject query) {
}
});

queryHandlers.put(EqualsProperty.class, new QueryHandler<EqualsProperty>() {
public void handle(PersistentEntity entity, EqualsProperty criterion, DBObject query) {
String propertyName = getPropertyName(entity, criterion);
String otherPropertyName = getPropertyName(entity, criterion.getOtherProperty());
addWherePropertyComparison(query, propertyName, otherPropertyName, "==");
}
});
queryHandlers.put(NotEqualsProperty.class, new QueryHandler<NotEqualsProperty>() {
public void handle(PersistentEntity entity, NotEqualsProperty criterion, DBObject query) {
String propertyName = getPropertyName(entity, criterion);
String otherPropertyName = getPropertyName(entity, criterion.getOtherProperty());
addWherePropertyComparison(query, propertyName, otherPropertyName, "!=");
}
});
queryHandlers.put(GreaterThanProperty.class, new QueryHandler<GreaterThanProperty>() {
public void handle(PersistentEntity entity, GreaterThanProperty criterion, DBObject query) {
String propertyName = getPropertyName(entity, criterion);
String otherPropertyName = getPropertyName(entity, criterion.getOtherProperty());
addWherePropertyComparison(query, propertyName, otherPropertyName, ">");
}
});
queryHandlers.put(LessThanProperty.class, new QueryHandler<LessThanProperty>() {
public void handle(PersistentEntity entity, LessThanProperty criterion, DBObject query) {
String propertyName = getPropertyName(entity, criterion);
String otherPropertyName = getPropertyName(entity, criterion.getOtherProperty());
addWherePropertyComparison(query, propertyName, otherPropertyName, "<");
}
});
queryHandlers.put(GreaterThanEqualsProperty.class, new QueryHandler<GreaterThanEqualsProperty>() {
public void handle(PersistentEntity entity, GreaterThanEqualsProperty criterion, DBObject query) {
String propertyName = getPropertyName(entity, criterion);
String otherPropertyName = getPropertyName(entity, criterion.getOtherProperty());
addWherePropertyComparison(query, propertyName, otherPropertyName, ">=");
}
});
queryHandlers.put(LessThanEqualsProperty.class, new QueryHandler<LessThanEqualsProperty>() {
public void handle(PersistentEntity entity, LessThanEqualsProperty criterion, DBObject query) {
String propertyName = getPropertyName(entity, criterion);
String otherPropertyName = getPropertyName(entity, criterion.getOtherProperty());
addWherePropertyComparison(query, propertyName, otherPropertyName, "<=");
}
});


queryHandlers.put(NotEquals.class, new QueryHandler<NotEquals>() {
public void handle(PersistentEntity entity, NotEquals criterion, DBObject query) {
DBObject notEqualQuery = new BasicDBObject();
Expand Down Expand Up @@ -324,6 +371,10 @@ public void handle(PersistentEntity entity, LessThanEquals criterion, DBObject q
});
}

private static void addWherePropertyComparison(DBObject query, String propertyName, String otherPropertyName, String operator) {
query.put(MONGO_WHERE_OPERATOR, new StringBuilder(MONGO_THIS_PREFIX).append(propertyName).append(operator).append(MONGO_THIS_PREFIX).append(otherPropertyName).toString());
}

private static void handleLike(PersistentEntity entity, Like like, DBObject query, boolean caseSensitive) {
Object value = like.getValue();
if (value == null) value = "null";
Expand Down Expand Up @@ -557,8 +608,12 @@ public static void populateMongoQuery(PersistentEntity entity, DBObject query, J
}

protected static String getPropertyName(PersistentEntity entity,
PropertyCriterion criterion) {
PropertyNameCriterion criterion) {
String propertyName = criterion.getProperty();
return getPropertyName(entity, propertyName);
}

private static String getPropertyName(PersistentEntity entity, String propertyName) {
if (entity.isIdentityName(propertyName)) {
propertyName = MongoEntityPersister.MONGO_ID_FIELD;
}
Expand Down

0 comments on commit 34a4543

Please sign in to comment.