/*
* 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.query;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.jdbc.Work;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.test.SearchTestBase;
import org.hibernate.search.testsupport.TestConstants;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* @author Emmanuel Bernard
* @author Sanne Grinovero
*/
public class MultiClassesQueryLoaderTest extends SearchTestBase {
private Query luceneQuery;
@Before
@Override
public void setUp() throws Exception {
super.setUp();
try ( Session session = openSession() ) {
Transaction tx = session.beginTransaction();
// used for the filtering tests
Author author = new Author();
author.setName( "Moo Cow" );
Music music = new Music();
music.addAuthor( author );
music.setTitle( "The moo moo mooing under the stars" );
Book book = new Book();
book.setBody( "This is the story of the Moo Cow, who sang the moo moo moo at night" );
book.setId( 1 );
session.persist( book );
session.persist( author );
session.persist( music );
// used for the not found test
Author charles = new Author();
charles.setName( "Charles Dickens" );
session.persist( charles );
tx.commit();
}
QueryParser parser = new QueryParser( "title", TestConstants.keywordAnalyzer );
luceneQuery = parser.parse( "name:moo OR title:moo OR body:moo" );
}
@Test
public void testObjectNotFound() throws Exception {
Session session = openSession();
Transaction tx = session.beginTransaction();
session.doWork(
new Work() {
@Override
public void execute(Connection connection) throws SQLException {
Statement statement = connection.createStatement();
statement.executeUpdate( "DELETE FROM Author where name = 'Charles Dickens'" );
statement.close();
}
}
);
FullTextSession s = Search.getFullTextSession( session );
QueryParser parser = new QueryParser( "title", TestConstants.keywordAnalyzer );
Query query = parser.parse( "name:charles" );
FullTextQuery hibQuery = s.createFullTextQuery( query, Author.class, Music.class );
List result = hibQuery.list();
assertEquals( "Should have returned no author", 0, result.size() );
tx.commit();
s.close();
}
@Test
public void testObjectTypeFilteringSingleClass() throws Exception {
Session session = openSession();
Transaction tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery, Music.class );
List result = fullTextQuery.list();
assertEquals( "Should match the music only", 1, result.size() );
tx.commit();
fullTextSession.close();
}
@Test
public void testObjectTypeFilteringTwoClasses() throws Exception {
Session session = openSession();
Transaction tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery, Author.class, Music.class );
List result = fullTextQuery.list();
assertEquals( "Should match the author and music only", 2, result.size() );
tx.commit();
fullTextSession.close();
}
@Test
public void testObjectTypeFilteringThreeClasses() throws Exception {
Session session = openSession();
Transaction tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(
luceneQuery,
Author.class,
Music.class,
Book.class
);
List result = fullTextQuery.list();
assertEquals( "Should match the author, music and book", 3, result.size() );
fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
result = fullTextQuery.list();
assertEquals( "Should match all types", 3, result.size() );
tx.commit();
fullTextSession.close();
}
@Test
public void testImplicitObjectTypeFiltering() throws Exception {
Session session = openSession();
Transaction tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
List result = fullTextQuery.list();
assertEquals( "Should match all types", 3, result.size() );
tx.commit();
fullTextSession.close();
}
@Override
public Class<?>[] getAnnotatedClasses() {
return new Class[] {
Author.class,
Music.class,
Book.class
};
}
}