Skip to main content

Usando LazyDataModel con Jmoordb y Microprofile

 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());

        }

    }



Si tenemos algunos filtros lo implementamos con la clase paginator
// @RolesAllowed({"admin"}) public String filterActive() { try { //Aqui aplicar un filter Bson filter = eq("active", status); Document sort = new Document("idcolegio", -1); paginator = new Paginator.Builder() .page(1) .query(JmoordbDocument.jsonToDocument(JmoordbDocument.bsonToJson(filter))) .sort(sort) .title(rf.getMessage("filter.active") + " = " + status) .build(); } catch (Exception e) { JsfUtil.errorDialog(JsfUtil.nameOfMethod(), e.getLocalizedMessage()); } return ""; } // </editor-fold>

Comments