/*
* 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.embedded.sorting;
import static org.fest.assertions.Assertions.assertThat;
import java.util.List;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.hibernate.search.test.SearchTestBase;
import org.hibernate.search.testsupport.TestForIssue;
import org.hibernate.search.testsupport.junit.ElasticsearchSupportInProgress;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.ExpectedException;
/**
* @author Davide D'Alto
*/
@TestForIssue(jiraKey = "HSEARCH-2069")
public class EmbeddedSortableIdFieldTest extends SearchTestBase {
private static final String LEX = "Lex Luthor";
private static final String DARKSEID = "Darkseid";
private static final String CLARK = "Clark Kent";
@Rule
public final ExpectedException thrown = ExpectedException.none();
@Before
public void before() throws Exception {
try ( Session session = openSession() ) {
Transaction transaction = session.beginTransaction();
Villain darkseid = new Villain( 100, DARKSEID );
Villain lex = new Villain( Integer.MIN_VALUE, LEX );
Hero superman = new Hero( Integer.MAX_VALUE, CLARK );
superman.setVillain( lex );
lex.setHero( superman );
superman.setSortableVillain( darkseid );
darkseid.setHero( superman );
session.save( superman );
session.save( lex );
transaction.commit();
}
}
@Test
public void testEntityCanSortOnId() {
try ( Session session = openSession() ) {
FullTextSession fullTextSession = Search.getFullTextSession( session );
Transaction transaction = fullTextSession.beginTransaction();
Sort sort = new Sort( new SortField( "id", SortField.Type.STRING ) );
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity( Villain.class ).get();
Query q = queryBuilder.keyword().onField( "name" ).matching( LEX ).createQuery();
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( q, Villain.class );
fullTextQuery.setSort( sort );
List list = fullTextQuery.list();
assertThat( list ).hasSize( 1 );
Villain actual = (Villain) list.get( 0 );
assertThat( actual.getName() ).isEqualTo( LEX );
transaction.commit();
}
}
@Test
public void testSortingOnSortableFieldIncludedByIndexEmbedded() {
try ( Session session = openSession() ) {
FullTextSession fullTextSession = Search.getFullTextSession( session );
Transaction transaction = fullTextSession.beginTransaction();
// This should be of type Integer
Sort sort = new Sort( new SortField( "sortableVillain.id", SortField.Type.STRING ) );
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity( Hero.class ).get();
Query q = queryBuilder.keyword().onField( "villain.name" ).matching( LEX ).createQuery();
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( q, Hero.class );
fullTextQuery.setSort( sort );
List list = fullTextQuery.list();
assertThat( list ).hasSize( 1 );
Hero actual = (Hero) list.get( 0 );
assertThat( actual.getSecretIdentity() ).isEqualTo( CLARK );
transaction.commit();
}
}
@Test
@Category( ElasticsearchSupportInProgress.class ) // HSEARCH-2398 Improve field name/type validation when querying the Elasticsearch backend
public void testSortingOnSortableFieldNotIncludedByIndexEmbeddedException() {
thrown.expect( SearchException.class );
thrown.expectMessage( "HSEARCH000301" );
try ( Session session = openSession() ) {
FullTextSession fullTextSession = Search.getFullTextSession( session );
Transaction transaction = fullTextSession.beginTransaction();
Sort sort = new Sort( new SortField( "villain.id", SortField.Type.STRING ) );
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity( Hero.class ).get();
Query q = queryBuilder.keyword().onField( "villain.name" ).matching( LEX ).createQuery();
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( q, Hero.class );
fullTextQuery.setSort( sort );
fullTextQuery.list();
transaction.commit();
}
}
@Override
public Class<?>[] getAnnotatedClasses() {
return new Class[] { Hero.class, Villain.class };
}
}