forked from infinispan/infinispan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RowMatcher.java
101 lines (83 loc) · 3.9 KB
/
RowMatcher.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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 (Object[]). 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, null, instance, rowMetadata);
context.initMultiFilterContext(filterRegistry);
return context;
}
return null;
}
@Override
protected RowMatcherEvalContext startSingleTypeContext(Object userContext, Object eventType, Object key,
Object instance, MetadataAdapter<RowPropertyHelper.RowMetadata, RowPropertyHelper.ColumnMetadata, Integer> metadataAdapter) {
if (Object[].class == instance.getClass()) {
return new RowMatcherEvalContext(userContext, eventType, key, 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;
}
/**
* Implementation is just for completeness. The name does not matter.
*/
@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("Rows do not support nested attributes");
}
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("Rows do not support nested attributes");
}
return rowMetadata.getColumns()[attribute];
}
@Override
public boolean isComparableProperty(RowPropertyHelper.ColumnMetadata attributeMetadata) {
Class<?> propertyType = attributeMetadata.getPropertyType();
return propertyType.isPrimitive() || Comparable.class.isAssignableFrom(propertyType);
}
}
}