package org.infinispan.query.distributed; import static org.testng.AssertJUnit.assertEquals; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.hibernate.search.query.dsl.QueryBuilder; import org.infinispan.Cache; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.Index; import org.infinispan.context.Flag; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.query.CacheQuery; import org.infinispan.query.Search; import org.infinispan.query.SearchManager; import org.infinispan.query.queries.faceting.Car; import org.infinispan.query.test.Person; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; /** * Tests for Mass Indexer in a local cache. * * @author gustavonalle * @since 7.1 */ @Test(groups = "functional", testName = "query.distributed.LocalCacheMassIndexerTest") public class LocalCacheMassIndexerTest extends SingleCacheManagerTest { private static final int NUM_ENTITIES = 2000; @Override protected EmbeddedCacheManager createCacheManager() throws Exception { ConfigurationBuilder cfg = getDefaultStandaloneCacheConfig(false); cfg.indexing().index(Index.ALL) .addIndexedEntity(Person.class) .addProperty("default.directory_provider", "ram") .addProperty("lucene_version", "LUCENE_CURRENT"); return TestCacheManagerFactory.createCacheManager(cfg); } private int indexSize(Cache<?, ?> cache) { SearchManager searchManager = Search.getSearchManager(cache); return searchManager.getQuery(new MatchAllDocsQuery(), Person.class).getResultSize(); } @Test public void testMassIndexer() { for (int i = 0; i < NUM_ENTITIES; i++) { cache.put(i, new Person("name" + i, "blurb" + i, i)); } SearchManager searchManager = Search.getSearchManager(cache); assertEquals(NUM_ENTITIES, indexSize(cache)); searchManager.getMassIndexer().start(); assertEquals(NUM_ENTITIES, indexSize(cache)); cache.clear(); searchManager.getMassIndexer().start(); assertEquals(0, indexSize(cache)); } public void testPartiallyReindex() throws Exception { cache.getAdvancedCache().withFlags(Flag.SKIP_INDEXING).put(0, new Person("name" + 0, "blurb" + 0, 0)); verifyFindsPerson(0, "name" + 0); Search.getSearchManager(cache).getMassIndexer().reindex(0).get(); verifyFindsPerson(1, "name" + 0); cache.remove(0); verifyFindsPerson(0, "name" + 0); } protected void verifyFindsPerson(int expectedCount, String name) throws Exception { SearchManager searchManager = Search.getSearchManager(cache); QueryBuilder carQueryBuilder = searchManager.buildQueryBuilderForClass(Person.class).get(); Query fullTextQuery = carQueryBuilder.keyword().onField("name").matching(name).createQuery(); CacheQuery<Car> cacheQuery = searchManager.getQuery(fullTextQuery, Person.class); assertEquals(expectedCount, cacheQuery.getResultSize()); } }