package org.infinispan.objectfilter.impl;
import java.util.Collections;
import java.util.List;
import org.infinispan.objectfilter.impl.predicateindex.RowMatcherEvalContext;
import org.infinispan.objectfilter.impl.syntax.parser.RowPropertyHelper;
/**
* A matcher for projection rows. This matcher is not stateless so it cannot be reused.
*
* @author anistor@redhat.com
* @since 8.0
*/
public final class RowMatcher extends BaseMatcher<RowPropertyHelper.RowMetadata, RowPropertyHelper.ColumnMetadata, Integer> {
private final RowPropertyHelper.RowMetadata rowMetadata;
public RowMatcher(RowPropertyHelper.ColumnMetadata[] columns) {
super(new RowPropertyHelper(columns));
rowMetadata = ((RowPropertyHelper) propertyHelper).getRowMetadata();
}
@Override
protected RowMatcherEvalContext startMultiTypeContext(boolean isDeltaFilter, Object userContext, Object eventType, Object instance) {
FilterRegistry<RowPropertyHelper.RowMetadata, RowPropertyHelper.ColumnMetadata, Integer> filterRegistry = getFilterRegistryForType(isDeltaFilter, rowMetadata);
if (filterRegistry != null) {
RowMatcherEvalContext context = new RowMatcherEvalContext(userContext, eventType, instance, rowMetadata);
context.initMultiFilterContext(filterRegistry);
return context;
}
return null;
}
@Override
protected RowMatcherEvalContext startSingleTypeContext(Object userContext, Object eventType, Object instance, MetadataAdapter<RowPropertyHelper.RowMetadata, RowPropertyHelper.ColumnMetadata, Integer> metadataAdapter) {
if (Object[].class == instance.getClass()) {
return new RowMatcherEvalContext(userContext, eventType, instance, rowMetadata);
} else {
return null;
}
}
@Override
protected MetadataAdapter<RowPropertyHelper.RowMetadata, RowPropertyHelper.ColumnMetadata, Integer> createMetadataAdapter(RowPropertyHelper.RowMetadata rowMetadata) {
return new MetadataAdapterImpl(rowMetadata);
}
private static class MetadataAdapterImpl implements MetadataAdapter<RowPropertyHelper.RowMetadata, RowPropertyHelper.ColumnMetadata, Integer> {
private final RowPropertyHelper.RowMetadata rowMetadata;
MetadataAdapterImpl(RowPropertyHelper.RowMetadata rowMetadata) {
this.rowMetadata = rowMetadata;
}
@Override
public String getTypeName() {
return "Row";
}
@Override
public RowPropertyHelper.RowMetadata getTypeMetadata() {
return rowMetadata;
}
@Override
public List<Integer> mapPropertyNamePathToFieldIdPath(String[] path) {
if (path.length > 1) {
throw new IllegalStateException("Nested attributes are not supported");
}
String columnName = path[0];
for (RowPropertyHelper.ColumnMetadata c : rowMetadata.getColumns()) {
if (c.getColumnName().equals(columnName)) {
return Collections.singletonList(c.getColumnIndex());
}
}
throw new IllegalArgumentException("Column not found : " + columnName);
}
@Override
public RowPropertyHelper.ColumnMetadata makeChildAttributeMetadata(RowPropertyHelper.ColumnMetadata parentAttributeMetadata, Integer attribute) {
if (parentAttributeMetadata != null) {
throw new IllegalStateException("Nested attributes are not supported");
}
return rowMetadata.getColumns()[attribute];
}
@Override
public boolean isComparableProperty(RowPropertyHelper.ColumnMetadata attributeMetadata) {
Class<?> propertyType = attributeMetadata.getPropertyType();
return propertyType.isPrimitive() || Comparable.class.isAssignableFrom(propertyType);
}
}
}