/* * 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.nullindexed; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.List; import org.apache.lucene.search.Query; import org.hibernate.Session; import org.hibernate.Transaction; 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.junit.ElasticsearchSupportInProgress; import org.junit.Test; import org.junit.experimental.categories.Category; /** * @author Davide D'Alto */ public class NullEmbeddedTest extends SearchTestBase { @Test public void testEmbeddedNullNotIndexedQuery() throws Exception { Man withoutPuppies = new Man( "Davide" ); withoutPuppies.setPartner( null ); Pet dog = new Pet( "dog" ); dog.setPuppies( null ); withoutPuppies.setPet( dog ); Man wihKittens = new Man( "Omar" ); Pet cat = new Pet( "cat" ); wihKittens.setPet( cat ); Puppy kittenOne = new Puppy( "kitten one" ); Puppy KittenTwo = new Puppy( "kitten two" ); cat.addPuppy( kittenOne ).addPuppy( KittenTwo ); Session s = openSession(); Transaction tx = s.beginTransaction(); s.persist( withoutPuppies ); s.persist( wihKittens ); s.persist( dog ); s.persist( cat ); s.persist( kittenOne ); s.persist( KittenTwo ); tx.commit(); try { findNullsFor( s, "partner", "indexAsNull not set" ); fail( "Embedded null field should not exists for field without indexAsNull property" ); } catch (SearchException e) { // Succeded: indexAsNull not specified so the field is not created } s.clear(); tx = s.beginTransaction(); s.delete( s.get( Man.class, withoutPuppies.getId() ) ); s.delete( s.get( Man.class, wihKittens.getId() ) ); s.delete( s.get( Pet.class, dog.getId() ) ); s.delete( s.get( Pet.class, cat.getId() ) ); s.delete( s.get( Puppy.class, kittenOne.getId() ) ); s.delete( s.get( Puppy.class, KittenTwo.getId() ) ); tx.commit(); s.close(); } @Test @Category(ElasticsearchSupportInProgress.class) // HSEARCH-2389 Support indexNullAs for @IndexedEmbedded applied on objects with Elasticsearch public void testNestedEmbeddedNullIndexing() throws Exception { Man withPet = new Man( "Davide" ); Pet dog = new Pet( "dog" ); dog.setPuppies( null ); withPet.setPet( dog ); Man withPuppies = new Man( "Omar" ); Pet cat = new Pet( "cat" ); withPuppies.setPet( cat ); Puppy puppy1 = new Puppy( "puppy one" ); Puppy puppy2 = new Puppy( "puppy two" ); cat.addPuppy( puppy1 ).addPuppy( puppy2 ); Session s = openSession(); Transaction tx = s.beginTransaction(); s.persist( withPet ); s.persist( withPuppies ); s.persist( dog ); s.persist( cat ); s.persist( puppy1 ); s.persist( puppy2 ); tx.commit(); List<Man> result = findNullsFor( s, "pet.pups", "_null_" ); assertEquals( "Wrong number of results found", 1, result.size() ); assertEquals( "Wrong result returned", withPet, result.get( 0 ) ); s.clear(); tx = s.beginTransaction(); s.delete( s.get( Man.class, withPet.getId() ) ); s.delete( s.get( Man.class, withPuppies.getId() ) ); s.delete( s.get( Pet.class, dog.getId() ) ); s.delete( s.get( Pet.class, cat.getId() ) ); s.delete( s.get( Puppy.class, puppy1.getId() ) ); s.delete( s.get( Puppy.class, puppy2.getId() ) ); tx.commit(); s.close(); } @Test @Category(ElasticsearchSupportInProgress.class) // HSEARCH-2389 Support indexNullAs for @IndexedEmbedded applied on objects with Elasticsearch public void testEmbeddedNullIndexing() throws Exception { Man me = new Man( "Davide" ); Pet dog = new Pet( "dog" ); me.setPet( null ); Man someoneElse = new Man( "Omar" ); Pet cat = new Pet( "cat" ); someoneElse.setPet( cat ); Puppy puppy1 = new Puppy( "puppy one" ); Puppy puppy2 = new Puppy( "puppy two" ); cat.addPuppy( puppy1 ).addPuppy( puppy2 ); Session s = openSession(); Transaction tx = s.beginTransaction(); s.persist( me ); s.persist( someoneElse ); s.persist( dog ); s.persist( cat ); s.persist( puppy1 ); s.persist( puppy2 ); tx.commit(); List<Man> result = findNullsFor( getSession(), "pet", Man.NO_PET ); assertEquals( "Wrong number of results found", 1, result.size() ); assertEquals( "Wrong result returned", me, result.get( 0 ) ); s.clear(); tx = s.beginTransaction(); s.delete( s.get( Man.class, me.getId() ) ); s.delete( s.get( Man.class, someoneElse.getId() ) ); s.delete( s.get( Pet.class, dog.getId() ) ); s.delete( s.get( Pet.class, cat.getId() ) ); s.delete( s.get( Puppy.class, puppy1.getId() ) ); s.delete( s.get( Puppy.class, puppy2.getId() ) ); tx.commit(); s.close(); } @Test @Category(ElasticsearchSupportInProgress.class) // HSEARCH-2389 Support indexNullAs for @IndexedEmbedded applied on objects with Elasticsearch public void testNestedEmbeddedNullElementCollectionIndexing() throws Exception { Man withPetWithoutTricks = new Man( "Davide" ); Pet cat = new Pet( "cat" ); cat.setTricks( null ); withPetWithoutTricks.setPet( cat ); Man withPetWithTricks = new Man( "Omar" ); Pet dog = new Pet( "dog" ); withPetWithTricks.setPet( dog ); Trick trick1 = new Trick( "sit", "bone" ); Trick trick2 = new Trick( "high five", "steak" ); dog.addTrick( trick1 ).addTrick( trick2 ); Session s = openSession(); Transaction tx = s.beginTransaction(); s.persist( withPetWithoutTricks ); s.persist( withPetWithTricks ); s.persist( cat ); s.persist( dog ); tx.commit(); List<Man> result = findNullsFor( s, "pet.tricks_", "_null_" ); assertEquals( "Wrong number of results found", 1, result.size() ); assertEquals( "Wrong result returned", withPetWithoutTricks, result.get( 0 ) ); s.clear(); tx = s.beginTransaction(); s.delete( s.get( Man.class, withPetWithoutTricks.getId() ) ); s.delete( s.get( Man.class, withPetWithTricks.getId() ) ); s.delete( s.get( Pet.class, cat.getId() ) ); s.delete( s.get( Pet.class, dog.getId() ) ); tx.commit(); s.close(); } private List<Man> findNullsFor(Session s, String fieldName, String value) { FullTextSession session = Search.getFullTextSession( s ); QueryBuilder queryBuilder = session.getSearchFactory().buildQueryBuilder().forEntity( Man.class ).get(); Query query = queryBuilder.keyword().onField( fieldName ).ignoreAnalyzer().matching( value ).createQuery(); @SuppressWarnings("unchecked") List<Man> result = session.createFullTextQuery( query ).list(); return result; } @Override public Class<?>[] getAnnotatedClasses() { return new Class[] { Man.class, Pet.class, Puppy.class, Woman.class }; } }