QueryEvaluator.java
package eu.javaexperience.query;
import java.util.Collection;
import eu.javaexperience.exceptions.UnimplementedCaseException;
import eu.javaexperience.interfaces.simple.getBy.GetBy2;
public class QueryEvaluator<T>
{
protected GetBy2<Boolean, T, AtomicCondition> unitMatcher;
public QueryEvaluator(GetBy2<Boolean, T, AtomicCondition> unitMatcher)
{
this.unitMatcher = unitMatcher;
}
public boolean eval(T element, LogicalGroup query)
{
LogicalRelation rel = query.getLogicalRelation();
switch(rel)
{
case and:
for(LogicalGroup g:query.getLogicalGroups())
{
if(!eval(element, g))
{
return false;
}
}
return true;
case or:
for(LogicalGroup g:query.getLogicalGroups())
{
if(eval(element, g))
{
return true;
}
}
return false;
case unit:
return unitMatcher.getBy(element, query.getAtomicCondition());
default: throw new UnimplementedCaseException(rel);
}
}
public int select(Collection<T> dst, Collection<T> from, LogicalGroup query)
{
int n=0;
for(T f:from)
{
if(eval(f, query))
{
dst.add(f);
++n;
}
}
return n;
}
}