package org.infinispan.hibernate.search.sharedIndex; import static org.infinispan.hibernate.search.ClusterTestHelper.createClusterNode; import static org.infinispan.hibernate.search.ClusterTestHelper.waitMembersCount; import static org.junit.Assert.assertEquals; import java.util.HashSet; import java.util.List; import org.apache.lucene.search.Query; import org.hibernate.Transaction; import org.hibernate.search.FullTextSession; import org.hibernate.search.engine.spi.EntityIndexBinding; import org.hibernate.search.indexes.spi.DirectoryBasedIndexManager; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.spi.SearchIntegrator; import org.hibernate.search.test.util.FullTextSessionBuilder; import org.infinispan.hibernate.search.ClusterSharedConnectionProvider; import org.infinispan.hibernate.search.spi.InfinispanDirectoryProvider; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.remoting.transport.Address; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * Test to verify HSEARCH-926 * * @author Zach Kurey */ public class SharedIndexTest { FullTextSessionBuilder node; HashSet<Class<?>> entityTypes; @Test public void testSingleResultFromDeviceIndex() { assertEquals(1, clusterSize(node, Toaster.class)); // index an entity: { FullTextSession fullTextSession = node.openFullTextSession(); Transaction transaction = fullTextSession.beginTransaction(); Toaster toaster = new Toaster("A1"); fullTextSession.save(toaster); transaction.commit(); fullTextSession.close(); verifyResult(node); } } private void verifyResult(FullTextSessionBuilder node) { FullTextSession fullTextSession = node.openFullTextSession(); try { Transaction transaction = fullTextSession.beginTransaction(); QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder() .forEntity(Toaster.class).get(); Query query = queryBuilder.keyword().onField("serialNumber").matching("A1").createQuery(); List list = fullTextSession.createFullTextQuery(query).getResultList(); assertEquals(1, list.size()); Device device = (Device) list.get(0); assertEquals("GE", device.manufacturer); transaction.commit(); } finally { fullTextSession.close(); } } @Before public void setUp() throws Exception { entityTypes = new HashSet<Class<?>>(); entityTypes.add(Device.class); entityTypes.add(Robot.class); entityTypes.add(Toaster.class); node = createClusterNode(entityTypes, true); waitMembersCount(node, Toaster.class, 1); } @After public void tearDown() throws Exception { if (node != null) { node.close(); } } @BeforeClass public static void prepareConnectionPool() { ClusterSharedConnectionProvider.realStart(); } @AfterClass public static void shutdownConnectionPool() { ClusterSharedConnectionProvider.realStop(); } /** * Counts the number of nodes in the cluster on this node * * @param node the FullTextSessionBuilder representing the current node * @return */ protected int clusterSize(FullTextSessionBuilder node, Class<?> entityType) { SearchIntegrator integrator = node.getSearchFactory().unwrap(SearchIntegrator.class); EntityIndexBinding indexBinding = integrator.getIndexBinding(Toaster.class); DirectoryBasedIndexManager indexManager = (DirectoryBasedIndexManager) indexBinding.getIndexManagers()[0]; InfinispanDirectoryProvider directoryProvider = (InfinispanDirectoryProvider) indexManager.getDirectoryProvider(); EmbeddedCacheManager cacheManager = directoryProvider.getCacheManager(); List<Address> members = cacheManager.getMembers(); return members.size(); } }