Package org.hibernate.search.test.bridge

Source Code of org.hibernate.search.test.bridge.IterableBridgeTest

/*
* 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.bridge;

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.engine.SearchFactory;
import org.hibernate.search.bridge.util.impl.NumericFieldUtils;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.hibernate.search.query.dsl.TermMatchingContext;
import org.hibernate.search.test.SearchTestBase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import static org.hibernate.search.test.bridge.IterableBridgeTestEntity.Language.ENGLISH;
import static org.hibernate.search.test.bridge.IterableBridgeTestEntity.Language.ITALIAN;
import static org.hibernate.search.test.bridge.IterableBridgeTestEntity.Language.KLINGON;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

/**
* Test indexing of {@link javax.persistence.ElementCollection} annotated elements.
*
* @author Davide D'Alto
*/
public class IterableBridgeTest extends SearchTestBase {

  private FullTextSession fullTextSession;
  private IterableBridgeTestEntity withoutNull;
  private IterableBridgeTestEntity withNullEntry;
  private IterableBridgeTestEntity withNullEmbedded;
  private Date indexedDate;

  @Override
  @Before
  public void setUp() throws Exception {
    super.setUp();
    Session session = openSession();
    fullTextSession = Search.getFullTextSession( session );
    prepareData();
  }

  @Override
  @After
  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( ITALIAN );
    withoutNull.addNullIndexed( ENGLISH );
    withoutNull.addNumericNullIndexed( 1 );
    withoutNull.addNumericNullIndexed( 2 );
    withoutNull.addNullNotIndexed( "DaltoValue" );
    withoutNull.addNullNotIndexed( "DavideValue" );
    withoutNull.addNumericNullNotIndexed( 3L );
    withoutNull.addNumericNullNotIndexed( 4L );
    indexedDate = new Date();
    withoutNull.addDate( indexedDate );

    withNullEntry = persistEntity( fullTextSession, "Worf" );
    withNullEntry.addNullIndexed( KLINGON );
    withNullEntry.addNullIndexed( ENGLISH );
    withNullEntry.addNullIndexed( null );
    withNullEntry.addNumericNullIndexed( 11 );
    withNullEntry.addNumericNullIndexed( null );
    withNullEntry.addNullNotIndexed( "WorfValue" );
    withNullEntry.addNullNotIndexed( null );
    withNullEntry.addNumericNullNotIndexed( 33L );
    withNullEntry.addNumericNullNotIndexed( null );
    withNullEntry.addDate( 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();
  }

  @Test
  public void testSearchNullEntry() throws Exception {
    {
      List<IterableBridgeTestEntity> results = findResults( "nullIndexed", IterableBridgeTestEntity.NULL_TOKEN, true );

      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() );
    }
  }

  @Test
  public void testSearchNullEmbedded() throws Exception {
    List<IterableBridgeTestEntity> results = findEmbeddedNullResults( "nullIndexed", IterableBridgeTestEntity.NULL_EMBEDDED, true );

    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() );
  }

  @Test
  public void testSearchNullNumericEmbedded() throws Exception {
    List<IterableBridgeTestEntity> results =
        findEmbeddedNullResults( "embeddedNum", IterableBridgeTestEntity.NULL_EMBEDDED_NUMERIC, true );

    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() );
  }

  @Test
  public void testSearchNullNumericEntry() throws Exception {
    List<IterableBridgeTestEntity> results = findResults( "numericNullIndexed", IterableBridgeTestEntity.NULL_NUMERIC_TOKEN, true );

    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() );
  }

  @Test
  public void testSearchNotNullEntry() throws Exception {
    {
      List<IterableBridgeTestEntity> results = findResults( "nullIndexed", KLINGON, false );

      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<IterableBridgeTestEntity> results = findResults( "nullIndexed", ITALIAN, false );

      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<IterableBridgeTestEntity> results = findResults( "nullIndexed", ENGLISH, false );

      assertNotNull( "No result found for an indexed collection", results );
      assertEquals( "Wrong number of results returned for an indexed collection", 2, results.size() );
    }
  }

  @Test
  public void testSearchEntryWhenNullEntryNotIndexed() throws Exception {
    {
      List<IterableBridgeTestEntity> results = findResults( "nullNotIndexed", "DaltoValue", false );

      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<IterableBridgeTestEntity> results = findResults( "nullNotIndexed", "WorfValue", false );

      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() );
    }
  }

  @Test
  public void testSearchNotNullNumeric() throws Exception {
    {
      List<IterableBridgeTestEntity> 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<IterableBridgeTestEntity> 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() );
    }
  }

  @Test
  public void testSearchNotNullNumericEntryWhenNullEntryNotIndexed() throws Exception {
    {
      List<IterableBridgeTestEntity> 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<IterableBridgeTestEntity> 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() );
    }
  }

  @Test
  public void testDateIndexing() throws Exception {
    List<IterableBridgeTestEntity> results = findResults( "dates", indexedDate, false );

    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<IterableBridgeTestEntity> findEmbeddedNullResults(String fieldName, Object value, boolean checkForNullToken) {
    QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder()
        .forEntity( IterableBridgeTestEntity.class ).get();
    TermMatchingContext termMatchingContext = queryBuilder.keyword().onField( fieldName );
    if ( checkForNullToken ) {
      termMatchingContext.ignoreFieldBridge();
    }
    Query query = termMatchingContext
        .ignoreAnalyzer()
        .matching( value ).createQuery();
    return fullTextSession.createFullTextQuery( query, IterableBridgeTestEntity.class ).list();
  }

  @SuppressWarnings("unchecked")
  private List<IterableBridgeTestEntity> findResults( String fieldName, Object value, boolean checkRawValue) {
    QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder()
        .forEntity( IterableBridgeTestEntity.class ).get();
    TermMatchingContext termMatchingContext = queryBuilder.keyword().onField( fieldName );
    if ( checkRawValue ) {
      termMatchingContext.ignoreFieldBridge();
    }
    Query query = termMatchingContext.matching( value ).createQuery();
    return fullTextSession.createFullTextQuery( query, IterableBridgeTestEntity.class ).list();
  }

  @SuppressWarnings("unchecked")
  private List<IterableBridgeTestEntity> findNumericResults( String fieldName, Object number) {
    Query query = NumericFieldUtils.createNumericRangeQuery( fieldName, number, number, true, true );
    return fullTextSession.createFullTextQuery( query, IterableBridgeTestEntity.class ).list();
  }

  private IterableBridgeTestEntity persistEntity(Session s, String name) {
    IterableBridgeTestEntity boy = new IterableBridgeTestEntity();
    boy.setName( name );
    s.persist( boy );
    return boy;
  }

  @Override
  protected Class<?>[] getAnnotatedClasses() {
    return new Class<?>[] { IterableBridgeTestEntity.class, };
  }

  private void cleanData() {
    Transaction tx = fullTextSession.beginTransaction();
    @SuppressWarnings("unchecked")
    List<IterableBridgeTestEntity> locations = fullTextSession.createCriteria( IterableBridgeTestEntity.class ).list();
    for ( IterableBridgeTestEntity location : locations ) {
      fullTextSession.delete( location );
    }
    tx.commit();
    fullTextSession.close();
  }

  private boolean indexIsEmpty() {
    int numDocsForeigner = countSizeForType( IterableBridgeTestEntity.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;
  }
}
TOP

Related Classes of org.hibernate.search.test.bridge.IterableBridgeTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.