package org.infinispan.query.remote.impl; import org.hibernate.search.analyzer.Discriminator; import org.infinispan.protostream.descriptors.Descriptor; import org.infinispan.query.logging.Log; import org.infinispan.query.remote.impl.indexing.FieldMapping; import org.infinispan.query.remote.impl.indexing.IndexingMetadata; import org.infinispan.query.remote.impl.indexing.ProtobufValueWrapper; import org.infinispan.util.logging.LogFactory; /** * @author anistor@redhat.com * @since 9.0 */ public final class ProtobufValueWrapperAnalyzerDiscriminator implements Discriminator { private static final Log log = LogFactory.getLog(ProtobufValueWrapperAnalyzerDiscriminator.class, Log.class); private static final boolean trace = log.isTraceEnabled(); @Override public String getAnalyzerDefinitionName(Object value, Object entity, String field) { if (entity instanceof ProtobufValueWrapper) { ProtobufValueWrapper wrapper = (ProtobufValueWrapper) entity; Descriptor messageDescriptor = wrapper.getMessageDescriptor(); if (messageDescriptor != null) { return getAnalyzerForField(messageDescriptor, field); } } return null; } private String getAnalyzerForField(Descriptor messageDescriptor, String fieldName) { IndexingMetadata indexingMetadata = messageDescriptor.getProcessedAnnotation(IndexingMetadata.INDEXED_ANNOTATION); if (indexingMetadata != null) { FieldMapping fieldMapping = indexingMetadata.getFieldMapping(fieldName); if (fieldMapping != null && fieldMapping.analyze()) { String analyzerName = fieldMapping.analyzer(); if (analyzerName == null || analyzerName.isEmpty()) { analyzerName = indexingMetadata.analyzer(); } if (analyzerName != null && !analyzerName.isEmpty()) { if (trace) { log.tracef("Using analyzer %s for field %s of type %s", analyzerName, fieldName, messageDescriptor.getFullName()); } return analyzerName; } } } return null; } }