/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* 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.ogm.backendtck.massindex;
import static org.fest.assertions.Assertions.assertThat;
import static org.hibernate.ogm.utils.GridDialectType.MONGODB;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.ogm.backendtck.hsearch.Insurance;
import org.hibernate.ogm.backendtck.id.NewsID;
import org.hibernate.ogm.backendtck.massindex.model.IndexedLabel;
import org.hibernate.ogm.backendtck.massindex.model.IndexedNews;
import org.hibernate.ogm.utils.OgmTestCase;
import org.hibernate.ogm.utils.SkipByGridDialect;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.junit.Test;
/**
* @author Davide D'Alto <davide@hibernate.org>
*/
public class SimpleEntityMassIndexingTest extends OgmTestCase {
@Test
public void testSimpleEntityMassIndexing() throws Exception {
{
Session session = openSession();
Transaction transaction = session.beginTransaction();
Insurance insurance = new Insurance();
insurance.setName( "Insurance Corporation" );
session.persist( insurance );
transaction.commit();
session.clear();
session.close();
}
{
purgeAll( Insurance.class );
startAndWaitMassIndexing( Insurance.class );
}
{
FullTextSession session = Search.getFullTextSession( openSession() );
QueryBuilder queryBuilder = session.getSearchFactory().buildQueryBuilder().forEntity( Insurance.class ).get();
Query luceneQuery = queryBuilder.keyword().wildcard().onField( "name" ).matching( "ins*" ).createQuery();
Transaction transaction = session.beginTransaction();
@SuppressWarnings("unchecked")
List<Insurance> list = session.createFullTextQuery( luceneQuery ).list();
assertThat( list ).hasSize( 1 );
assertThat( list.get( 0 ).getName() ).isEqualTo( "Insurance Corporation" );
transaction.commit();
session.clear();
session.close();
}
}
@Test
@SkipByGridDialect(value = { MONGODB }, comment = "Uses embedded key which is currently not supported by the db query parsers")
public void testEntityWithCompositeIdMassIndexing() throws Exception {
{
Session session = openSession();
Transaction transaction = session.beginTransaction();
IndexedNews news = new IndexedNews( new NewsID( "title", "author" ), "content" );
session.persist( news );
transaction.commit();
session.clear();
session.close();
}
{
purgeAll( IndexedNews.class );
startAndWaitMassIndexing( IndexedNews.class );
}
{
// Assert index creation
FullTextSession session = Search.getFullTextSession( openSession() );
QueryBuilder queryBuilder = session.getSearchFactory().buildQueryBuilder().forEntity( IndexedNews.class ).get();
Query luceneQuery = queryBuilder.keyword().wildcard().onField( "newsId" ).ignoreFieldBridge().matching( "tit*" ).createQuery();
Transaction transaction = session.beginTransaction();
@SuppressWarnings("unchecked")
List<IndexedNews> list = session.createFullTextQuery( luceneQuery ).list();
assertThat( list ).hasSize( 1 );
assertThat( list.get( 0 ).getContent() ).isEqualTo( "content" );
assertThat( list.get( 0 ).getNewsId().getTitle() ).isEqualTo( "title" );
assertThat( list.get( 0 ).getNewsId().getAuthor() ).isEqualTo( "author" );
transaction.commit();
session.clear();
session.close();
}
}
private void startAndWaitMassIndexing(Class<?> entityType) throws InterruptedException, IOException {
FullTextSession session = Search.getFullTextSession( openSession() );
session.createIndexer( entityType ).purgeAllOnStart( true ).startAndWait();
final int numDocs;
try ( IndexReader indexReader = session.getSearchFactory().getIndexReaderAccessor().open( entityType ) ) {
numDocs = indexReader.numDocs();
}
assertThat( numDocs ).isGreaterThan( 0 );
}
private void purgeAll(Class<?> entityType) throws IOException {
FullTextSession session = Search.getFullTextSession( openSession() );
session.purgeAll( entityType );
session.flushToIndexes();
final int numDocs;
try ( IndexReader indexReader = session.getSearchFactory().getIndexReaderAccessor().open( entityType ) ) {
numDocs = indexReader.numDocs();
}
session.close();
assertThat( numDocs ).isEqualTo( 0 );
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { Insurance.class, IndexedNews.class, IndexedLabel.class };
}
@Override
protected void configure(Map<String, Object> settings) {
settings.put( "hibernate.search.default.directory_provider", "ram" );
// Infinispan requires to be set to distribution mode for this test to pass
settings.put( "hibernate.ogm.infinispan.configuration_resourcename", "infinispan-dist.xml" );
}
}