
org.hibernate.search.engine.metadata.impl.PropertyMetadata Maven / Gradle / Ivy
Show all versions of hibernate-search-engine Show documentation
/*
* 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 .
*/
package org.hibernate.search.engine.metadata.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.annotations.common.reflection.XProperty;
import org.hibernate.search.engine.BoostStrategy;
import org.hibernate.search.engine.impl.DefaultBoostStrategy;
import org.hibernate.search.util.impl.ReflectionHelper;
/**
* Encapsulating the metadata for a single indexed property (field or getter).
*
* Each field or getter can have multiple document fields (via {@code @Fields}).
*
* @author Hardy Ferentschik
*/
public class PropertyMetadata {
private final XProperty propertyAccessor;
private final Class> propertyClass;
private final Map documentFieldMetadataMap;
private final Set documentFieldMetadataList;
private final Set sortableFieldMetadata;
private final BoostStrategy dynamicBoostStrategy;
private final String propertyAccessorName;
/**
* Fields explicitly declared by {@link org.hibernate.search.bridge.MetadataProvidingFieldBridge}s.
*
* Note: This is only to be used for validation / schema creation in ES, don't use it to drive invocation of field
* bridges at indexing time!
*/
private final Map bridgeDefinedFields;
private PropertyMetadata(Builder builder) {
this.propertyAccessor = builder.propertyAccessor;
this.propertyClass = builder.propertyClass;
this.documentFieldMetadataList = Collections.unmodifiableSet( builder.fieldMetadataSet );
this.documentFieldMetadataMap = createDocumentFieldMetadataMap( builder.fieldMetadataSet );
this.sortableFieldMetadata = Collections.unmodifiableSet( builder.sortableFieldMetadata );
this.bridgeDefinedFields = Collections.unmodifiableMap( builder.bridgeDefinedFields );
this.propertyAccessorName = propertyAccessor == null ? null : propertyAccessor.getName();
if ( builder.dynamicBoostStrategy != null ) {
this.dynamicBoostStrategy = builder.dynamicBoostStrategy;
}
else {
this.dynamicBoostStrategy = DefaultBoostStrategy.INSTANCE;
}
}
private Map createDocumentFieldMetadataMap(Set fieldMetadataSet) {
Map tmpMap = new HashMap<>();
for ( DocumentFieldMetadata documentFieldMetadata : fieldMetadataSet ) {
tmpMap.put( documentFieldMetadata.getName(), documentFieldMetadata );
}
return Collections.unmodifiableMap( tmpMap );
}
public XProperty getPropertyAccessor() {
return propertyAccessor;
}
public Class> getPropertyClass() {
return propertyClass;
}
public String getPropertyAccessorName() {
return propertyAccessorName;
}
/**
* @deprecated use getFieldMetadataSet() instead
*/
@Deprecated
public List getFieldMetadata() {
return new ArrayList( documentFieldMetadataList );
}
public Set getFieldMetadataSet() {
return documentFieldMetadataList;
}
public DocumentFieldMetadata getFieldMetadata(String fieldName) {
return documentFieldMetadataMap.get( fieldName );
}
/**
* Accessor to the metadata of the sortable fields.
*
* @return the sortable fields defined for this property.
*/
public Set getSortableFieldMetadata() {
return sortableFieldMetadata;
}
public Map getBridgeDefinedFields() {
return bridgeDefinedFields;
}
public BoostStrategy getDynamicBoostStrategy() {
return dynamicBoostStrategy;
}
public static class Builder {
// required parameters
private final XProperty propertyAccessor;
private final Class> propertyClass;
private final Set fieldMetadataSet;
private final Set sortableFieldMetadata;
private final Map bridgeDefinedFields;
// optional parameters
private BoostStrategy dynamicBoostStrategy;
public Builder(XProperty propertyAccessor, Class> propertyClass) {
if ( propertyAccessor != null ) {
ReflectionHelper.setAccessible( propertyAccessor );
}
this.propertyAccessor = propertyAccessor;
this.propertyClass = propertyClass;
this.fieldMetadataSet = new HashSet<>();
this.sortableFieldMetadata = new HashSet<>();
this.bridgeDefinedFields = new HashMap<>();
}
public Builder dynamicBoostStrategy(BoostStrategy boostStrategy) {
this.dynamicBoostStrategy = boostStrategy;
return this;
}
public Builder addDocumentField(DocumentFieldMetadata documentFieldMetadata) {
this.fieldMetadataSet.add( documentFieldMetadata );
return this;
}
public Builder addSortableField(SortableFieldMetadata sortableField) {
this.sortableFieldMetadata.add( sortableField );
return this;
}
public Builder addBridgeDefinedField(BridgeDefinedField bridgeDefinedField) {
this.bridgeDefinedFields.put( bridgeDefinedField.getName(), bridgeDefinedField );
return this;
}
public XProperty getPropertyAccessor() {
return propertyAccessor;
}
public Set getFieldMetadata() {
return fieldMetadataSet;
}
public PropertyMetadata build() {
return new PropertyMetadata( this );
}
}
@Override
public String toString() {
return "PropertyMetadata{"
+ "propertyAccessor=" + propertyAccessor
+ ", fieldMetadata=" + documentFieldMetadataList
+ ", dynamicBoostStrategy=" + dynamicBoostStrategy + '}';
}
}