package org.raidenjpa.db; import java.util.ArrayList; import java.util.List; public class Consulta<T> { private final Class<T> type; private final List<Filtro> filtros = new ArrayList<Filtro>(); private final List<Ordem> ordems = new ArrayList<Ordem>(); private Long limit = 1000l; private Long chunk; public static <T> Consulta<T> create(Class<T> type) { return new Consulta<T>(type); } private Consulta(Class<T> type) { this.type = type; } public Consulta<T> filtro(String atributo, String operador, Object valor) { return filtro(atributo, Operador.sigla(operador), valor); } public Consulta<T> filtro(String atributo, Operador operador, Object valor) { filtro(new Filtro(atributo, operador, valor)); return this; } public Consulta<T> filtro(Filtro filtro) { if (filtro.getValor() != null) { filtros.add(filtro); } return this; } public List<Filtro> getFiltros() { return filtros; } public Class<T> getType() { return type; } @Override public String toString() { return "[Consulta " + type + "]"; } public Consulta<T> ordem(String atributo) { return ordem(atributo, Orientacao.ASC); } public Consulta<T> ordem(String atributo, String orientacao) { return ordem(atributo, Orientacao.sigla(orientacao)); } public Consulta<T> ordem(String atributo, Orientacao orientacao) { this.ordems.add(new Ordem(atributo, orientacao)); return this; } public List<Ordem> getOrdems() { return ordems; } public Consulta<T> limit(Long limit) { this.limit = limit; return this; } public Long getLimit() { if (limit == null) { limit = -1L; } return limit; } public Consulta<T> chunk(Long chunk) { this.chunk = chunk; return this; } public Long getChunk() { if (chunk == null) { chunk = -1L; } return chunk; } public void setChunk(Long chunk) { this.chunk = chunk; } public Consulta<T> filtros(List<Filtro> filtros) { this.filtros.addAll(filtros); return this; } public Consulta<T> ordems(List<Ordem> ordems) { this.ordems.addAll(ordems); return this; } public Consulta<T> duplicate() { return Consulta.create(getType()).filtros(getFiltros()).ordems(getOrdems()).limit(getLimit()).chunk(getChunk()); } }