package org.infinispan.objectfilter.impl.predicateindex;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.infinispan.objectfilter.impl.FilterSubscriptionImpl;
/**
* The projections of an attribute across multiple filters.
*
* @author anistor@redhat.com
* @since 7.0
*/
final class Projections {
private List<ProjectionSubscription> subscriptions = new ArrayList<ProjectionSubscription>();
private static class ProjectionSubscription {
// the filter using this attribute subscription
private final FilterSubscriptionImpl filterSubscription;
// the position of the attribute in the projection
private final int position;
private ProjectionSubscription(FilterSubscriptionImpl filterSubscription, int position) {
this.filterSubscription = filterSubscription;
this.position = position;
}
}
void addProjection(FilterSubscriptionImpl filterSubscription, int position) {
subscriptions.add(new ProjectionSubscription(filterSubscription, position));
}
void removeProjections(FilterSubscriptionImpl filterSubscription) {
Iterator<ProjectionSubscription> it = subscriptions.iterator();
while (it.hasNext()) {
ProjectionSubscription s = it.next();
if (s.filterSubscription == filterSubscription) {
it.remove();
}
}
}
void processProjections(MatcherEvalContext<?, ?, ?> ctx, Object attributeValue) {
for (int i = 0; i < subscriptions.size(); i++) {
ProjectionSubscription s = subscriptions.get(i);
FilterEvalContext c = ctx.getFilterEvalContext(s.filterSubscription);
c.processProjection(s.position, attributeValue);
}
}
boolean hasProjections() {
return !subscriptions.isEmpty();
}
}