/* * 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.configuration; import java.lang.annotation.ElementType; import org.apache.lucene.queryparser.classic.QueryParser; import org.hibernate.Transaction; import org.hibernate.dialect.PostgreSQL81Dialect; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.annotations.IndexedEmbedded; import org.hibernate.search.test.util.FullTextSessionBuilder; import org.hibernate.search.testsupport.TestConstants; import org.hibernate.search.testsupport.TestForIssue; import org.hibernate.testing.SkipForDialect; import org.hibernate.testing.junit4.CustomRunner; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; /** * Tests for the programmatic configuration of embedded index elements. * * @author Gunnar Morling */ @TestForIssue(jiraKey = "HSEARCH-1764") @SkipForDialect(jiraKey = "HSEARCH-1942", value = PostgreSQL81Dialect.class) @RunWith(CustomRunner.class)//To enable usage of @SkipForDialect public class IndexEmbeddedProgrammaticallyMappedTest { @Test public void canSetIncludeEmbeddedObjectIdProgrammatically() throws Exception { try (FullTextSessionBuilder builder = getFullTextSessionBuilder() ) { // given builder.fluentMapping() .entity( Address.class ) .indexed() .property( "addressId", ElementType.METHOD ) .documentId() .name( "id" ) .property( "country", ElementType.METHOD ) .indexEmbedded() .includeEmbeddedObjectId( true ); Long scotlandCountryId = setupTestData( builder ); FullTextSession s = builder.openFullTextSession(); // when QueryParser parser = new QueryParser( "id", TestConstants.standardAnalyzer ); org.apache.lucene.search.Query luceneQuery = parser.parse( "country.id:" + scotlandCountryId ); Transaction tx = s.beginTransaction(); // then FullTextQuery query = s.createFullTextQuery( luceneQuery ); assertEquals( 1, query.getResultSize() ); assertEquals( "Bob McRobb", ( (Address) query.list().iterator().next() ).getOwner() ); tx.commit(); s.close(); } } @Test public void canSetIndexNullAsProgrammatically() throws Exception { try (FullTextSessionBuilder builder = getFullTextSessionBuilder() ) { // given builder.fluentMapping() .entity( Address.class ) .indexed() .property( "addressId", ElementType.METHOD ) .documentId() .name( "id" ) .property( "country", ElementType.METHOD ) .indexEmbedded() .indexNullAs( IndexedEmbedded.DEFAULT_NULL_TOKEN ); setupTestData( builder ); FullTextSession s = builder.openFullTextSession(); // when QueryParser parser = new QueryParser( "id", TestConstants.standardAnalyzer ); org.apache.lucene.search.Query luceneQuery = parser.parse( "country:" + "_null_" ); Transaction tx = s.beginTransaction(); // then FullTextQuery query = s.createFullTextQuery( luceneQuery ); assertEquals( 1, query.getResultSize() ); assertEquals( "Alice Donellis", ( (Address) query.list().iterator().next() ).getOwner() ); tx.commit(); s.close(); } } @Test public void canSetIncludePathsProgrammatically() throws Exception { try (FullTextSessionBuilder builder = getFullTextSessionBuilder() ) { // given builder.fluentMapping() .entity( Address.class ) .indexed() .property( "addressId", ElementType.METHOD ) .documentId() .name( "id" ) .property( "country", ElementType.METHOD ) .indexEmbedded() .includePaths( "id", "name" ) .entity( Country.class ) .indexed() .property( "name", ElementType.METHOD ) .field(); Long scotlandCountryId = setupTestData( builder ); FullTextSession s = builder.openFullTextSession(); // when QueryParser parser = new QueryParser( "id", TestConstants.standardAnalyzer ); org.apache.lucene.search.Query luceneQuery = parser.parse( "country.id:" + scotlandCountryId ); Transaction tx = s.beginTransaction(); // then FullTextQuery query = s.createFullTextQuery( luceneQuery ); assertEquals( 1, query.getResultSize() ); assertEquals( "Bob McRobb", ( (Address) query.list().iterator().next() ).getOwner() ); // when luceneQuery = parser.parse( "country.name:Scotland" ); // then query = s.createFullTextQuery( luceneQuery ); assertEquals( 1, query.getResultSize() ); assertEquals( "Bob McRobb", ( (Address) query.list().iterator().next() ).getOwner() ); tx.commit(); s.close(); } } @SuppressWarnings("resource") private FullTextSessionBuilder getFullTextSessionBuilder() { return new FullTextSessionBuilder() .addAnnotatedClass( Address.class ) .addAnnotatedClass( Country.class ); } public Long setupTestData(FullTextSessionBuilder builder) { FullTextSession s = builder.openFullTextSession(); Transaction tx = s.beginTransaction(); Address bobsPlace = new Address(); bobsPlace.setOwner( "Bob McRobb" ); Address alicesPlace = new Address(); alicesPlace.setOwner( "Alice Donellis" ); Country scotland = new Country(); scotland.setName( "Scotland" ); bobsPlace.setCountry( scotland ); scotland.getAddresses().add( bobsPlace ); s.persist( bobsPlace ); s.persist( alicesPlace ); s.persist( scotland ); Long scotlandId = scotland.getId(); tx.commit(); s.close(); return scotlandId; } }