package org.infinispan.objectfilter;
import java.util.List;
import java.util.Map;
import org.infinispan.objectfilter.impl.aggregation.FieldAccumulator;
import org.infinispan.query.dsl.Query;
/**
* An object matcher able to test a given object against multiple registered filters specified either as Ickle queries
* (a JP-QL subset with full-text support) or using the query DSL (see {@link org.infinispan.query.dsl}). The matching
* filters are notified via a callback supplied when registering the filter. The filter will have to specify the fully
* qualified type name of the matching entity type because simple names cannot be easily resolved as it would happen
* in the case of an {@link javax.persistence.EntityManager} which has knowledge of all types in advance and is able to
* translate simple names to fully qualified names unambiguously.
* <p>
* Full-text predicates are not supported at the moment.
* <p>
* This is a low-level interface which should not be directly used by Infinispan users.
*
* @author anistor@redhat.com
* @since 7.0
*/
public interface Matcher {
FilterSubscription registerFilter(Query query, FilterCallback callback, Object... eventType);
FilterSubscription registerFilter(String queryString, Map<String, Object> namedParameters, FilterCallback callback, Object... eventType);
FilterSubscription registerFilter(String queryString, FilterCallback callback, Object... eventType);
FilterSubscription registerFilter(Query query, FilterCallback callback, boolean isDeltaFilter, Object... eventType);
FilterSubscription registerFilter(String queryString, Map<String, Object> namedParameters, FilterCallback callback, boolean isDeltaFilter, Object... eventType);
FilterSubscription registerFilter(String queryString, FilterCallback callback, boolean isDeltaFilter, Object... eventType);
void unregisterFilter(FilterSubscription filterSubscription);
/**
* Test the given instance against all the subscribed filters and notify all callbacks registered for instances of
* the same instance type. The {@code isDelta} parameter of the callback will be {@code false}.
*
* @param userContext an optional user provided object to be passed to matching subscribers along with the matching
* instance; can be {@code null}
* @param eventType on optional event type discriminator that is matched against the event type specified when the
* filter was registered; can be {@code null}
* @param instance the object to test against the registered filters; never {@code null}
*/
void match(Object userContext, Object eventType, Object instance);
/**
* Test two instances (which are actually before/after snapshots of the same instance) against all the subscribed
* filters and notify all callbacks registered for instances of the same instance type. The {@code isDelta} parameter
* of the callback will be {@code true}.
*
* @param userContext an optional user provided object to be passed to matching subscribers along with the matching
* instance; can be {@code null}
* @param eventType on optional event type discriminator that is matched against the event type specified when the
* filter was registered; can be {@code null}
* @param instanceOld the 'before' object to test against the registered filters; never {@code null}
* @param instanceNew the 'after' object to test against the registered filters; never {@code null}
* @param joinEvent the event to generate if the instance joins the matching set
* @param updateEvent the event to generate if a matching instance is updated and continues to the match
* @param leaveEvent the event to generate if the instance leaves the matching set
*/
void matchDelta(Object userContext, Object eventType, Object instanceOld, Object instanceNew, Object joinEvent, Object updateEvent, Object leaveEvent);
/**
* Obtains an ObjectFilter instance that is capable of testing a single filter condition.
*
* @param filterSubscription a filter subscription previously registered with this Matcher; the newly created
* ObjectFilter will be based on the same filter condition
* @return the single-filter
*/
ObjectFilter getObjectFilter(FilterSubscription filterSubscription);
ObjectFilter getObjectFilter(Query query);
ObjectFilter getObjectFilter(String queryString);
ObjectFilter getObjectFilter(String queryString, List<FieldAccumulator> acc);
}