/* * 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.id; import static org.junit.Assert.assertEquals; import java.util.List; import org.apache.lucene.search.NumericRangeQuery; import org.hibernate.search.annotations.DocumentId; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.NumericField; import org.hibernate.search.annotations.SortableField; import org.hibernate.search.annotations.Store; import org.hibernate.search.backend.spi.Work; import org.hibernate.search.backend.spi.WorkType; import org.hibernate.search.backend.spi.Worker; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.query.engine.spi.EntityInfo; import org.hibernate.search.query.engine.spi.HSQuery; import org.hibernate.search.spi.SearchIntegrator; import org.hibernate.search.testsupport.junit.SearchFactoryHolder; import org.hibernate.search.testsupport.setup.TransactionContextForTest; import org.junit.Rule; import org.junit.Test; /** * Test to verify that we allow to encode the DocumentId field as a NumericField * * @author Sanne Grinovero */ public class NumericIdEncodingTest { @Rule public SearchFactoryHolder factoryHolder = new SearchFactoryHolder( Staff.class ); @Test public void testNumericIdRangeQuery() { storeTestingData( new Staff( 1l, "One" ), new Staff( 2l, "Two" ), new Staff( 3l, "Three" ), new Staff( 4l, "Four" ) ); NumericRangeQuery<Long> smallRangeQuery = NumericRangeQuery.newLongRange( "id", 1l, 3l, false, false ); expectedProjections( smallRangeQuery, "Two" ); NumericRangeQuery<Long> universeRangeQuery = NumericRangeQuery.newLongRange( "id", null, null, false, false ); expectedProjections( universeRangeQuery, "One", "Two", "Three", "Four" ); } private void expectedProjections(NumericRangeQuery<Long> numericRangeQuery, String... expectedProjections) { SearchIntegrator searchFactory = factoryHolder.getSearchFactory(); QueryBuilder queryBuilder = searchFactory.buildQueryBuilder().forEntity( Staff.class ).get(); HSQuery hsQuery = searchFactory.createHSQuery( numericRangeQuery, Staff.class ) .projection( "name" ) .sort( queryBuilder.sort().byField( "idSort" ).createSort() ); List<EntityInfo> result = hsQuery.queryEntityInfos(); assertEquals( expectedProjections.length, result.size() ); assertEquals( expectedProjections.length, hsQuery.queryResultSize() ); for ( int i = 0; i < expectedProjections.length; i++ ) { assertEquals( expectedProjections[i], result.get( i ).getProjection()[0] ); } } private void storeTestingData(Staff... testData) { Worker worker = factoryHolder.getSearchFactory().getWorker(); TransactionContextForTest tc = new TransactionContextForTest(); for ( int i = 0; i < testData.length; i++ ) { Staff p = testData[i]; worker.performWork( new Work( p, p.id, WorkType.INDEX ), tc ); } tc.end(); } @Indexed public class Staff { @DocumentId @NumericField(forField = "id") @Field(name = "idSort") @SortableField(forField = "idSort") final Long id; @Field(store = Store.YES) final String name; Staff(long id, String name) { this.id = id; this.name = name; } } }