Siguiendo el post de básicos
para el desarrollo de aplicaciones J2EE sobre Alfresco, os
dejamos una lista de pequeños consejos para el desarrollo con
Alfresco, y en concreto para búsquedas con OpenCMIS.
Búsquedas con OpenCMIS
Para realizar las búsquedas, podemos seguir el consejo que os dimos
en el post de básicos de Alfresco y usar la utilidad QueryStatement
que nos ofrece la librería de OpenCMIS, o
podéis construirlas a mano.
Comparadores CMIS-SQL
Si se requiere el uso de
comparaciones case-sensitive, hacer uso del predicado
CONTAINS() de CMIS-SQL para establecer cláusulas Full
Text Search, en vez de el comparador básico provisto
por CMIS-SQL =’ ‘. Ejemplo:SELECT * FROM eu:registro as r join cm:titled as t on r.cmis:objectId=t.cmis:objectId join cmis:folder as f on r.cmis:objectId = f.cmis:objectId WHERE CONTAINS(t,'cm:title:'*convenio*'') ORDER BY r.cmis:lastModificationDate DESC
Para
las búsquedas de campos marcados como constraints, el
predicado ‘=’ de CMIS-SQL funciona como si utilizáramos el
predicado LIKE. Es por eso que por ejemplo; buscandoSELECT eu:EstadoArchivo FROM eu:registro WHERE eu:EstadoArchivo='Expedientar'
Bajo el modelo
<property name="eu:EstadoArchivo"> <title>Estado Archivo</title> <type>d:text</type> <constraints> <constraint ref="eu:listaEstadosArchivo" /> </constraints> </property> <constraint name="eu:listaEstadosArchivo" type="LIST"> <parameter name="allowedValues"> <list> <value>Pendiente revisar</value> <value>Expedientar</value> <value>No expedientar</value> </list> </parameter> </constraint
Se encuentran tanto los valores de ‘Expedientar’ como ‘No expedientar’.
En nuestro caso arreglamos el problema cambiando el valor de
‘Expedientar’ por ‘Si expedientar’
Uso del predicado IN_TREE
Para
agilizar las búsquedas, el uso del predicado IN_TREE resulta de
gran ayuda, ya que nos asegura buscar objetos dentro del árbol de
un nodo determinado. Ejemplo:SELECT * FROM eu:registro as r join cm:titled as t on r.cmis:objectId=t.cmis:objectId join cmis:folder as f on r.cmis:objectId = f.cmis:objectId WHERE IN_TREE(f, 'workspace://SpacesStore/8d18d03a-8fe6-4ede-bfcd-5f6435d78b9e') ORDER BY r.cmis:lastModificationDate DESC
Métodos de paginación
La interfaz ItemIterable
que nos ofrece OpenCMIS nos da todo lo necesario para realizar
una paginación en servidor, gracias al los métodos
skipTo(posición) y getPage().Con esto la
búsqueda paginada nos quedaría algo tal que
public ItemIterable<QueryResult> doQuery(String query, int delta, int page) { log.trace("doQuery | delta: " + delta + " | page: " + page); Session session = this.getSession(this.username); OperationContext contexto = session.createOperationContext(); if (delta != -1){ contexto.setMaxItemsPerPage(delta); } log.debug("doQuery | " + query); ItemIterable<QueryResult> results = session.query(query, false, contexto); log.trace("doQuery | nº resultados: " + results.getTotalNumItems()); if (page > 1){ log.trace("skip to " + (page*delta-delta)); results = results.skipTo(page*delta-delta); } return results.getPage(); } |
Otros consejos
Uso de caracteres especiales
A la hora
de crear ficheros / directorios en Alfresco, es conveniente
recordar que existen ciertos caracteres que no son válidos. Sin
embargo, es útil saber que no tenemos porqué deshacernos del
nombre original de lo que queremos guardar (a pesar de que incluya
alguno de estos caracteres), ya que podemos hacer uso del metadato
‘Title’, para insertar estos caracteres, y luego recuperarlos
desde nuestra aplicación.