/* * JBoss, Home of Professional Open Source * Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors * as indicated by the @authors tag. All rights reserved. * See the copyright.txt in the distribution for a * full listing of individual contributors. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ package org.hibernate.search.test.bridge; import static org.hibernate.search.test.bridge.MapBridgeTestEntity.Language.ENGLISH; import static org.hibernate.search.test.bridge.MapBridgeTestEntity.Language.ITALIAN; import static org.hibernate.search.test.bridge.MapBridgeTestEntity.Language.KLINGON; import java.util.Date; import java.util.List; import org.apache.lucene.index.IndexReader; 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.SearchFactory; import org.hibernate.search.bridge.util.impl.NumericFieldUtils; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.test.SearchTestCase; /** * Test indexing of {@link javax.persistence.ElementCollection} annotated elements. * * @author Davide D'Alto */ public class MapBridgeTest extends SearchTestCase { private FullTextSession fullTextSession; private MapBridgeTestEntity withoutNull; private MapBridgeTestEntity withNullEntry; private MapBridgeTestEntity withNullEmbedded; private Date indexedDate; @Override public void setUp() throws Exception { super.setUp(); Session session = openSession(); fullTextSession = Search.getFullTextSession( session ); prepareData(); } @Override public void tearDown() throws Exception { cleanData(); assertTrue( indexIsEmpty() ); super.tearDown(); } private void prepareData() { Transaction tx = fullTextSession.beginTransaction(); withoutNull = persistEntity( fullTextSession, "Davide D'Alto" ); withoutNull.addNullIndexed( 1, ITALIAN ); withoutNull.addNullIndexed( 2, ENGLISH ); withoutNull.addNumericNullIndexed( 1, 1 ); withoutNull.addNumericNullIndexed( 2, 2 ); withoutNull.addNullNotIndexed( 1, "DaltoValue" ); withoutNull.addNullNotIndexed( 2, "DavideValue" ); withoutNull.addNumericNullNotIndexed( 1, 3L ); withoutNull.addNumericNullNotIndexed( 2, 4L ); indexedDate = new Date(); withoutNull.addDate( 1, indexedDate ); withNullEntry = persistEntity( fullTextSession, "Worf" ); withNullEntry.addNullIndexed( 1, KLINGON ); withNullEntry.addNullIndexed( 2, ENGLISH ); withNullEntry.addNullIndexed( 3, null ); withNullEntry.addNumericNullIndexed( 1, 11 ); withNullEntry.addNumericNullIndexed( 2, null ); withNullEntry.addNullNotIndexed( 1, "WorfValue" ); withNullEntry.addNullNotIndexed( 2, null ); withNullEntry.addNumericNullNotIndexed( 1, 33L ); withNullEntry.addNumericNullNotIndexed( 2, null ); withNullEntry.addDate( 1, null ); withNullEmbedded = persistEntity( fullTextSession, "Mime" ); withNullEmbedded.setDates( null ); withNullEmbedded.setNumericNullIndexed( null ); withNullEmbedded.setNumericNullNotIndexed( null ); withNullEmbedded.setNullIndexed( null ); withNullEmbedded.setNullNotIndexed( null ); withNullEmbedded.setDates( null ); tx.commit(); } public void testSearchNullEntry() throws Exception { List<MapBridgeTestEntity> results = findResults( "nullIndexed", MapBridgeTestEntity.NULL_TOKEN ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Unexpected number of results in a collection", 1, results.size() ); assertEquals( "Wrong result returned looking for a null in a collection", withNullEntry.getName(), results.get( 0 ).getName() ); } public void testSearchNullEmbedded() throws Exception { List<MapBridgeTestEntity> results = findEmbeddedNullResults( "nullIndexed", MapBridgeTestEntity.NULL_EMBEDDED ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Unexpected number of results in a collection", 1, results.size() ); assertEquals( "Wrong result returned looking for a null in a collection", withNullEmbedded.getName(), results.get( 0 ).getName() ); } public void testSearchNullNumericEmbedded() throws Exception { List<MapBridgeTestEntity> results = findEmbeddedNullResults( "embeddedNum", MapBridgeTestEntity.NULL_EMBEDDED_NUMERIC ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Unexpected number of results in a collection", 1, results.size() ); assertEquals( "Wrong result returned looking for a null in a collection of numeric", withNullEmbedded.getName(), results.get( 0 ).getName() ); } public void testSearchNullNumericEntry() throws Exception { List<MapBridgeTestEntity> results = findResults( "numericNullIndexed", MapBridgeTestEntity.NULL_NUMERIC_TOKEN ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Unexpected number of results in a collection", 1, results.size() ); assertEquals( "Wrong result returned looking for a null in a collection of numeric", withNullEntry.getName(), results.get( 0 ).getName() ); } public void testSearchNotNullEntry() throws Exception { { List<MapBridgeTestEntity> results = findResults( "nullIndexed", KLINGON ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Wrong number of results returned for an indexed collection", 1, results.size() ); assertEquals( "Wrong result returned from an indexed collection", withNullEntry.getName(), results.get( 0 ) .getName() ); } { List<MapBridgeTestEntity> results = findResults( "nullIndexed", ITALIAN ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Wrong number of results returned for an indexed collection", 1, results.size() ); assertEquals( "Wrong result returned from an indexed collection", withoutNull.getName(), results.get( 0 ) .getName() ); } { List<MapBridgeTestEntity> results = findResults( "nullIndexed", ENGLISH ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Wrong number of results returned for an indexed collection", 2, results.size() ); } } public void testSearchEntryWhenNullEntryNotIndexed() throws Exception { { List<MapBridgeTestEntity> results = findResults( "nullNotIndexed", "DaltoValue" ); assertNotNull( "No result found for an indexed array", results ); assertEquals( "Wrong number of results returned for an indexed array", 1, results.size() ); assertEquals( "Wrong result returned from an indexed array", withoutNull.getName(), results.get( 0 ) .getName() ); } { List<MapBridgeTestEntity> results = findResults( "nullNotIndexed", "WorfValue" ); assertNotNull( "No result found for an indexed array", results ); assertEquals( "Wrong number of results returned for an indexed array", 1, results.size() ); assertEquals( "Wrong result returned from an indexed array", withNullEntry.getName(), results.get( 0 ) .getName() ); } } public void testSearchNotNullNumeric() throws Exception { { List<MapBridgeTestEntity> results = findNumericResults( "numericNullIndexed", 1 ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Wrong number of results returned for an indexed collection", 1, results.size() ); assertEquals( "Wrong result returned from an indexed collection", withoutNull.getName(), results.get( 0 ) .getName() ); } { List<MapBridgeTestEntity> results = findNumericResults( "numericNullIndexed", 11 ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Wrong number of results returned for an indexed collection", 1, results.size() ); assertEquals( "Wrong result returned from an indexed collection", withNullEntry.getName(), results.get( 0 ) .getName() ); } } public void testSearchNotNullNumericEntryWhenNullEntryNotIndexed() throws Exception { { List<MapBridgeTestEntity> results = findNumericResults( "numericNullNotIndexed", 3L ); assertNotNull( "No result found for an indexed array", results ); assertEquals( "Wrong number of results returned for an indexed array", 1, results.size() ); assertEquals( "Wrong result returned from an indexed array", withoutNull.getName(), results.get( 0 ) .getName() ); } { List<MapBridgeTestEntity> results = findNumericResults( "numericNullNotIndexed", 33L ); assertNotNull( "No result found for an indexed array", results ); assertEquals( "Wrong number of results returned for an indexed array", 1, results.size() ); assertEquals( "Wrong result returned from an indexed array", withNullEntry.getName(), results.get( 0 ) .getName() ); } } public void testDateIndexing() throws Exception { List<MapBridgeTestEntity> results = findResults( "dates", indexedDate ); assertNotNull( "No result found for an indexed collection", results ); assertEquals( "Wrong number of results returned for an indexed collection", 1, results.size() ); assertEquals( "Wrong result returned from a collection of Date", withoutNull.getName(), results.get( 0 ) .getName() ); } @SuppressWarnings("unchecked") private List<MapBridgeTestEntity> findEmbeddedNullResults(String fieldName, Object value) { QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder() .forEntity( MapBridgeTestEntity.class ).get(); Query query = queryBuilder.keyword().onField( fieldName ).ignoreAnalyzer().matching( value ).createQuery(); return fullTextSession.createFullTextQuery( query, MapBridgeTestEntity.class ).list(); } @SuppressWarnings("unchecked") private List<MapBridgeTestEntity> findResults(String fieldName, Object value) { QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder() .forEntity( MapBridgeTestEntity.class ).get(); Query query = queryBuilder.keyword().onField( fieldName ).matching( value ).createQuery(); return fullTextSession.createFullTextQuery( query, MapBridgeTestEntity.class ).list(); } @SuppressWarnings("unchecked") private List<MapBridgeTestEntity> findNumericResults(String fieldName, Object number) { Query query = NumericFieldUtils.createNumericRangeQuery( fieldName, number, number, true, true ); return fullTextSession.createFullTextQuery( query, MapBridgeTestEntity.class ).list(); } private MapBridgeTestEntity persistEntity(Session s, String name) { MapBridgeTestEntity boy = new MapBridgeTestEntity(); boy.setName( name ); s.persist( boy ); return boy; } @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { MapBridgeTestEntity.class, }; } private void cleanData() { Transaction tx = fullTextSession.beginTransaction(); @SuppressWarnings("unchecked") List<MapBridgeTestEntity> locations = fullTextSession.createCriteria( MapBridgeTestEntity.class ).list(); for ( MapBridgeTestEntity location : locations ) { fullTextSession.delete( location ); } tx.commit(); fullTextSession.close(); } private boolean indexIsEmpty() { int numDocsForeigner = countSizeForType( MapBridgeTestEntity.class ); return numDocsForeigner == 0; } private int countSizeForType(Class<?> type) { SearchFactory searchFactory = fullTextSession.getSearchFactory(); int numDocs = -1; // to have it fail in case of errors IndexReader locationIndexReader = searchFactory.getIndexReaderAccessor().open( type ); try { numDocs = locationIndexReader.numDocs(); } finally { searchFactory.getIndexReaderAccessor().close( locationIndexReader ); } return numDocs; } }