package org.infinispan.query.backend; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import java.util.Date; import org.apache.lucene.search.MatchAllDocsQuery; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.backend.IndexWorkVisitor; import org.hibernate.search.backend.impl.lucene.LuceneBackendResources; import org.hibernate.search.backend.impl.lucene.WorkspaceHolder; import org.hibernate.search.backend.impl.lucene.works.ByTermUpdateWorkExecutor; import org.hibernate.search.backend.impl.lucene.works.LuceneWorkExecutor; import org.hibernate.search.indexes.spi.DirectoryBasedIndexManager; import org.hibernate.search.spi.SearchIntegrator; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.Index; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.query.CacheQuery; import org.infinispan.query.Search; import org.infinispan.query.SearchManager; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.TestingUtil; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; /** * Test for multiple entities types in the same cache sharing the same index * * @author gustavonalle * @since 7.1 */ @Test(groups = "functional", testName = "query.backend.MultipleEntitiesTest") public class MultipleEntitiesTest extends SingleCacheManagerTest { @Override protected EmbeddedCacheManager createCacheManager() throws Exception { ConfigurationBuilder cfg = getDefaultStandaloneCacheConfig(false); cfg.indexing().index(Index.ALL) .addIndexedEntity(Bond.class) .addIndexedEntity(Debenture.class) .addProperty("default.directory_provider", "ram") .addProperty("error_handler", "org.infinispan.query.helper.StaticTestingErrorHandler") .addProperty("lucene_version", "LUCENE_CURRENT"); return TestCacheManagerFactory.createCacheManager(cfg); } @Test public void testIndexAndQuery() throws Exception { SearchManager searchManager = Search.getSearchManager(cache); cache.put(123405, new Bond(new Date(System.currentTimeMillis()), 450L)); assertEfficientIndexingUsed(searchManager.unwrap(SearchIntegrator.class), Bond.class); cache.put(123502, new Debenture("GB", 116d)); assertEfficientIndexingUsed(searchManager.unwrap(SearchIntegrator.class), Debenture.class); cache.put(223456, new Bond(new Date(System.currentTimeMillis()), 550L)); assertEfficientIndexingUsed(searchManager.unwrap(SearchIntegrator.class), Bond.class); CacheQuery<?> query = searchManager.getQuery(new MatchAllDocsQuery(), Bond.class, Debenture.class); assertEquals(query.list().size(), 3); CacheQuery<?> queryBond = searchManager.getQuery(new MatchAllDocsQuery(), Bond.class); assertEquals(queryBond.getResultSize(), 2); CacheQuery<?> queryDeb = searchManager.getQuery(new MatchAllDocsQuery(), Debenture.class); assertEquals(queryDeb.getResultSize(), 1); } private void assertEfficientIndexingUsed(SearchIntegrator searchIntegrator, Class<?> clazz) { DirectoryBasedIndexManager im = (DirectoryBasedIndexManager) searchIntegrator.getIndexBinding(clazz).getIndexManagers()[0]; WorkspaceHolder workspaceHolder = im.getWorkspaceHolder(); LuceneBackendResources indexResources = workspaceHolder.getIndexResources(); IndexWorkVisitor<Void, LuceneWorkExecutor> visitor = indexResources.getWorkVisitor(); assertTrue(TestingUtil.extractField(visitor, "updateExecutor") instanceof ByTermUpdateWorkExecutor); } } @Indexed(index = "instruments") class Bond { @Field Date maturity; @Field Long price; public Bond(Date maturity, Long price) { this.maturity = maturity; this.price = price; } } @Indexed(index = "instruments") class Debenture { @Field String issuer; @Field Double rate; public Debenture(String issuer, Double rate) { this.issuer = issuer; this.rate = rate; } }