DEV Community

aristides villarreal
aristides villarreal

Posted on

Implementando searchLikeBy en MongoDB con Jmoordbcore 2/3

Las expresiones regulares en Java se utilizan para validar patrones. En MongoDB se utiliza $regex.

A continuación se muestra la sintaxis y ejemplos de uso en MongoDB.

Sintaxis:

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ "<field>": { "$regex": "pattern", "$options": "<options>" } }
{ <field>: { $regex: /pattern/<options> } }

Enter fullscreen mode Exit fullscreen mode
  • Ejemplo de consulta en MongoDB

db.tareas.find( { tarea: { $regex: /prueba$/ } } )

Enter fullscreen mode Exit fullscreen mode
  • Ejemplo de consulta en SQL utilizando Like.

SELECT * FROM Tarjetas WHERE tareas like "%prueba";

Enter fullscreen mode Exit fullscreen mode
  • Para realizar consultas que distingan entre mayúsculas y minúsculas. Se utiliza la opción i.
db.tareas.find( { tarea: { $regex: /^prueba/i } } )

Enter fullscreen mode Exit fullscreen mode
  • Para realizar consultas por coincidencias que inician por una letra, se utiliza m.
db.tareas.find( { tarea: { $regex: /^p/, $options: 'm' } } )

Enter fullscreen mode Exit fullscreen mode

Jmoordbcore ofrece soporte para expresiones regulares mediante:

  • @regex

  • @RegexCount

  • @SearchCountLikeBy

  • @SearchLikeBy

@regex

La anotación @regex, se emplea para realizar búsquedas basadas en expresiones regulares usando el comando $regex en MongoDB.

@Regex(where = "tarjeta .like. @tarjeta ",caseSensitive = CaseSensitive.NO,typeOrder = TypeOrder.ASC)
public List<Tarjeta> regex(String tarjeta);


Enter fullscreen mode Exit fullscreen mode

@RegexCount

La anotación @RegexCount, cuenta el número de documentos que coinciden con una expresión regular especificada.

La anotación devuelve un valor de tipo Long.

@RegexCount(where = "tarjeta .like. @tarjeta",caseSensitive = CaseSensitive.YES)
public Long regexCountTarjeta(String tarjeta);
Enter fullscreen mode Exit fullscreen mode

@SearchCountLikeBy

La anotación @SearchCountLikeBy, cuenta el número de documentos que coinciden con una expresión regular especificada que utiliza Search, se asocia al uso de @SearchLikeBy.

La anotación devuelve un valor de tipo Long.

 @SearchCountLikeBy(caseSensitive = CaseSensitive.NO,LikeByType.ANYWHERE)
   public Long serchCountLikeByTarjeta(String tarejeta, Search search);

Enter fullscreen mode Exit fullscreen mode

@SearchLikeBy

La anotación @SearchLikeBy permite definir las consultas basadas en el análisis del nombre de métodos, incorporando filtros, ordenación y paginación mediante un objeto de tipo Search.

@SearchLikeBy(caseSensitive = CaseSensitive.NO, typeOrder = TypeOrder.ASC, likeByType = LikeByType.ANYWHERE)
public List<Tarjeta> searchLikeByTarjeta(String tarjeta, Search search);

Enter fullscreen mode Exit fullscreen mode

Estos fueron utilizados en el repositorio descrito en la parte 1 del tutorial anteriorImplementando searchLikeBy en MongoDB con Jmoordbcore 1/3.

Jakarta Server Faces

Ahora definiremos en la pagina .xhtml, un inputText que realizara una búsqueda mediante expresión regular por el atributo tarjeta.

 <p:inputText value="#{buscadorTarjetasFaces.textToSearch}"                                                       

id="inputTextToSearch" >
<p:ajax event="keyup" listener="#{buscadorTarjetasFaces.sugerirTarjetas}"                                                             

update=":form:growl, dataTable,inputTextDescripcionToSearch"
/>
</p:inputText>
Enter fullscreen mode Exit fullscreen mode

Se observa que utilizamos para gestionar el evento keyup de manera que en la medida que el usuario escriba algo en la caja de texto deseamos realizar la búsqueda como una expresión regular.

Búsqueda por tarjeta

public void sugerirTarjetas(AjaxBehaviorEvent event) {
  List<Tarjeta> result = new ArrayList<>();
  try {
      textDescripcionToSearch = "";
      findByTarjetas();
      setFirstPageDataTable();
  } catch (Exception e) {          FacesUtil.errorMessage(FacesUtil.nameOfClassAndMethod() + " " + e.getLocalizedMessage());

    }
}

Enter fullscreen mode Exit fullscreen mode

El método sugerirTarjetas se invoca por cada letra que se ingrese a la caja de texto y luego se hace el llamado al método findByTarjetas().
Colocaremos un filtro que combina otras condiciones

Bson filter = and(
                eq("active", Boolean.TRUE)
        );
var userView = new UserView(userLogged.getIduser(), userLogged.getName(), userLogged.getPhoto(), userLogged.getEmail());

 Bson filterUser = eq("user.iduser", userView.getIduser());
 for (UserView uv : userViewList) {
   if (userView.getIduser().equals(uv.getIduser())) {
   } else {
filterUser = or(filterUser,eq("user.iduser", uv.getIduser()));
  }
 }
filter = and(filter, filterUser);

paginator = new Paginator.Builder()
           .page(1)
           .filter(filter)
           .sort(sort)
           .sorted(new Sorted(sort))
           .title(filterText)
           .name("findByTarjetas")
           .build();

Enter fullscreen mode Exit fullscreen mode

Para realizar la consulta

totalRecords = tarjetaServices.searchCountLikeByTarjeta(textToSearch, paginator.getFilter(), paginator.getSort(), paginator.getPage(), rowPageSmall.get()).intValue();

result = tarjetaServices.searchLikeByTarjeta(textToSearch, paginator.getFilter(), paginator.getSort(), paginator.getPage(), rowPageSmall.get());

Enter fullscreen mode Exit fullscreen mode

Recuerde que en la parte 1 definió this.tarjetaLazyDataModel = new LazyDataModel(), en el init(), por lo cual se ejecutara el método load() para gestionar los desplazamientos de los documentos en el datatable.

Top comments (0)