package org.qi4j.api.dataset.iterable;
import java.util.HashMap;
import java.util.Map;
import org.qi4j.api.dataset.Query;
import org.qi4j.api.property.Property;
import org.qi4j.api.query.QueryException;
import org.qi4j.functional.Iterables;
import org.qi4j.functional.Specification;
import org.qi4j.functional.Visitor;
/**
* TODO
*/
public class IterableQuery<T> implements Query<T>
{
private Iterable<T> iterable;
private int skip;
private int limit;
private Map<String, Object> variables = new HashMap<String, Object>();
public IterableQuery( Iterable<T> iterable )
{
this.iterable = iterable;
}
@Override
public Query filter( Specification<T> filter )
{
iterable = Iterables.filter( filter, iterable );
return this;
}
@Override
public Query orderBy( Property<?> property, Order order )
{
return this;
}
@Override
public Query skip( int skipNrOfResults )
{
this.skip = skipNrOfResults;
return this;
}
@Override
public Query limit( int maxNrOfResults )
{
this.limit = maxNrOfResults;
return this;
}
@Override
public Query<T> setVariable( String name, Object value )
{
variables.put( name, value );
return this;
}
@Override
public Object getVariable( String name )
{
return variables.get( name );
}
@Override
public long count()
{
return Iterables.count( Iterables.limit( limit, Iterables.skip( skip, iterable ) ) );
}
@Override
public T first()
{
return Iterables.first( Iterables.limit( limit, Iterables.skip( skip, iterable ) ) );
}
@Override
public T single()
throws QueryException
{
return Iterables.single( Iterables.limit( limit, Iterables.skip( skip, iterable ) ) );
}
@Override
public <ThrowableType extends Throwable> boolean execute( Visitor<T, ThrowableType> resultVisitor )
throws ThrowableType
{
for( T t : toIterable() )
{
if( !resultVisitor.visit( t ) )
{
return false;
}
}
return true;
}
@Override
public Iterable<T> toIterable()
throws QueryException
{
return Iterables.limit( limit, Iterables.skip( skip, iterable ) );
}
}