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
Pues si es un poco extraño .. todo es ponerse a hacer pruebas .. pero me da que ahora mismo lo tengo dificil.
Para querys combinadas no hay mucha mas historia que la que ponen en el wiki http://wiki.alfresco.com/wiki/Search#Combined_Queries
Y el tema del PATH tampoco debería tener mas misterio .. ya te digo q el script q he posteado a mi me funciona perfectamente (y comprobado q solo trae lo que debe).
En fin .. no se que mas decirte .. mas pruebas y si ves algun detalle que pueda ser relevante lo comentas por aqui?.
La verdad q el post lo he seguido un poco a lo rapido .. asi que lo mismo no he entrado a valorar algo q debia. De todas formas no te veo lejos de conseguirlo tu mismo :wink:.
Saludos y suerte!

venzia
Star Collaborator
Star Collaborator
Ya por curiosidad me he puesto .. y a mi casos similares si que me funcionan (siempre es bueno probar el query en el explorador de nodos).
De todas formas si ves que tienes muchos problemas con el tema del path (lo mismo tiene q ver con que no localiza user_home y se queda en company_home .. ya por decir algo) .. prueba con el tipo carpeta y el campo descripcion unicamente (que supongo sera unica en el repositorio)
Saludos!

vlopez
Champ in-the-making
Champ in-the-making
Javier me está funcionando. Ante todo agradecerte sinceramente tu inestimable ayuda sin la que hubiera sido del todo imposible llegar al resultado final, y también agradecer la colaboración de pjcaracuel (Pedro Jiménez).
Bien al grano.
El problema del script era la línea con la que comenzaba el primer "If":
if (carpetacliente!= null)
A mi me costó, porque no soy programador, pero aplicando la lógica del script al final me di cuenta que por aquí pasaba todo, y devolvía cualquier resultado (no se exactamente cuál), lo que hacía que el resto del script fuera mal interpretado. Como la búsqueda me devuelve una matriz de nodos, la comparación parece ser que siempre era algún tipo de valor. Así que sustituí dicha línea por el valor que en las siguientes líneas se empleaba, es decir "carpetacliente[0], y "voilá", salió andando. Así que esa línea queda del siguiente modo:
if (carpetacliente[0]!= null)
También cambié la ruta de la carpeta clientes, aunque dentro de User Homes, también funciona.
El código completo del script queda del siguiente modo (con una pequeña modificación, puesto que la descripción de la carpeta lleva por delante la palabra Cliente más un espacio):
var documento   = document.name;
var codigo = documento.substr(0,6);
var nombre = "Cliente "+codigo;
var pendientes = space.childByNamePath("pendientes");
var carpetacliente = search.luceneSearch("+PATH:\"/app:company_home/cm:Clientes//*\" AND TYPE:\"cm:folder\" AND @cm\\:description:\""+nombre+"\"");

if (carpetacliente[0]!= null)
  { 
     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();
     }
}
Por supuesto, este código no es perfecto y menos teniendo en cuenta de donde proviene (no soy programador), y es muy mejorable, por lo que agradecezco cualquier sugerencia.
Hay algunas cosas que es necesario aclarar y resumir:
  • La carpeta Clientes debe incluir la Carpeta que yo llamo Registro de Entrada que es la carpeta a la que se le aplica la regla.

  • La carpeta Registro de Entrada contiene otra carpeta que llamo pendientes, que es donde se incluirán aquellos archivos mal nombrados o cuya carpeta de cliente no exista.

  • De la carpeta Clientes cuelgan todas las carpeta de clientes que se identifican por [Código de 6 dígitos][Nombre del cliente], sin espacios entre el código y el nombre del cliente. Aunque de cara al script el nombre de la carpeta da igual porque como se ve a continuación se emplea el campo descripción.

  • Cada carpeta de un cliente debe tener como descripción Cliente [Código de 6 dígitos], con un espacio entre Cliente y código, que es el campo por el que realmente se realiza la búsqueda, y que como dijo Javier evita la codificación a ISO 9075, ya que ésta solo se aplica al nombre de la carpeta.

  • Los nombre de archivos se codifican comenzando siempre por el código del cliente, es decir, [Código de 6 dígitos][texto libre].

  • He hecho pruebas en dos Alfresco distintos (2.9 y 3.2), si bien, esto puede ser un problema de cara a la sintáxis de Lucene, creo que el problema me lo daba realmente que en la versión 2.9 el directorio de almacenamiento era variable y no fijo (el famoso dir.root). Aunque esto no lo puedo asegurar del todo.

  • Por otra parte con las funcionalidades propias de Alfresco se solventan otra serie de cosas, como la introducción de dos archivos con el mismo nombre en la misma carpeta, o la existencia de dos carpetas con el mismo campo descripción. En el primer caso, si la inclusión de documentos se realiza a través de la interfaz web, Alfresco lanza un error, si se hace a través de CIFS, lo pasa a la carpeta pendientes (esto último no lo he testado suficientemente). En el caso de que existan dos carpetas con la misma descrición, Alfresco introduce el documento en la primera carpeta con el mismo nombre que encuentre, que será aquella que primero se creó en el tiempo.
Este script creo que supone en si un modelo de organización de al menos una parte de cualquier empresa, puesto que si existe un sistema de codificación de los nombre de archivos y de los nombres de carpetas, la distribución de documentos es una tarea automatizada, y que además implica incrementar el grado de seguridad y confidencialidad, ya que aquellos que se encargan de la introducción de documentos de forma masiva (el registro de entrada), no tienen porqué tener acceso a las carpetas de los clientes, eliminando problemáticas de actuaciones por mala fe, o por descuido, y limando las responsabilidades sobre la documentación de cada cliente (esto no es superfluo, tal y como están las cosas en lo relativo a la LOPD, y tal como se van a poner).
En fin, espero que le sea útil a más gente, y al que le valga que por favor le mande el agradecimiento a Javier Martínez.

venzia
Star Collaborator
Star Collaborator
Perfecto Tini!! .. me alegro!! .. no obstante yo meteria la comprobacion de si ha devuelto algo, puesto que en el caso que no encuentre la carpeta destino te va a petar el tipico tema de "index out of the bound". Quedaria de la siguiente forma :
var documento   = document.name;
var codigo = documento.substr(0,6);
var nombre = "Cliente "+codigo;
var pendientes = space.childByNamePath("pendientes");
var carpetacliente = search.luceneSearch("+PATH:\"/app:company_home/cm:Clientes//*\" AND TYPE:\"cm:folder\" AND @cm\\:description:\""+nombre+"\"");

if (carpetacliente!= null)
{
   if (carpetacliente[0]!= null)
   {
      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();
       }
   }
}
else
{
   var copy = document.move(pendientes);
   if (copy != null)                                  
   {
      document.name = documento;
      document.save();
   }
}
(puede que se me haya escapado meter alguna llave { .. } )
Prueba y si ves que da problemas obvias mi comentario.
Saludos,