cancel
Showing results for 
Search instead for 
Did you mean: 

Uso de luceneSearch

vlopez
Champ in-the-making
Champ in-the-making
Saludos.
Este post viene al hilo de otro http://forums.alfresco.com/es/viewtopic.php?f=6&t=1976.
Estoy construyendo un script con javascript (y no soy programador…tiene su mérito 😎  ). El script tiene como función comparar el nombre de un archivo con el nombre de una carpeta, y si coinciden los seis primero dígitos de ambos nombres, entonces el archivo se mueve a ese espacio.
El patrón que siguen los nombres de archivo es: 000000Textolibre (seis dígitos para el código de cliente y texto libre).
El patrón que siguen los nombres de carpetas es: 000000Nombre del cliente (seis dígitos para el código del cliente y una cadena de carácteres que incluyen espacios en blanco).
Tengo un problema para definir la variable  que localiza el nombre de la carpeta con javascript y sus caracteres comodín. He intentado definir la variable nombre de carpeta como indicaba en el post indicado anteriormente.
Ahora estoy intentando usar luceneSearch, y como estoy en pruebas monto la variable con una carpeta creada, pero no funciona. El script es:

var documento   = document.name;
var nombre = documento.substr(0,5);
//NUEVA FORMA DE BUSCAR
var Folder = search.luceneSearch("+PATH:\"app:company_home/*\" +TYPE:\"cm:folder\" +@cm\\:name:\"000053Ramírez\"");

var pendientes = space.childByNamePath("pendientes");

if (Folder != null && Folder.hasPermission("CreateChildren"))
{
   var copy = document.move(Folder);
   if (copy != null)
   {
      document.name = documento;
      document.save();
   }
}
else
{
  var copy = document.move(pendientes);
   if (copy != null)
     {
      document.name = documento;
      document.save();
     }
}

