package br.com.dextra.dextranet.persistencia;
import java.util.ArrayList;
import java.util.List;
import br.com.dextra.dextranet.persistencia.adapter.ParametrosAdapter;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.CompositeFilter;
import com.google.appengine.api.datastore.Query.CompositeFilterOperator;
import com.google.appengine.api.datastore.Query.Filter;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.datastore.Query.FilterPredicate;
public class EntidadeRepository {
protected DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
protected <T extends Entidade> T persiste(T entidade) {
datastore.put(entidade.toEntity());
return entidade;
}
protected <T extends Entidade> void remove(String id, Class<T> clazz) {
Key key = KeyFactory.createKey(clazz.getName(), id);
datastore.delete(key);
}
protected <T extends Entidade> Entity obtemPorId(String id, Class<T> clazz) throws EntityNotFoundException {
Key key = KeyFactory.createKey(clazz.getName(), id);
return datastore.get(key);
}
protected <T extends Entidade> Iterable<Entity> lista(Class<T> clazz, EntidadeOrdenacao... ordenacao) {
return this.lista(clazz, null, null, ordenacao);
}
protected <T extends Entidade> Iterable<Entity> lista(ParametrosAdapter<T> params) {
Query query = new Query(params.getEntidade().getName());
if (params.getOrdenacao() != null) {
for (EntidadeOrdenacao o : params.getOrdenacao()) {
query.addSort(o.getAtributo(), o.getOrdenacao());
}
}
if (params.getFiltroCampos() != null && params.getFiltroValores() != null && params.getFiltroCampos().size() == params.getFiltroValores().size()) {
setFilters(params.getFiltroCampos(), params.getFiltroValores(), query);
}
PreparedQuery pquery = this.datastore.prepare(query);
if (params.getRegistrosPorPagina() != null && params.getNumeroDaPagina() != null) {
FetchOptions opcoesFetch = FetchOptions.Builder.withDefaults();
opcoesFetch.limit(params.getRegistrosPorPagina());
opcoesFetch.offset(params.getRegistrosPorPagina() * (params.getNumeroDaPagina() - 1));
return pquery.asIterable(opcoesFetch);
}
return pquery.asIterable();
}
protected <T extends Entidade> Iterable<Entity> lista(Class<T> clazz, Integer registrosPorPagina,
Integer numeroDaPagina, EntidadeOrdenacao... ordenacao) {
Query query = new Query(clazz.getName());
if (ordenacao!=null) {
for (EntidadeOrdenacao o : ordenacao) {
query.addSort(o.getAtributo(), o.getOrdenacao());
}
}
PreparedQuery pquery = this.datastore.prepare(query);
if (registrosPorPagina != null && numeroDaPagina != null) {
FetchOptions opcoesFetch = FetchOptions.Builder.withDefaults();
opcoesFetch.limit(registrosPorPagina);
opcoesFetch.offset(registrosPorPagina * (numeroDaPagina - 1));
return pquery.asIterable(opcoesFetch);
}
return pquery.asIterable();
}
protected <T extends Entidade> Iterable<Entity> obterPor(Class<T> clazz, List<String> campos, List<Object> valores) {
if (valores != null && campos != null && valores.size() == campos.size()) {
Query query = new Query(clazz.getName());
setFilters(campos, valores, query);
PreparedQuery pquery = this.datastore.prepare(query);
return pquery.asIterable();
}
return null;
}
public Iterable<Entity> paginar(EntidadeBusca entidadeBusca) {
Query query = new Query(entidadeBusca.clazz);
Filter filter = new FilterPredicate(entidadeBusca.campo, entidadeBusca.filtro, entidadeBusca.data);
query.setFilter(filter);
query.addSort(entidadeBusca.campo, entidadeBusca.direcaoOrdenacao);
PreparedQuery pquery = this.datastore.prepare(query);
FetchOptions opcoesFetch = FetchOptions.Builder.withDefaults();
if (entidadeBusca.isLimite()) {
opcoesFetch.limit(entidadeBusca.limite);
}
return pquery.asIterable(opcoesFetch);
}
public <T extends Entidade> Iterable<Entity> obterKeyGoogleGrupos() {
Query query = new Query("br.com.dextra.dextranet.area.Area");
PreparedQuery pquery = this.datastore.prepare(query);
return pquery.asIterable();
}
private void setFilters(List<String> campos, List<Object> valores, Query query) {
List<Filter> filters = new ArrayList<Query.Filter>();
for (int cont = 0; cont < campos.size(); cont++) {
Filter filter = new FilterPredicate(campos.get(cont), FilterOperator.EQUAL, valores.get(cont));
if (valores.size() > 1) {
filters.add(filter);
} else {
query.setFilter(filter);
}
}
if (valores.size() > 1) {
CompositeFilter compositeFilter = new Query.CompositeFilter(CompositeFilterOperator.AND, filters);
query.setFilter(compositeFilter);
}
}
}