Usando LazyDataModel con Jmoordb y Microprofile
Lazy es una característica muy interesante que nos permite mostrar solo unos registros en lugar
de todos por ejemplo en un DataTable. Esto reduce el tiempo de espera y disminuye el consumo
de recursos para desplegar los.
Un escenario puede ser donde tenemos 20000 registros y queremos mostrarlos en un datatable
en la cual solo mostraremos 25 por pagina, no seria adecuado cargar los 20000 registros al mismo
tiempo. Para ello podemos utilizar LazyDataModel.
Para usarlo agregar un objeto LazyDataModel con los métodos set/get:
private LazyDataModel<Colegio> lazyDataModelColegio;
//set/get
En el método init
Instanciar el objeto lazyDataModelColegio y en el método load() haremos las implementaciones. El offset es el desplazamiento entre las paginas, sortBy tiene
información sobre la ordenación y filterBy información sobre el filtro entre las columnas.
En nuestro caso usaremos la clase paginator de jmoordb para gestionar varias acciones como
filtros que pueden cambiar las condiciones de búsqueda.
this.lazyDataModelColegio = new LazyDataModel<Colegio>() {
@Override
public List<Colegio> load(int offset, int pageSize, Map<String, SortMeta> sortBy,
Map<String, FilterMeta> filterBy) {
/// Implementación
}
Implementación usando paginator de jmoordb
Pasos:
- Contar el numero de documentos que cumplen la condición
- Invocar el método processLazyDataModel de la interace IPaginator de JmoordbUtils
- Realizar la consulta
- Actualizar lazyDataModelColegio con la cantidad de registros.
// <editor-fold defaultstate="collapsed" desc="init">
@PostConstruct
public void init() {
try {
this.lazyDataModelColegio = new LazyDataModel<Colegio>() {
@Override
public List<Colegio> load(int offset, int pageSize, Map<String, SortMeta> sortBy, Map<String, FilterMeta> filterBy) {
Integer totalRecords = colegioServices.countJsonQuery(JmoordbDocument.bsonToJson(paginator.getQuery()));
processLazyDataModel(paginator, paginatorOld, offset, rowPage.get(), totalRecords, sortBy);
List<Colegio> result = colegioServices.jsonQuery(
JmoordbDocument.documentToJson(paginator.getQuery()),
JmoordbDocument.documentToJson(paginator.getSort()),
paginator.getPage(),
rowPage.get());
lazyDataModelColegio.setRowCount(totalRecords);
return result;
}
};
} catch (Exception e) {
System.out.println(JsfUtil.nameOfMethod() + " " + e.getLocalizedMessage());
JsfUtil.errorDialog(JsfUtil.nameOfMethod(), e.getLocalizedMessage());
}
}
Comments