Uso de luceneSearch

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

Uso de luceneSearch

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 8)  ). 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
pjcaracuel_2349
Active Member II

Re: Uso de luceneSearch

Buenas,

No sera que Folder es una colecion de Nodos y no un nodo al que aplicarle el metodo hasPermission??

Saludos
vlopez
Member II

Re: Uso de luceneSearch

Gracias Pedro por tu respuesta …y rápida…
Tienes que perdonar que no sea programador, y seguro que ese es el motivo por el que no entiendo bien la respuesta que me das.
¿Quiere decir que el resultado de luceneSearch tal como lo planteo no es un nodo y por tanto no le puedo aplicar el método?.
pjcaracuel_2349
Active Member II

Re: Uso de luceneSearch

Tampoco yo creas que me acuerdo de mucho, pero he visto un ejemplo tal que esta:

var results = store.luceneSearch("TEXT:tomcat");
      for (var i=0; i<results.length; i++)
      {
         out += results.path + "<br>";
      }
      return out;
   }


De lo que deduzco que results es un array de nodos, que se itera para sacar los nodos. Luego deberias aplicarle el hasPermission al nodo iterado.

Saludos
vlopez
Member II

Re: Uso de luceneSearch

Gracias Pedro por tu respuesta.

Me permito una pregunta más, ya que con el nombre del espacio el script se me empieza a complicar, y se escapa a mi conocimiento. Aquí la pregunta:
¿existe alguna función como space.childByNamePath, pero que en lugar del nombre del espacio use el campo descripción para localizar dicho espacio?
vlopez
Member II

Re: Uso de luceneSearch

Buenas.

Aquí sigo peleando con el script que me tiene algo desquiciado…algo no…mucho. :mrgreen:
Como he mencionado a lo largo de este post, estoy intentando crear un script para que me mueva documentos desde una carpeta a otra en función de una parte del nombre del documento, y (OJO esto es nuevo) en función del valor del campo descripción del espacio.
Veamos. Y me vuelvo a repetir: Tengo una estructura de carpetas dentro de una carpeta general llamada "Clientes". De esta carpeta cuelgan otras que son nombradas con un nombre compuesto por seis dígitos que son números(código del cliente), y a continuación una cadena de texto sin longitud definida y que contiene el nombre del cliente (puede contener tildes, comas, etc). Estas carpetas se completan con el campo descripción del espacio que está conformado exclusivamente por el código del cliente, o lo que es lo mismo:seis dígitos numéricos.
Dentro de la carpeta general Clientes tengo otra carpeta llamada "pendientes", donde se moverán los documentos que no coincidan con las condiciones de la búsqueda (esto se producirá cuando el documento no este correctamente nombrado, o cuando la carpeta del cliente no exista).
Los documentos son nombrados mediante seis dígitos al comienzo (para hacerlo coincidir con el nombre de la carpeta y del campo descripción de la carpeta), y a continuación una cadena de texto libre.
De este modo el documento 001180Modelo de contrato debe ser movido a la carpeta 001180Cliente Fulanito de tal, esta carpeta tiene como valor del campo descrición 001180.

Estoy loco con la función search.luceneSearch y la forma de crear la consulta. He hecho pruebas con el explorador de nodos y con diferentes variantes me devuelve siempre la existencia de la carpeta.

Pero cuando llevo la consulta al script me encuentro con que me devuelve un error de que no encuentra lo que busco.
A continuación el script:

var documento   = document.name;
var nombre = documento.substr(0,6);
var pendientes = space.childByNamePath("pendientes");

var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\"";
query += ' + TYPE:"cm:folder"+@cm\:description:\"+ nombre ';

var carpetacliente = search.luceneSearch(query);
var ruta = space.childByNamePath(carpetacliente);

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

A continuación el error:
Ocurrió un error del sistema durante la operación: Failed to execute script 'workspace://SpacesStore/dc818d72-ce10-11de-a65d-43cb83d5086a': Failed to execute script 'workspace://SpacesStore/dc818d72-ce10-11de-a65d-43cb83d5086a': Wrapped java.lang.IllegalArgumentException: Local name cannot be null or empty. (AlfrescoScript#34)

Es claro que el problema está en la construcción de la búsqueda, porque de forma intencionada renombramos el documento con el valor que devuelve la búsqueda, y nos dice (como se ve en el error), que dicho nombre no puede ser un valor vacío…
Evidentemente la búsqueda no devuelve nada.
Un detalle importante en función de todo lo que he leído sobre Lucene es que estoy usando la versión 2.9 community.

¿Alguien puede ayudarme sobre la sintaxis para la construcción de la búsqueda?, ¿qué estoy haciedo mal?……por favor ayudaaaaaaa
venzia
Senior Member

Re: Uso de luceneSearch

Creo que el cambio que necesitas es .. de :
var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\"";
query += ' + TYPE:"cm:folder"+@cm\:description:\"+ nombre ';
a
var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\"";
query += " +TYPE:\"cm:folder\" +@cm\:description:\"+ nombre +"\"";
Prueba y nos dices.
Saludos
vlopez
Member II

Re: Uso de luceneSearch

Hola Javier:

He probado con el query como tu me indicas, y me arroja el siguiente error:
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/c2e44dbb-cec3-11de-a65d-43cb83d5086a':
Failed to execute script 'workspace://SpacesStore/c2e44dbb-cec3-11de-a65d-43cb83d5086a': illegal character (AlfrescoScript#20)

La línea 20 es la primera en la que se define el query (la ruta).

Una pregunta más. He visto en algunos foros que aplican, creo que es una función, al resultado de la búsqueda, hacen la siguiente instrucción sobre la variable (en este caso query):

model.query=query

Otra cosa, el hecho de que las carpetas comiencen por valores numéricos, ¿no requiere la conversión al formato _x0020_?
venzia
Senior Member

Re: Uso de luceneSearch

Creo que el cambio que necesitas es .. de :
var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\"";
query += ' + TYPE:"cm:folder"+@cm\:description:\"+ nombre ';
a
var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\"";
query += " +TYPE:\"cm:folder\" +@cm\:description:\"+ nombre +"\"";
Prueba y nos dices.
Saludos
Cierto tini, lo estoy haciendo de cabeza y se me paso una comilla doble :
var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\"";
query += " +TYPE:\"cm:folder\" +@cm\:description:\""+ nombre +"\"";
Dime que tal con este cambio.
Saludos,
vlopez
Member II

Re: Uso de luceneSearch

Ok Javier.
La búsqueda parece que la ha solventado, es decir, no me arroja error de sintáxis. Pero ahora me dice lo siguiente:

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/8f2beb23-d29a-11de-8a47-316241369f51':
Failed to execute script 'workspace://SpacesStore/8f2beb23-d29a-11de-8a47-316241369f51': Wrapped java.lang.IllegalArgumentException: Local name cannot be null or empty. (AlfrescoScript#25)
El script:
var documento   = document.name;
var nombre = documento.substr(0,6);
var pendientes = space.childByNamePath("pendientes");

var query = "+PATH:\"/app:company_home/cm:User Homes/cm:Clientes/*\"";
query += " +TYPE:\"cm:folder\" +@cm\:description:\""+ nombre +"\"";

var carpetacliente = search.luceneSearch(query);
var ruta = space.childByNamePath(carpetacliente);

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

Volvemos a que el resultado de la búsqueda me lo devuelve como vacío o nulo. ¿Habrá que hacer la conversión que mencioné anteriomente, lo de aplicar "model" o cambiar al formato _x0020_?

Gracias de antemano.