---
name: merge_entity_attributes
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "def merge_entity_attributes(attr_list: list[dict]) -> dict"
description: "Combina atributos de multiples candidatos de la misma entidad. Aplica heuristicas de resolucion por tipo de campo: max para numericos, min/max para fechas, union para listas, OR para booleanos, mas largo para strings."
tags: [merge, entity, attributes, resolution, deduplication, fuzzygraph, python]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: attr_list
    desc: "Lista de diccionarios con atributos de candidatos de la misma entidad"
output: "Diccionario con atributos merged aplicando heurísticas de resolución por tipo"
tested: true
tests:
  - "Atributos complementarios (A tiene full_name, B tiene nationality) -> ambos"
  - "Atributos conflictivos en risk_score -> max"
  - "Atributos first_seen conflictivos -> min"
  - "Todos null -> null"
  - "Listas -> union sin duplicados"
  - "Boolean verified -> True si alguno es True"
  - "String conflictivo -> usar el mas largo"
  - "Valores iguales -> usar ese valor"
  - "Un solo candidato -> retorna sus atributos tal cual"
  - "Lista vacia -> retorna dict vacio"
  - "last_seen conflictivo -> max (mas reciente)"
  - "Un candidato tiene null, otro tiene valor -> usar el valor"
test_file_path: "python/functions/core/merge_entity_attributes_test.py"
file_path: "python/functions/core/merge_entity_attributes.py"
---

## Ejemplo

```python
a = {"risk_score": 3.5, "first_seen": "2022-05-15", "verified": False}
b = {"risk_score": 7.2, "first_seen": "2023-01-01", "verified": True, "alias": "Alice"}

result = merge_entity_attributes([a, b])
# {
#   "risk_score": 7.2,           # max
#   "first_seen": "2022-05-15",  # min (mas antigua)
#   "verified": True,            # OR logico
#   "alias": "Alice"             # solo en b
# }
```

## Heuristicas de resolucion

| Campo / tipo | Conflicto | Resolucion |
|---|---|---|
| `risk_score`, `balance`, `cvss` | numerico | `max` |
| `first_seen`, `created_date` | fecha | `min` (mas antigua) |
| `last_seen`, `expires_date` | fecha | `max` (mas reciente) |
| `verified`, `exploited` | booleano | `any` (OR logico) |
| cualquier `list` | lista | union sin duplicados |
| cualquier `str` u otro | string | el mas largo |

Los campos fuera de las listas conocidas usan la heuristica por tipo Python (`list`, `bool`, luego `str`/otro).

## Notas

Funcion pura. No tiene dependencias externas. Las listas conocidas de campos especiales (`_NUMERIC_FIELDS`, `_DATE_MIN_FIELDS`, etc.) pueden extenderse si el dominio crece.

Disenada originalmente para el grafo de entidades de fuzzygraph, donde multiples fuentes pueden describir la misma entidad con datos complementarios o contradictorios.
