mjuez / TFM2016_Analisis-Visual-Revisiones-Codigo

Herramienta para la obtención y visualización de datos de revisiones de código.
MIT License
1 stars 0 forks source link

Algunas estadísticas calculadas son incorrectas #63

Closed mjuez closed 7 years ago

mjuez commented 7 years ago

En el momento de obtener datos de GitHub, tareas como la de obtención de revisiones o la de obtención de usuarios hacen un cálculo de estadísticas.

Durante la obtención de las revisiones de una pull request se actualiza la pull request añadiendo un contador de revisiones (GitHub no lo ofrece), pero dicho contador es calculado de forma incorrecta. Por ejemplo el repositorio elastic/elasticsearch cuenta con 7695 revisiones, si sumamos el número de revisiones de todas las pull request, obtenemos únicamente 103.

mjuez commented 7 years ago

También se calculan mal las estadísticas de los usuarios sobre:

mjuez commented 7 years ago

La función map de javascript es síncrona por defecto, sin embargo, si la función lambda utilizada para procesar cada uno de los elementos es asíncrona provoca que la función map también lo sea. Esta situación se daba en la línea 68 del fichero AbstractPersistenceService. El comportamiento deseado es que la función createOrUpdateMultiple sea una función asíncrona async que si se llama con await el flujo del programa se detenga hasta que se complete la función. Para que ocurra dicho comportamiento, si dentro de la función se realizan operaciones asíncronas se debe indicar que el programa espere a que se completen dichas operaciones, y en este caso faltaba el await en la función (aquí asíncrona) map:

Incorrecto:

entities.map(async (entity) => { ... 

Correcto:

await entities.map(async (entity) => { ... 

Esto provocaba que la tarea que obtiene revisiones y actualiza las estadísticas de la pull request, comenzara a contar cuantas revisiones había asociadas a una pull request antes de que todas las revisiones se almacenaran en base de datos, por que aunque en la tarea se especificaba que se debía esperar a que todas las entidades fueran almacenadas, la función que almacenaba todas las entidades no tenía el comportamiento esperado y se resolvía antes de tiempo.