diff --git a/src/main/java/org/springframework/data/gemfire/repository/query/QueryString.java b/src/main/java/org/springframework/data/gemfire/repository/query/QueryString.java index 5003cc05..0b3d7ae5 100644 --- a/src/main/java/org/springframework/data/gemfire/repository/query/QueryString.java +++ b/src/main/java/org/springframework/data/gemfire/repository/query/QueryString.java @@ -34,7 +34,8 @@ import com.gemstone.gemfire.cache.Region; */ class QueryString { - private static final String REGION_PATTERN = "(?<=\\/)\\w+"; + //private static final String REGION_PATTERN = "(?<=\\/)\\w+"; + private static final String REGION_PATTERN = "\\/\\w+"; private static final String IN_PARAMETER_PATTERN = "(?<=IN (SET|LIST) \\$)\\d"; private static final String IN_PATTERN = "(?<=IN (SET|LIST) )\\$\\d"; @@ -79,7 +80,7 @@ class QueryString { * @return */ public QueryString forRegion(Class domainClass, Region region) { - return new QueryString(query.replaceAll(REGION_PATTERN, region.getName())); + return new QueryString(query.replaceAll(REGION_PATTERN, region.getFullPath())); } /** diff --git a/src/test/java/org/springframework/data/gemfire/repository/query/QueryStringUnitTests.java b/src/test/java/org/springframework/data/gemfire/repository/query/QueryStringUnitTests.java index cdff5c0d..12e5173d 100644 --- a/src/test/java/org/springframework/data/gemfire/repository/query/QueryStringUnitTests.java +++ b/src/test/java/org/springframework/data/gemfire/repository/query/QueryStringUnitTests.java @@ -43,21 +43,25 @@ public class QueryStringUnitTests { @Test public void replacesDomainObjectWithRegionNameCorrectly() { - QueryString query = new QueryString("SELECT * FROM /Person p WHERE p.firstname = $1"); - when(region.getName()).thenReturn("foo"); + when(region.getFullPath()).thenReturn("/foo"); + assertThat(query.forRegion(Person.class, region).toString(), is("SELECT * FROM /foo p WHERE p.firstname = $1")); + + verify(region, never()).getName(); } //SGF-156 @Test public void replacesDomainObjectWithPluralRegionNameCorrectly() { - QueryString query = new QueryString("SELECT * FROM /Persons p WHERE p.firstname = $1"); - when(region.getName()).thenReturn("Persons"); + when(region.getFullPath()).thenReturn("/Persons"); + assertThat(query.forRegion(Person.class, region).toString(), is("SELECT * FROM /Persons p WHERE p.firstname = $1")); + + verify(region, never()).getName(); } @Test diff --git a/src/test/java/org/springframework/data/gemfire/repository/sample/Programmer.java b/src/test/java/org/springframework/data/gemfire/repository/sample/Programmer.java new file mode 100644 index 00000000..693f1f62 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/repository/sample/Programmer.java @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.gemfire.repository.sample; + +import org.springframework.data.gemfire.mapping.Region; +import org.springframework.util.StringUtils; + +/** + * The Programmer class is a User representing/modeling a software engineer/developer. + *

+ * @author John J. Blum + * @see org.springframework.data.gemfire.mapping.Region + * @see org.springframework.data.gemfire.repository.sample.User + * @since 1.0.0 + */ +@Region("Programmers") +@SuppressWarnings("unused") +public class Programmer extends User { + + protected static final String DEFAULT_PROGRAMMING_LANGUAGE = "?"; + + private String programmingLanguage; + + public Programmer(final String username) { + super(username); + } + + public String getProgrammingLanguage() { + return (StringUtils.hasText(programmingLanguage) ? programmingLanguage : DEFAULT_PROGRAMMING_LANGUAGE); + } + + public void setProgrammingLanguage(final String programmingLanguage) { + this.programmingLanguage = programmingLanguage; + } + + @Override + public String toString() { + return String.format("%1$s programs in '%2$s.", getUsername(), getProgrammingLanguage()); + } + +} diff --git a/src/test/java/org/springframework/data/gemfire/repository/sample/ProgrammerRepository.java b/src/test/java/org/springframework/data/gemfire/repository/sample/ProgrammerRepository.java new file mode 100644 index 00000000..9c6ca3b6 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/repository/sample/ProgrammerRepository.java @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.gemfire.repository.sample; + +import java.util.List; + +import org.springframework.data.gemfire.repository.GemfireRepository; + +/** + * The ProgrammerRepository class is a Data Access Object (DAO) for Programmer domain objects supporting basic CRUD + * and Query operations. + *

+ * @author John Blum + * @see org.springframework.data.gemfire.repository.GemfireRepository + * @see org.springframework.data.gemfire.repository.sample.Programmer + * @since 1.3.4 + */ +@SuppressWarnings("unused") +public interface ProgrammerRepository extends GemfireRepository { + + public List findDistinctByProgrammingLanguageOrderByUsernameAsc(String programmingLanguage); + + public List findDistinctByProgrammingLanguageLikeOrderByUsernameAsc(String programmingLanguage); + +} diff --git a/src/test/java/org/springframework/data/gemfire/repository/sample/SubRegionRepositoryIntegrationTest.java b/src/test/java/org/springframework/data/gemfire/repository/sample/SubRegionRepositoryIntegrationTest.java new file mode 100644 index 00000000..4aeb0460 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/repository/sample/SubRegionRepositoryIntegrationTest.java @@ -0,0 +1,173 @@ +/* + * Copyright 2010-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.gemfire.repository.sample; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Resource; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.gemfire.repository.Wrapper; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.gemstone.gemfire.cache.Region; + +/** + * The SubRegionRepositoryTest class is a test suite of test cases testing the use of GemFire Repositories on GemFire + * Cache Subregions. + *

+ * @author John Blum + * @see org.junit.Test + * @see org.junit.runner.RunWith + * @see org.springframework.data.gemfire.repository.Wrapper + * @see org.springframework.data.gemfire.repository.sample.Programmer + * @see org.springframework.data.gemfire.repository.sample.ProgrammerRepository + * @see org.springframework.test.context.ContextConfiguration + * @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner + * @see com.gemstone.gemfire.cache.Region + * @since 1.0.0 + */ +@ContextConfiguration("subregionRepository.xml") +@RunWith(SpringJUnit4ClassRunner.class) +@SuppressWarnings("unused") +public class SubRegionRepositoryIntegrationTest { + + private static final Map PROGRAMMER_DATA = new HashMap(23, 0.90f); + + static { + createProgrammer("AdaLovelace", "Ada"); + createProgrammer("AlanKay", "Smalltalk"); + createProgrammer("BjarneStroustrup", "C++"); + createProgrammer("BrendanEich", "JavaScript"); + createProgrammer("DennisRitchie", "C"); + createProgrammer("GuidoVanRossum", "Python"); + createProgrammer("JamesGosling", "Java"); + createProgrammer("JamesStrachan", "Groovy"); + createProgrammer("JohnBackus", "Fortran"); + createProgrammer("JohnKemeny", "BASIC"); + createProgrammer("JohnMcCarthy", "LISP"); + createProgrammer("JoshuaBloch", "Java"); + createProgrammer("LarryWall", "Perl"); + createProgrammer("MartinOdersky", "Scala"); + createProgrammer("NiklausWirth", "Modula-2"); + createProgrammer("NiklausWirth", "Pascal"); + createProgrammer("ThomasKurtz", "BASIC"); + createProgrammer("YukihiroMatsumoto", "Ruby"); + } + + @Autowired + private ProgrammerRepository programmersRepo; + + @Resource(name = "/Users/Programmers") + private Region programmers; + + protected static Programmer createProgrammer(final String username, final String programmingLanguage) { + Programmer programmer = new Programmer(username); + programmer.setProgrammingLanguage(programmingLanguage); + PROGRAMMER_DATA.put(username, programmer); + return programmer; + } + + protected static List getProgrammers(final String... usernames) { + List programmers = new ArrayList(usernames.length); + + for (String username : usernames) { + Programmer programmer = PROGRAMMER_DATA.get(username); + + if (programmer != null) { + programmers.add(PROGRAMMER_DATA.get(username)); + } + } + + Collections.sort(programmers); + + return programmers; + } + + @Before + public void setup() { + assertNotNull("The /Users/Programmers Subregion was null!", programmers); + + if (programmers.isEmpty()) { + programmers.putAll(PROGRAMMER_DATA); + } + + assertEquals(PROGRAMMER_DATA.size(), programmers.size()); + } + + @Test + public void testSubregionRepositoryInteractions() { + assertEquals(PROGRAMMER_DATA.get("JamesGosling"), programmersRepo.findOne("JamesGosling")); + + List javaProgrammers = programmersRepo.findDistinctByProgrammingLanguageOrderByUsernameAsc("Java"); + + assertNotNull(javaProgrammers); + assertFalse(javaProgrammers.isEmpty()); + assertEquals(2, javaProgrammers.size()); + assertTrue(javaProgrammers.containsAll(getProgrammers("JamesGosling", "JoshuaBloch"))); + + List groovyProgrammers = programmersRepo.findDistinctByProgrammingLanguageLikeOrderByUsernameAsc("Groovy"); + + assertNotNull(groovyProgrammers); + assertFalse(groovyProgrammers.isEmpty()); + assertEquals(1, groovyProgrammers.size()); + assertTrue(groovyProgrammers.containsAll(getProgrammers("JamesStrachan"))); + + programmersRepo.save(new Wrapper(createProgrammer("RodJohnson", "Java"), "RodJohnson")); + programmersRepo.save(new Wrapper(createProgrammer("GuillaumeLaforge", "Groovy"), "GuillaumeLaforge")); + programmersRepo.save(new Wrapper(createProgrammer("GraemeRocher", "Groovy"), "GraemeRocher")); + + javaProgrammers = programmersRepo.findDistinctByProgrammingLanguageOrderByUsernameAsc("Java"); + + assertNotNull(javaProgrammers); + assertFalse(javaProgrammers.isEmpty()); + assertEquals(3, javaProgrammers.size()); + assertTrue(javaProgrammers.containsAll(getProgrammers("JamesGosling", "JoshuaBloch", "RodJohnson"))); + + groovyProgrammers = programmersRepo.findDistinctByProgrammingLanguageLikeOrderByUsernameAsc("Groovy"); + + assertNotNull(groovyProgrammers); + assertFalse(groovyProgrammers.isEmpty()); + assertEquals(3, groovyProgrammers.size()); + assertTrue(groovyProgrammers.containsAll(getProgrammers("GraemeRocher", "GuillaumeLaforge", "JamesStrachan"))); + + List javaLikeProgrammers = programmersRepo.findDistinctByProgrammingLanguageLikeOrderByUsernameAsc("Java%"); + + assertNotNull(javaLikeProgrammers); + assertFalse(javaLikeProgrammers.isEmpty()); + assertEquals(4, javaLikeProgrammers.size()); + assertTrue(javaLikeProgrammers.containsAll(getProgrammers("BrendanEich", "JamesGosling", "JoshuaBloch", "RodJohnson"))); + + List pseudoCodeProgrammers = programmersRepo.findDistinctByProgrammingLanguageLikeOrderByUsernameAsc("PseudoCode"); + + assertNotNull(pseudoCodeProgrammers); + assertTrue(pseudoCodeProgrammers.isEmpty()); + } + +} diff --git a/src/test/java/org/springframework/data/gemfire/repository/sample/User.java b/src/test/java/org/springframework/data/gemfire/repository/sample/User.java index c777845a..323936a9 100644 --- a/src/test/java/org/springframework/data/gemfire/repository/sample/User.java +++ b/src/test/java/org/springframework/data/gemfire/repository/sample/User.java @@ -27,12 +27,14 @@ import org.springframework.util.ObjectUtils; * The User class represents an authorized user of a service or computer system, etc. *

* @author John Blum - * @since 1.3.3 (Spring Data GemFire) - * @since 7.0.1 (GemFire) + * @see java.lang.Comparable + * @see org.springframework.data.annotation.Id + * @see org.springframework.data.gemfire.mapping.Region + * @since 1.3.4 */ -@SuppressWarnings("unused") @Region("Users") -public class User { +@SuppressWarnings("unused") +public class User implements Comparable { private Boolean active = true; @@ -80,8 +82,9 @@ public class User { return username; } - private static boolean equalsIgnoreNull(final Object obj1, final Object obj2) { - return (obj1 == null ? obj2 == null : obj1.equals(obj2)); + @Override + public int compareTo(final User user) { + return getUsername().compareTo(user.getUsername()); } @Override diff --git a/src/test/java/org/springframework/data/gemfire/repository/sample/UserRepository.java b/src/test/java/org/springframework/data/gemfire/repository/sample/UserRepository.java index 11e73679..18ab249f 100644 --- a/src/test/java/org/springframework/data/gemfire/repository/sample/UserRepository.java +++ b/src/test/java/org/springframework/data/gemfire/repository/sample/UserRepository.java @@ -25,8 +25,9 @@ import org.springframework.data.gemfire.repository.GemfireRepository; *

* @author John Blum * @see org.springframework.data.gemfire.repository.GemfireRepository - * @since 1.3.3 (Spring Data GemFire) - * @since 7.0.1 (GemFire) + * @see org.springframework.data.gemfire.repository.Query + * @see org.springframework.data.gemfire.repository.sample.User + * @since 1.3.4 */ @SuppressWarnings("unused") public interface UserRepository extends GemfireRepository { diff --git a/src/test/resources/org/springframework/data/gemfire/repository/sample/subregionRepository.xml b/src/test/resources/org/springframework/data/gemfire/repository/sample/subregionRepository.xml new file mode 100644 index 00000000..b60ce37e --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/repository/sample/subregionRepository.xml @@ -0,0 +1,30 @@ + + + + + cacheInitializationTest + localhost[11235] + config + 0 + localhost[11235] + + + + + + + + + + +