package org.qi4j.api.dataset; import org.qi4j.api.property.Property; import org.qi4j.api.query.QueryException; import org.qi4j.api.query.QueryExecutionException; import org.qi4j.functional.Specification; import org.qi4j.functional.Visitor; /** * TODO */ public interface Query<T> { public enum Order { ASCENDING, DESCENDING } Query filter( Specification<T> filter ); Query orderBy( final Property<?> property, final Order order ); Query skip( int skipNrOfResults ); Query limit( int maxNrOfResults ); // Variables Query<T> setVariable( String name, Object value ); Object getVariable( String name ); long count() throws QueryExecutionException; T first() throws QueryExecutionException; T single() throws QueryException; <ThrowableType extends Throwable> boolean execute( Visitor<T, ThrowableType> resultVisitor ) throws ThrowableType, QueryExecutionException; Iterable<T> toIterable() throws QueryExecutionException; }