Merge pull request #19 from SpringSource/SGF-115

SGF-115 - Added support for Like, Contains, StartsWith and EndsWith keywords.
This commit is contained in:
David Turanski
2012-08-06 10:03:56 -07:00
4 changed files with 84 additions and 2 deletions

View File

@@ -15,9 +15,13 @@
*/
package org.springframework.data.gemfire.repository.query;
import java.util.Iterator;
import org.springframework.data.gemfire.GemfireTemplate;
import org.springframework.data.repository.query.ParametersParameterAccessor;
import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.parser.Part;
import org.springframework.data.repository.query.parser.Part.Type;
import org.springframework.data.repository.query.parser.PartTree;
/**
@@ -63,6 +67,39 @@ public class PartTreeGemfireRepositoryQuery extends GemfireRepositoryQuery {
RepositoryQuery repositoryQuery = new StringBasedGemfireRepositoryQuery(query.toString(), method, template);
return repositoryQuery.execute(parameters);
return repositoryQuery.execute(prepareStringParameters(parameters));
}
private Object[] prepareStringParameters(Object[] parameters) {
Iterator<Part> iterator = tree.getParts().iterator();
Object[] result = new Object[parameters.length];
for (int i = 0; i < parameters.length; i++) {
Object parameter = parameters[i];
if (parameter == null) {
result[i] = parameter;
continue;
}
Type type = iterator.next().getType();
switch (type) {
case CONTAINING:
result[i] = String.format("%%%s%%", parameter.toString());
break;
case STARTING_WITH:
result[i] = String.format("%s%%", parameter.toString());
break;
case ENDING_WITH:
result[i] = String.format("%%%s", parameter.toString());
break;
default:
result[i] = parameter;
}
}
return result;
}
}

View File

@@ -162,6 +162,11 @@ class Predicates implements Predicate {
case IS_NOT_NULL:
case NEGATING_SIMPLE_PROPERTY:
return "!=";
case LIKE:
case STARTING_WITH:
case ENDING_WITH:
case CONTAINING:
return "LIKE";
case IS_NULL:
case SIMPLE_PROPERTY:
return "=";
@@ -170,4 +175,4 @@ class Predicates implements Predicate {
}
}
}
}
}

View File

@@ -44,4 +44,12 @@ public interface PersonRepository extends CrudRepository<Person, Long> {
Collection<Person> findByFirstnameOrLastname(String firstname, String lastname);
Person findByLastname(String lastname);
Collection<Person> findByFirstnameLike(String firstname);
Collection<Person> findByFirstnameStartingWith(String firstname);
Collection<Person> findByLastnameEndingWith(String lastname);
Collection<Person> findByFirstnameContaining(String firstname);
}

View File

@@ -153,6 +153,38 @@ public abstract class AbstractGemfireRepositoryFactoryIntegrationTests {
}
}
/**
* @see SGF-115
*/
@Test
public void executesStartsWithCorrectly() {
assertResultsFound(repository.findByFirstnameStartingWith("Da"), dave);
}
/**
* @see SGF-115
*/
@Test
public void executesEndsWithCorrectly() {
assertResultsFound(repository.findByLastnameEndingWith("ews"), dave, oliverAugust);
}
/**
* @see SGF-115
*/
@Test
public void executesContainsCorrectly() {
assertResultsFound(repository.findByFirstnameContaining("o"), boyd, leroi);
}
/**
* @see SGF-115
*/
@Test
public void executesLikeCorrectly() {
assertResultsFound(repository.findByFirstnameLike("Da%"), dave);
}
private <T> void assertResultsFound(Iterable<T> result, T... expected) {
assertThat(result, is(notNullValue()));