@ -20,6 +20,8 @@ import java.util.Collection;
@@ -20,6 +20,8 @@ import java.util.Collection;
import java.util.LinkedHashMap ;
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.core.geo.Circle ;
import org.springframework.data.mongodb.core.geo.Point ;
@ -30,6 +32,10 @@ import org.springframework.util.StringUtils;
@@ -30,6 +32,10 @@ import org.springframework.util.StringUtils;
import com.mongodb.BasicDBObject ;
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 {
/ * *
@ -45,6 +51,10 @@ public class Criteria implements CriteriaDefinition {
@@ -45,6 +51,10 @@ public class Criteria implements CriteriaDefinition {
private Object isValue = NOT_SET ;
public Criteria ( ) {
this . criteriaChain = new ArrayList < Criteria > ( ) ;
}
public Criteria ( String key ) {
this . criteriaChain = new ArrayList < Criteria > ( ) ;
this . criteriaChain . add ( this ) ;
@ -70,7 +80,6 @@ public class Criteria implements CriteriaDefinition {
@@ -70,7 +80,6 @@ public class Criteria implements CriteriaDefinition {
/ * *
* Static factory method to create a Criteria using the provided key
*
* @param key
* @return
* /
public Criteria and ( String key ) {
@ -356,6 +365,25 @@ public class Criteria implements CriteriaDefinition {
@@ -356,6 +365,25 @@ public class Criteria implements CriteriaDefinition {
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 ( ) {
return this . key ;
}
@ -372,7 +400,10 @@ public class Criteria implements CriteriaDefinition {
@@ -372,7 +400,10 @@ public class Criteria implements CriteriaDefinition {
} else {
DBObject criteriaObject = new BasicDBObject ( ) ;
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 ;
}
@ -405,4 +436,24 @@ public class Criteria implements CriteriaDefinition {
@@ -405,4 +436,24 @@ public class Criteria implements CriteriaDefinition {
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 + "'." ) ;
}
}
}