72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
# processors/duplicate_uid_handler.py
|
|
"""
|
|
Manejador de UIDs duplicados en el JSON
|
|
"""
|
|
|
|
|
|
def detect_and_resolve_duplicate_uids(data):
|
|
"""
|
|
Detecta y resuelve UIDs duplicados en el JSON de datos.
|
|
Estrategia: Renombrar UIDs duplicados añadiendo sufijo _dup1, _dup2, etc.
|
|
"""
|
|
uid_counts = {}
|
|
modifications_made = 0
|
|
|
|
print("INFO: Detectando UIDs duplicados...")
|
|
|
|
# Primera pasada: contar UIDs
|
|
for network in data.get("networks", []):
|
|
network_id = network.get("id", "Unknown")
|
|
for instruction in network.get("logic", []):
|
|
uid = instruction.get("instruction_uid")
|
|
if uid:
|
|
if uid not in uid_counts:
|
|
uid_counts[uid] = []
|
|
uid_counts[uid].append((network_id, instruction))
|
|
|
|
# Segunda pasada: renombrar duplicados
|
|
for uid, instances in uid_counts.items():
|
|
if len(instances) > 1:
|
|
print(
|
|
f"INFO: UID duplicado encontrado: {uid} ({len(instances)} instancias)"
|
|
)
|
|
|
|
# Mantener la primera instancia, renombrar las demás
|
|
for i, (network_id, instruction) in enumerate(instances[1:], 1):
|
|
old_uid = instruction["instruction_uid"]
|
|
new_uid = f"{old_uid}_dup{i}"
|
|
instruction["instruction_uid"] = new_uid
|
|
modifications_made += 1
|
|
|
|
print(f" - Red {network_id}: UID {old_uid} → {new_uid}")
|
|
|
|
# También actualizar referencias en otras instrucciones
|
|
update_uid_references(data, old_uid, new_uid, network_id)
|
|
|
|
if modifications_made > 0:
|
|
print(f"INFO: Se resolvieron {modifications_made} UIDs duplicados")
|
|
else:
|
|
print("INFO: No se encontraron UIDs duplicados")
|
|
|
|
return modifications_made > 0
|
|
|
|
|
|
def update_uid_references(data, old_uid, new_uid, target_network_id):
|
|
"""
|
|
Actualiza las referencias al UID antiguo en conexiones de otras instrucciones
|
|
dentro de la misma red.
|
|
"""
|
|
for network in data.get("networks", []):
|
|
if network.get("id") != target_network_id:
|
|
continue
|
|
|
|
for instruction in network.get("logic", []):
|
|
# Buscar en inputs que tengan source_instruction_uid
|
|
for pin_name, pin_info in instruction.get("inputs", {}).items():
|
|
if isinstance(pin_info, dict):
|
|
if pin_info.get("source_instruction_uid") == old_uid:
|
|
pin_info["source_instruction_uid"] = new_uid
|
|
print(
|
|
f" - Actualizada referencia en instrucción {instruction.get('instruction_uid')} pin {pin_name}"
|
|
)
|