Compressão lógica

Como entender a resposta de uma busca de vôos e o mecanismo de referência por indices

Uma resposta de busca de vôos retorna uma lista de FlightOptions(Opções de seleção) e cada FlightOption é composto por FlightGroups como descrito em Busca de vôos. No entanto, quando uma pesquisa retorna opções de seleção combinadas, muitas vezes cada opção pode referenciar o mesmo FlightGroup para ida e outro FlightGroup diferente para a volta.

Tomemos por exemplo o resultado abaixo:

[...]
{
	"flightGroups":
  [
    {//Indice 0
      "supplierSystem": "Gol",
      "durationInMinutes": 0,
      "cityPairIndex": 0,
      "flights": [
        {
          "arrivalAirportId": 0,
          "departureAirportId": 0,
          "durationInMinutes": 100,
          "layoverInMinutes": 0,
          "arrivalDateTime": "2023-11-20T08:40:00",
          "departureDateTime": "2023-11-20T07:00:00",
          "cabinType": "Economy",
          "airCompanyCode": "G3",
          "operatedByAirCompanyCode": "G3",
          "flightNumber": "1210",
          "classOfService": "U",
          "aircraftType": "738",
          "arrivalAirportIATA": "POA",
          "departureAirportIATA": "CGH"
        }
      ],
      "arrivalTime": "2023-11-20T08:40:00",
      "departureTime": "2023-11-20T07:00:00",
      "originIATA": "CGH",
      "destinationIATA": "POA",
      "stops": 1,
      "credentialIdentifier": "A213459EB634941F55937EF85DCD6A32A9C2116E"
    },
    {//Indice 1
      "supplierSystem": "Gol",
      "durationInMinutes": 0,
      "cityPairIndex": 1,
      "flights": [
        {
          "arrivalAirportId": 0,
          "departureAirportId": 0,
          "durationInMinutes": 100,
          "layoverInMinutes": 0,
          "arrivalDateTime": "2023-11-28T08:00:00",
          "departureDateTime": "2023-11-28T06:20:00",
          "cabinType": "Economy",
          "airCompanyCode": "G3",
          "operatedByAirCompanyCode": "G3",
          "flightNumber": "1205",
          "classOfService": "O",
          "aircraftType": "738",
          "arrivalAirportIATA": "CGH",
          "departureAirportIATA": "POA"
        }
      ],
      "arrivalTime": "2023-11-28T08:00:00",
      "departureTime": "2023-11-28T06:20:00",
      "originIATA": "POA",
      "destinationIATA": "CGH",
      "stops": 1,
      "credentialIdentifier": "A213459EB634941F55937EF85DCD6A32A9C2116E"
    },
    {//Indice 2
      "supplierSystem": "Gol",
      "durationInMinutes": 0,
      "cityPairIndex": 0,
      "flights": [
        {
          "arrivalAirportId": 0,
          "departureAirportId": 0,
          "durationInMinutes": 100,
          "layoverInMinutes": 0,
          "arrivalDateTime": "2023-11-20T09:40:00",
          "departureDateTime": "2023-11-20T08:00:00",
          "cabinType": "Economy",
          "airCompanyCode": "G3",
          "operatedByAirCompanyCode": "G3",
          "flightNumber": "1212",
          "classOfService": "U",
          "aircraftType": "738",
          "arrivalAirportIATA": "POA",
          "departureAirportIATA": "CGH"
        }
      ],
      "arrivalTime": "2023-11-20T09:40:00",
      "departureTime": "2023-11-20T08:00:00",
      "originIATA": "CGH",
      "destinationIATA": "POA",
      "stops": 1,
      "credentialIdentifier": "A213459EB634941F55937EF85DCD6A32A9C2116E"
    },
  ],
    "flightsOptions": [
      { //Primeira opção de vôo que tem o FlightGroup 0 como ida e o 1 como volta
        "flightGroupIndexes": [
          0,
          1
        ],
        "brandedFares": [
          [Preço 1],
          [Preço 2],
          [Preço 3],
        ]
      },    
      { //Segunda opção de vôo que tem o FlightGroup 0 como ida e o 2 como volta
        "flightGroupIndexes": [
          0,
          2
        ],
        "brandedFares": [
          {...}
        ]
      }
    ]
}

Note que cada objeto FlightOption tem um array de FlightGroupIndexes e não um array de FlightGroups propriamente dito, justamente porque dado o exemplo acima o FlightGroup 0 teria seu conteúdo repetido inúmeras vezes.

Por isso ao fazer o parse do resultado de buscas a interface deve apresentar os FlightOptions e seus BrandedFares ao mesmo tempo que "desreferencia" o FlightGroup pelo indice no array de FlightGroups retornado na própria resposta.