package org.infinispan.query.blackbox; import static org.infinispan.query.helper.TestQueryHelperFactory.createQueryParser; import static org.testng.AssertJUnit.assertEquals; import java.util.List; import java.util.NoSuchElementException; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.infinispan.Cache; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.Index; import org.infinispan.query.CacheQuery; import org.infinispan.query.FetchOptions; import org.infinispan.query.ResultIterator; import org.infinispan.query.Search; import org.infinispan.query.SearchManager; import org.infinispan.query.helper.StaticTestingErrorHandler; import org.infinispan.query.test.Person; import org.infinispan.test.MultipleCacheManagersTest; import org.testng.annotations.Test; /** * ClusteredQueryTest. * * @author Israel Lacerra <israeldl@gmail.com> * @since 5.1 */ @Test(groups = "functional", testName = "query.blackbox.ClusteredQueryTest") public class ClusteredQueryTest extends MultipleCacheManagersTest { private final QueryParser queryParser = createQueryParser("blurb"); Cache<String, Person> cacheAMachine1, cacheAMachine2; CacheQuery<Person> cacheQuery; public ClusteredQueryTest() { // BasicConfigurator.configure(); cleanup = CleanupPhase.AFTER_METHOD; } protected void enhanceConfig(ConfigurationBuilder cacheCfg) { // meant to be overridden } @Override protected void createCacheManagers() throws Throwable { ConfigurationBuilder cacheCfg = getDefaultClusteredCacheConfig(getCacheMode(), false); cacheCfg .indexing() .index(Index.LOCAL) .addIndexedEntity(Person.class) .addProperty("default.directory_provider", "ram") .addProperty("error_handler", "org.infinispan.query.helper.StaticTestingErrorHandler") .addProperty("lucene_version", "LUCENE_CURRENT"); enhanceConfig(cacheCfg); List<Cache<String, Person>> caches = createClusteredCaches(2, cacheCfg); cacheAMachine1 = caches.get(0); cacheAMachine2 = caches.get(1); } protected CacheMode getCacheMode() { return CacheMode.REPL_SYNC; } protected void prepareTestData() { Person person1 = new Person(); person1.setName("NavinSurtani"); person1.setBlurb("Likes playing WoW"); person1.setAge(45); Person person2 = new Person(); person2.setName("BigGoat"); person2.setBlurb("Eats grass"); person2.setAge(30); Person person3 = new Person(); person3.setName("MiniGoat"); person3.setBlurb("Eats cheese"); person3.setAge(35); // Put the 3 created objects in the cache1. cacheAMachine2.put("Navin", person1); cacheAMachine1.put("BigGoat", person2); cacheAMachine1.put("MiniGoat", person3); Person person4 = new Person(); person4.setName("MightyGoat"); person4.setBlurb("Also eats grass"); person4.setAge(66); cacheAMachine1.put("newOne", person4); StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } public void testLazyOrdered() throws ParseException { populateCache(); // applying sort SortField sortField = new SortField("age", SortField.Type.INT); Sort sort = new Sort(sortField); cacheQuery.sort(sort); for (int i = 0; i < 2; i ++) { ResultIterator<Person> iterator = cacheQuery.iterator(new FetchOptions().fetchMode(FetchOptions.FetchMode.LAZY)); try { assert cacheQuery.getResultSize() == 4 : cacheQuery.getResultSize(); int previousAge = 0; while (iterator.hasNext()) { Person person = iterator.next(); assert person.getAge() > previousAge; previousAge = person.getAge(); } } finally { iterator.close(); } } StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } public void testLazyNonOrdered() throws ParseException { populateCache(); ResultIterator<Person> iterator = cacheQuery.iterator(new FetchOptions().fetchMode(FetchOptions.FetchMode.LAZY)); try { assert cacheQuery.getResultSize() == 4 : cacheQuery.getResultSize(); } finally { iterator.close(); } StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } public void testLocalQuery() throws ParseException { populateCache(); final SearchManager searchManager1 = Search.getSearchManager(cacheAMachine1); final CacheQuery<?> localQuery1 = searchManager1.getQuery(createLuceneQuery()); assertEquals(3, localQuery1.getResultSize()); final SearchManager searchManager2 = Search.getSearchManager(cacheAMachine2); final CacheQuery<?> localQuery2 = searchManager2.getQuery(createLuceneQuery()); assertEquals(1, localQuery2.getResultSize()); StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } public void testEagerOrdered() throws ParseException { populateCache(); // applying sort SortField sortField = new SortField("age", SortField.Type.INT); Sort sort = new Sort(sortField); cacheQuery.sort(sort); ResultIterator<Person> iterator = cacheQuery.iterator(new FetchOptions().fetchMode(FetchOptions.FetchMode.EAGER)); try { assertEquals(4, cacheQuery.getResultSize()); int previousAge = 0; while (iterator.hasNext()) { Person person = iterator.next(); assert person.getAge() > previousAge; previousAge = person.getAge(); } } finally { iterator.close(); } StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } @Test(expectedExceptions = NoSuchElementException.class, expectedExceptionsMessageRegExp = "Out of boundaries") public void testIteratorNextOutOfBounds() throws Exception { populateCache(); cacheQuery.maxResults(1); ResultIterator<Person> iterator = cacheQuery.iterator(new FetchOptions().fetchMode(FetchOptions.FetchMode.EAGER)); try { assert iterator.hasNext(); iterator.next(); assert !iterator.hasNext(); iterator.next(); } finally { iterator.close(); } StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } @Test(expectedExceptions = UnsupportedOperationException.class) public void testIteratorRemove() throws Exception { populateCache(); cacheQuery.maxResults(1); ResultIterator<Person> iterator = cacheQuery.iterator(new FetchOptions().fetchMode(FetchOptions.FetchMode.EAGER)); try { assert iterator.hasNext(); iterator.remove(); } finally { iterator.close(); } StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } public void testList() throws ParseException { populateCache(); // applying sort SortField sortField = new SortField("age", SortField.Type.INT); Sort sort = new Sort(sortField); cacheQuery.sort(sort); List<Person> results = cacheQuery.list(); assert results.size() == 4 : cacheQuery.getResultSize(); int previousAge = 0; for (Person person : results) { assert person.getAge() > previousAge; previousAge = person.getAge(); } StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } public void testGetResultSizeList() throws ParseException { populateCache(); assertEquals(4, cacheQuery.getResultSize()); } public void testPagination() throws ParseException { populateCache(); cacheQuery.firstResult(2); cacheQuery.maxResults(1); // applying sort SortField sortField = new SortField("age", SortField.Type.INT); Sort sort = new Sort(sortField); cacheQuery.sort(sort); List<Person> results = cacheQuery.list(); assertEquals(1, results.size()); assertEquals(4, cacheQuery.getResultSize()); Person result = results.get(0); assertEquals(45, result.getAge()); StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } public void testQueryAll() throws ParseException { populateCache(); CacheQuery<Person> clusteredQuery = Search.getSearchManager(cacheAMachine1) .getClusteredQuery(new MatchAllDocsQuery(), Person.class); assertEquals(4, clusteredQuery.list().size()); StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } private void populateCache() throws ParseException { prepareTestData(); cacheQuery = Search.getSearchManager(cacheAMachine1).getClusteredQuery(createLuceneQuery()); StaticTestingErrorHandler.assertAllGood(cacheAMachine1, cacheAMachine2); } private BooleanQuery createLuceneQuery() throws ParseException { return new BooleanQuery.Builder() .add(queryParser.parse("eats"), Occur.SHOULD) .add(queryParser.parse("playing"), Occur.SHOULD) .build(); } }