|
|
|
@ -20,6 +20,8 @@ import java.util.Collection; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.bson.types.BasicBSONList; |
|
|
|
|
|
|
|
import org.springframework.dao.InvalidDataAccessApiUsageException; |
|
|
|
import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; |
|
|
|
import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; |
|
|
|
import org.springframework.data.mongodb.core.geo.Circle; |
|
|
|
import org.springframework.data.mongodb.core.geo.Circle; |
|
|
|
import org.springframework.data.mongodb.core.geo.Point; |
|
|
|
import org.springframework.data.mongodb.core.geo.Point; |
|
|
|
@ -30,6 +32,10 @@ import org.springframework.util.StringUtils; |
|
|
|
import com.mongodb.BasicDBObject; |
|
|
|
import com.mongodb.BasicDBObject; |
|
|
|
import com.mongodb.DBObject; |
|
|
|
import com.mongodb.DBObject; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Central class for creating queries. It follows a fluent API style so that you can easily chain together multiple |
|
|
|
|
|
|
|
* criteria. Static import of the 'Criteria.where' method will improve readability. |
|
|
|
|
|
|
|
*/ |
|
|
|
public class Criteria implements CriteriaDefinition { |
|
|
|
public class Criteria implements CriteriaDefinition { |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -45,6 +51,10 @@ public class Criteria implements CriteriaDefinition { |
|
|
|
|
|
|
|
|
|
|
|
private Object isValue = NOT_SET; |
|
|
|
private Object isValue = NOT_SET; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Criteria() { |
|
|
|
|
|
|
|
this.criteriaChain = new ArrayList<Criteria>(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public Criteria(String key) { |
|
|
|
public Criteria(String key) { |
|
|
|
this.criteriaChain = new ArrayList<Criteria>(); |
|
|
|
this.criteriaChain = new ArrayList<Criteria>(); |
|
|
|
this.criteriaChain.add(this); |
|
|
|
this.criteriaChain.add(this); |
|
|
|
@ -70,7 +80,6 @@ public class Criteria implements CriteriaDefinition { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* Static factory method to create a Criteria using the provided key |
|
|
|
* Static factory method to create a Criteria using the provided key |
|
|
|
* |
|
|
|
* |
|
|
|
* @param key |
|
|
|
|
|
|
|
* @return |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public Criteria and(String key) { |
|
|
|
public Criteria and(String key) { |
|
|
|
@ -356,6 +365,25 @@ public class Criteria implements CriteriaDefinition { |
|
|
|
criteria.put("$or", queries); |
|
|
|
criteria.put("$or", queries); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Criteria orOperator(Criteria... criteria) { |
|
|
|
|
|
|
|
BasicBSONList bsonList = createCriteriaList(criteria); |
|
|
|
|
|
|
|
criteriaChain.add(new Criteria("$or").is(bsonList)); |
|
|
|
|
|
|
|
return this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Criteria norOperator(Criteria... criteria) { |
|
|
|
|
|
|
|
BasicBSONList bsonList = createCriteriaList(criteria); |
|
|
|
|
|
|
|
criteriaChain.add(new Criteria("$nor").is(bsonList)); |
|
|
|
|
|
|
|
return this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Criteria andOperator(Criteria... criteria) { |
|
|
|
|
|
|
|
BasicBSONList bsonList = createCriteriaList(criteria); |
|
|
|
|
|
|
|
criteriaChain.add(new Criteria("$and").is(bsonList)); |
|
|
|
|
|
|
|
return this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public String getKey() { |
|
|
|
public String getKey() { |
|
|
|
return this.key; |
|
|
|
return this.key; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -372,7 +400,10 @@ public class Criteria implements CriteriaDefinition { |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
DBObject criteriaObject = new BasicDBObject(); |
|
|
|
DBObject criteriaObject = new BasicDBObject(); |
|
|
|
for (Criteria c : this.criteriaChain) { |
|
|
|
for (Criteria c : this.criteriaChain) { |
|
|
|
criteriaObject.putAll(c.getSingleCriteriaObject()); |
|
|
|
DBObject dbo = c.getSingleCriteriaObject(); |
|
|
|
|
|
|
|
for (String k : dbo.keySet()) { |
|
|
|
|
|
|
|
setValue(criteriaObject, k, dbo.get(k)); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return criteriaObject; |
|
|
|
return criteriaObject; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -405,4 +436,24 @@ public class Criteria implements CriteriaDefinition { |
|
|
|
return queryCriteria; |
|
|
|
return queryCriteria; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private BasicBSONList createCriteriaList(Criteria[] criteria) { |
|
|
|
|
|
|
|
BasicBSONList bsonList = new BasicBSONList(); |
|
|
|
|
|
|
|
for (Criteria c : criteria) { |
|
|
|
|
|
|
|
bsonList.add(c.getCriteriaObject()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return bsonList; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void setValue(DBObject dbo, String key, Object value) { |
|
|
|
|
|
|
|
Object existing = dbo.get(key); |
|
|
|
|
|
|
|
if (existing == null) { |
|
|
|
|
|
|
|
dbo.put(key, value); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
throw new InvalidDataAccessApiUsageException("Due to limitations of the com.mongodb.BasicDBObject, " + |
|
|
|
|
|
|
|
"you can't add a second '" + key + "' expression specified as '" + key + " : " + value + "'. " + |
|
|
|
|
|
|
|
"Criteria already contains '" + key + " : " + existing + "'."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|