From e9e9aafe100b78ff96850fba9b6c4143399282f1 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 6 Aug 2012 17:49:37 +0200 Subject: [PATCH] SGF-115 - Added support for Like, Contains, StartsWith and EndsWith keywords. --- .../query/PartTreeGemfireRepositoryQuery.java | 39 ++++++++++++++++++- .../gemfire/repository/query/Predicates.java | 7 +++- .../repository/sample/PersonRepository.java | 8 ++++ ...fireRepositoryFactoryIntegrationTests.java | 32 +++++++++++++++ 4 files changed, 84 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/gemfire/repository/query/PartTreeGemfireRepositoryQuery.java b/src/main/java/org/springframework/data/gemfire/repository/query/PartTreeGemfireRepositoryQuery.java index 56a1982f..4e3edc06 100644 --- a/src/main/java/org/springframework/data/gemfire/repository/query/PartTreeGemfireRepositoryQuery.java +++ b/src/main/java/org/springframework/data/gemfire/repository/query/PartTreeGemfireRepositoryQuery.java @@ -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 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; } } diff --git a/src/main/java/org/springframework/data/gemfire/repository/query/Predicates.java b/src/main/java/org/springframework/data/gemfire/repository/query/Predicates.java index 8d42093d..593cce7d 100644 --- a/src/main/java/org/springframework/data/gemfire/repository/query/Predicates.java +++ b/src/main/java/org/springframework/data/gemfire/repository/query/Predicates.java @@ -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 { } } } -} \ No newline at end of file +} diff --git a/src/test/java/org/springframework/data/gemfire/repository/sample/PersonRepository.java b/src/test/java/org/springframework/data/gemfire/repository/sample/PersonRepository.java index 4c7bb0bb..af406598 100644 --- a/src/test/java/org/springframework/data/gemfire/repository/sample/PersonRepository.java +++ b/src/test/java/org/springframework/data/gemfire/repository/sample/PersonRepository.java @@ -44,4 +44,12 @@ public interface PersonRepository extends CrudRepository { Collection findByFirstnameOrLastname(String firstname, String lastname); Person findByLastname(String lastname); + + Collection findByFirstnameLike(String firstname); + + Collection findByFirstnameStartingWith(String firstname); + + Collection findByLastnameEndingWith(String lastname); + + Collection findByFirstnameContaining(String firstname); } diff --git a/src/test/java/org/springframework/data/gemfire/repository/support/AbstractGemfireRepositoryFactoryIntegrationTests.java b/src/test/java/org/springframework/data/gemfire/repository/support/AbstractGemfireRepositoryFactoryIntegrationTests.java index 17381dc6..1dcf122a 100644 --- a/src/test/java/org/springframework/data/gemfire/repository/support/AbstractGemfireRepositoryFactoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/gemfire/repository/support/AbstractGemfireRepositoryFactoryIntegrationTests.java @@ -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 void assertResultsFound(Iterable result, T... expected) { assertThat(result, is(notNullValue()));