package org.infinispan.query.distributed; import static org.testng.Assert.assertNull; import static org.testng.AssertJUnit.assertEquals; import java.util.List; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; 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.context.Flag; import org.infinispan.query.CacheQuery; import org.infinispan.query.Search; import org.infinispan.query.SearchManager; import org.infinispan.query.helper.StaticTestingErrorHandler; import org.infinispan.query.queries.faceting.Car; import org.infinispan.query.test.Person; import org.testng.annotations.Test; /** * Test the MassIndexer in a configuration of multiple entity types per cache. * * @author gustavonalle * @since 7.1 */ @Test(groups = "functional", testName = "query.distributed.MultipleEntitiesMassIndexTest") public class MultipleEntitiesMassIndexTest extends DistributedMassIndexingTest { protected void createCacheManagers() throws Throwable { // Person goes to RAM, Cars goes to Infinispan ConfigurationBuilder cacheCfg = getDefaultClusteredCacheConfig(CacheMode.REPL_SYNC, false); cacheCfg .indexing() .index(Index.ALL) .addIndexedEntity(Car.class) .addIndexedEntity(Person.class) .addProperty("hibernate.search.person.directory_provider", "ram") .addProperty("hibernate.search.car.indexmanager", "org.infinispan.query.indexmanager.InfinispanIndexManager") .addProperty("error_handler", "org.infinispan.query.helper.StaticTestingErrorHandler") .addProperty("lucene_version", "LUCENE_CURRENT"); List<Cache<String, Car>> cacheList = createClusteredCaches(2, cacheCfg); waitForClusterToForm(); for (Cache cache : cacheList) { caches.add(cache); } } @Override @SuppressWarnings("unchecked") public void testReindexing() throws Exception { caches.get(0).put(key("C1"), new Car("megane", "white", 300)); caches.get(1).put(key("P1"), new Person("james", "blurb", 23)); caches.get(1).put(key("P2"), new Person("tony", "blurb", 28)); caches.get(1).put(key("P3"), new Person("chris", "blurb", 26)); caches.get(1).put(key("P4"), new Person("iker", "blurb", 23)); caches.get(1).put(key("P5"), new Person("sergio", "blurb", 29)); checkIndex(5, Person.class); checkIndex(1, Car.class); checkIndex(1, "make", "megane", Car.class); checkIndex(1, "name", "james", Person.class); caches.get(1).put(key("C2"), new Car("megane", "blue", 300)); checkIndex(2, "make", "megane", Car.class); //add an entry without indexing it: caches.get(1).getAdvancedCache().withFlags(Flag.SKIP_INDEXING).put(key("C3"), new Car("megane", "blue", 300)); checkIndex(2, "make", "megane", Car.class); //re-sync datacontainer with indexes: rebuildIndexes(); checkIndex(5, Person.class); checkIndex(3, Car.class); checkIndex(3, "make", "megane", Car.class); checkIndex(1, "name", "tony", Person.class); //verify we cleanup old stale index values by removing the data but avoid touching the index caches.get(1).getAdvancedCache().withFlags(Flag.SKIP_INDEXING).remove(key("C2")); caches.get(1).getAdvancedCache().withFlags(Flag.SKIP_INDEXING).remove(key("P3")); assertNull(caches.get(1).get(key("P3"))); assertNull(caches.get(1).get(key("C2"))); checkIndex(3, "make", "megane", Car.class); checkIndex(5, Person.class); //re-sync rebuildIndexes(); checkIndex(2, Car.class); checkIndex(2, "make", "megane", Car.class); checkIndex(4, Person.class); } protected void checkIndex(int expectedCount, String fieldName, String fieldValue, Class<?> entity) throws ParseException { Query q = new QueryParser(fieldName, new StandardAnalyzer()).parse(fieldName + ":" + fieldValue); checkIndex(expectedCount, q, entity); } protected void checkIndex(int expectedCount, Class<?> entity) throws ParseException { checkIndex(expectedCount, new MatchAllDocsQuery(), entity); } private void checkIndex(int expectedCount, Query luceneQuery, Class<?> entity) throws ParseException { for (Cache cache : caches) { StaticTestingErrorHandler.assertAllGood(cache); SearchManager searchManager = Search.getSearchManager(cache); CacheQuery<?> cacheQuery = searchManager.getQuery(luceneQuery, entity); assertEquals(expectedCount, cacheQuery.getResultSize()); } } }