Skip to main content

Ricerca nell'albero

La funzionalità ha lo scopo di determinare un percorso tra due nodi specifici (nodo iniziale e nodo finale) all’interno di una struttura ad albero composta da oggetti TreePcabNodes. La ricerca considera condizioni specifiche per l’esplorazione dei nodi, l’utilizzo di percorsi alternativi, la gestione dei nodi già esplorati e la possibilità di invertire il verso della ricerca qualora il nodo di partenza non fosse presente.

public List<TreePcabNodes> getNodeRoutingBetweenNodes(RoutingState routingState)

Restituisce una lista ordinata di oggetti TreePcabNodes che rappresenta il percorso calcolato tra due nodi, tenendo conto delle regole di filtraggio, delle esclusioni e dell’eventuale utilizzo della rete alternativa.

Classe RoutingState

È una struttura di supporto che incapsula tutti i dati necessari per la ricerca del percorso. Contiene:

  • Il nodo di partenza (startPk) e il nodo di arrivo (endPk)

  • L’albero completo dei nodi (tree)

  • La configurazione del calcolo fibre (CalcFibersLogicalConfig)

  • Flag di controllo per l’abilitazione del percorso alternativo di unidata (alternativeNet) e per l’esclusione dei nodi CNO (jumpCnos)

  • Una lista di identificativi di nodi già esplorati, utilizzata per evitare cicli durante la visita dell’albero (exploredNodesList)

1. Costruzione dell’albero filtrato

Il metodo getFilteredTree(RoutingState routingState) restituisce un sottoinsieme dell’albero contenente il nodo di partenza. I passaggi sono i seguenti:

  • Se il nodo di partenza (startPk) è nullo, viene restituita una lista vuota.

  • Se la configurazione del calcolo fibre non è presente, viene restituita una lista vuota.

  • Viene costruita una HashMap dell’albero.

  • Se il nodo di partenza non è presente nella HashMap, viene tentata un’inversione dei punti di partenza e di arrivo per eseguire la ricerca in direzione opposta. Questo per trovare il nodo A ed inserirlo in una mappa per rendere randomico il tempo di accesso alla ricerca dei nodi Z.

2. Esecuzione della ricerca

Il metodo getRouting(RoutingState, routing, filteredTree) decide se utilizzare l’albero completo o quello filtrato e richiama la ricerca vera e propria tramite getEndNode(...).

La funzione getEndNode(...) rappresenta il nucleo della ricerca ricorsiva ed esplora l’albero a partire da un sottoinsieme iniziale (lista di nodi) alla ricerca del nodo di arrivo.

I passaggi principali sono:

  • Se il nodo corrente è quello finale (endPk), viene restituito direttamente.

  • Se il nodo ha tra i propri figli un nodo con pk uguale a endPk, viene aggiunto al percorso e restituito il figlio corrispondente.

  • In assenza di corrispondenze dirette, si esegue una chiamata ricorsiva ai figli, filtrati secondo i criteri definiti, fino al ritrovamento del nodo finale.

Tutte le operazioni di scrittura sulla lista dei nodi esplorati e sulla lista del percorso sono sincronizzate per garantirne la consistenza in presenza di esecuzioni concorrenti (stream paralleli).

3. Filtri applicati durante l’esplorazione

Durante la ricerca, vengono applicati i seguenti filtri:

  • Nodi già esplorati: esclusi per evitare cicli.

  • Nodi di tipo CNO: esclusi se è attivo il flag jumpCnos.

  • Sezioni alternative di unidata: escluse se il flag alternativeNet è disattivato.

Questi filtri vengono applicati nei metodi:

  • isNodeToSkip(...): controlla se un nodo deve essere saltato.

  • canUseAlternativeRoute(...): determina se una sezione può essere attraversata.


Recupero delle sezioni tra i nodi

public List<PcabSection> getRoutingOnSectionBetweenNodes(RoutingState routingState)

Questa funzione permette di tradurre il percorso tra nodi in una lista di sezioni (PcabSection) che collegano un nodo al successivo. Le sezioni vengono estratte utilizzando il metodo getSectionForNode(...) di ogni nodo.


Recupero delle giunzioni associate a un nodo

public List<FibJoints> getRealizedJoints(CalcFibLogicalSupport support, Long pkNodes)

Dato un identificativo di nodo e una configurazione, questo metodo cerca il nodo all’interno dell’albero e restituisce tutte le giunzioni realizzate al suo interno, arricchite con i dati completi delle fibre in ingresso e uscita.