package org.infinispan.query.distributed;
import static org.testng.AssertJUnit.assertEquals;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
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 non blocking MassIndexer
*
* @author gustavonalle
* @since 7.1
*/
@Test(groups = "functional", testName = "query.distributed.AsyncMassIndexTest")
public class AsyncMassIndexTest extends MultipleCacheManagersTest {
protected static final int NUM_NODES = 2;
protected List<Cache<Integer, Transaction>> caches = new ArrayList<>(NUM_NODES);
protected CleanupPhase cleanup = CleanupPhase.AFTER_METHOD;
@Override
@SuppressWarnings("unchecked")
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder cacheCfg = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false);
cacheCfg
.indexing()
.index(Index.LOCAL)
.addIndexedEntity(Transaction.class)
.addProperty("default.indexmanager", "org.infinispan.query.indexmanager.InfinispanIndexManager")
.addProperty("error_handler", "org.infinispan.query.helper.StaticTestingErrorHandler")
.addProperty("lucene_version", "LUCENE_CURRENT");
List<Cache<Integer, Transaction>> cacheList = createClusteredCaches(NUM_NODES, cacheCfg);
waitForClusterToForm(BasicCacheContainer.DEFAULT_CACHE_NAME);
for (Cache cache : cacheList) {
caches.add(cache);
}
}
private void populate(int elements) throws Exception {
Cache<Integer, Transaction> cache = caches.get(0);
for (int i = 0; i < elements; i++) {
cache.put(i, new Transaction(i + 200, "bytes"));
}
}
@Test
public void testListener() throws Exception {
Cache<Integer, Transaction> cache = caches.get(0);
int elements = 50;
populate(elements);
SearchManager searchManager = Search.getSearchManager(cache);
CompletableFuture<Void> future = searchManager.getMassIndexer().startAsync();
final CountDownLatch endLatch = new CountDownLatch(1);
future.whenComplete((v, t) -> {
endLatch.countDown();
});
endLatch.await();
checkIndex(elements, Transaction.class);
}
protected void checkIndex(int expectedNumber, Class<?> entity) {
Cache<Integer, Transaction> c = caches.get(0);
SearchManager searchManager = Search.getSearchManager(c);
CacheQuery<?> q = searchManager.getQuery(new MatchAllDocsQuery(), entity);
int resultSize = q.getResultSize();
assertEquals(expectedNumber, resultSize);
}
}