package org.infinispan.objectfilter.impl;
import java.util.List;
import org.infinispan.objectfilter.impl.predicateindex.ProtobufMatcherEvalContext;
import org.infinispan.objectfilter.impl.syntax.IndexedFieldProvider;
import org.infinispan.objectfilter.impl.syntax.parser.ObjectPropertyHelper;
import org.infinispan.objectfilter.impl.syntax.parser.ProtobufPropertyHelper;
import org.infinispan.protostream.SerializationContext;
import org.infinispan.protostream.WrappedMessage;
import org.infinispan.protostream.descriptors.Descriptor;
import org.infinispan.protostream.descriptors.FieldDescriptor;
/**
* @author anistor@redhat.com
* @since 7.0
*/
public final class ProtobufMatcher extends BaseMatcher<Descriptor, FieldDescriptor, Integer> {
private final SerializationContext serializationContext;
private final Descriptor wrappedMessageDescriptor;
public ProtobufMatcher(SerializationContext serializationContext, IndexedFieldProvider<Descriptor> indexedFieldProvider) {
super(new ProtobufPropertyHelper(serializationContext, indexedFieldProvider));
this.serializationContext = serializationContext;
this.wrappedMessageDescriptor = serializationContext.getMessageDescriptor(WrappedMessage.PROTOBUF_TYPE_NAME);
}
@Override
protected ProtobufMatcherEvalContext startMultiTypeContext(boolean isDeltaFilter, Object userContext, Object eventType, Object instance) {
ProtobufMatcherEvalContext context = new ProtobufMatcherEvalContext(userContext, eventType, instance, wrappedMessageDescriptor, serializationContext);
if (context.getEntityType() != null) {
FilterRegistry<Descriptor, FieldDescriptor, Integer> filterRegistry = getFilterRegistryForType(isDeltaFilter, context.getEntityType());
if (filterRegistry != null) {
context.initMultiFilterContext(filterRegistry);
return context;
}
}
return null;
}
@Override
protected ProtobufMatcherEvalContext startSingleTypeContext(Object userContext, Object eventType, Object instance, MetadataAdapter<Descriptor, FieldDescriptor, Integer> metadataAdapter) {
ProtobufMatcherEvalContext ctx = new ProtobufMatcherEvalContext(userContext, eventType, instance, wrappedMessageDescriptor, serializationContext);
return ctx.getEntityType() != null && ctx.getEntityType().getFullName().equals(metadataAdapter.getTypeName()) ? ctx : null;
}
@Override
protected MetadataAdapter<Descriptor, FieldDescriptor, Integer> createMetadataAdapter(Descriptor messageDescriptor) {
return new MetadataAdapterImpl(messageDescriptor, propertyHelper);
}
private static class MetadataAdapterImpl implements MetadataAdapter<Descriptor, FieldDescriptor, Integer> {
private final Descriptor messageDescriptor;
private final ObjectPropertyHelper<Descriptor> propertyHelper;
MetadataAdapterImpl(Descriptor messageDescriptor, ObjectPropertyHelper<Descriptor> propertyHelper) {
this.messageDescriptor = messageDescriptor;
this.propertyHelper = propertyHelper;
}
@Override
public String getTypeName() {
return messageDescriptor.getFullName();
}
@Override
public Descriptor getTypeMetadata() {
return messageDescriptor;
}
@Override
public List<Integer> mapPropertyNamePathToFieldIdPath(String[] path) {
return (List<Integer>) propertyHelper.mapPropertyNamePathToFieldIdPath(messageDescriptor, path);
}
@Override
public FieldDescriptor makeChildAttributeMetadata(FieldDescriptor parentAttributeMetadata, Integer attribute) {
return parentAttributeMetadata == null ?
messageDescriptor.findFieldByNumber(attribute) : parentAttributeMetadata.getMessageType().findFieldByNumber(attribute);
}
@Override
public boolean isComparableProperty(FieldDescriptor attributeMetadata) {
switch (attributeMetadata.getJavaType()) {
case INT:
case LONG:
case FLOAT:
case DOUBLE:
case BOOLEAN:
case STRING:
case BYTE_STRING:
case ENUM:
return true;
}
return false;
}
}
}