private void putInFieldTypeBucket(Set<String> stringEncodedFieldNames, Set<String> numericEncodedFieldNames, FieldDescriptor fieldDescriptor) { if ( FieldDescriptor.Type.NUMERIC.equals( fieldDescriptor.getType() ) ) { // If the property allows to index a string based null token, a non numeric query is ok // We are currently skipping this case completely from the validation. In a full on implementation we would // need to take term values into account and in the case of a string query only allow the null token. // For now we cast a net which is potentially too wide (HF) if ( !fieldDescriptor.indexNull() ) { numericEncodedFieldNames.add( fieldDescriptor.getName() ); } } else { stringEncodedFieldNames.add( fieldDescriptor.getName() ); } }
private Map<String, FieldDescriptor> createAllFieldDescriptors() { Map<String, FieldDescriptor> fieldDescriptorMap = new HashMap<String, FieldDescriptor>(); for ( FieldDescriptor fieldDescriptor : classBridgeFieldDescriptors ) { fieldDescriptorMap.put( fieldDescriptor.getName(), fieldDescriptor ); } for ( PropertyDescriptor propertyDescriptor : propertyDescriptors ) { for ( FieldDescriptor fieldDescriptor : propertyDescriptor.getIndexedFields() ) { fieldDescriptorMap.put( fieldDescriptor.getName(), fieldDescriptor ); } } return fieldDescriptorMap; }
@Override public PropertyDescriptor getProperty(String propertyName) { if ( propertyName == null ) { throw log.getPropertyNameCannotBeNullException(); } for ( PropertyDescriptor propertyDescriptor : propertyDescriptors ) { if ( propertyDescriptor.getName().equals( propertyName ) ) { return propertyDescriptor; } } return null; }
@Test public void testFieldDescriptorLuceneOptions() { String fieldName = "my-snafu"; FieldDescriptor fieldDescriptor = getFieldDescriptor( Snafu.class, fieldName ); assertEquals( "Wrong field name", fieldName, fieldDescriptor.getName() ); assertEquals( Index.NO, fieldDescriptor.getIndex() ); assertEquals( Analyze.NO, fieldDescriptor.getAnalyze() ); assertEquals( Store.YES, fieldDescriptor.getStore() ); assertEquals( Norms.NO, fieldDescriptor.getNorms() ); assertEquals( TermVector.WITH_POSITIONS, fieldDescriptor.getTermVector() ); assertEquals( 10.0f, fieldDescriptor.getBoost(), 0 ); assertFalse( fieldDescriptor.indexNull() ); assertNull( fieldDescriptor.indexNullAs() ); assertTrue( FieldSettingsDescriptor.Type.BASIC.equals( fieldDescriptor.getType() ) ); }
@Test public void testFieldDescriptorExplicitNumericOptions() { FieldDescriptor fieldDescriptor = getFieldDescriptor( Snafu.class, "numericField" ); assertTrue( FieldSettingsDescriptor.Type.NUMERIC.equals( fieldDescriptor.getType() ) ); NumericFieldSettingsDescriptor numericFieldSettingsDescriptor = fieldDescriptor.as( NumericFieldSettingsDescriptor.class ); int expectedPrecisionStep = 16; assertEquals( "the numeric step should be " + expectedPrecisionStep, expectedPrecisionStep, numericFieldSettingsDescriptor.precisionStep() ); NumericEncodingType expectedNumericEncodingType = NumericEncodingType.INTEGER; assertEquals( "the numeric field should be encoded as " + expectedNumericEncodingType, expectedNumericEncodingType, numericFieldSettingsDescriptor.encodingType() ); }
@Test public void testFieldDescriptorWithCoordinates() { FieldDescriptor fieldDescriptor = getFieldDescriptor( SnafuWithCoordinates.class, "location" ); assertNotNull( fieldDescriptor.getFieldBridge() ); assertTrue( fieldDescriptor.getFieldBridge() instanceof SpatialFieldBridge ); assertTrue( FieldSettingsDescriptor.Type.SPATIAL.equals( fieldDescriptor.getType() ) ); }
@Test public void testCastingNonNumericFieldDescriptorToNumericOneThrowsException() { FieldDescriptor fieldDescriptor = getFieldDescriptor( Snafu.class, "my-snafu" ); assertFalse( FieldSettingsDescriptor.Type.NUMERIC.equals( fieldDescriptor.getType() ) ); try { fieldDescriptor.as( NumericFieldSettingsDescriptor.class ); fail( "A basic field descriptor cannot be narrowed to a numeric one" ); } catch (ClassCastException e) { assertTrue( "Wrong exception: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000180" ) ); } }
@Test public void testFieldAnnotationAddsAdditionalFieldForIdProperty() { IndexedTypeDescriptor typeDescriptor = DescriptorTestHelper.getTypeDescriptor( metadataProvider, Quux.class ); PropertyDescriptor propertyDescriptor = typeDescriptor.getProperty( "id" ); assertEquals( "Unexpected number of fields", 2, propertyDescriptor.getIndexedFields().size() ); } }
/** * Indicates whether the considered {@code FieldBridge} is a numeric one. * * @param fieldBridge the considered {@code FieldBridge} * @return true if the considered {@code FieldBridge} is a numeric {@code FieldBridge} */ public static boolean isNumericFieldBridge(FieldBridge fieldBridge) { EncodingBridge encodingBridge = BridgeAdaptorUtils.unwrapAdaptorOnly( fieldBridge, EncodingBridge.class ); return !NumericEncodingType.UNKNOWN.equals( getNumericEncoding( encodingBridge ) ); }
private FieldDescriptor getFieldDescriptor(Class<?> clazz, String fieldName) { IndexedTypeDescriptor typeDescriptor = DescriptorTestHelper.getTypeDescriptor( metadataProvider, clazz ); return typeDescriptor.getIndexedField( fieldName ); } }
private PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String propertyName) { IndexedTypeDescriptor typeDescriptor = DescriptorTestHelper.getTypeDescriptor( metadataProvider, clazz ); return typeDescriptor.getProperty( propertyName ); } }
private void putInFieldTypeBucket(Set<String> stringEncodedFieldNames, Set<String> numericEncodedFieldNames, FieldDescriptor fieldDescriptor) { if ( FieldDescriptor.Type.NUMERIC.equals( fieldDescriptor.getType() ) ) { // If the property allows to index a string based null token, a non numeric query is ok // We are currently skipping this case completely from the validation. In a full on implementation we would // need to take term values into account and in the case of a string query only allow the null token. // For now we cast a net which is potentially too wide (HF) if ( !fieldDescriptor.indexNull() ) { numericEncodedFieldNames.add( fieldDescriptor.getName() ); } } else { stringEncodedFieldNames.add( fieldDescriptor.getName() ); } }
@Test public void testFieldDescriptorShortNumericFieldBridge() { FieldDescriptor fieldDescriptor = getFieldDescriptor( Snafu.class, "numericShortField" ); assertNotNull( fieldDescriptor.getFieldBridge() ); assertTrue( fieldDescriptor.getFieldBridge() instanceof NumericFieldBridge ); assertTrue( FieldSettingsDescriptor.Type.NUMERIC.equals( fieldDescriptor.getType() ) ); NumericFieldSettingsDescriptor numericFieldSettingsDescriptor = fieldDescriptor.as( NumericFieldSettingsDescriptor.class ); int expectedPrecisionStep = 8; assertEquals( "the numeric step should be " + expectedPrecisionStep, expectedPrecisionStep, numericFieldSettingsDescriptor.precisionStep() ); NumericEncodingType expectedNumericEncodingType = NumericEncodingType.INTEGER; assertEquals( "the short numeric field should be encoded as " + expectedNumericEncodingType, expectedNumericEncodingType, numericFieldSettingsDescriptor.encodingType() ); }
@Test public void testFieldDescriptorSpatialFieldBridge() { FieldDescriptor fieldDescriptor = getFieldDescriptor( Snafu.class, "location" ); assertNotNull( fieldDescriptor.getFieldBridge() ); assertTrue( fieldDescriptor.getFieldBridge() instanceof SpatialFieldBridge ); assertTrue( FieldSettingsDescriptor.Type.SPATIAL.equals( fieldDescriptor.getType() ) ); }
private Map<String, FieldDescriptor> createAllFieldDescriptors() { Map<String, FieldDescriptor> fieldDescriptorMap = new HashMap<String, FieldDescriptor>(); for ( FieldDescriptor fieldDescriptor : classBridgeFieldDescriptors ) { fieldDescriptorMap.put( fieldDescriptor.getName(), fieldDescriptor ); } for ( PropertyDescriptor propertyDescriptor : propertyDescriptors ) { for ( FieldDescriptor fieldDescriptor : propertyDescriptor.getIndexedFields() ) { fieldDescriptorMap.put( fieldDescriptor.getName(), fieldDescriptor ); } } return fieldDescriptorMap; }
@Override public PropertyDescriptor getProperty(String propertyName) { if ( propertyName == null ) { throw log.getPropertyNameCannotBeNullException(); } for ( PropertyDescriptor propertyDescriptor : propertyDescriptors ) { if ( propertyDescriptor.getName().equals( propertyName ) ) { return propertyDescriptor; } } return null; }
/** * Indicates whether the considered {@code FieldBridge}, or its {@link ContainerBridge#getElementBridge() element bridge}, * is a numeric one. * * @param fieldBridge the considered {@code FieldBridge} * @return true if the considered {@code FieldBridge} is a numeric {@code FieldBridge} */ public static boolean isNumericContainerOrNumericFieldBridge(FieldBridge fieldBridge) { EncodingBridge encodingBridge = BridgeAdaptorUtils.unwrapAdaptorAndContainer( fieldBridge, EncodingBridge.class ); return !NumericEncodingType.UNKNOWN.equals( getNumericEncoding( encodingBridge ) ); }
private FieldDescriptor getFieldDescriptor(Class<?> clazz, String fieldName) { IndexedTypeDescriptor typeDescriptor = DescriptorTestHelper.getTypeDescriptor( metadataProvider, clazz ); return typeDescriptor.getIndexedField( fieldName ); }
/** * Indicates whether the considered {@code FieldBridge} is a numeric one. * * @param fieldBridge the considered {@code FieldBridge} * @return true if the considered {@code FieldBridge} is a numeric {@code FieldBridge} */ public static boolean isNumericFieldBridge(FieldBridge fieldBridge) { EncodingBridge encodingBridge = BridgeAdaptorUtils.unwrapAdaptorOnly( fieldBridge, EncodingBridge.class ); return !NumericEncodingType.UNKNOWN.equals( getNumericEncoding( encodingBridge ) ); }
/** * Indicates whether the considered {@code FieldBridge}, or its {@link ContainerBridge#getElementBridge() element bridge}, * is a numeric one. * * @param fieldBridge the considered {@code FieldBridge} * @return true if the considered {@code FieldBridge} is a numeric {@code FieldBridge} */ public static boolean isNumericContainerOrNumericFieldBridge(FieldBridge fieldBridge) { EncodingBridge encodingBridge = BridgeAdaptorUtils.unwrapAdaptorAndContainer( fieldBridge, EncodingBridge.class ); return !NumericEncodingType.UNKNOWN.equals( getNumericEncoding( encodingBridge ) ); }