package org.infinispan.hibernate.search; import static junit.framework.Assert.assertEquals; import static org.infinispan.hibernate.search.ClusterTestHelper.clusterSize; import static org.infinispan.hibernate.search.ClusterTestHelper.createClusterNode; import static org.infinispan.hibernate.search.ClusterTestHelper.waitMembersCount; 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.query.dsl.QueryBuilder; import org.hibernate.search.test.util.FullTextSessionBuilder; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * We start two different Hibernate Search instances, both using an InfinispanDirectoryProvider as the default * DirectoryProvider for all entities. Then after some indexing was done we verify the index contains expected data both * on the other node and on a third just started node. * * @author Sanne Grinovero */ public class TwoNodesTest { private final String to = "spam@hibernate.org"; private final String messageText = "to get started as a real spam expert, search for 'getting an iphone' on Hibernate forums"; FullTextSessionBuilder nodea; FullTextSessionBuilder nodeb; HashSet<Class<?>> entityTypes; @Test public void testSomething() { assertEquals(2, clusterSize(nodea, SimpleEmail.class)); // index an entity: { FullTextSession fullTextSession = nodea.openFullTextSession(); Transaction transaction = fullTextSession.beginTransaction(); SimpleEmail mail = new SimpleEmail(); mail.to = to; mail.message = messageText; fullTextSession.save(mail); transaction.commit(); fullTextSession.close(); } // verify nodeb is able to find it: verifyNodeSeesUpdatedIndex(nodeb); // now start a new node, it will join the cluster and receive the current index state: FullTextSessionBuilder nodeC = createClusterNode(entityTypes, true); assertEquals(3, clusterSize(nodea, SimpleEmail.class)); try { // verify the new node is able to perform the same searches: verifyNodeSeesUpdatedIndex(nodeC); } finally { nodeC.close(); } waitMembersCount(nodea, SimpleEmail.class, 2); assertEquals(2, clusterSize(nodea, SimpleEmail.class)); verifyNodeSeesUpdatedIndex(nodea); verifyNodeSeesUpdatedIndex(nodeb); } private void verifyNodeSeesUpdatedIndex(FullTextSessionBuilder node) { FullTextSession fullTextSession = node.openFullTextSession(); try { Transaction transaction = fullTextSession.beginTransaction(); QueryBuilder queryBuilder = fullTextSession.getSearchFactory() .buildQueryBuilder() .forEntity(SimpleEmail.class) .get(); Query query = queryBuilder.keyword() .onField("message") .matching("Hibernate Getting Started") .createQuery(); List list = fullTextSession.createFullTextQuery(query).setProjection("message").list(); assertEquals(1, list.size()); Object[] result = (Object[]) list.get(0); assertEquals(messageText, result[0]); transaction.commit(); } finally { fullTextSession.close(); } } @Before public void setUp() throws Exception { entityTypes = new HashSet<Class<?>>(); entityTypes.add(SimpleEmail.class); nodea = createClusterNode(entityTypes, true); nodeb = createClusterNode(entityTypes, true); waitMembersCount(nodea, SimpleEmail.class, 2); } @After public void tearDown() throws Exception { if (nodea != null) { nodea.close(); } if (nodeb != null) { nodeb.close(); } } @BeforeClass public static void prepareConnectionPool() { ClusterSharedConnectionProvider.realStart(); } @AfterClass public static void shutdownConnectionPool() { ClusterSharedConnectionProvider.realStop(); } }