From 7e8b5971080360d66e0bc70692d05d3feffa7590 Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Sun, 19 Sep 2010 11:29:19 -0400 Subject: [PATCH] added support for $or criteria --- .../document/mongodb/query/BasicQuery.java | 25 ++++++++++++ .../{QueryCriterion.java => Criteria.java} | 40 +++++++++++-------- .../document/mongodb/query/CriteriaSpec.java | 9 +++++ .../document/mongodb/query/OrCriteria.java | 31 ++++++++++++++ .../document/mongodb/query/QueryBuilder.java | 12 +++--- 5 files changed, 96 insertions(+), 21 deletions(-) create mode 100644 src/main/java/org/springframework/datastore/document/mongodb/query/BasicQuery.java rename src/main/java/org/springframework/datastore/document/mongodb/query/{QueryCriterion.java => Criteria.java} (72%) create mode 100644 src/main/java/org/springframework/datastore/document/mongodb/query/CriteriaSpec.java create mode 100644 src/main/java/org/springframework/datastore/document/mongodb/query/OrCriteria.java diff --git a/src/main/java/org/springframework/datastore/document/mongodb/query/BasicQuery.java b/src/main/java/org/springframework/datastore/document/mongodb/query/BasicQuery.java new file mode 100644 index 000000000..321fed314 --- /dev/null +++ b/src/main/java/org/springframework/datastore/document/mongodb/query/BasicQuery.java @@ -0,0 +1,25 @@ +package org.springframework.datastore.document.mongodb.query; + +import com.mongodb.DBObject; +import com.mongodb.util.JSON; + +public class BasicQuery implements Query { + + private DBObject dbo = null; + + + public BasicQuery(String query) { + super(); + this.dbo = (DBObject) JSON.parse(query); + } + + public BasicQuery(DBObject dbo) { + super(); + this.dbo = dbo; + } + + public DBObject getQueryObject() { + return dbo; + } + +} diff --git a/src/main/java/org/springframework/datastore/document/mongodb/query/QueryCriterion.java b/src/main/java/org/springframework/datastore/document/mongodb/query/Criteria.java similarity index 72% rename from src/main/java/org/springframework/datastore/document/mongodb/query/QueryCriterion.java rename to src/main/java/org/springframework/datastore/document/mongodb/query/Criteria.java index 59a342f7a..16f071b37 100644 --- a/src/main/java/org/springframework/datastore/document/mongodb/query/QueryCriterion.java +++ b/src/main/java/org/springframework/datastore/document/mongodb/query/Criteria.java @@ -9,7 +9,7 @@ import org.springframework.datastore.document.InvalidDocumentStoreApiUageExcepti import com.mongodb.BasicDBObject; import com.mongodb.DBObject; -public class QueryCriterion { +public class Criteria implements CriteriaSpec { private QueryBuilder qb = null; @@ -18,13 +18,18 @@ public class QueryCriterion { private Object isValue = null; - public QueryCriterion(QueryBuilder qb) { + public Criteria(QueryBuilder qb) { super(); this.qb = qb; } - public QueryCriterion is(Object o) { + public Criteria and(String key) { + return qb.find(key); + } + + + public Criteria is(Object o) { if (isValue != null) { throw new InvalidDocumentStoreApiUageException("Multiple 'is' values declared."); } @@ -32,37 +37,37 @@ public class QueryCriterion { return this; } - public QueryCriterion lt(Object o) { + public Criteria lt(Object o) { criteria.put("$lt", o); return this; } - public QueryCriterion lte(Object o) { + public Criteria lte(Object o) { criteria.put("$lte", o); return this; } - public QueryCriterion gt(Object o) { + public Criteria gt(Object o) { criteria.put("$gt", o); return this; } - public QueryCriterion gte(Object o) { + public Criteria gte(Object o) { criteria.put("$gte", o); return this; } - public QueryCriterion in(Object... o) { + public Criteria in(Object... o) { criteria.put("$in", o); return this; } - public QueryCriterion nin(Object... o) { + public Criteria nin(Object... o) { criteria.put("$min", o); return this; } - public QueryCriterion mod(Number value, Number remainder) { + public Criteria mod(Number value, Number remainder) { List l = new ArrayList(); l.add(value); l.add(remainder); @@ -70,30 +75,30 @@ public class QueryCriterion { return this; } - public QueryCriterion all(Object o) { + public Criteria all(Object o) { criteria.put("$is", o); return this; } - public QueryCriterion size(Object o) { + public Criteria size(Object o) { criteria.put("$is", o); return this; } - public QueryCriterion exists(boolean b) { + public Criteria exists(boolean b) { return this; } - public QueryCriterion type(int t) { + public Criteria type(int t) { return this; } - public QueryCriterion not() { + public Criteria not() { criteria.put("$not", null); return this; } - public QueryCriterion regExp(String re) { + public Criteria regExp(String re) { return this; } @@ -105,6 +110,9 @@ public class QueryCriterion { return qb.build(); } + /* (non-Javadoc) + * @see org.springframework.datastore.document.mongodb.query.Criteria#getCriteriaObject(java.lang.String) + */ public DBObject getCriteriaObject(String key) { DBObject dbo = new BasicDBObject(); boolean not = false; diff --git a/src/main/java/org/springframework/datastore/document/mongodb/query/CriteriaSpec.java b/src/main/java/org/springframework/datastore/document/mongodb/query/CriteriaSpec.java new file mode 100644 index 000000000..d6804d3fc --- /dev/null +++ b/src/main/java/org/springframework/datastore/document/mongodb/query/CriteriaSpec.java @@ -0,0 +1,9 @@ +package org.springframework.datastore.document.mongodb.query; + +import com.mongodb.DBObject; + +public interface CriteriaSpec { + + DBObject getCriteriaObject(String key); + +} \ No newline at end of file diff --git a/src/main/java/org/springframework/datastore/document/mongodb/query/OrCriteria.java b/src/main/java/org/springframework/datastore/document/mongodb/query/OrCriteria.java new file mode 100644 index 000000000..b5f97e88f --- /dev/null +++ b/src/main/java/org/springframework/datastore/document/mongodb/query/OrCriteria.java @@ -0,0 +1,31 @@ +package org.springframework.datastore.document.mongodb.query; + +import org.bson.types.BasicBSONList; + +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; + +public class OrCriteria implements CriteriaSpec { + + Query[] queries = null; + + public OrCriteria(Query[] queries) { + super(); + this.queries = queries; + } + + + /* (non-Javadoc) + * @see org.springframework.datastore.document.mongodb.query.Criteria#getCriteriaObject(java.lang.String) + */ + public DBObject getCriteriaObject(String key) { + DBObject dbo = new BasicDBObject(); + BasicBSONList l = new BasicBSONList(); + for (Query q : queries) { + l.add(q.getQueryObject()); + } + dbo.put(key, l); + return dbo; + } + +} diff --git a/src/main/java/org/springframework/datastore/document/mongodb/query/QueryBuilder.java b/src/main/java/org/springframework/datastore/document/mongodb/query/QueryBuilder.java index afba5f3fc..dd0fa5f30 100644 --- a/src/main/java/org/springframework/datastore/document/mongodb/query/QueryBuilder.java +++ b/src/main/java/org/springframework/datastore/document/mongodb/query/QueryBuilder.java @@ -7,15 +7,17 @@ import com.mongodb.DBObject; public class QueryBuilder implements Query { - private LinkedHashMap criteria = new LinkedHashMap(); + private LinkedHashMap criteria = new LinkedHashMap(); - public QueryCriterion find(String key) { - QueryCriterion c = new QueryCriterion(this); + public Criteria find(String key) { + Criteria c = new Criteria(this); this.criteria.put(key, c); return c; } - public void or(Query... queries) { + public QueryBuilder or(Query... queries) { + this.criteria.put("$or", new OrCriteria(queries)); + return this; } public FieldSpecification fields() { @@ -41,7 +43,7 @@ public class QueryBuilder implements Query { public DBObject getQueryObject() { DBObject dbo = new BasicDBObject(); for (String k : criteria.keySet()) { - QueryCriterion c = criteria.get(k); + CriteriaSpec c = criteria.get(k); DBObject cl = c.getCriteriaObject(k); dbo.putAll(cl); }