# Proceso de transformación y validación

A continuación se detallan las instrucciones para realizar el proceso de transformación de la colección y de validación de la colección resultante. 

## Transformación: 

La transformación de la colección original a la colección transformada se realiza mediante el siguiente comando:

```bash
$ python Transformation.py --database ScappDB --target-collection dummy_data --old-collection dummy_data_old --parameter-collection parameters --log-file log.json
```
De esta forma la colección `dummy_data` de la base de datos `ScappDB` es renombrada a `dummy_data_old`. Posteriormente, se genera una nueva colección `dummy_data` de índice compuesto y se realiza la transformación de los datos desde `dummy_data_old` a `dummy_data`. Al finalizar la transformación, se actualiza el registro asociado a la versión de la db en la colección `parameters`. Como resultado de la transformación se obtiene un archivo `log.json` que contiene posibles errores de transformación ocurridos durante el proceso y los ids resultantes de la transformación del documento original en documentos basados en la nueva estructrura. 

### Parámetros disponibles
|Parámetro|Tipo| Descripción | Valor por Defecto|
|---------|----|-------------|------------------|
| `--mongo_uri`       | String | URI de conexión a MongoDB                           | `mongodb://localhost:27017/`     |
| `--database` | String | Nombre de la base de datos | No aplica.| 
| `--old-collection` | String | Nombre de la colección original posterior a la transformación. | No aplica. |
| `--target-collection` | Strign | Nombre de la colección a transformar. | No aplica. | 
| `--log-file` | String | Nombre del archivo resultante del proceso de transformación. | `log.json` |
| `--verbose` | Bool | Indica si se deben mostrar prints del proceso de transformación. | False |

### Resultado transformación

La transformación da como resultado un archivo `log.JSON`. El cual contiene un diccionario con los siguientes pares de llave-valor:
```json
    'transformation_errors': [
        "6778a46cd618cc4956a9b70f",
        "67c5cca697f03eec027c77b4",
        // ... mas _ids
    ],
    'associated_ids':{
        {
            "674296ec8e95a6bd014151bf":[
                "67c5cca697f03eec027c7659",
                "67c5cca697f03eec027c765a",
                // ... mas _ids
            ],
            // ... más documentos asociados
        }
    }
    '
```

- `transformation_errors`: Corresponde a un diccionario que agrupa todos los documentos que presentan errores durante el proceso de transformación. Los valores se almacenan como un listado de valores `_id` que identifican al documento con problemas en la colección original. 
- `associated_ids`: Corresponde a un diccionario, que contiene diccionarios, donde la llave corresponde a un `_id` de un documento en la colección original y el valor asociado, corresponde a una lista de `_id` con todos los documentos que se desprenden del documento original en la nueva colección. 


## Validación:

La validación de la colección resultante del proceso de transformación se realiza mediante el siguiente comando:

```bash
python Validation.py --database ScappDB --time-series-collection dummy_data --original-collection dummy_data_old --transformation-log log.json --integrity-collection errors --summary-log summary.json
```
El script realiza la validación de la colección transformada (series de tiempo) `dummy_data`, con respecto a la colección `dummy_data_old`, utilizando como referencia el archivo de salida `log.json` del proceso de transformación. Los resultados exhaustivos de la validación de los documentos transformados se almacena en en una colección en la misma base de datos, denominada `errors`. Un resumen de validación por llave, se almacena en `summary.json`.

### Parámetros disponibles
|Parámetro|Tipo| Descripción | Valor por Defecto|
|---------|----|-------------|------------------|
| `--mongo_uri`       | String | URI de conexión a MongoDB                           | `mongodb://localhost:27017/`     |
| `--database` | String | Nombre de la base de datos | No aplica.| 
| `--time-series-collection` | String | Nombre de la serie de tiempo a validar. | No aplica. | 
| `--original-collection` | String | Nombre de la colección original. | No aplica. | 
| `--transformation-log` | String | Nombre del archivo JSON resultado del proceso de transformación. | `log.jons`  |
| `--integrity-collection` | String | Nombre de la colección donde almacenar los resultados de la revisión exhaustiva. | `errors`|
| `--summary-log`| String | Nombre del archivo JSON con el resumen de validación por llave. | `summary.json` |


### Proceso de validación

Como resultado del proceso de transformación, el archivo `log.json` retorna los documentos transformados asociados a cada documento de la colección original. Utilizando como base esto, el proceso de validación evalua cada documento transformado asociado a un documento de la colección original. Cada documento transformado se ha revertido al formato de la colección original, comparando llave a llave los valores entre ambos documentos. 

El documento original se toma como referencia realizando evaluaciones tanto de tipo de dato, como también sobre el valor en sí:
- Se verifica que los tipos de datos entre los valores a comparar sea igual.
- Cuando los datos comparados son de índole númerica, el proceso de evaluación verifica que la diferencia entre ambos no supere 1e-3.
- En caso de que los valores no sean númericos, en general strings, se revisa que no existan diferencias entre ambos. 

