/*
* 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.bridge.impl;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.hibernate.search.bridge.FieldBridge;
import org.hibernate.search.bridge.builtin.NumericFieldBridge;
import org.hibernate.search.util.impl.CollectionHelper;
/**
* @author Emmanuel Bernard
*/
class NumericBridgeProvider extends ExtendedBridgeProvider {
private static final Map<String, NumericFieldBridge> numericBridges;
/**
* Those numeric types for which a String field will be used by default; Only if explicitly marked via {@code NumericField}
* they will be encoded numerically.
*/
// TODO HSEARCH-1779 Remove and use numeric fields for all number types by default
private static final Set<Class<?>> TYPES_USING_STRING_FIELD_BY_DEFAULT = CollectionHelper.<Class<?>>asSet( Short.class, short.class, Byte.class, byte.class );
static {
numericBridges = new HashMap<>( 12 );
numericBridges.put( Byte.class.getName(), NumericFieldBridge.BYTE_FIELD_BRIDGE );
numericBridges.put( byte.class.getName(), NumericFieldBridge.BYTE_FIELD_BRIDGE );
numericBridges.put( Short.class.getName(), NumericFieldBridge.SHORT_FIELD_BRIDGE );
numericBridges.put( short.class.getName(), NumericFieldBridge.SHORT_FIELD_BRIDGE );
numericBridges.put( Integer.class.getName(), NumericFieldBridge.INT_FIELD_BRIDGE );
numericBridges.put( int.class.getName(), NumericFieldBridge.INT_FIELD_BRIDGE );
numericBridges.put( Long.class.getName(), NumericFieldBridge.LONG_FIELD_BRIDGE );
numericBridges.put( long.class.getName(), NumericFieldBridge.LONG_FIELD_BRIDGE );
numericBridges.put( Double.class.getName(), NumericFieldBridge.DOUBLE_FIELD_BRIDGE );
numericBridges.put( double.class.getName(), NumericFieldBridge.DOUBLE_FIELD_BRIDGE );
numericBridges.put( Float.class.getName(), NumericFieldBridge.FLOAT_FIELD_BRIDGE );
numericBridges.put( float.class.getName(), NumericFieldBridge.FLOAT_FIELD_BRIDGE );
}
@Override
public FieldBridge provideFieldBridge(ExtendedBridgeProviderContext bridgeContext) {
// For id and short/byte use numeric fields only if explicitly requested via @NumericField
if ( !bridgeContext.isExplicitlyMarkedAsNumeric() &&
( bridgeContext.isId() || encodeWithStringFieldByDefault( bridgeContext.getReturnType() ) ) ) {
return null;
}
return numericBridges.get( bridgeContext.getReturnType().getName() );
}
private boolean encodeWithStringFieldByDefault(Class<?> clazz) {
return TYPES_USING_STRING_FIELD_BY_DEFAULT.contains( clazz );
}
}