/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.test.engine.worker.duplication; import static org.junit.Assert.assertEquals; import java.io.IOException; import org.hibernate.Session; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.SearchFactory; import org.hibernate.search.test.SearchTestBase; import org.hibernate.search.test.session.Domain; import org.junit.Test; /** * Testcase for HSEARCH-353 * Verify that different kinds of work (add/delete) found in the same * queue are all executed; having special care about different entities * being deleted/persisted but sharing the same PK (to replace the old * instance with another one). * * @author Sanne Grinovero */ public class WorkSequencesTest extends SearchTestBase { private SearchFactory searchFactory; @Test public void testComplexTransactionSequence() throws IOException { Session classicSession = openSession( ); FullTextSession session = Search.getFullTextSession( classicSession ); searchFactory = session.getSearchFactory(); // create some different domains: { session.beginTransaction(); session.persist( new Domain( 1, "jboss.org" ) ); session.persist( new Domain( 2, "jboss.com" ) ); session.persist( new Domain( 3, "hibernate.org" ) ); session.persist( new Domain( 4, "geocities.com" ) ); session.getTransaction().commit(); } assertEquals( 2, countDomainsByFullText( "jboss*" ) ); assertEquals( 1, countDomainsByFullText( "hibernate*" ) ); assertEquals( 1, countDomainsByFullText( "geocities*" ) ); // now create some and delete others: { session.beginTransaction(); session.persist( new Domain( 5, "sun.com" ) ); session.persist( new Domain( 6, "mysql.com" ) ); session.persist( new Domain( 7, "oracle.com" ) ); Domain hibernateDomain = session.get( Domain.class, 3 ); session.delete( hibernateDomain ); Domain geocitiesDomain = session.get( Domain.class, 4 ); session.delete( geocitiesDomain ); session.getTransaction().commit(); } assertEquals( 0, countDomainsByFullText( "hibernate*" ) ); assertEquals( 0, countDomainsByFullText( "geocities*" ) ); assertEquals( 2, countDomainsByFullText( "jboss*" ) ); assertEquals( 1, countDomainsByFullText( "sun*" ) ); assertEquals( 1, countDomainsByFullText( "mysql*" ) ); assertEquals( 1, countDomainsByFullText( "oracle*" ) ); // use create/update/delete: { session.beginTransaction(); session.persist( new Domain( 3, "hibernate.org" ) ); Domain mysqlDomain = session.get( Domain.class, 6 ); session.delete( mysqlDomain ); //persisting a new entity having the same PK as a deleted one: session.persist( new Domain( 6, "myhql.org" ) ); Domain sunDomain = session.get( Domain.class, 5 ); sunDomain.setName( "community.oracle.com" ); session.getTransaction().commit(); } assertEquals( 1, countDomainsByFullText( "hibernate*" ) ); assertEquals( 2, countDomainsByFullText( "*oracle*" ) ); assertEquals( 1, countDomainsByFullText( "myhql*" ) ); assertEquals( 1, countDomainsByFullText( "community*" ) ); assertEquals( 0, countDomainsByFullText( "mysql*" ) ); // now creating and deleting the "same" (as by pk) entity several times in same transaction: { session.beginTransaction(); session.persist( new Domain( 8, "mysql.org" ) ); Domain mysqlDomain = session.load( Domain.class, 8 ); session.delete( mysqlDomain ); Domain newDomain = new Domain( 8, "something.org" ); session.persist( newDomain ); session.delete( newDomain ); session.persist( new Domain( 8, "somethingnew.org" ) ); session.getTransaction().commit(); } assertEquals( 1, countDomainsByFullText( "somethingnew*" ) ); session.close(); } //helper method to verify how many instances are found in the index by doing a simple FT query private int countDomainsByFullText(String name) throws IOException { String indexName = getExtendedSearchIntegrator().getIndexBinding( Domain.class ) .getIndexManagers()[0].getIndexName(); return getNumberOfDocumentsInIndexByQuery( indexName, "name", name ); } @Override public Class<?>[] getAnnotatedClasses() { return new Class[] { Domain.class }; } }