All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.search.engine.metadata.impl.PropertyMetadata Maven / Gradle / Ivy

There is a newer version: 5.11.12.Final
Show newest version
/*
 * 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 + '}'; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy