Thursday, September 27, 2018

Aplicar Filter en un List MongoDB + ejbmoordb

A veces necesitamos hacer filtros complejos sobre un List<>, continuamos con el blog anterior .
Buscar elemento en un List<> Embebido/Referenciado/MongoDB + ejbjmooordb
donde definíamos los entitys, controller y paginas java server faces. Ahora implementaremos los filtros para buscar un determinado usuario que puede estar en la posicion 1 o 2 del List,



Deseamos filtrar en List<Usuario>, el encargado de tienda si observamos para algunas condiciones del subtipoorden, este estará en la posición 2 y para otras condiciones del subtipo de orden lo encontraremos en la posición 1.




Tendremos que crear un filtro complejo en el cual para obtener el usuario.#.username puede ser 1 o 2 dependiendo de las condiciones :;
posición subtipoorden
2                 tiendaabodega
2bodegaatienda
2bodegaainterno
2internoabodega
1tiendaainterno
1iternoatienda

En este caso lo encontramos en la posición 1 al encargado de tienda ya que subtipoorden="tiendaainterno"


En el caso que el sutipoorden=""tiendaabodega" el encargado de tienda estara en la posiciòn 2:



Creamos los filtros para que busque en la posición 2 o 1 en base al valor de subtipoorden.,

Imaginemos que usamos un <p:autocomplete> para hacer el filtro



   Bson filter_1 =Filters.and(Filters.eq("usuario.2.username",encargadotienda.getUsername()),
                                         Filters.or(Filters.eq("subtipoorden","tiendaabodega"),
                                                        Filters.eq("subtipoorden","bodegaatienda"),
                                                        Filters.eq("subtipoorden","bodegaainterno"),
                                                        Filters.eq("subtipoorden","internoabodega")));

   Bson filter_2 =Filters.and(Filters.eq("usuario.1.username",encargadotienda.getUsername()),
                                             Filters.or(Filters.eq("subtipoorden","tiendaainterno"),
                                                        Filters.eq("subtipoorden","iternoatienda")));


  Bson filter =Filters.or(filter_1, filter_2);

  ordenList = ordenRepository.filtersPagination(filter, page, rowPage, new Document("idorden", -1));







Buscar elemento en un List<> Embebido/Referenciado/MongoDB + ejbjmooordb

Contamos con una base de datos MongoDB con varias colecciones


public class Orden {
@Id
private Integer idorden;
private Date fecha;
private String tipoorden;
private String subtipoorden;
private String observacion;
private Integer idemisor;
private String tipoemisor;

@Referenced(documment = "Almacen", repository = "com.avbravo.storeejb.repository.AlmacenRepository",
field = "idalmacen", javatype = "Integer", lazy = false)
private Almacen almacen;

@Referenced(documment = "Usuario", repository = "com.avbravo.storeejb.repository.UsuarioRepository",
field = "username", javatype = "String", lazy = false)
private List<Usuario> usuario;
private String activo;

@Embedded
private List<UserInfo> userInfo;
}
}


public class Usuario {

@Id
private String username;
private String nombre;
private String password;
private String email;
private String telefono;
private Double porcentajecomision;
private String activo;
private String direccion;

@Referenced(documment = "Almacen",
repository = "com.avbravo.storeejb.repository.AlmacenRepository",
field = "idalmacen", javatype = "Integer", lazy = false)
private List<Almacen> almacen;


@Referenced(documment = "Rol", repository = "com.avbravo.storeejb.repository.RolRepository",
field = "idrol", javatype = "String", lazy = false)
private List<Rol> rol;

@Referenced(documment = "Empresa", repository = "com.avbravo.storeejb.repository.EmpresaRepository",
field = "idempresa", javatype = "Integer", lazy = false)
private Empresa empresa;

@Embedded
private List<UserInfo> userInfo;

public Usuario() {
}

}


Si realizamos una consulta encontraremos un List<Usuario> en la colección hemos definido previamente que el primer elemento sera para almacenar el usuario que sera el que autoriza la operación, las demás posiciones estan indicadas por reglas que establecemos en base al tipo y subtipoorden.




Buscar un username en una posición especifica
Por ejemplo deseamos buscar el username = avbravo en la posiciòn 0, indicamos usuario.posicion.campo
db.orden.find( {"usuario.0.username":"avbravo"}).pretty()
Si usamos ejbmoordb,

Document  doc = new Document("usuario.0.username", "avbravo");



ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));

Un ejemplo con un autocomplete

Definimos que la persona que autoriza la operación se encuentra en la posición 0 del List<>, deseamos buscarla específicamente en esa posición.
<p:outputLabel value="#{msg['field.autorizado']}"/>
<e:autocompleteusuario listener="#{ordenController.searchBy('autorizado')}"
value="#{ordenController.autorizado}"
itemLabel=" #{p.nombre}"
field="nombre"
dropdown="true"
update=" :form:dataTable"
fromstart="true"
minQueryLength="0"
size="45"



Filtra un List<> con paginaciòn




