package org.infinispan.query.blackbox;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import org.hibernate.search.engine.integration.impl.ExtendedSearchIntegrator;
import org.hibernate.search.engine.spi.EntityIndexBinding;
import org.hibernate.search.spi.SearchIntegrator;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.Index;
import org.infinispan.factories.ComponentRegistry;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.query.test.AnotherGrassEater;
import org.infinispan.query.test.Person;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.Test;
/**
* Tests that undeclared indexed entities are autodetected.
*
* @author anistor@redhat.com
* @since 8.2
*/
@Test(groups = {"functional", "smoke"}, testName = "query.blackbox.IndexedEntityAutodetectTest")
public class IndexedEntityAutodetectTest extends LocalCacheTest {
@Override
protected EmbeddedCacheManager createCacheManager() throws Exception {
// this configuration does not declare any indexed types on purpose, so they are autodetected
ConfigurationBuilder cfg = getDefaultStandaloneCacheConfig(true);
cfg
.indexing()
.index(Index.ALL)
.addProperty("default.directory_provider", "ram")
.addProperty("error_handler", "org.infinispan.query.helper.StaticTestingErrorHandler")
.addProperty("lucene_version", "LUCENE_CURRENT");
enhanceConfig(cfg);
return TestCacheManagerFactory.createCacheManager(cfg);
}
/**
* Verifies if the indexing interceptor is aware of a specific list of types.
*
* @param cache the cache containing the indexes
* @param types vararg listing the types the indexing engine should know
*/
private void assertIndexingKnows(Cache<Object, Object> cache, Class<?>... types) {
ComponentRegistry cr = cache.getAdvancedCache().getComponentRegistry();
SearchIntegrator searchIntegrator = cr.getComponent(SearchIntegrator.class);
assertNotNull(searchIntegrator);
Map<Class<?>, EntityIndexBinding> indexBindingForEntity = searchIntegrator.unwrap(ExtendedSearchIntegrator.class).getIndexBindings();
assertNotNull(indexBindingForEntity);
Set<Class<?>> keySet = indexBindingForEntity.keySet();
assertEquals(types.length, keySet.size());
assertTrue(keySet.containsAll(Arrays.asList(types)));
}
@Override
protected void loadTestingData() {
assertIndexingKnows(cache);
super.loadTestingData();
assertIndexingKnows(cache, Person.class, AnotherGrassEater.class);
}
public void testEntityDiscovery() {
assertIndexingKnows(cache);
Person p = new Person();
p.setName("Lucene developer");
p.setAge(30);
p.setBlurb("works best on weekends");
cache.put(p.getName(), p);
assertIndexingKnows(cache, Person.class);
}
}