El script extrae los cinco primeros dígitos del nombre del documento, luego busca la carpeta y mueve el documento, si no encuentra la carpeta el documento se almacenaría en la carpeta pendientes. Pero al incluir algún contenido, Alfresco me lanza un error, tal que:
Ocurrió un error del sistema durante la operación: Failed to execute script 'workspace://SpacesStore/7465b384-cd60-11de-a65d-43cb83d5086a':
Failed to execute script 'workspace://SpacesStore/7465b384-cd60-11de-a65d-43cb83d5086a': TypeError: Cannot find function hasPermission. (AlfrescoScript#7)

¿Alguna orientación?
23 REPLIES 23

venzia
Star Collaborator
Star Collaborator
Hola de nuevo tini, antes tenia algo de prisa y se me paso comentarte lo de las carpetas cuyos nombre empiezan por número.
Extraido de un post de aqui donde ajv explicaba el caso :
Las búsquedas por Lucene están basadas en codificación ISO9075, por lo que hay ciertos caracteres en el inicio del nombre de un contenido que se deben tratar de forma espacial, entre ellos los números Smiley Very Happy
Puedes emplear la codificación ISO9075. Por ejemplo, los espacios se reemplazan por _x0020_, las cadenas que comienzan con números se codifica el primer numero de la siguiente forma: _x003Y_, donde Y es el número a codificar.
Por ejemplo, la cadena "1 2" sería "_x0031__x0020_2"
(http://forums.alfresco.com/es/viewtopic.php?f=6&t=974)
Visto esto, para solventar tu problema deberías modificar el query de esta forma :

//reemplazamos el primer caracter por el formato ISO9075 de dicho caracter numerico
//teniendo en cuenta que todas estas carpetas destino empezaran por un numero
//en caso que no sea asi habra que meter una comprobacion previa de si empieza con numero
var nombre_carpeta=nombre.replace(nombre.substring(0,1),"_x003"+nombre.substring(0,1)+"_");
query += " +TYPE:\"cm:folder\" +@cm\:description:\""+ nombre_carpeta +"\"";

Voy de cabeza .. por lo que puede fallar. Espero al menos que entiendas el procedimiento.
Saludos,

vlopez
Champ in-the-making
Champ in-the-making
Aquí de nuevo Javier….(pero con algunas neuronas menos….este script me las está quemando).

Veamos. He analizado lo que me mandas y creo que lo he entendido. Estamos declarando una variable que lo que hace es reemplazar el primer dígito del nombre de la carpeta por el carácter apropiado para que sea entendido por la codificación que emplea Lucene. Hasta ahí, espero que bien.
He leído detenidamente tanto tu respuesta, como el post que me incluyes en la misma, así como otros varios en los que habla sobre el asunto de la codificación (como ejemplo más completo: …./en/viewtopic.php?f=4&t=7215&p=23458&hilit=query+for+lucenesearch#p23458).
He modificado mi script incluyendo exactamente lo que me indicas, porque por lo que he observado el uso del método "replace", es como escribes en tu respuesta (cadena a reemplazar, por lo que reemplaza). Y ademàs lo que busco, como indicas en el post que me enlazabas, es reemplazar solo el primer dígito (el nombre de la carpeta empieza por 6 números).
A continuación el script modificado y comentado:

var documento   = document.name; //obtengo el nombre del archivo que meto en Alfresco

var nombre = documento.substr(0,6); //extraigo los seis primeros dígitos del nombre del archivo

var pendientes = space.childByNamePath("pendientes");

var nombre_carpeta=nombre.replace(nombre.substring(0,1),"_x003"+nombre.substring (0,1)+"_");//Reemplazo primer dígito por _x003primerdigitonumero_

var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\""; //ruta de la consulta: Empresa-User Homes-Clientes
query += " +TYPE:\"cm:folder\" +@cm\:description:\""+ nombre_carpeta +"\""; //la consulta busca una carpeta cuya descripción coincida con los seis primeros   
                                                                                                                   //digitos del nombre del documento.

var carpetacliente = search.luceneSearch(query); //ejecutamos la consulta
var ruta = space.childByNamePath(carpetacliente);//trasladamos la consulta al nombre del espacio destino del documento.

if (ruta != null && ruta.hasPermission("CreateChildren")) //si la espacio destino no es nulo y tiene permiso (eso creo que significa)
{
   var copy = document.move(ruta); //mueve el documento al espacio destino
   if (copy != null)                            //si el movimiento no es nulo
   {
      document.name = documento;  //nombro el documento con su nombre original
      document.save();                    //persistiendo el movimiento
   }
}
else                                                 //en caso contrario
{
  var copy = document.move(pendientes);//muevo el documento a la carpeta pendientes
   if (copy != null)                                  
     {
    document.name = carpetacliente; //pero en este caso lo nombro con el resultado de la consulta para comprobar que me arroja la consulta
    document.save();
     }
}

Vale….creo que entiendo lo que escribo de código, pero el caso es que me sigue arrojando el mismo error:

Por favor corrija los errores siguientes y haga clic en Aceptar.
    * Ocurrió un error del sistema durante la operación: Failed to execute script 'workspace://SpacesStore/a741be7f-d2c4-11de-8a47-316241369f51':
Failed to execute script 'workspace://SpacesStore/a741be7f-d2c4-11de-8a47-316241369f51': Wrapped java.lang.IllegalArgumentException: Local name cannot be null or empty. (AlfrescoScript#27)

Me da que el problema es que no se como interpretar el resultado de la búsqueda, o bien, que la búsqueda me devuelve algo pero de forma incorrecta. Hay que tener en cuenta que además de los seis primeros dígitos, tenemos como nombre de carpeta apellidos y nombre del cliente, y si bien entre los seis primeros dígitos y el primer apellido no hay espacio alguno, si los hay posteriormente entre los apellidos y los nombres. Para más, complicaciones, pueden existir tildes, aunque eso no me preocupa porque las quito y listo.

¿Qué es lo que falla?…¿por què me sigue dando error?

venzia
Star Collaborator
Star Collaborator
Vale tini .. ya veo por donde puede estar fallando :
(vamos al grano)
En primer lugar la busqueda seguro que no te devuelve nada en este momento, puesto que estamos realizando una comparación exacta con el campo descripcion (al llevar comillas dobles) .. para ello te propongo que pruebes el siguiente script :
var documento   = document.name; //obtengo el nombre del archivo que meto en Alfresco

var nombre = documento.substr(0,6); //extraigo los seis primeros dígitos del nombre del archivo

var pendientes = space.childByNamePath("pendientes");

var nombre_carpeta=nombre.replace(nombre.substring(0,1),"_x003"+nombre.substring (0,1)+"_");//Reemplazo primer dígito por _x003primerdigitonumero_

var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\""; //ruta de la consulta: Empresa-User Homes-Clientes
//AHORA METEMOS BUSQUEDA CON COMODIN PUESTO QUE NO SABEMOS EL RESTO DE DATOS
query += " +TYPE:\"cm:folder\" +@cm\:description:"+ nombre_carpeta +"*"; //la consulta busca una carpeta cuya descripción coincida con los seis primeros   
                                                                                                                
var carpetacliente = search.luceneSearch(query); //ejecutamos la consulta
//ESTO ES ERRONEO PUESTO QUE EL QUERY DEVUELVE UN ARRAY DE OBJETOS TIPO NODO
//var ruta = space.childByNamePath(carpetacliente);//trasladamos la consulta al nombre del espacio destino del documento.

//si nos devuelve algo
if (carpetacliente!= null)
{
  //comprobamos si tenemos permisos sobre el primero objeto (y en teoria unico)
if(carpetacliente[0].hasPermission("CreateChildren"))
{
   var copy = document.move(carpetacliente[0]); //mueve el documento al espacio destino
   if (copy != null)                            //si el movimiento no es nulo
   {
      document.name = documento;  //nombro el documento con su nombre original
      document.save();                    //persistiendo el movimiento
   }
}
}
else                                                 //en caso contrario
{
  var copy = document.move(pendientes);//muevo el documento a la carpeta pendientes
   if (copy != null)                                  
     {
    document.name = carpetacliente; //pero en este caso lo nombro con el resultado de la consulta para comprobar que me arroja la consulta
    document.save();
     }
}
Creo que no se me pasa nada ..
Prueba a ver que te dice ahora  :mrgreen:.
Hay que tener en cuenta donde ejecutas el script (es decir .. si tienes subespacios donde heredan la regla el objeto space varía).
La verdad que me pillas justo de tiempo para darle una ojeada mas profunda a tu caso .. espero al menos que te sirva.
Saludos,

vlopez
Champ in-the-making
Champ in-the-making
Javier, no te puedes ni imaginar lo que agradezco tu inestimable ayuda (hay alguien al otro lado… :lol: )
Bueno, al grano.

He probado el script tal y como tu me lo escribiste. No me ha funcionado:
  • Si subo un archivo con nombre 000587MOCONT3T2009.txt el archivo es subido pero no se mueve al espacio 000587Ramon Martinez del Campo.

  • Si subo un archivo con nombre 000587Ramon Martinez del Campo, me lanza el siguiente error:
  • Please correct the errors below then click OK.
    A system error happened during the operation: 10160061 Failed to execute script 'workspace://SpacesStore/5f38585d-18a7-4fa7-9f65-cfbd0ea46f57': 10160060 Failed to execute search: +PATH:"/app:company_home/cm:Clientes/*" +TYPE:"cm:folder" +@cm:description:_x0030_00587*
    Hay que observar que me está identificando correctamente el primer dígito. [size=85](NOTA: he cambiado la carpeta clientes y la he subido un nivel, ahora la he puesto dentro de Company Home directamente, para evitar efectos colaterales  Smiley Very Happy ), y es en la carpeta clientes donde aplica la regla y desde la que subo los archivos.[/size]
  • Si subo un archivo con nombre prueba.txt, me lanza un error similar:
  • Please correct the errors below then click OK.
    A system error happened during the operation: 10160063 Failed to execute script 'workspace://SpacesStore/5f38585d-18a7-4fa7-9f65-cfbd0ea46f57': 10160062 Failed to execute search: +PATH:"/app:company_home/cm:Clientes/*" +TYPE:"cm:folder" +@cm:description:_x003P_rueba*
    Algo me has hecho avanzar, ya no devuelve un valor nulo o vacío, aunque falla en la ejecución de la búsqueda (lo mismo es cualquier error de sintáxis, que el Lucene se las trae).
    Analizando el script me he dado cuenta de que algo no lo estoy interpretando bien. Me explico.
    Las carpetas tienen como nombre la composición de los 6 dígitos + texto libre, pero el campo descripción tiene exclusivamente el valor de los 6 dígitos. Por ejemplo:
    Nombre de carpeta: 000587Ramon Martinez del Campo —- Campo Descripción: 000587

    Entonces he hecho la prueba de dejar en la consulta el valor de la variable cm:description como estaba incialmente, con doble entrecomillado, puesto que el campo descripción es exacto a los seis primeros dígitos del nombre del documento que debe incluirse. Y me ocurre exactamente lo mismo que lo explicado para los tres archivos que subo.

    Mi duda es si en la consulta debo incluir también una búsqueda por el nombre de la carpeta y no solo por el campo descripción si bien, este último es el campo más fiable, puesto que es exactamente la cadena por la que empieza el nombre de cualquier documento que debe incluirse en esa carpeta.
    También dudo, si debiera modifica algo en el modelo de contenido (contentModel.xml) en lo que respecta al campo descripción (Tokenise, atomic, etc.), aunque esto creo que no, puesto que la carpeta es un objeto de contenido, y por tanto debe heredar estas propiedades del objeto content.

    En fin, que esto empieza a tomar carácter de Cuarto Milenio.

    venzia
    Star Collaborator
    Star Collaborator
    Pues la verdad q si .. puesto q cojo el query del error y lo meto en el explorador de nodos y funciona! (eso si .. a mi no me devuelve nada .. pero esto es logico).
    Viendo la explicacion solo me cabe hacer dos pruebas. Una tal y como lo tenias, sin formateo del primer caracter numerico y con la comparacion exacta del campo descripcion. Otra quitandole la busqueda por el path .. es decir .. cambiar la busqueda para ver si encuentras que es lo que falla.
    En fin, ya me dices los resultados de las pruebas.
    Saludos,

    vlopez
    Champ in-the-making
    Champ in-the-making
    Hola Javier.
    He hecho las pruebas. que me comentas, sin resultado. Está claro que el problema está en la búsqueda.
    Los errores que me ha arrojado dicen que no se puede aplicar el método "haspermission" sobre indefinidos. Parece que algo avanzamos, porque parece que encontrar encuentra algo, pero es indefinido.
    Te voy a comentar algunos resultados obtenidos con el explorador de nodos, a ver si así ves algo que me pueda dar pistas.
    He incluido la carpeta Clientes de nuevo dentro de User Homes.
    Si en el explorador de nodos introduzco la siguiente cadena:
    TYPE:"cm:folder" +@cm\:description:"000090"
    Me devuelve el resultado correcto:
    {http://www.alfresco.org/model/content/1.0}_x0030_00090López_x0020_Martínez_x002c__x0020_Manuel
    Si en el explorador de nodos incluyo:
    "app:/company_home/cm:user_homes/cm:Clientes"+TYPE:"cm:folder" +@cm\:description:"000090"
    Me devuelve el resultado correcto:
    {http://www.alfresco.org/model/content/1.0}_x0030_00090López_x0020_Martínez_x002c__x0020_Manuel
    Por tanto, creo que no es necesario incluir la conversión del primer dígito (_x003_)
    Para empezar al incluir la ruta resulta que User Homes, es user_homes. Esto es como apuntar a un blanco invisible.
    Mi pregunta es si en la declaración de la consulta del script: ¿puedo incluir directamente lo que incluyo en el explorador de nodos, en caso contrario cúal es la forma de construirlo conforme al resultado del explorador de nodos? (por favor no me remitáis a las wiki porque la documentación más que instruir, lia).
    Y otra pregunta. En el explorador de nodos he metido un valor directamente, al construir la consulta en el script, ¿cómo incluyo en lugar de un valor una variable?

    venzia
    Star Collaborator
    Star Collaborator
    Hola Javier.
    He hecho las pruebas. que me comentas, sin resultado. Está claro que el problema está en la búsqueda.
    Los errores que me ha arrojado dicen que no se puede aplicar el método "haspermission" sobre indefinidos. Parece que algo avanzamos, porque parece que encontrar encuentra algo, pero es indefinido.
    Te voy a comentar algunos resultados obtenidos con el explorador de nodos, a ver si así ves algo que me pueda dar pistas.
    He incluido la carpeta Clientes de nuevo dentro de User Homes.
    Si en el explorador de nodos introduzco la siguiente cadena:
    TYPE:"cm:folder" +@cm\:description:"000090"
    Me devuelve el resultado correcto:
    {http://www.alfresco.org/model/content/1.0}_x0030_00090López_x0020_Martínez_x002c__x0020_Manuel
    Si en el explorador de nodos incluyo:
    "app:/company_home/cm:user_homes/cm:Clientes"+TYPE:"cm:folder" +@cm\:description:"000090"
    Me devuelve el resultado correcto:
    {http://www.alfresco.org/model/content/1.0}_x0030_00090López_x0020_Martínez_x002c__x0020_Manuel
    Por tanto, creo que no es necesario incluir la conversión del primer dígito (_x003_)
    Para empezar al incluir la ruta resulta que User Homes, es user_homes. Esto es como apuntar a un blanco invisible.
    Mi pregunta es si en la declaración de la consulta del script: ¿puedo incluir directamente lo que incluyo en el explorador de nodos, en caso contrario cúal es la forma de construirlo conforme al resultado del explorador de nodos? (por favor no me remitáis a las wiki porque la documentación más que instruir, lia).
    Y otra pregunta. En el explorador de nodos he metido un valor directamente, al construir la consulta en el script, ¿cómo incluyo en lugar de un valor una variable?
    Hola Tini, parece que va mejorando la cosa ..
    -El tema de la conversion del primer digito me da que solo es necesario cuando tratamos de buscar por la propiedad name (pero bueno .. habia que probar  :winkSmiley Happy.
    -A la busqueda
    "app:/company_home/cm:user_homes/cm:Clientes"+TYPE:"cm:folder" +@cm\:description:"000090"
    creo que le falta el termino PATH (supongo que sera un descuido .. no obstante confirmalo please).
    -En cuanto a meter los clientes en el user_home no lo veo adecuado si no se da el caso que los clientes son usuarios (mas que nada a nivel de estructura del repositorio), en cuyo caso lo ideal sería crear directamente en user_home una carpeta por cada cliente (en el mismo wizard de creacion de usuarios). No obstante esto no debe ser la causa del problema y queda como opinion personal :mrgreen:.
    -Y Para adaptar el codigo de busqueda al script deberás tener en cuenta que hay que "escapar" ciertos caracteres especiales como las comillas (") o los dos puntos de los nombres de las propiedades (Smiley Happy.
    El siguiente codigo es un ejemplo de los que yo tengo y funcionan perfectamente :
    var docs = search.luceneSearch("PATH:\"/app:company_home/cm:EMPRESA//*\" AND ASPECT:\"{modelo.personalizado}relaciones\" AND NOT (@custom_model\\:relaciones:\"<entidad></entidad>\" AND @custom_model\\:expedientes:\"<entidad></entidad>\")");
    Esto viene bien para entender la sintaxis .. Y COMPROBAR QUE HABIA UN FALLO EN EL PATH (app:/company_home) :
    -Las comillas del path, el nombre del aspecto y el valor de propiedades van escapadas con la \ (\") .. tanto las de inicio como las de fin.
    -Los dos puntos del nombre de la propiedad tb van escapados con la \ (\Smiley Happy.

    De esta forma .. la ultima consulta que comentas que funciona en el explorador de nodos, debería quedar así para ejecutarla desde el script :
    var query = "PATH:\"/app:company_home/cm:user_homes/cm:Clientes//*\" +TYPE:\"cm:folder\" +@cm\\:description:\""+codigo_del_cliente+"\"";
    Prueba y me dices.
    Saludos y suerte!

    vlopez
    Champ in-the-making
    Champ in-the-making
    OEEEEOOOOEEEEE……el script en su parte más importante….funciona.
    Javier me hace la búsqueda, me mueve los documentos cuyos nombres coinciden a las carpetas que corresponden… Smiley Very Happy Eres un monstruo….
    Pero como el mundo no es perfecto, me queda un fleco, que aún siendo un fleco es importante.
    Resulta que la búsqueda parece como si siempre arrojara algo, y además descubro que me está buscando en todo el repositorio, puesto que si subo un archivo con nombre Pruebas.txt resulta que lo mete en la carpeta  Diccionario de datos - Modelos de Espacio - Plantilla1 (un espacio creado por mi), y que resulta que tiene como descripción del espacio Prueba de plantilla. Por tanto, no se limita a buscar en la ruta que se le especifica.
    Entonces, la cuestión que surge es… ¿cómo limitar esa búsqueda a un espacio y sus subespacios?.
    Por otra parte si incluyo otro documento llamado "Query.txt" lanza un error porque no encuentra ningún espacio de correspondencia, y no lo mueve al espacio pendientes, por lo que me parece, como dije antes que la búsqueda siempre arroja algo (no se el qué). La pregunta que me surge en este caso es ¿cómo forzar a que emplee el espacio pendientes que indica el script?
    A continuación el código del script:

    var documento   = document.name;
    var nombre = documento.substr(0,6);
    var pendientes = space.childByNamePath("pendientes");
    var carpetacliente = search.luceneSearch("PATH:\"/app:company_home/cm:user_homes/cm:Clientes//*\" +TYPE:\"cm:folder\" +@cm\\:description:\""+nombre+"\"");

    //si nos devuelve algo
    if (carpetacliente!= null)
    {
    //comprobamos si tenemos permisos sobre el primero objeto (y en teoria unico)
    if(carpetacliente[0].hasPermission("CreateChildren"))
    {
       var copy = document.move(carpetacliente[0]);
       if (copy != null)
       {
          document.name = documento;
          document.save();
       }
      
    }
    }
    else
    {
      var copy = document.move(pendientes);
       if (copy != null)                                  
         {
        document.name = documento;
        document.save();
         }
    }

    venzia
    Star Collaborator
    Star Collaborator
    jejeje .. bueno .. esto ya tiene buena pinta .. me alegro!!
    Prueba este cambio en el query :
    var carpetacliente = search.luceneSearch("+PATH:\"/app:company_home/cm:user_homes/cm:Clientes//*\" +TYPE:\"cm:folder\" +@cm\\:description:\""+nombre+"\"");
    o este otro
    var carpetacliente = search.luceneSearch("+PATH:\"/app:company_home/cm:user_homes/cm:Clientes//*\" AND TYPE:\"cm:folder\" AND @cm\\:description:\""+nombre+"\"");
    Lo mismo si no indicas el + antes de PATH inicial lo toma como un OR lógico .. ya me dices.
    Saludos!

    vlopez
    Champ in-the-making
    Champ in-the-making
    Buenas Javier, mejor dicho San Javier (jeje).

    He probado metiendo el + delante del PATH y nada. También he probado metiendo AND en lugar de + , tampoco.
    Si miras en el post que redacté antes (y que me contestaste a tal velocidad que no me dio tiempo ni a publicar una edición del mismo  Smiley Tongue ), verás que si subo un archivo con nombre Query.txt, me encuentro que lanza un error:
    Por favor corrija los errores siguientes y haga clic en Aceptar.
    Ocurrió un error del sistema durante la operación: Failed to execute script 'workspace://SpacesStore/42622f72-d387-11de-8a47-316241369f51': Failed to execute script 'workspace://SpacesStore/42622f72-d387-11de-8a47-316241369f51': TypeError: Cannot call method "hasPermission" of undefined (AlfrescoScript#10)
    Creo entender por el error que no ha encontrado el espacio, pero también me da que pensar que no pasa del primer y segundo "If" porque la búsqueda siempre arroja algo, aunque no sea una coincidencia de lo que buscamos, o simplemente un valor nulo.
    ¿cómo le digo que sea un coincidencia exacta?….¿debería  emplear otro método que no fuera el if / else?..