/// <summary> /// Imports flight records. /// </summary> /// <param name="source"></param> /// <param name="dest"></param> private void ProcessFlights(IBaseStationDatabaseSQLite source, IBaseStationDatabase dest) { if (!ImportFlights) { WriteLog("Flight import skipped"); } else if (!ImportSessions || !ImportLocations) { WriteLog("Flight import skipped because session import was skipped"); } else if (!ImportAircraft) { WriteLog("Flight import skipped because aircraft import was skipped"); } else { WriteLog("Importing flight records"); var criteria = new SearchBaseStationCriteria(); var countFlights = source.GetCountOfFlights(new SearchBaseStationCriteria()); var countSource = 0; var countDest = 0; var startRow = 0; var pageSize = 30000; while (startRow < countFlights) { var allSource = source.GetFlights(criteria, startRow, startRow + (pageSize - 1), "DATE", true, null, false); countSource += allSource.Count; var upsertCandidates = new List <BaseStationFlightUpsert>(); var upsertKeys = new HashSet <string>(); foreach (var candidate in allSource) { var key = $"{candidate.AircraftID}-{candidate.StartTime}"; if (!upsertKeys.Contains(key) && _AircraftMap.TryGetValue(candidate.AircraftID, out var aircraftID) && _SessionMap.TryGetValue(candidate.SessionID, out var sessionID)) { upsertCandidates.Add(new BaseStationFlightUpsert(candidate) { AircraftID = aircraftID, SessionID = sessionID, }); upsertKeys.Add(key); } } var upserted = dest.UpsertManyFlights(upsertCandidates); countDest += upserted.Length; startRow += pageSize; } WriteLog($" Imported {countDest:N0} / {countSource:N0} flights"); } }