/* * 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.dsl; import java.util.List; import org.apache.lucene.document.Document; import org.apache.lucene.search.Query; import org.hibernate.search.annotations.DocumentId; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.FieldBridge; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.backend.spi.Work; import org.hibernate.search.backend.spi.WorkType; import org.hibernate.search.bridge.LuceneOptions; import org.hibernate.search.bridge.MetadataProvidingFieldBridge; import org.hibernate.search.bridge.spi.FieldMetadataBuilder; import org.hibernate.search.bridge.spi.FieldType; import org.hibernate.search.engine.integration.impl.ExtendedSearchIntegrator; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.query.engine.spi.EntityInfo; import org.hibernate.search.testsupport.TestForIssue; import org.hibernate.search.testsupport.junit.SearchFactoryHolder; import org.hibernate.search.testsupport.setup.TransactionContextForTest; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; /** * The RangeQuery builder DSL needs to guess the right type of range it needs to produce, by either relying * on the known metadata for the target fields, or by guessing it from the types provided as arguments. * * @author Sanne Grinovero (C) 2014 Red Hat Inc. */ @TestForIssue(jiraKey = "HSEARCH-1758") public class NumericTypeGuessedTest { @Rule public SearchFactoryHolder sfHolder = new SearchFactoryHolder( CustomBridgedNumbers.class ); @Test public void numericRangeQueryOnCustomField() { final ExtendedSearchIntegrator searchFactory = sfHolder.getSearchFactory(); storeData( "title-one", "1" ); storeData( "title-two", "2" ); storeData( "title-three", "3" ); QueryBuilder queryBuilder = searchFactory .buildQueryBuilder() .forEntity( CustomBridgedNumbers.class ) .get(); Query query = queryBuilder .range() .onField( "customField" ) .from( 1 ).excludeLimit() .to( 3 ).excludeLimit() .createQuery(); List<EntityInfo> queryEntityInfos = searchFactory.createHSQuery( query, CustomBridgedNumbers.class ) .projection( "title" ) .queryEntityInfos(); Assert.assertEquals( 1, queryEntityInfos.size() ); EntityInfo entityInfo = queryEntityInfos.get( 0 ); Assert.assertEquals( "title-two", entityInfo.getProjection()[0] ); } private void storeData(String title, String value) { CustomBridgedNumbers entry = new CustomBridgedNumbers(); entry.title = title; entry.textEncodedInt = value; Work work = new Work( entry, entry.title, WorkType.ADD, false ); TransactionContextForTest tc = new TransactionContextForTest(); sfHolder.getSearchFactory().getWorker().performWork( work, tc ); tc.end(); } @Indexed public static class CustomBridgedNumbers { @DocumentId String title; @Field(bridge = @FieldBridge(impl = NumericEncodingCustom.class)) String textEncodedInt; } public static class NumericEncodingCustom implements org.hibernate.search.bridge.FieldBridge, MetadataProvidingFieldBridge { @Override public void configureFieldMetadata(String name, FieldMetadataBuilder builder) { builder.field( "customField", FieldType.INTEGER ); } @Override public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { if ( value != null ) { Integer i = Integer.parseInt( (String) value ); luceneOptions.addNumericFieldToDocument( "customField", i, document ); } } } }