/* * 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.boost.embeddable; import org.apache.lucene.search.Query; import org.hibernate.Transaction; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.test.SearchTestBase; import org.hibernate.search.testsupport.TestForIssue; import org.junit.Test; import static org.fest.assertions.Assertions.assertThat; import java.util.Locale; /** * Tests around boosting of embeddable fields. * * @author Gunnar Morling */ public class EmbeddedFieldBoostTest extends SearchTestBase { @Test @TestForIssue(jiraKey = "HSEARCH-1804") public void testBoostedIndexEmbeddedEntity() { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); // Given Transaction tx = fullTextSession.beginTransaction(); Magazine highPerfComputing = new Magazine( 1L, "High-perf trends", new Title( "High Performance Computing", "Faster, faster, faster" ) ); highPerfComputing.getTitle().setLocalizedTitle( new LocalizedTitle( 1L, Locale.FRENCH, "Informatique hautes-performances" ) ); fullTextSession.persist( highPerfComputing ); Magazine roseGrowers = new Magazine( 2L, null, new Title( "Rose Grower's Weekly", "No petunia here" ) ); roseGrowers.getTitle().setLocalizedTitle( new LocalizedTitle( 2L, Locale.FRENCH, "L'hebdomadaire des cultivateurs de roses" ) ); fullTextSession.persist( roseGrowers ); Magazine astronautDigest = new Magazine( 3L, null, new Title( "Astronaut Digest", "Tips for astronauts" ) ); astronautDigest.getTitle().setLocalizedTitle( new LocalizedTitle( 3L, Locale.FRENCH, "Le bréviaire des astronautes" ) ); fullTextSession.persist( astronautDigest ); Magazine diyMagazine = new Magazine( 4L, null, new Title( "DIY magazine", "The do-it-yourself magazine" ) ); diyMagazine.getTitle().setLocalizedTitle( new LocalizedTitle( 4L, Locale.FRENCH, "Brico magazine" ) ); fullTextSession.persist( diyMagazine ); tx.commit(); fullTextSession.clear(); tx = fullTextSession.beginTransaction(); final QueryBuilder queryBuilder = fullTextSession.getSearchFactory() .buildQueryBuilder() .forEntity( Magazine.class ) .get(); // When Query query = queryBuilder.bool() .should( queryBuilder.keyword() .onField( "title.value" ) .matching( "rose" ) .createQuery() ) .should( queryBuilder.keyword() .onField( "description" ) .matching( "trends" ) .createQuery() ) .should( queryBuilder.keyword() .onField( "title.subTitle.value" ) .matching( "tips" ) .createQuery() ) .should( queryBuilder.keyword() .onField( "title.localizedTitle.value" ) .matching( "brico" ) .createQuery() ) .createQuery(); // Then assertThat( fullTextSession.createFullTextQuery( query, Magazine.class ).list() ) .describedAs( "Query results are not in the order expected as per configured field boosts" ) .onProperty( "id" ) .containsExactly( 2L, 4L, 3L, 1L ); tx.commit(); fullTextSession.close(); } @Override public Class<?>[] getAnnotatedClasses() { return new Class[] { Magazine.class, LocalizedTitle.class }; } }