# HG changeset patch # User Mario Torre # Date 1358534341 -3600 # Node ID beda9a88a6467e56ecc08382e89693750ccf9894 # Parent 5c92b1c6da2134eff2ac0601a9e0831d7000b8a1 Fix query to allow chain where clauses review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-January/005238.html reviewwed-by: jerboaa diff -r 5c92b1c6da21 -r beda9a88a646 storage/core/src/main/java/com/redhat/thermostat/storage/core/Query.java --- a/storage/core/src/main/java/com/redhat/thermostat/storage/core/Query.java Fri Jan 18 19:39:00 2013 +0100 +++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/Query.java Fri Jan 18 19:39:01 2013 +0100 @@ -51,7 +51,7 @@ LESS_THAN, LESS_THAN_OR_EQUAL_TO, } - + enum SortDirection { ASCENDING(1), DESCENDING(-1); @@ -68,7 +68,7 @@ } void where(Key key, Criteria criteria, S value); - + void sort(Key key, SortDirection direction); void limit(int n); diff -r 5c92b1c6da21 -r beda9a88a646 storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoQuery.java --- a/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoQuery.java Fri Jan 18 19:39:00 2013 +0100 +++ b/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoQuery.java Fri Jan 18 19:39:01 2013 +0100 @@ -36,9 +36,13 @@ package com.redhat.thermostat.storage.mongodb.internal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Objects; import com.mongodb.BasicDBObject; +import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; import com.redhat.thermostat.storage.core.AbstractQuery; import com.redhat.thermostat.storage.core.Category; @@ -50,6 +54,8 @@ private MongoStorage storage; private BasicDBObject query = new BasicDBObject(); + private Map builerMap; + private boolean hasClauses = false; private Category category; private Class resultClass; @@ -58,6 +64,7 @@ this.storage = storage; this.category = category; this.resultClass = category.getDataClass(); + this.builerMap = new HashMap(); } public Category getCategory() { @@ -74,31 +81,45 @@ } public void where(String key, Criteria operator, Object value) { - switch (operator) { - case EQUALS: + + // strict equality is mutually exclusive on the key + if (operator.equals(Criteria.EQUALS)) { query.put(key, value); - break; - - case NOT_EQUAL_TO: - query.put(key, new BasicDBObject("$ne", value)); - break; - - case LESS_THAN: - query.put(key, new BasicDBObject("$lt", value)); - break; - - case LESS_THAN_OR_EQUAL_TO: - query.put(key, new BasicDBObject("$lte", value)); - break; - case GREATER_THAN: - query.put(key, new BasicDBObject("$gt", value)); - break; - - case GREATER_THAN_OR_EQUAL_TO: - query.put(key, new BasicDBObject("$gte", value)); - break; - default: - throw new IllegalArgumentException("MongoQuery can not handle " + operator); + + } else { + BasicDBObjectBuilder queryParameters = null; + if (builerMap.containsKey(key)) { + queryParameters = (BasicDBObjectBuilder) builerMap.get(key); + } else { + queryParameters = BasicDBObjectBuilder.start(); + builerMap.put(key, queryParameters); + } + + switch (operator) { + + case NOT_EQUAL_TO: + queryParameters.add("$ne", value); + break; + + case LESS_THAN: + queryParameters.add("$lt", value); + break; + + case LESS_THAN_OR_EQUAL_TO: + queryParameters.add("$lte", value); + break; + case GREATER_THAN: + queryParameters.add("$gt", value); + break; + + case GREATER_THAN_OR_EQUAL_TO: + queryParameters.add("$gte", value); + break; + + default: + throw new IllegalArgumentException("MongoQuery can not handle " + operator); + } + query.put(key, queryParameters.get()); } hasClauses = true; } diff -r 5c92b1c6da21 -r beda9a88a646 storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoQueryTest.java --- a/storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoQueryTest.java Fri Jan 18 19:39:00 2013 +0100 +++ b/storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoQueryTest.java Fri Jan 18 19:39:01 2013 +0100 @@ -45,6 +45,7 @@ import org.junit.Test; import com.mongodb.BasicDBObject; +import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; import com.redhat.thermostat.storage.core.Category; import com.redhat.thermostat.storage.core.Query.Criteria; @@ -121,6 +122,48 @@ assertEquals(new BasicDBObject("$lte", "value"), generatedQuery.get("key")); } + @Test + public void testMultiWhere() { + MongoQuery query = new MongoQuery<>(storage, category); + query.where("test", Criteria.LESS_THAN_OR_EQUAL_TO, 1); + query.where("test", Criteria.GREATER_THAN, 2); + + DBObject generatedQuery = query.getGeneratedQuery(); + DBObject dbObject = BasicDBObjectBuilder.start("$lte", 1).add("$gt", 2).get(); + assertEquals(dbObject, generatedQuery.get("test")); + } + + @Test + public void testMultiWhere2() { + MongoQuery query = new MongoQuery<>(storage, category); + query.where("test", Criteria.LESS_THAN_OR_EQUAL_TO, 1); + query.where("test2", Criteria.GREATER_THAN, 2); + + DBObject generatedQuery = query.getGeneratedQuery(); + assertEquals(new BasicDBObject("$lte", 1), generatedQuery.get("test")); + } + + @Test + public void testMultiWhere3() { + MongoQuery query = new MongoQuery<>(storage, category); + query.where("test", Criteria.EQUALS, 1); + query.where("test", Criteria.GREATER_THAN, 2); + + DBObject generatedQuery = query.getGeneratedQuery(); + assertEquals(new BasicDBObject("$gt", 2), generatedQuery.get("test")); + } + + @Test + public void testMultiWhere4() { + MongoQuery query = new MongoQuery<>(storage, category); + query.where("test", Criteria.EQUALS, 1); + query.where("test2", Criteria.GREATER_THAN, 2); + + DBObject generatedQuery = query.getGeneratedQuery(); + assertEquals(1, generatedQuery.get("test")); + assertEquals(new BasicDBObject("$gt", 2), generatedQuery.get("test2")); + } + private DBObject generateSimpleWhereQuery(String key, Criteria criteria, Object value) { MongoQuery query = new MongoQuery<>(storage, category); query.where(key, criteria, value);