org.hibernate.search.engine.metadata.impl.DocumentFieldMetadata 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.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.hibernate.search.analyzer.spi.AnalyzerReference;
import org.hibernate.search.annotations.NumericField;
import org.hibernate.search.annotations.Store;
import org.hibernate.search.bridge.FieldBridge;
import org.hibernate.search.engine.nulls.codec.impl.NotEncodingCodec;
import org.hibernate.search.engine.nulls.codec.impl.NullMarkerCodec;
import org.hibernate.search.spi.IndexedTypeIdentifier;
import static org.hibernate.search.metadata.NumericFieldSettingsDescriptor.NumericEncodingType;
/**
* Encapsulating the metadata for a single field within a Lucene {@code Document}.
*
* @author Hardy Ferentschik
*/
@SuppressWarnings("deprecation")
public class DocumentFieldMetadata implements PartialDocumentFieldMetadata {
private final IndexedTypeIdentifier sourceTypeIdentifier;
private final BackReference sourceType;
private final BackReference sourceProperty;
private final DocumentFieldPath path;
private final Store store;
private final Field.Index index;
private final Field.TermVector termVector;
private final FieldBridge fieldBridge;
private final Float boost;
private final AnalyzerReference analyzerReference;
private final boolean isId;
private final boolean isIdInEmbedded;
private final NullMarkerCodec nullMarkerCodec;
private final boolean isNumeric;
private final boolean isSpatial;
private final int precisionStep;
private final NumericEncodingType numericEncodingType;
private final Set facetMetadata;
/**
* 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 DocumentFieldMetadata(Builder builder) {
this.sourceTypeIdentifier = builder.sourceTypeIdentifier;
this.sourceType = builder.sourceType;
this.sourceProperty = builder.sourceProperty;
this.path = builder.path;
this.store = builder.store;
this.index = builder.index;
this.termVector = builder.termVector;
this.fieldBridge = builder.fieldBridge;
this.boost = builder.boost;
this.analyzerReference = builder.analyzerReference;
this.isId = builder.isId;
this.isIdInEmbedded = builder.isIdInEmbedded;
this.nullMarkerCodec = builder.nullMarkerCodec;
this.isNumeric = builder.isNumeric;
this.isSpatial = builder.isSpatial;
this.precisionStep = builder.precisionStep;
this.numericEncodingType = builder.numericEncodingType;
this.facetMetadata = Collections.unmodifiableSet( builder.facetMetadata );
this.bridgeDefinedFields = Collections.unmodifiableMap( builder.bridgeDefinedFields );
}
/**
* @return Equivalent to {@code getSourceType().getType()}, but can be called during metadata building.
*/
IndexedTypeIdentifier getSourceTypeIdentifier() {
return sourceTypeIdentifier;
}
/**
* @return The type from which the value for this field is extracted. This is not
* the type of the actual value, since the value might be extracted by accessing a
* {@link #getSourceProperty() property} on this type.
*/
public TypeMetadata getSourceType() {
return sourceType.get();
}
/**
* @return The property from which the value for this field is extracted.
* {@code null} for class bridges.
*/
@Override
public PropertyMetadata getSourceProperty() {
return sourceProperty.get();
}
/**
* @return The full name of this field, including any indexed-embedded prefix. Equivalent to {@code #getPath().getAbsoluteName()}.
*/
public String getAbsoluteName() {
return path.getAbsoluteName();
}
/**
* @return The path from the document root to this field.
*/
@Override
public DocumentFieldPath getPath() {
return path;
}
public boolean isId() {
return isId;
}
public boolean isIdInEmbedded() {
return isIdInEmbedded;
}
public Store getStore() {
return store;
}
@Override
public Field.Index getIndex() {
return index;
}
public Field.TermVector getTermVector() {
return termVector;
}
public FieldBridge getFieldBridge() {
return fieldBridge;
}
public Float getBoost() {
return boost;
}
public AnalyzerReference getAnalyzerReference() {
return analyzerReference;
}
public NullMarkerCodec getNullMarkerCodec() {
return nullMarkerCodec;
}
@Override
public boolean isNumeric() {
return isNumeric;
}
public boolean isSpatial() {
return isSpatial;
}
public Integer getPrecisionStep() {
return precisionStep;
}
@Override
public NumericEncodingType getNumericEncodingType() {
return numericEncodingType;
}
public boolean hasFacets() {
return !facetMetadata.isEmpty();
}
public Set getFacetMetadata() {
return facetMetadata;
}
@Override
public Map getBridgeDefinedFields() {
return bridgeDefinedFields;
}
@Override
public String toString() {
return "DocumentFieldMetadata{" +
"path='" + path + '\'' +
", sourceType='" + sourceType + '\'' +
", sourceProperty='" + sourceProperty + '\'' +
", store=" + store +
", index=" + index +
", termVector=" + termVector +
", fieldBridge=" + fieldBridge +
", boost=" + boost +
", analyzer=" + analyzerReference +
", isId=" + isId +
", isIdInEmbedded=" + isIdInEmbedded +
", nullMarkerCodec='" + nullMarkerCodec + '\'' +
", isNumeric=" + isNumeric +
", isSpatial=" + isSpatial +
", precisionStep=" + precisionStep +
", numericEncodingType=" + numericEncodingType +
", facetMetadata=" + facetMetadata +
'}';
}
public static class Builder implements PartialDocumentFieldMetadata {
protected final BackReference resultReference = new BackReference<>();
// required parameters
private final IndexedTypeIdentifier sourceTypeIdentifier;
private final BackReference sourceType;
private final BackReference sourceProperty;
private final PartialPropertyMetadata partialSourceProperty;
private final DocumentFieldPath path;
private final Store store;
private Field.Index index;
private final Field.TermVector termVector;
// optional parameters
private FieldBridge fieldBridge;
private Float boost;
private AnalyzerReference analyzerReference;
private boolean isId;
private boolean isIdInEmbedded;
private boolean isNumeric;
private boolean isSpatial;
private int precisionStep = NumericField.PRECISION_STEP_DEFAULT;
private NumericEncodingType numericEncodingType;
private Set facetMetadata;
private NullMarkerCodec nullMarkerCodec = NotEncodingCodec.SINGLETON;
private final Map bridgeDefinedFields;
public Builder(TypeMetadata.Builder typeMetadataBuilder,
BackReference sourceProperty,
PartialPropertyMetadata partialSourceProperty,
DocumentFieldPath path,
Store store,
Field.Index index,
Field.TermVector termVector) {
if ( typeMetadataBuilder != null ) {
this.sourceTypeIdentifier = typeMetadataBuilder.getIndexedType();
this.sourceType = typeMetadataBuilder.getResultReference();
}
else {
this.sourceTypeIdentifier = null;
this.sourceType = BackReference.empty();
}
this.sourceProperty = sourceProperty;
this.partialSourceProperty = partialSourceProperty;
this.path = path;
this.store = store;
this.index = index;
this.termVector = termVector;
this.facetMetadata = new LinkedHashSet<>( 1 ); // the most common case is a single facet
this.bridgeDefinedFields = new LinkedHashMap<>();
}
@Override
public PartialPropertyMetadata getSourceProperty() {
return partialSourceProperty;
}
@Override
public DocumentFieldPath getPath() {
return path;
}
public String getAbsoluteName() {
return path.getAbsoluteName();
}
public String getRelativeName() {
return path.getRelativeName();
}
@Override
public Index getIndex() {
return index;
}
public Builder index(Index index) {
this.index = index;
return this;
}
public Builder fieldBridge(FieldBridge fieldBridge) {
this.fieldBridge = fieldBridge;
return this;
}
public Builder boost(Float boost) {
this.boost = boost;
return this;
}
public Builder analyzerReference(AnalyzerReference analyzerReference) {
this.analyzerReference = analyzerReference;
return this;
}
@Override
public AnalyzerReference getAnalyzerReference() {
return analyzerReference;
}
public Builder id() {
this.isId = true;
return this;
}
public Builder idInEmbedded() {
this.isIdInEmbedded = true;
return this;
}
public Builder indexNullAs(NullMarkerCodec nullMarkerCodec) {
this.nullMarkerCodec = nullMarkerCodec;
return this;
}
public Builder numeric() {
this.isNumeric = true;
return this;
}
@Override
public boolean isNumeric() {
return isNumeric;
}
public Builder spatial() {
this.isSpatial = true;
return this;
}
public Builder precisionStep(int precisionStep) {
this.precisionStep = precisionStep;
return this;
}
public Builder numericEncodingType(NumericEncodingType numericEncodingType) {
this.numericEncodingType = numericEncodingType;
return this;
}
@Override
public NumericEncodingType getNumericEncodingType() {
return numericEncodingType;
}
public Builder addFacetMetadata(FacetMetadata facetMetadata) {
this.facetMetadata.add( facetMetadata );
return this;
}
public Builder addBridgeDefinedField(BridgeDefinedField bridgeDefinedField) {
this.bridgeDefinedFields.put( bridgeDefinedField.getAbsoluteName(), bridgeDefinedField );
return this;
}
@Override
public Map getBridgeDefinedFields() {
return Collections.unmodifiableMap( bridgeDefinedFields );
}
public BackReference getResultReference() {
return resultReference;
}
public DocumentFieldMetadata build() {
DocumentFieldMetadata result = new DocumentFieldMetadata( this );
resultReference.initialize( result );
return result;
}
@Override
public String toString() {
return "Builder{" +
"path='" + path + '\'' +
'}';
}
}
}