Skip to content

Commit 0c9ee0e

Browse files
author
Thomas Risberg
committed
DATADOC-106 added support for $ne and $nor
1 parent 7f6a609 commit 0c9ee0e

File tree

8 files changed

+556
-459
lines changed

8 files changed

+556
-459
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java

+373-349
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright 2010-2011 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.document.mongodb.query;
17+
18+
public class NorCriteria extends OrCriteria {
19+
20+
public NorCriteria(Query[] queries) {
21+
super(queries);
22+
}
23+
24+
@Override
25+
protected String getOperator() {
26+
return "$nor";
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.springframework.data.document.mongodb.query;
2+
3+
public class NorQuery extends Query {
4+
5+
public NorQuery(Query... q) {
6+
super.nor(q);
7+
}
8+
9+
}

spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/OrCriteria.java

+23-17
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,31 @@
2121

2222
public class OrCriteria implements CriteriaDefinition {
2323

24-
Query[] queries = null;
24+
Query[] queries = null;
2525

26-
public OrCriteria(Query[] queries) {
27-
super();
28-
this.queries = queries;
29-
}
26+
public OrCriteria(Query[] queries) {
27+
super();
28+
this.queries = queries;
29+
}
3030

31+
/*
32+
* (non-Javadoc)
33+
*
34+
* @see org.springframework.datastore.document.mongodb.query.Criteria#
35+
* getCriteriaObject(java.lang.String)
36+
*/
37+
public DBObject getCriteriaObject() {
38+
DBObject dbo = new BasicDBObject();
39+
BasicBSONList l = new BasicBSONList();
40+
for (Query q : queries) {
41+
l.add(q.getQueryObject());
42+
}
43+
dbo.put(getOperator(), l);
44+
return dbo;
45+
}
3146

32-
/* (non-Javadoc)
33-
* @see org.springframework.datastore.document.mongodb.query.Criteria#getCriteriaObject(java.lang.String)
34-
*/
35-
public DBObject getCriteriaObject() {
36-
DBObject dbo = new BasicDBObject();
37-
BasicBSONList l = new BasicBSONList();
38-
for (Query q : queries) {
39-
l.add(q.getQueryObject());
40-
}
41-
dbo.put("$or", l);
42-
return dbo;
43-
}
47+
protected String getOperator() {
48+
return "$or";
49+
}
4450

4551
}

spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/OrQuery.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
public class OrQuery extends Query {
44

5-
public OrQuery(Query... q) {
6-
super.or(q);
7-
}
5+
public OrQuery(Query... q) {
6+
super.or(q);
7+
}
88

99
}

spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java

+5
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ public Query or(Query... queries) {
5555
return this;
5656
}
5757

58+
public Query nor(Query... queries) {
59+
this.criteria.put("$nor", new NorCriteria(queries));
60+
return this;
61+
}
62+
5863
public Field fields() {
5964
synchronized (this) {
6065
if (fieldSpec == null) {

spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/CriteriaTests.java

+7
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ public void testSimpleCriteria() {
2727
Assert.assertEquals("{ \"name\" : \"Bubba\"}", c.getCriteriaObject().toString());
2828
}
2929

30+
@Test
31+
public void testNotEqualCriteria() {
32+
Criteria c = new Criteria("name").ne("Bubba");
33+
Assert.assertEquals("{ \"name\" : { \"$ne\" : \"Bubba\"}}", c.getCriteriaObject().toString());
34+
}
35+
36+
3037
@Test
3138
public void testChainedCriteria() {
3239
Criteria c = new Criteria("name").is("Bubba").and("age").lt(21);

spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/QueryTests.java

+108-90
Original file line numberDiff line numberDiff line change
@@ -22,94 +22,112 @@
2222

2323
public class QueryTests {
2424

25-
@Test
26-
public void testSimpleQuery() {
27-
Query q = new Query(where("name").is("Thomas").and("age").lt(80));
28-
String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$lt\" : 80}}";
29-
Assert.assertEquals(expected, q.getQueryObject().toString());
30-
}
31-
32-
@Test
33-
public void testQueryWithNot() {
34-
Query q = new Query(where("name").is("Thomas").and("age").not().mod(10, 0));
35-
String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$not\" : { \"$mod\" : [ 10 , 0]}}}";
36-
Assert.assertEquals(expected, q.getQueryObject().toString());
37-
}
38-
39-
@Test
40-
public void testOrQuery() {
41-
Query q = new OrQuery(
42-
new Query(where("name").is("Sven").and("age").lt(50)),
43-
new Query(where("age").lt(50)),
44-
new BasicQuery("{'name' : 'Thomas'}")
45-
);
46-
String expected = "{ \"$or\" : [ { \"name\" : \"Sven\" , \"age\" : { \"$lt\" : 50}} , { \"age\" : { \"$lt\" : 50}} , { \"name\" : \"Thomas\"}]}";
47-
Assert.assertEquals(expected, q.getQueryObject().toString());
48-
}
49-
50-
@Test
51-
public void testQueryWithLimit() {
52-
Query q = new Query(where("name").gte("M").lte("T").and("age").not().gt(22));
53-
q.limit(50);
54-
String expected = "{ \"name\" : { \"$gte\" : \"M\" , \"$lte\" : \"T\"} , \"age\" : { \"$not\" : { \"$gt\" : 22}}}";
55-
Assert.assertEquals(expected, q.getQueryObject().toString());
56-
Assert.assertEquals(50, q.getLimit());
57-
}
58-
59-
@Test
60-
public void testQueryWithFieldsAndSlice() {
61-
Query q = new Query(where("name").gte("M").lte("T").and("age").not().gt(22));
62-
q.fields().exclude("address").include("name").slice("orders", 10);
63-
64-
String expected = "{ \"name\" : { \"$gte\" : \"M\" , \"$lte\" : \"T\"} , \"age\" : { \"$not\" : { \"$gt\" : 22}}}";
65-
Assert.assertEquals(expected, q.getQueryObject().toString());
66-
String expectedFields = "{ \"address\" : 0 , \"name\" : 1 , \"orders\" : { \"$slice\" : 10}}";
67-
Assert.assertEquals(expectedFields, q.getFieldsObject().toString());
68-
}
69-
70-
@Test
71-
public void testBasicQuery() {
72-
Query q = new BasicQuery("{ \"name\" : \"Thomas\"}").addCriteria(where("age").lt(80));
73-
String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$lt\" : 80}}";
74-
Assert.assertEquals(expected, q.getQueryObject().toString());
75-
}
76-
77-
@Test
78-
public void testSimpleQueryWithChainedCriteria() {
79-
Query q = new Query(where("name").is("Thomas").and("age").lt(80));
80-
String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$lt\" : 80}}";
81-
Assert.assertEquals(expected, q.getQueryObject().toString());
82-
}
83-
84-
@Test
85-
public void testComplexQueryWithMultipleChainedCriteria() {
86-
Query q = new Query(where("name").regex("^T.*").and("age").gt(20).lt(80).and("city").in("Stockholm", "London", "New York"));
87-
String expected = "{ \"name\" : { \"$regex\" : \"^T.*\"} , \"age\" : { \"$gt\" : 20 , \"$lt\" : 80} , " +
88-
"\"city\" : { \"$in\" : [ \"Stockholm\" , \"London\" , \"New York\"]}}";
89-
Assert.assertEquals(expected, q.getQueryObject().toString());
90-
}
91-
92-
@Test
93-
public void testAddCriteriaWithComplexQueryWithMultipleChainedCriteria() {
94-
Query q1 = new Query(where("name").regex("^T.*").and("age").gt(20).lt(80).and("city").in("Stockholm", "London", "New York"));
95-
Query q2 = new Query(where("name").regex("^T.*").and("age").gt(20).lt(80)).addCriteria(where("city").in("Stockholm", "London", "New York"));
96-
Assert.assertEquals(q1.getQueryObject().toString(), q2.getQueryObject().toString());
97-
Query q3 = new Query(where("name").regex("^T.*")).addCriteria(where("age").gt(20).lt(80)).addCriteria(where("city").in("Stockholm", "London", "New York"));
98-
Assert.assertEquals(q1.getQueryObject().toString(), q3.getQueryObject().toString());
99-
}
100-
101-
@Test
102-
public void testQueryWithElemMatch() {
103-
Query q = new Query(where("openingHours").elemMatch(where("dayOfWeek").is("Monday").and("open").lte("1800")));
104-
String expected = "{ \"openingHours\" : { \"$elemMatch\" : { \"dayOfWeek\" : \"Monday\" , \"open\" : { \"$lte\" : \"1800\"}}}}";
105-
Assert.assertEquals(expected, q.getQueryObject().toString());
106-
}
107-
108-
@Test
109-
public void testQueryWithIn() {
110-
Query q = new Query(where("state").in("NY", "NJ", "PA"));
111-
System.out.println(q.getQueryObject().toString());
112-
String expected = "{ \"state\" : { \"$in\" : [ \"NY\" , \"NJ\" , \"PA\"]}}";
113-
Assert.assertEquals(expected, q.getQueryObject().toString());
114-
}
25+
@Test
26+
public void testSimpleQuery() {
27+
Query q = new Query(where("name").is("Thomas").and("age").lt(80));
28+
String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$lt\" : 80}}";
29+
Assert.assertEquals(expected, q.getQueryObject().toString());
30+
}
31+
32+
@Test
33+
public void testQueryWithNot() {
34+
Query q = new Query(where("name").is("Thomas").and("age").not()
35+
.mod(10, 0));
36+
String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$not\" : { \"$mod\" : [ 10 , 0]}}}";
37+
Assert.assertEquals(expected, q.getQueryObject().toString());
38+
}
39+
40+
@Test
41+
public void testOrQuery() {
42+
Query q = new OrQuery(new Query(where("name").is("Sven").and("age")
43+
.lt(50)), new Query(where("age").lt(50)), new BasicQuery(
44+
"{'name' : 'Thomas'}"));
45+
String expected = "{ \"$or\" : [ { \"name\" : \"Sven\" , \"age\" : { \"$lt\" : 50}} , { \"age\" : { \"$lt\" : 50}} , { \"name\" : \"Thomas\"}]}";
46+
Assert.assertEquals(expected, q.getQueryObject().toString());
47+
}
48+
49+
@Test
50+
public void testNorQuery() {
51+
Query q = new NorQuery(new Query(where("name").is("Sven")), new Query(
52+
where("age").lt(50)), new BasicQuery("{'name' : 'Thomas'}"));
53+
String expected = "{ \"$nor\" : [ { \"name\" : \"Sven\"} , { \"age\" : { \"$lt\" : 50}} , { \"name\" : \"Thomas\"}]}";
54+
Assert.assertEquals(expected, q.getQueryObject().toString());
55+
}
56+
57+
@Test
58+
public void testQueryWithLimit() {
59+
Query q = new Query(where("name").gte("M").lte("T").and("age").not()
60+
.gt(22));
61+
q.limit(50);
62+
String expected = "{ \"name\" : { \"$gte\" : \"M\" , \"$lte\" : \"T\"} , \"age\" : { \"$not\" : { \"$gt\" : 22}}}";
63+
Assert.assertEquals(expected, q.getQueryObject().toString());
64+
Assert.assertEquals(50, q.getLimit());
65+
}
66+
67+
@Test
68+
public void testQueryWithFieldsAndSlice() {
69+
Query q = new Query(where("name").gte("M").lte("T").and("age").not()
70+
.gt(22));
71+
q.fields().exclude("address").include("name").slice("orders", 10);
72+
73+
String expected = "{ \"name\" : { \"$gte\" : \"M\" , \"$lte\" : \"T\"} , \"age\" : { \"$not\" : { \"$gt\" : 22}}}";
74+
Assert.assertEquals(expected, q.getQueryObject().toString());
75+
String expectedFields = "{ \"address\" : 0 , \"name\" : 1 , \"orders\" : { \"$slice\" : 10}}";
76+
Assert.assertEquals(expectedFields, q.getFieldsObject().toString());
77+
}
78+
79+
@Test
80+
public void testBasicQuery() {
81+
Query q = new BasicQuery("{ \"name\" : \"Thomas\"}").addCriteria(where(
82+
"age").lt(80));
83+
String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$lt\" : 80}}";
84+
Assert.assertEquals(expected, q.getQueryObject().toString());
85+
}
86+
87+
@Test
88+
public void testSimpleQueryWithChainedCriteria() {
89+
Query q = new Query(where("name").is("Thomas").and("age").lt(80));
90+
String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$lt\" : 80}}";
91+
Assert.assertEquals(expected, q.getQueryObject().toString());
92+
}
93+
94+
@Test
95+
public void testComplexQueryWithMultipleChainedCriteria() {
96+
Query q = new Query(where("name").regex("^T.*").and("age").gt(20)
97+
.lt(80).and("city").in("Stockholm", "London", "New York"));
98+
String expected = "{ \"name\" : { \"$regex\" : \"^T.*\"} , \"age\" : { \"$gt\" : 20 , \"$lt\" : 80} , "
99+
+ "\"city\" : { \"$in\" : [ \"Stockholm\" , \"London\" , \"New York\"]}}";
100+
Assert.assertEquals(expected, q.getQueryObject().toString());
101+
}
102+
103+
@Test
104+
public void testAddCriteriaWithComplexQueryWithMultipleChainedCriteria() {
105+
Query q1 = new Query(where("name").regex("^T.*").and("age").gt(20)
106+
.lt(80).and("city").in("Stockholm", "London", "New York"));
107+
Query q2 = new Query(where("name").regex("^T.*").and("age").gt(20)
108+
.lt(80)).addCriteria(where("city").in("Stockholm", "London",
109+
"New York"));
110+
Assert.assertEquals(q1.getQueryObject().toString(), q2.getQueryObject()
111+
.toString());
112+
Query q3 = new Query(where("name").regex("^T.*")).addCriteria(
113+
where("age").gt(20).lt(80)).addCriteria(
114+
where("city").in("Stockholm", "London", "New York"));
115+
Assert.assertEquals(q1.getQueryObject().toString(), q3.getQueryObject()
116+
.toString());
117+
}
118+
119+
@Test
120+
public void testQueryWithElemMatch() {
121+
Query q = new Query(where("openingHours").elemMatch(
122+
where("dayOfWeek").is("Monday").and("open").lte("1800")));
123+
String expected = "{ \"openingHours\" : { \"$elemMatch\" : { \"dayOfWeek\" : \"Monday\" , \"open\" : { \"$lte\" : \"1800\"}}}}";
124+
Assert.assertEquals(expected, q.getQueryObject().toString());
125+
}
126+
127+
@Test
128+
public void testQueryWithIn() {
129+
Query q = new Query(where("state").in("NY", "NJ", "PA"));
130+
String expected = "{ \"state\" : { \"$in\" : [ \"NY\" , \"NJ\" , \"PA\"]}}";
131+
Assert.assertEquals(expected, q.getQueryObject().toString());
132+
}
115133
}

0 commit comments

Comments
 (0)