package org.infinispan.objectfilter;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
/**
* A filter that tests if an object matches a pre-defined condition and returns either the original instance or the
* projection, depending on how the filter was created. The projection is represented as an Object[]. If the given
* instance does not match the filter will just return null.
*
* @author anistor@redhat.com
* @since 7.0
*/
public interface ObjectFilter {
/**
* The fully qualified entity type name accepted by this filter.
*/
String getEntityTypeName();
/**
* The array of '.' separated path names of the projected fields if any, or {@code null} otherwise.
*/
String[] getProjection();
Class<?>[] getProjectionTypes();
/**
* Returns the parameter names or an empty Set if there are no parameters.
*/
Set<String> getParameterNames();
Map<String, Object> getParameters();
/**
* Creates a new ObjectFilter based on current one and the given parameters.
*/
ObjectFilter withParameters(Map<String, Object> namedParameters);
/**
* The array of sort specifications if defined, or {@code null} otherwise.
*/
SortField[] getSortFields();
/**
* The comparator corresponding to the 'order by' clause, if any.
*
* @return the Comparator or {@code null} if no 'order by' was specified ({@link #getSortFields()} also returns {@code null})
*/
Comparator<Comparable[]> getComparator();
/**
* Tests if an object instance matches the filter.
*
* @param instance the instance to test; this is never {@code null}
* @return a {@code FilterResult} if there is a match or {@code null} otherwise
*/
FilterResult filter(Object instance);
/**
* The output of the {@link ObjectFilter#filter} method.
*/
interface FilterResult {
/**
* Returns the matched object. This is non-null unless projections are present.
*/
Object getInstance();
/**
* Returns the projection, if a projection was requested or {@code null} otherwise.
*/
Object[] getProjection();
/**
* Returns the projection of fields used for sorting, if sorting was requested or {@code null} otherwise.
*/
Comparable[] getSortProjection();
}
}