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; buscando
SELECT 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'
-
SELECT eu:EstadoArchivo FROM eu:registro WHERE eu:EstadoArchivo='Sí 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.