package com.googlecode.objectify.cmd;
import com.google.appengine.api.datastore.QueryResultIterable;
import com.googlecode.objectify.LoadResult;
import java.util.List;
/**
* Most of the various methods that can end the definition of a query and start execution. The first()
* method is excluded because it returns a Ref<T> which encapsulates both the regular and keys-only
* result. It makes no sense to have a Ref<Key<T>>, but when you do keys() you get a QueryExecute<Key<T>>.
*
* @author Jeff Schnitzer <jeff@infohazard.org>
*/
public interface QueryExecute<T> extends QueryResultIterable<T>
{
/**
* <p>Starts an asynchronous query which will return entities.</p>
*
* <p>Note that since the Query<T> itself is QueryResultIterable<T>, you can iterate on the query
* object itself. However, if you want to start an async query and iterate on it later, you can
* use this method.</p>
*/
public QueryResultIterable<T> iterable();
/**
* <p>Execute the query and get the results as a List. The list will be equivalent to a simple ArrayList;
* you can iterate through it multiple times without incurring additional datastore cost.</p>
*
* <p>Note that you must be careful about limit()ing the size of the list returned; you can
* easily exceed the practical memory limits of Appengine by querying for a very large dataset.</p>
*/
public List<T> list();
/**
* Gets the first entity in the result set. Obeys the offset value.
*
* @return an asynchronous result containing the first result. The result will hold null if the result set is empty.
*/
public LoadResult<T> first();
/**
* <p>Generates a string that consistently and uniquely specifies this query. There
* is no way to convert this string back into a query and there is no guarantee that
* the string will be consistent across versions of Objectify.</p>
*
* <p>In particular, this value is useful as a key for a simple memcache query cache.</p>
*/
public String toString();
}