package er.neo4jadaptor.query;
import java.util.ArrayList;
import java.util.List;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.PropertyContainer;
import com.webobjects.eoaccess.EOEntity;
import com.webobjects.eocontrol.EOQualifier;
import er.neo4jadaptor.query.all_of_type.AllOfTypeFilter;
import er.neo4jadaptor.query.lucene.LuceneFilter;
import er.neo4jadaptor.query.neo4j_by_pk.ByPrimaryKeyFilter;
/**
* <p>
* Filter that uses various types of {@link er.neo4jadaptor.query.Filter}s and their layering to achieve
* results exactly matching search criteria.
* </p>
*
* <p>
* </p>
*
* @author Jedrzej Sobanski
*
* @param <T>
*/
public class LayeringFilter <T extends PropertyContainer> extends Filter<T> {
private final Filter<T> firstLine;
public LayeringFilter() {
List<Filter<T>> filters = new ArrayList<Filter<T>>();
filters.add(new AllOfTypeFilter<T>());
filters.add(new ByPrimaryKeyFilter<T>());
filters.add(new LuceneFilter<T>());
for (int i=0; i<filters.size()-1; i++) {
filters.get(i).setSuccessor(filters.get(i+1));
}
this.firstLine = filters.get(0);
}
@Override
public Results<T> doFilter(GraphDatabaseService db, EOEntity entity, EOQualifier qualifier) {
Results<T> ret = firstLine.doFilter(db, entity, qualifier);
if (ret != null) {
return ret;
} else {
// chain delegation (probably won't be used, but left here as formality for the chain of responsibility pattern
return successor.doFilter(db, entity, qualifier);
}
}
}