/* * 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 java.util.List; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.hibernate.Transaction; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.test.SearchTestBase; import org.hibernate.search.test.query.Book; import org.hibernate.search.testsupport.TestForIssue; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.fest.assertions.Assertions.assertThat; import static org.junit.Assert.assertNotNull; /** * Tests for sortable fields contributed through custom field bridges. Those bridges must expose the required sortable * field meta-data so they can be used for sorting without falling back to index uninverting. * * @author Gunnar Morling */ @TestForIssue(jiraKey = "HSEARCH-2021") public class SortOnFieldsFromCustomBridgeTest extends SearchTestBase { @Before public void insertTestData() throws Exception { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); Territory novaScotia = new Territory( 1, "Nova Scotia" ); fullTextSession.save( novaScotia ); Territory alaska = new Territory( 2, "Alaska" ); fullTextSession.save( alaska ); Territory tierraDelFuego = new Territory( 3, "Tierra del Fuego" ); fullTextSession.save( tierraDelFuego ); fullTextSession.save( new Explorer( 1, 23, novaScotia, "Sam", "1st", "Seaman" ) ); fullTextSession.save( new Explorer( 2, 22, alaska, "Sam", "2nd", "Traveller" ) ); fullTextSession.save( new Explorer( 3, 22, tierraDelFuego, "Collin", "1st", "Conqueror" ) ); tx.commit(); fullTextSession.close(); } @After public void deleteTestData() throws Exception { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.delete( new Explorer( 1 ) ); fullTextSession.delete( new Explorer( 2 ) ); fullTextSession.delete( new Explorer( 3 ) ); fullTextSession.delete( new Territory( 1 ) ); fullTextSession.delete( new Territory( 2 ) ); fullTextSession.delete( new Territory( 3 ) ); tx.commit(); fullTextSession.close(); } @Test public void testSortableFieldConfiguredThroughClassLevelBridge() throws Exception { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); @SuppressWarnings("unchecked") List<Book> result = fullTextSession.createFullTextQuery( new MatchAllDocsQuery(), Explorer.class ) .setSort( new Sort( new SortField( "fn_firstName", SortField.Type.STRING ), new SortField( "fn_middleName", SortField.Type.STRING ) ) ) .list(); assertNotNull( result ); assertThat( result ).onProperty( "id" ).containsExactly( 3, 1, 2 ); tx.commit(); fullTextSession.close(); } @Test public void testSortableFieldConfiguredThroughCustomFieldLevelBridge() throws Exception { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); @SuppressWarnings("unchecked") List<Book> result = fullTextSession.createFullTextQuery( new MatchAllDocsQuery(), Explorer.class ) .setSort( new Sort( new SortField( "nameParts_lastName", SortField.Type.STRING ) ) ) .list(); assertNotNull( result ); assertThat( result ).onProperty( "id" ).containsExactly( 3, 1, 2 ); tx.commit(); fullTextSession.close(); } @Test public void testTwoSortableFieldsConfiguredThroughAnnotationAndCustomFieldLevelBridge() throws Exception { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); @SuppressWarnings("unchecked") List<Book> result = fullTextSession.createFullTextQuery( new MatchAllDocsQuery(), Explorer.class ) .setSort( new Sort( new SortField( "exploredCountries", SortField.Type.INT ), new SortField( "nameParts_lastName", SortField.Type.STRING ) ) ) .list(); assertNotNull( result ); assertThat( result ).onProperty( "id" ).containsExactly( 3, 2, 1 ); tx.commit(); fullTextSession.close(); } @Test @TestForIssue(jiraKey = "HSEARCH-2325") public void testNumericCustomFieldLevelBridge() throws Exception { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); @SuppressWarnings("unchecked") List<Book> result = fullTextSession.createFullTextQuery( new MatchAllDocsQuery(), Explorer.class ) .setSort( new Sort( new SortField( "favoriteTerritory.idFromBridge", SortField.Type.INT ) ) ) .list(); assertNotNull( result ); assertThat( result ).onProperty( "id" ).containsExactly( 1, 2, 3 ); tx.commit(); fullTextSession.close(); } @Test public void testSortableFieldConfiguredThroughClassLevelBridgeOnEmbeddedEntity() throws Exception { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); @SuppressWarnings("unchecked") List<Book> result = fullTextSession.createFullTextQuery( new MatchAllDocsQuery(), Explorer.class ) .setSort( new Sort( new SortField( "favoriteTerritory.territoryName", SortField.Type.STRING ) ) ) .list(); assertNotNull( result ); assertThat( result ).onProperty( "id" ).containsExactly( 2, 1, 3 ); tx.commit(); fullTextSession.close(); } @Override public Class<?>[] getAnnotatedClasses() { return new Class[] { Explorer.class, Territory.class }; } }