/*
* 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.sorting;
import static org.fest.assertions.Assertions.assertThat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import javax.persistence.EntityTransaction;
import org.apache.lucene.search.Sort;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.hibernate.search.test.jpa.JPATestCase;
import org.hibernate.search.test.query.ProductArticle;
import org.junit.Test;
/**
* @author Davide D'Alto
*/
public class SortUsingEntityManagerTest extends JPATestCase {
private static final TimeZone ENCODING_TIME_ZONE = TimeZone.getTimeZone( "UTC" );
private FullTextEntityManager em;
@Override
public void setUp() {
super.setUp();
em = org.hibernate.search.jpa.Search.getFullTextEntityManager( factory.createEntityManager() );
createArticles();
}
private void createArticles() {
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
em.persist( article( 1, "Hibernate & Lucene", date( 4, Calendar.JULY, 2005 ) ) );
em.persist( article( 2, "Hibernate Search", date( 2, Calendar.SEPTEMBER, 2005 ) ) );
em.persist( article( 3, "Hibernate OGM", date( 4, Calendar.SEPTEMBER, 2005 ) ) );
em.persist( article( 4, "Hibernate", date( 4, Calendar.DECEMBER, 2005 ) ) );
em.persist( article( 5, "Hibernate Validator", date( 8, Calendar.SEPTEMBER, 2010 ) ) );
em.persist( article( 6, "Hibernate Core", date( 4, Calendar.SEPTEMBER, 2012 ) ) );
}
finally {
tx.commit();
em.clear();
}
}
@Test
@SuppressWarnings("unchecked")
public void testResultOrderedByDateDescending() throws Exception {
EntityTransaction tx = em.getTransaction();
tx.begin();
QueryBuilder builder = em.getSearchFactory().buildQueryBuilder().forEntity( ProductArticle.class ).get();
org.apache.lucene.search.Query query = builder.keyword().wildcard().onField( "header" ).matching( "hib*" ).createQuery();
Sort dateDescending = builder.sort().byField( "creationDate" ).desc().createSort();
List<ProductArticle> result = em.createFullTextQuery( query, ProductArticle.class )
.setSort( dateDescending ).setFirstResult( 3 ).getResultList();
assertThat( result ).as( "query result" ).hasSize( 3 );
assertThat( result.get( 0 ).getArticleId() ).as( "article id" ).isEqualTo( 3 );
assertThat( result.get( 1 ).getArticleId() ).as( "article id" ).isEqualTo( 2 );
assertThat( result.get( 2 ).getArticleId() ).as( "article id" ).isEqualTo( 1 );
tx.commit();
em.clear();
}
private Date date(int day, int month, int year) {
Calendar cal = Calendar.getInstance( ENCODING_TIME_ZONE, Locale.US );
cal.set( year, month, day, 11, 05, 30 );
return cal.getTime();
}
private ProductArticle article(int id, String header, Date date) {
ProductArticle article = new ProductArticle();
article.setCreationDate( date );
article.setHeader( header );
article.setArticleId( Integer.valueOf( id ) );
return article;
}
@Override
public Class<?>[] getAnnotatedClasses() {
return new Class[] { ProductArticle.class };
}
}