package org.infinispan.query.distributed; import static org.testng.AssertJUnit.assertEquals; import java.util.ArrayList; import java.util.List; import org.apache.lucene.search.MatchAllDocsQuery; import org.infinispan.Cache; import org.infinispan.commons.api.BasicCacheContainer; 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.Search; import org.infinispan.query.SearchManager; import org.infinispan.test.MultipleCacheManagersTest; import org.testng.annotations.Test; /** * Test for the MassIndexer for different entities sharing the same index and cache. * * @author gustavonalle * @since 7.1 */ @Test(groups = "functional", testName = "query.distributed.OverlappingIndexMassIndexTest") public class OverlappingIndexMassIndexTest extends MultipleCacheManagersTest { protected static final int NUM_NODES = 3; protected List<Cache<String, Object>> caches = new ArrayList<>(NUM_NODES); @Override @SuppressWarnings("unchecked") protected void createCacheManagers() throws Throwable { ConfigurationBuilder cacheCfg = getDefaultClusteredCacheConfig(CacheMode.REPL_SYNC, false); cacheCfg .indexing() .index(Index.ALL) .addIndexedEntity(Transaction.class) .addIndexedEntity(Block.class) .addProperty("default.directory_provider", "ram") .addProperty("error_handler", "org.infinispan.query.helper.StaticTestingErrorHandler") .addProperty("lucene_version", "LUCENE_CURRENT"); List<Cache<String, Object>> cacheList = createClusteredCaches(NUM_NODES, cacheCfg); waitForClusterToForm(BasicCacheContainer.DEFAULT_CACHE_NAME); for (Cache cache : cacheList) { caches.add(cache); } } public void testReindex() throws Exception { Transaction t1 = new Transaction(302, "04a27"); Transaction t2 = new Transaction(256, "ae461"); Transaction t3 = new Transaction(257, "ac537"); Block b1 = new Block(1, t1); Block b2 = new Block(2, t2); Block b3 = new Block(3, t3); caches.get(0).put("T1", t1); caches.get(0).put("T2", t2); caches.get(0).put("T3", t3); caches.get(0).put("B1", b1); caches.get(0).put("B2", b2); caches.get(0).put("B3", b3); checkIndex(3, Transaction.class, 3, Block.class); runMassIndexer(); checkIndex(3, Transaction.class, 3, Block.class); caches.get(0).clear(); runMassIndexer(); checkIndex(0, Transaction.class, 0, Block.class); } protected void checkIndex(int expectedNumber, Class<?> entity, int otherExpected, Class<?> otherEntity) { for (Cache<?, ?> c : caches) { SearchManager searchManager = Search.getSearchManager(c); CacheQuery<?> query1 = searchManager.getQuery(new MatchAllDocsQuery(), entity); CacheQuery<?> query2 = searchManager.getQuery(new MatchAllDocsQuery(), otherEntity); assertEquals(expectedNumber, query1.getResultSize()); assertEquals(otherExpected, query2.getResultSize()); } } protected void runMassIndexer() throws Exception { Cache cache = caches.get(0); SearchManager searchManager = Search.getSearchManager(cache); searchManager.getMassIndexer().start(); } }