package org.infinispan.query.remote.impl;
import java.util.function.BiFunction;
import org.infinispan.objectfilter.impl.syntax.IndexedFieldProvider;
import org.infinispan.protostream.descriptors.Descriptor;
import org.infinispan.protostream.descriptors.FieldDescriptor;
import org.infinispan.protostream.descriptors.JavaType;
import org.infinispan.query.remote.impl.indexing.IndexingMetadata;
/**
* Tests if a field is indexed by examining the Protobuf metadata.
*
* @author anistor@redhat.com
* @since 8.0
*/
final class ProtobufFieldIndexingMetadata implements IndexedFieldProvider.FieldIndexingMetadata {
private final Descriptor messageDescriptor;
ProtobufFieldIndexingMetadata(Descriptor messageDescriptor) {
if (messageDescriptor == null) {
throw new IllegalArgumentException("argument cannot be null");
}
this.messageDescriptor = messageDescriptor;
}
@Override
public boolean isIndexed(String[] propertyPath) {
return getMetadata(propertyPath, IndexingMetadata::isFieldIndexed, true);
}
@Override
public boolean isAnalyzed(String[] propertyPath) {
return getMetadata(propertyPath, IndexingMetadata::isFieldAnalyzed, false);
}
@Override
public boolean isStored(String[] propertyPath) {
return getMetadata(propertyPath, IndexingMetadata::isFieldStored, true);
}
private boolean getMetadata(String[] propertyPath, BiFunction<IndexingMetadata, String, Boolean> metadataFun, boolean defVal) {
Descriptor md = messageDescriptor;
int i = 0;
for (String p : propertyPath) {
i++;
FieldDescriptor field = md.findFieldByName(p);
if (field == null) {
break;
}
IndexingMetadata indexingMetadata = md.getProcessedAnnotation(IndexingMetadata.INDEXED_ANNOTATION);
boolean res = indexingMetadata == null ? defVal : metadataFun.apply(indexingMetadata, field.getName());
if (!res) {
break;
}
if (field.getJavaType() == JavaType.MESSAGE) {
md = field.getMessageType();
} else {
return i == propertyPath.length;
}
}
return false;
}
}