package com.googlecode.objectify.cmd;
import com.google.appengine.api.datastore.Cursor;
import com.google.appengine.api.datastore.Query.Filter;
/**
* The basic options for a typed Query. In addition to adding a few methods that are only available for typed
* queries, this interface overrides the QueryCommon methods to return the full Query<T>.
*
* @author Jeff Schnitzer <jeff@infohazard.org>
*/
public interface Query<T> extends SimpleQuery<T>
{
/**
* <p>Create a filter based on the specified condition and value, using
* the same syntax as the GAE/Python query class. Examples:</p>
*
* <ul>
* <li>{@code filter("age >=", age)}</li>
* <li>{@code filter("age =", age)}</li>
* <li>{@code filter("age", age)} (if no operator, = is assumed)</li>
* <li>{@code filter("age !=", age)}</li>
* <li>{@code filter("age in", ageList)}</li>
* </ul>
*
* <p><strong>The space between the property name and the operator is required.</strong>
* Filtering a condition of {@code "age>="} will perform an <em>equality</em> test on an entity
* property exactly named "age>=". You can't create properties like this with Objectify, but you
* can with the Low-Level API.</p>
*
* <p>Multiple calls to filter() will produce an AND (intersection) query.</p></p>
*
* <p>See the Google documentation for
* <a href="http://code.google.com/appengine/docs/java/datastore/queries.html#Introduction_to_Indexes">indexes</a>
* for an explanation of what you can and cannot filter for.</p>
*
* <p>You can <strong>not</strong> filter on @Id or @Parent properties. Use
* {@code filterKey()} or {@code ancestor()} instead.</p>
*/
public Query<T> filter(String condition, Object value);
/**
* <p>Create a filter based on the raw low-level Filter. This is a very low-level operation; the values
* in the Filter are not translated in any way. For example, this only understands native datastore
* {@code Key} objects and not Objectify {@code Key<?>} objects.</p>
*
* <p>See the Google documentation for
* <a href="http://code.google.com/appengine/docs/java/datastore/queries.html#Introduction_to_Indexes">indexes</a>
* for an explanation of what you can and cannot filter for.</p>
*
* <p>You can <strong>not</strong> filter on @Id or @Parent properties. Use
* {@code filterKey()} or {@code ancestor()} instead.</p>
*/
public Query<T> filter(Filter filter);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#filterKey(java.lang.String, java.lang.Object)
*/
@Override
public Query<T> filterKey(String condition, Object value);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#filterKey(java.lang.Object)
*/
@Override
public Query<T> filterKey(Object value);
/**
* <p>Sorts based on a property. Examples:</p>
*
* <ul>
* <li>{@code order("age")}</li>
* <li>{@code order("-age")} (descending sort)</li>
* </ul>
*
* <p>You can <strong>not</strong> sort on @Id or @Parent properties. Sort by __key__ or -__key__ instead.</p>
*/
public Query<T> order(String condition);
/**
* Shorthand for {@code order("__key__")} or {@code order("-__key__")}
* @param descending if true, specifies a descending (aka reverse) sort
*/
public Query<T> orderKey(boolean descending);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#ancestor(java.lang.Object)
*/
@Override
public Query<T> ancestor(Object keyOrEntity);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#limit(int)
*/
@Override
public Query<T> limit(int value);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#offset(int)
*/
@Override
public Query<T> offset(int value);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#startAt(com.google.appengine.api.datastore.Cursor)
*/
@Override
public Query<T> startAt(Cursor value);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#endAt(com.google.appengine.api.datastore.Cursor)
*/
@Override
public Query<T> endAt(Cursor value);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#chunk(int)
*/
@Override
public Query<T> chunk(int value);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#chunkAll()
*/
@Override
public Query<T> chunkAll();
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#hybrid(boolean)
*/
@Override
public Query<T> hybrid(boolean force);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#reverse()
*/
@Override
public Query<T> reverse();
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#project(String...)
*/
@Override
public Query<T> project(String... fields);
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#distinct()
*/
@Override
public Query<T> distinct(boolean value);
}