package com.googlecode.objectify.impl;
import com.google.appengine.api.datastore.Cursor;
import com.google.appengine.api.datastore.Entity;
import com.googlecode.objectify.cmd.QueryKeys;
import com.googlecode.objectify.cmd.SimpleQuery;
/**
* Base for command classes that include methods for defining a query (filter, order, limit, etc).
* Does not include the methods for executing a query.
*
* @author Jeff Schnitzer <jeff@infohazard.org>
*/
public abstract class SimpleQueryImpl<T> implements SimpleQuery<T>
{
/** */
protected LoaderImpl<?> loader;
/**
* There is a special case - if loader is null, use 'this' as the LoaderImpl. It's a bit of a hack
* but we can't pass in 'this' to super constructors.
*/
SimpleQueryImpl(LoaderImpl<?> loader) {
this.loader = loader == null ? (LoaderImpl<?>)this : loader;
}
/**
* Create an initial query object; for a typed query this will have a class, otherwise it will be generic.
* For the real QueryImpl itself this is a clone() operation.
*/
abstract QueryImpl<T> createQuery();
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.QueryCommon#filterKey(java.lang.String, java.lang.Object)
*/
@Override
public QueryImpl<T> filterKey(String condition, Object value) {
QueryImpl<T> q = createQuery();
q.addFilter(Entity.KEY_RESERVED_PROPERTY + " " + condition.trim(), value);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#filterKey(java.lang.Object)
*/
@Override
public QueryImpl<T> filterKey(Object value) {
return filterKey("=", value);
}
@Override
public QueryImpl<T> orderKey(boolean descending) {
String prefix = descending ? "-" : "";
QueryImpl<T> q = createQuery();
q.addOrder(prefix + Entity.KEY_RESERVED_PROPERTY);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.Query#ancestor(java.lang.Object)
*/
@Override
public QueryImpl<T> ancestor(Object keyOrEntity) {
QueryImpl<T> q = createQuery();
q.setAncestor(keyOrEntity);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.Query#limit(int)
*/
@Override
public QueryImpl<T> limit(int value) {
QueryImpl<T> q = createQuery();
q.setLimit(value);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.Query#offset(int)
*/
@Override
public QueryImpl<T> offset(int value) {
QueryImpl<T> q = createQuery();
q.setOffset(value);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.Query#startCursor(com.google.appengine.api.datastore.Cursor)
*/
@Override
public QueryImpl<T> startAt(Cursor value) {
QueryImpl<T> q = createQuery();
q.setStartCursor(value);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.Query#endCursor(com.google.appengine.api.datastore.Cursor)
*/
@Override
public QueryImpl<T> endAt(Cursor value) {
QueryImpl<T> q = createQuery();
q.setEndCursor(value);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.Query#chunk(int)
*/
@Override
public QueryImpl<T> chunk(int value) {
QueryImpl<T> q = createQuery();
q.setChunk(value);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#hybrid(boolean)
*/
@Override
public QueryImpl<T> hybrid(boolean force) {
QueryImpl<T> q = createQuery();
q.setHybrid(force);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#chunkAll()
*/
@Override
public QueryImpl<T> chunkAll()
{
return chunk(Integer.MAX_VALUE);
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.Query#keys()
*/
@Override
public QueryKeys<T> keys() {
QueryImpl<T> q = createQuery();
q.setKeysOnly();
return new QueryKeysImpl<>(q);
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#reverse()
*/
@Override
public QueryImpl<T> reverse() {
QueryImpl<T> q = createQuery();
q.toggleReverse();
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#distinct(boolean)
*/
@Override
public QueryImpl<T> distinct(boolean value) {
QueryImpl<T> q = createQuery();
q.setDistinct(value);
return q;
}
/* (non-Javadoc)
* @see com.googlecode.objectify.cmd.SimpleQuery#project(String...)
*/
@Override
public QueryImpl<T> project(String... fields) {
QueryImpl<T> q = createQuery();
q.addProjection(fields);
return q;
}
}