Datatable
<b:panel id="dataTable">
<a:paginator
rowPage="#{ordenController.rowPage}"
clear="#{ordenController.clear()}"
first="#{ordenController.first()}"
back="#{ordenController.back()}"
next="#{ordenController.next()}"
last="#{ordenController.last()}"
page="#{ordenController.page}"
pages="#{ordenController.pages}"
skip="ajax:ordenController.skip(ordenController.page)"
renderednew="false"
new="#{ordenController.prepare('gonew',ordenController.orden)}"
printAll="#{ordenController.printAll()}"
/>
<b:dataTable value="#{ordenController.ordenDataModel}"
var="item"
id="dataTable2"
paginated="false"
onpage="console.log('page');">
<b:dataTableColumn value="#{item.idorden}" label="#{msg['field.idorden']}"/>
<b:dataTableColumn label="#{msg['field.fecha']}" >
<a:labelDate value="#{item.fecha}"/>
</b:dataTableColumn>
<b:dataTableColumn value="#{ordenController.ordenServices.convertirTipoSubtipoOrdenAMayuscula(item.tipoorden,item.subtipoorden)}" label="#{msg['field.tipoorden']}"/>
<b:dataTableColumn value="#{ordenController.ordenServices.getDescripcionOfEmisorReceptor(item.idemisor,item.tipoemisor)}" label="#{msg['field.idemisor']}"/>
<b:dataTableColumn value="#{item.almacen.descripcion}" label="#{msg['field.idreceptor']}"/>
<b:dataTableColumn value="#{ordenController.ordenServices.nombreDeAutorizado(item)}" label="#{msg['field.autorizadopor']}"/>
<b:dataTableColumn value="#{ordenController.ordenServices.nombreDeEncargadoTienda(item)}" label="#{msg['field.encargadotienda']}"/>
<b:dataTableColumn value="#{item.activo}" label="#{msg['field.activo']}"/>
<b:dataTableColumn label="">
<a:column
edit="#{ordenController.prepare('view',item)}"
delete="#{ordenController.delete(item,false)}"
rendered="#{applicationMenu.orden.delete}" />
</b:dataTableColumn>
</b:dataTable>


En el Controller



// <editor-fold defaultstate="collapsed" desc="searchBy(String string, Boolean... blns)">


    @Override

    public String searchBy(String string) {

        try {

          loginController.put("searchorden", string);

            writable = true;

            move();


        } catch (Exception e) {

            JsfUtil.errorMessage("searchBy()" + e.getLocalizedMessage());

        }

        return "";


    }// </editor-fold>









    // <editor-fold defaultstate="collapsed" desc="move">


    @Override


    public void move() {


        try {



            Document doc;


            switch (loginController.get("searchorden")) {


                case "_init":


  ordenList = ordenRepository.findPagination(page, rowPage, new Document("idorden", -1));



                    break;


                case "_autocomplete":

                    //no se realiza ninguna accion 

                    break;



                case "idorden":


 doc = new Document("idorden", orden.getIdorden());


 ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));


                   break;


              case "autorizado":


 doc = new Document("usuario.0.username", autorizado.getUsername());


 ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));


                    break;


                case "#":

 doc = new Document("idorden", lookupStoreejbServices.getIdorden());


 ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));


                    break;


                case "fecha":


doc = new Document("fecha", lookupStoreejbServices.getFecha());


ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));


                    break;




                       case "_betweendates":

ordenList = ordenRepository.filterBetweenDatePagination("activo", "si", "fecha", lookupStoreejbServices.getFechaDesde(), "fecha", lookupStoreejbServices.getFechaHasta(), page, rowPage, new Document("idorden", -1));


                    break;


    case "proveedor":

doc = new Document("idemisor",proveedorSelected.getIdproveedor()).append("tipoemisor", "proveedor");

ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));


                    break;


                case "emisor":


doc = new Document("idemisor",emisor.getIdalmacen()).append("tipoemisor", "almacen");


 ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));


                    break;


          case "receptor":


doc = new Document("almacen.idalmacen",receptor.getIdalmacen());


ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));


                    break;



                default:



                    ordenList = ordenRepository.findPagination(page, rowPage);


                    break;


            }


            ordenFiltered = ordenList;


            ordenDataModel = new OrdenDataModel(ordenList);


        } catch (Exception e) {


            JsfUtil.errorMessage("move() " + e.getLocalizedMessage());


        }


    }// </editor-fold>



Consultar si existe el usuario avbravo en cualquier elemento de la lista


> db.orden.find( {"usuario.username":"avbravo"}).pretty()

Se desea consultar que exista el username avbravo en la lista que tenga solo dos elementos, utilizamos:

"usuario":{$size:2}
exit: Ctrl + ↩
db.orden.find( {"usuario":{$size:2}, "usuario.username":"avbravo"}).pretty()
Consultar el usuario 7 u avbravo en la lista de tres elementos
db.orden.find( {"usuario.username":"7","usuario.username":"avbravo","usuario":{$size:2}}).pretty()



Entrevista con Geovany Mendoza

Entrevista con Geovany Mendoza En esta ocasión continuamos con las entrevistas a miembros importantes de la comunidad Java, la realizare ...