/*
* 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.event.autoindexembeddable;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.Search;
import org.hibernate.search.test.jpa.JPATestCase;
import org.hibernate.search.testsupport.TestForIssue;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* @author Hardy Ferentschik
*/
@TestForIssue(jiraKey = "HSEARCH-1358")
public class EventBasedEmbeddableCollectionUpdateTest extends JPATestCase {
private EntityManager entityManager;
@Before
@Override
public void setUp() {
super.setUp();
entityManager = factory.createEntityManager();
}
@After
@Override
public void tearDown() {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager( entityManager );
fullTextEntityManager.purgeAll( Book.class );
fullTextEntityManager.flushToIndexes();
fullTextEntityManager.close();
super.tearDown();
}
@Test
public void testUpdateOfEmbeddedElementCollectionTriggersIndexUpdate() throws Exception {
indexBookAndEnsureItIsIndexed();
// find and update book by adding "Bar" into Embedded ElementCollection
entityManager.getTransaction().begin();
Book book = entityManager.find( Book.class, 1234L );
book.getEmbeddableCategories().getCategories().remove( 12L );
book.getEmbeddableCategories().getCategories().put( 13L, "Bar" );
entityManager.persist( book );
entityManager.getTransaction().commit();
assertEquals(
"Foo should have been removed by indexed update",
0,
search( "embeddableCategories.categories:Foo" ).size()
);
assertEquals(
"Bar should have been added by indexed update",
1,
search( "embeddableCategories.categories:Bar" ).size()
);
}
@Override
public Class[] getAnnotatedClasses() {
return new Class[] { }; // configured in persistence.xml
}
private void indexBookAndEnsureItIsIndexed() throws ParseException {
entityManager.getTransaction().begin();
Book book = new Book();
book.setId( 1234L );
book.getEmbeddableCategories().getCategories().put( 12L, "Foo" );
entityManager.persist( book );
entityManager.getTransaction().commit();
assertEquals(
"Foo should have been added during indexing",
1,
search( "embeddableCategories.categories:Foo" ).size()
);
assertEquals( "Bar was not yet added", 0, search( "embeddableCategories.categories:Bar" ).size() );
}
@SuppressWarnings("unchecked")
private List<Book> search(String searchQuery) throws ParseException {
QueryParser parser = new MultiFieldQueryParser(
new String[] { },
new StandardAnalyzer()
);
FullTextQuery query = Search.getFullTextEntityManager( entityManager )
.createFullTextQuery( parser.parse( searchQuery ), Book.class );
return (List<Book>) query.getResultList();
}
}