**Cualquier discrepancia con los criterios mencionados, implica que dicho campo se considerá como resultado de un error.**

### Resultados del proceso de validación

#### Evaluación exhaustiva

Como resultado del proceso de validación, se obtiene una colección `errors`, que contiene documentos con los resultados de la evalaución exhaustiva de la integridad. Cada documento de la colección tiene la siguiente estructura: 

```json
{
    {
        "_id": "67cb579440265ede6d3502dd",
        "integrity": true,
        "reference": "674296ec8e95a6bd014151bf",
        "evaluation: {
            "dia": {
                "valid": true, 
                "value": "2024-11-24", 
                "type": <class 'str'>, 
                "expected": "2024-11-24", 
                "expected_type": <class 'str'>
            },
            // Mas llaves del documento
        }
    },
    // Mas documentos analizados
}
```
Cada documento tiene la siguiente estructura:
- `_id`: ID asociado al documento transformado que se está evaluando. 
- `integrity`: Indica si el documento paso o no la validación frente al documento de referencia. 
- `reference`: El id asociado al documento de la colección original, utilizado para la comparación.
- `evaluation`: Diccionario que contiene todos los resultados de evaluación de las llaves presentes en el documento analizado. 

Cada valor dentro del diccionario `evaluation`, tiene por llave el campo evaluado y el valor corresponde al resultado de la evaluación. La estructura de la evaluación por llave se desglosa a continuación: 
- `valid`: Indica si el valor del documento transformado es integro respecto al documento original. 
- `value`: Valor obtenidos desde el documento transformado.
- `type`: Tipo de dato del valor obtenido desde el documento transformado.
- `expected`: Valor esperado, obtenido de la referencia (documento original). 
- `expected_type`: Tipo de dato esperado, obtenido desde la referencia. 

La ventaja de almacenar la información directamente como una colección, es explotar el buscador de mongoCompass para realizar el análisis del resultado de transformación. **Por ejemplo: Si se busca determinar todos los documentos transformados que presentan problemas en la llave de `Visitas` se puede utilizar la siguiente query:**

```
{"evaluation.Visitas.valid": false}
```

#### Resumen de la evaluación

Un segundo archivo resultante del proceso de validación `summary.json` contiene un resumen por llave, indicando el número de datos validos, invalidos, revisados y el porcentaje asociado. El archivo tiene la siguiente estructura: 

```json
{
    "dia": {"valid": 834308, "invalid": 0, "total": 834308, "valid_percentage": 100.0}, 
    "Metodo_alimentacion": {"valid": 834308, "invalid": 0, "total": 834308, "valid_percentage": 100.0}, 
    "hora": {"valid": 834308, "invalid": 0, "total": 834308, "valid_percentage": 100.0}, 
    "perdidos": {"valid": 834301, "invalid": 7, "total": 834308, "valid_percentage": 99.99916098131625}, 
    "detecciones": {"valid": 834303, "invalid": 5, "total": 834308, "valid_percentage": 99.99940070094017}, 
    "perdidos_propios": {"valid": 834302, "invalid": 6, "total": 834308, "valid_percentage": 99.99928084112821}, 
    "nivel_actividad": {"valid": 833928, "invalid": 380, "total": 834308, "valid_percentage": 99.9544532714537}, 
    "use_feeding_api": {"valid": 834308, "invalid": 0, "total": 834308, "valid_percentage": 100.0}, 
    "detection_active": {"valid": 834298, "invalid": 10, "total": 834308, "valid_percentage": 99.99880140188037}, 
    "Comida_entregada": {"valid": 834303, "invalid": 5, "total": 834308, "valid_percentage": 99.99940070094017}, 
    "Meta_dia": {"valid": 834303, "invalid": 5, "total": 834308, "valid_percentage": 99.99940070094017}, 
    "Porc_entregado": {"valid": 223336, "invalid": 610972, "total": 834308, "valid_percentage": 26.769010964775596}, 
    "Tasa": {"valid": 834304, "invalid": 4, "total": 834308, "valid_percentage": 99.99952056075215}, 
    "Dia": {"valid": 217267, "invalid": 617041, "total": 834308, "valid_percentage": 26.041581765966527}, 
    "Feeding_active": {"valid": 834305, "invalid": 3, "total": 834308, "valid_percentage": 99.9996404205641}, 
    "Unidad_Medida": {"valid": 834109, "invalid": 199, "total": 834308, "valid_percentage": 99.97614789741918}, 
    "Visitas": {"valid": 119637, "invalid": 714671, "total": 834308, "valid_percentage": 14.339668323928334}, 
    "x_pos": {"valid": 834308, "invalid": 0, "total": 834308, "valid_percentage": 100.0}, 
    "y_pos": {"valid": 834308, "invalid": 0, "total": 834308, "valid_percentage": 100.0}, 
    "winche_connected": {"valid": 834308, "invalid": 0, "total": 834308, "valid_percentage": 100.0}, 
    "temp": {"valid": 834308, "invalid": 0, "total": 834308, "valid_percentage": 100.0}
}
```