/*
* 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.criteria;
import java.util.List;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.Query;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.test.SearchTestBase;
import org.hibernate.search.testsupport.TestConstants;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
* @author Hardy Ferentschik
*/
public class MixedCriteriaTest extends SearchTestBase {
/**
* HSEARCH-360
*/
@Test
public void testCriteriaWithFilteredEntity() throws Exception {
indexTestData();
// Search
Session session = openSession();
Transaction tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
MultiFieldQueryParser parser = new MultiFieldQueryParser(
new String[] { "kurztext" }, TestConstants.standardAnalyzer
);
Query query = parser.parse( "combi OR sport" );
Criteria criteria = session.createCriteria( AbstractCar.class );
criteria.add( Restrictions.eq( "hasColor", Boolean.FALSE ) );
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( query, AbstractCar.class )
.setCriteriaQuery( criteria );
List result = hibQuery.list();
assertEquals( 2, result.size() );
tx.commit();
session.close();
}
@Test
public void testCriteriaWithoutFilteredEntity() throws Exception {
indexTestData();
// Search
Session session = openSession();
Transaction tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
MultiFieldQueryParser parser = new MultiFieldQueryParser( new String[] { "kurztext" }, TestConstants.standardAnalyzer );
Query query = parser.parse( "combi OR sport" );
Criteria criteria = session.createCriteria( AbstractCar.class );
criteria.add( Restrictions.eq( "hasColor", Boolean.FALSE ) );
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( query )
.setCriteriaQuery( criteria );
List result = hibQuery.list();
assertEquals( 2, result.size() );
tx.commit();
session.close();
}
@Test
public void testCriteriaWithMultipleEntities() throws Exception {
indexTestData();
// Search
Session session = openSession();
Transaction tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
MultiFieldQueryParser parser = new MultiFieldQueryParser(
new String[] { "kurztext" }, TestConstants.standardAnalyzer
);
Query query = parser.parse( "combi OR sport" );
Criteria criteria = session.createCriteria( AbstractCar.class );
criteria.add( Restrictions.eq( "hasColor", Boolean.FALSE ) );
try {
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( query, AbstractCar.class, Bike.class )
.setCriteriaQuery( criteria );
hibQuery.list();
fail();
}
catch (SearchException se) {
assertEquals( "Cannot mix criteria and multiple entity types", se.getMessage() );
}
tx.commit();
session.close();
}
private void indexTestData() {
Session s = openSession();
Transaction tx = s.beginTransaction();
CombiCar combi = new CombiCar();
combi.setKurztext( "combi" );
s.persist( combi );
SportCar sport = new SportCar();
sport.setKurztext( "sport" );
s.persist( sport );
Bike bike = new Bike();
bike.setKurztext( "bike" );
s.persist( bike );
tx.commit();
s.close();
}
@Override
public Class<?>[] getAnnotatedClasses() {
return new Class[] {
AbstractCar.class, CombiCar.class, SportCar.class, Bike.class
};
}
}