Buscar usuarios por apellido a la hora de invitar

cancel
Showing results for 
Search instead for 
Did you mean: 
hanzo
Member II

Buscar usuarios por apellido a la hora de invitar

Hola a todos,

He importado los usuarios por LDAP en Alfresco 2.9b. Si realizo una busqueda de un usuario por apellido, nombre o login name en el OpenSearch-Dashboard lo encuentra, pero a la hora de buscar a un usuario por apellido para invitar dentro de un espacio no lo encuentra. Si lo busco solo por nombre me muestra la lista de usuarios que tienen el mismo nombre o en algunos casos el buscado. :?

Como saben la mayoria se conocen por apellido dentro de una empresa y no todos saben el nombre de alguien a la hora de buscar para invitarlo.

Alguien me puede ayudar?? Hay alguna manera de configurar esta opción dentro de la opcion de busqueda de usuarios dentro de un espacio para que funcione como el OpenSearch??  :roll:

Gracias.
6 Replies
ajv
Member II

Re: Buscar usuarios por apellido a la hora de invitar

Hola polito,

Por lo que he podido averiguar, es un problema del wizard de invitación de usuarios al elaborar la query.
He estado haciendo pruebas, y cuando he buscado por el usuario adrian, la query que lanza es la siguiente:
@{http://www.alfresco.org/model/content/1.0}firstName:*adrian* 
@{http://www.alfresco.org/model/content/1.0}lastName:*adrian*
Esto, no devuelve ningún usuario, siguiendo la sintaxis de Lucene.

El problema es que el token tendría que estar encerrado en dobles comillas. Es decir, si hacemos:
@{http://www.alfresco.org/model/content/1.0}firstName:'*adrian*" 
@{http://www.alfresco.org/model/content/1.0}lastName:'*adrian*"
Nos lo encontraría.

Rebuscando código, he encontrado el lugar donde se monta esta query, por si quieres retocarlo. Se trata de la clase org.alfresco.web.bean.wizard.InviteUsersWizard.
El método en cuestión es el public SelectItem[] pickerCallback(int filterIndex, String contains), y habría que tocar el montaje de la query:
            String term = QueryParser.escape(contains.trim());
            StringBuilder query = new StringBuilder(128);
            query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:\"*");
            query.append(term);
            query.append("*\" @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:\"*");
            query.append(term);
            query.append("*\" @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:");
            query.append(term);
            query.append("*");
Como ves, aquí ya viene con los asteriscos intercalados…
Me parece que en las versiones más recientes, esto está fijado y corregido.
Bueno, espero que te haya servido.  :wink:

Hasta luego!!
sapodoble_3589
Member II

Re: Buscar usuarios por apellido a la hora de invitar

Yo me encontré con esta misma situación.
En su momento  corregí  la clase org.alfresco.web.bean.wizard.InviteUsersWizard y funcionó.
el problema que me encuentro ahora, es que los usuarios se quejan, que quieren buscar por nombre+apellido, con la modificación anterior no se contempla este caso.
¿Hay alguna forma fácil de hacerlo ? la que a mi se me ocurre es bastante compleja
(cortar la cadena en trozos y hacer una larga consulta con lucene).

Tengo otro problema, cuando un usuario tiene una ñ en el nombre o en los apellidos no me aparece, al hacer la búsqueda lo he de sustituir por "?", hay algo previsto para esto? o hago la modificación directamente en el código?

Gracias de nuevo.
ajv
Member II

Re: Buscar usuarios por apellido a la hora de invitar

Hola sapodoble,

Es cierto que si lo que quieren tus usuarios es que busque en ambos (por nombre y apellidos)…la modificación propuesta no te sirve, pero no lo veo tan complejo de arreglar.
Se podría hacer un trim del término de búsqueda (en el código es la variable term) y para cada "subterm" se ponen las condiciones (básicamente es encerrar los append's de las condiciones de búsqueda en un for). 
Así, por ejemplo, si buscamos adrian jimenez, pues detectaría 2 subterm's (adrian y jimenez)…y le pondria las condiciones quedando algo parecido a esto:
@{http://www.alfresco.org/model/content/1.0}firstName:'*adrian*"
@{http://www.alfresco.org/model/content/1.0}lastName:'*adrian*"
@{http://www.alfresco.org/model/content/1.0}firstName:'*jimenez*"
@{http://www.alfresco.org/model/content/1.0}lastName:'*jimenez*"
Ahora, si quieres que sea más inteligente y el primer subterm te lo asigne para el nombre y el otro para el apellido, pues entonces, es subdividir el string en nombre y posible apellido y hacer las 2 condiciones (la 2ª condicion, la del apellido, siempre que te hayan puesto apellido, es decir, siempre que tu varialbe apellido no sea null)…

Respecto a lo de la ñ, miraré de investigar un poco cuando tenga algo más de tiempo.
Saludos!!
sapodoble_3589
Member II

Re: Buscar usuarios por apellido a la hora de invitar

Gracias, con eso me sirve de momento.
sapodoble_3589
Member II

Re: Buscar usuarios por apellido a la hora de invitar

Después de cambiar a la versión 3.2 me he dado cuenta a la hora de invitar usuarios, que el formulario de búsqueda no permite la búsqueda de nombre + apellido de un usuario, sino sólo por nombre, por apellido o por nombre de usuario
El log de la consulta es:
12:16:20,902 User:sapodoble DEBUG [bean.wizard.BaseInviteUsersWizard] Maximum invite users results size: 500
12:16:20,902 User:sapodoble DEBUG [bean.wizard.BaseInviteUsersWizard] Using query to find users: @cm\:firstName:"*Jose Serra*" @cm\:lastName:"*Jose Serra*" @cm\:userName:Jose Serra*
¿Existe alguna razón de base para que se comporte de esta forma? para nuestro uso sería recomendable que las búsquedas puedan hacerse por nombre + apellido.

Voy a hacer las modificaciones en la clase BaseInviteUsersWizard para que se comporte cómo deseamos, pero me gustaría saber si hay una razón de peso para ese comportamiento.

En cuanto tenga la modificación la posteo por si alguién se encuentra con la misma problemática.

Un saludo

Emili.
sapodoble_3589
Member II

Re: Buscar usuarios por apellido a la hora de invitar

Por si a alguién le sirve he modificado el comportamiento de la búsqueda de usuarios en el formulario de invitar a un espacio, cuando manejamos unos 600 usuarios se hace complicado buscar una persona en concreto.
El comportamiento que hemos definido es el siguiente:

    * Búsquedas con una única cadena: buscará que la cadena forme parte de los atributos: nombre, apellidos, usuario y dirección de correo.
    * Búsquedas de 2 cadenas: buscará que la primera cadena forme parte del nombre y la segunda de los apellidos. A la inversa y que cualquier cadena forme parte del nombre de usuario.
    * Búsquedas con 3 o más cadenas: las dos últimas cadenas se consideraran apellidos, y todo lo anterior se considerará nombre para realizar la búsqueda.

La modificación es la siguiente:

  Modificaciones en  la claseorg.alfresco.web.ui.common.Utils

  public static void generatePersonSearch(StringBuilder query, String term)
   {
      StringBuffer strb = new StringBuffer ();
      StringTokenizer st = new StringTokenizer(term.trim());

      if (st.countTokens()==1)
      {
        query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:\"*");
        query.append(term);
        query.append("*\" @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:\"*");
        query.append(term);
        query.append("*\" @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:\"*");
        query.append(term);
        query.append("*\" @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:email:\"*");
        query.append(term);
        query.append("*\"");
      }
      else if(st.countTokens()==2)
      {
        String token1 = new String(st.nextToken());
        String token2 = new String(st.nextToken());

        query.append("(@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:\"*");
        query.append(token1);
        query.append("*\" AND @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:\"*");
        query.append(token2);
        query.append("*\")");

        query.append(" OR ");

        query.append("(@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:\"*");
        query.append(token1);
        query.append("*\" AND @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:\"*");
        query.append(token2);
        query.append("*\")");

        query.append(" OR ");

        query.append("(@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:\"*");
        query.append(token1);
        query.append("*\" OR @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:\"*");
        query.append(token2);
        query.append("*\")");
      }else
      {
      query.append("(");
        for (int i=0;  i < (st.countTokens()-2) ; i++)
        {
          String mtoken = st.nextToken();
          query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:\"*");
          query.append(mtoken);
          query.append("*\" ");
        }
        query.append(") AND (");

        String token1 = new String(st.nextToken());
        String token2 = new String(st.nextToken());

        query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:\"*");
        query.append(token1);
        query.append(" ");
        query.append(token2);
        query.append("*\"");

        query.append(")");
      }
   }

Seguramente se podrá optimizar la consulta pero así es bastante legible Smiley Happy

Para que las búsquedas de usuarios se comporten de igual forma en la parte de adminsitración de usuarios he modificado  (org.alfresco.web.bean.users) UserDialog concretamente la función search() para que haga uso de la misma función claseorg.alfresco.web.ui.common.Utils.generatePersonSearch()

  Código de la modificación en la función search() de (org.alfresco.web.bean.users) UserDialog
             …..
            StringBuilder query = new StringBuilder(128);
            Utils.generatePersonSearch(query, properties.getSearchCriteria());

// COMENTAMOS / BORRAMOS LA GENERACIÓN DE LA CONSULTA
/*          String search = properties.getSearchCriteria().trim();
            StringBuilder query = new StringBuilder(128);
            for (StringTokenizer t = new StringTokenizer(search, " "); t.hasMoreTokens(); )
            {
               String term = LuceneQueryParser.escape(t.nextToken());
               query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:\"*");
               query.append(term);
               query.append("*\" @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:\"*");
               query.append(term);
               query.append("*\" @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:");
               query.append(term);
               query.append("*");
            }
*/    
            ….

Epero que le sirva a alguién de ayuda.
Un saludo