martes, 13 de marzo de 2012

Diferencia entre dos flujos en Spoon

Hacía mucho tiempo que no tocaba Spoon, una herramienta que siempre me dejó con ganas de poder comprobar de qué es capaz realmente. Así que ha sido muy gratificante encontrarme con la posibilidad de utilizarla en mi trabajo, y de tener encima al lado a una persona con experiencia previa, como es el gran Isvapi.

Así que ya llevo unos días con un caso real. El clásico para este tipo de herramientas: tenemos que migrar los datos de un sistema a punto de morir, a otro nuevo y maravilloso. Si todo va bien y logro sacar un poco de tiempo, es posible que en las próximas semanas me anime a hacer una segunda parte de mi tutorial de iniciación. Pero hoy, como adelanto, la solución a un caso concreto que nos hemos encontrado.

El tema es que la migración la hacemos en dos fases. En la primera migramos todo el contenido de una tabla, y en la segunda el incremental. Por tanto, necesitábamos poder obtener la diferencia entre dos flujos de datos con la misma estructura (que sería el incremental a migrar). La realidad es que hacer algo así con Spoon es bastante fácil, gracias al paso Fundir filas.

Para explicar el proceso, vamos a suponer que trabajamos con una entidad Persona, que consta de un identificador, el nombre y los apellidos.

Lo primero que haríamos sería leer los dos repositorios de entrada, ya sean tablas de una base de datos, ficheros de texto, Excels... A continuación tendríamos que utilizar el paso indicado. Aquí su ayuda contextual:

Fundir dos flujos de filas, ordenadas por un campo clave. Se comparan los dos flujos y se señalan las filas que son iguales, han cambiado, se han eliminado y las nuevas.

Para que nos entendamos, lo que vamos a hacer es coger dos colecciones de datos con la misma estructura; en nuestro caso, dos colecciones de personas. El resultado contendrá la unión de las dos colecciones, indicando para cada elemento si:

- Aparece igual en ambas colecciones (identical).
- Aparece en ambas colecciones, pero algún dato ha cambiado (updated).
- Sólo aparece en la primera colección (deleted).
- Sólo aparece en la segunda colección (new).

Si vemos la configuración del paso, lo primero que tenemos que indicar son las colecciones que vamos a comparar; una de ellas será la de referencia. A continuación tenemos que dar un nombre al campo que se añadirá para indicar el resultado de la comparación (identical, updated, deleted o new).

Por último tenemos que especificar los campos que se utilizarán para hacer las comparaciones. Por un lado, hay que definir qué campos identifican a los elementos para poder indicar si estos están presentes en una de las colecciones, o en las dos. En nuestro caso, el campo id.

Por otro lado, tenemos que marcar los campos que se utilizarán para comparar los elementos presentes en ambas colecciones, y determinar si son idénticos, o han sido modificados. En nuestro caso añadiremos tanto el nombre como los apellidos.


Es importante incidir en la necesidad de que ambas colecciones estén ordenadas por los campos indicados como clave para que el paso funcione correctamente.

Una vez unidos los flujos y clasificados los registros, podemos utilizar el paso Switch para hacer lo que necesitemos con cada uno de ellos. En nuestro caso nos interesaba mandar a un fichero de texto aquellos registros que fuesen nuevos o hubiesen sido modificados, y a otro los que hubiesen sido eliminados.


El aspecto del proceso completo sería algo así.