carm-es / inside

Instalación y evolutivo de la versión distribuible de InSiDE (Infraestructura y Sistemas de Documentación Electrónica)
European Union Public License 1.1
5 stars 8 forks source link

Optimizar construcción de la petición, a Eeutil-Vis-Docexp, de visualización de expediente ENI #70

Closed ja-garcia closed 3 years ago

ja-garcia commented 3 years ago

Se ha detectado que para la construcción de la llamada al servicio de Eeutil-Vis-Docexp, para la obtención de la visualizacion del índice de expediente ENI en PDF, se recorre el índice del expediente, de manera recursiva, recuperando el nombre natural de cada documento que contiene, pero haciendo una consulta independiente a la base de datos por cada documento. Este comportamiento dispara los tiempos de ejecución de las operaciones de Inside que hacen uso de la visualización del expediente, cuando se trata con expedientes grandes (cientos o miles de documentos). Se propone:

Para poder activar este comportamiento, vamos a usar una propiedad configurable, de manera que sea posible volver al comportamiento original del código liberado si se desactiva la misma o no se declara en el fichero de propiedades extendidas.

En fichero: file:${config.path}/enhanced_carm.properties Propiedad: eeutils.vis-docexp.exp.optimizar.dml.indice=<true|false>

josefsabater commented 3 years ago

Buenas @ja-garcia

respecto a la descripción de la issue, no nos queda claro que quieres decir en la siguiente frase:

"Una vez montada la nueva consulta, podemos agregar, si fuese necesario, un índice de base de datos, para que haga uso del mismo (si no existe ya)."

Se supone que los índices están ya creados, de hecho es lo que se esta consultando ¿a que te refieres con lo de crear uno nuevo?

ja-garcia commented 3 years ago

Hola @josefsabater. Cuando hablo de la posibilidad de agregar un índice, me refiero a un índice MySQL (no al índice del expediente ENI). Sería para ayudar al ORM (Hibernate en este proyecto) a ejecutar más rápido la nueva consulta que recupera de golpe todos los documentos (o sus nombres naturales) de un expediente ENI concreto (lo más probable es que ya exista ese índice y no haga falta añadirlo, pero no he revisado recientemente el modelo a ese nivel, y por eso lo comento como opción).

abilionavarro commented 3 years ago

Buenas, hemos estado viendo como se podrían consultar los documentos que forman un expediente a través de una SQL. En principio, y conforme esta montado el modelo de datos (estructura de arbol), es necesario recuperar las carpetas, de forma recursiva, para poder consultar los documentos relacionados con cada carpeta, o si la carpeta a su vez esta dentro de otra carpeta o si esta simplemente a nivel de expediente (sin estar dentro de una carpeta).

No se si se ha contemplado la posibilidad de realizar un procedimiento en PL-SQL para realizar esta consulta porque estamos viendo que en un principio con un sql sería bastante compleja, en el caso de que fuese posible realizarla, que tampoco lo tenemos claro dada la complejidad de almacenamiento de los Índices de los expedientes ENI.

ja-garcia commented 3 years ago

Hola @abilionavarro. La eficiencia de la opción del procedimiento almacenado va a depender del número de consultas que se terminen ejecutando (por ejemplo, si necesita ejecutar consulta por cada carpeta del expediente, no ganamos tanto, porque estos expedientes grandes suelen tener multiterceros y una carpeta por cada uno de ellos, que termina resultando en un número elevado de carpetas).

Como la opción que ofrece MySQL para consultas recursivas jerárquicas está disponible a partir de la versión 8 (e Inside está utilizando la 5.7) y además, hay cierta urgencia para poder mejorar la tramitación de este tipo de expedientes, podéis valorar la opción de utilizar dos veces el método fillItemWithIndice, para que haga dos recorridos del expediente cuando opciones.isExterno() es false (que es la opción que está haciendo que se disparen los tiempos de ejecucuión, al tener que hacer una consulta a base de datos por documento):

aid35y commented 3 years ago

Buenas @ja-garcia

Ya hemos realizado los cambios correspondientes y refactorizado el código. Necesitamos que se despliegue la rama en desarrollo para hacer las pruebas.

En la nueva consulta HQL, hemos tenido que meter los parámetros a fuego ya que a través del método setParameterList no ha funcionado.

Los resultados obtenidos son:

Procedimiento 688 --> Documentos: 33

Resultado: 1s 53ms-- > OPTIMIZADO Resultado: 19s 88ms--> NO OPTIMIZADO

Procedimiento 10171 --> Documentos: 492

Resultado: 2s 27ms-- > OPTIMIZADO Resultado: 3m 53s--> NO OPTIMIZADO

Muchas gracias.

Saludos.

ja-garcia commented 3 years ago

Hola @aid35y, se han desplegado los cambios en desarrollo y pruebas, tras aplicar una buena refactorización a la entrega inicial (incluyendo buena parte de la que ha estado aplicando @josefsabater). La rama que he desplegado, feat/jgl13r/optimizar-peticion-eeutil-vis-expediente-#70, lleva algunas correciones más sobre la refactorización de @josefsabater.

Para los próximos issues, no hay problema en que hagáis el push a la rama del repositorio remoto, pero por favor, que lo valide @josefsabater o quien internamente decidáis, antes de avisarme por el issue de que está para entregar. Gracias.