# PostgreSQL cache

- V současnosti cachujeme pouze kontext k danému RT spoji - tedy stav vozidla/spoje po poslední zpracované zprávě
- Nemusíme tedy dotahovat předchozí pozice z DB, ale veškeré informace máme ve sloupci `last_position_context` v tabulce `vehicle_positions_trips`
- Uložen jako JSON objekt s variabilními daty a atributy - v závislosti na stavu vozidla/spoje některé atributy chybí nebo jsou prázdné/null
- Pokud se jedná o první pozici na spoji, pak všechny atributy kromě `tripId` budou null a nepovinné atributy můžou chybět
- Aktuální interface viz [IVPTripsLastPositionContext](../../../src/schema-definitions/vehicle-positions/models/interfaces/VPTripsLastPositionInterfaces.ts)

```typescript
interface IVPTripsLastPositionContext {
    lastPositionId: string | null;
    lastPositionLat?: number | null;
    lastPositionLng?: number | null;
    lastPositionOriginTimestamp: number | null;
    lastPositionTracking: Feature<Point, IVPTripsPositionAttributes> | null;
    lastPositionCanceled: boolean | null;
    lastPositionLastStop: {
        id: string | null;
        sequence: number | null;
        arrival_time: number | null;
        arrival_delay: number | null;
        departure_time: number | null;
        departure_delay: number | null;
    };
    lastPositionDelay: number | null;
    atStopStreak: IVPTripsComputedPositionAtStopStreak;
    lastPositionBeforeTrackDelayed: {
        delay: number | null;
        origin_timestamp: Date;
    } | null;
    lastPositionState: StatePositionEnum | null;
    lastStopSequence?: number | null;
    lastPositionStateChange: string | null;
    tripId: string;
}
```

- **lastPositionId** - ID poslední pozice, koresponduje ID záznamu v tabulce `vehiclepositions_positions`
    - _poznámka_: využití během aktualizace tripu v databázi (lze nahradit přímo pozicí). Rovněž se využívá během propagace zpoždění
- **lastPositionLat** - poslední známá zeměpisná šířka vozidla
    - _poznámka_: nepoužívá se a může být null, pokud je spoj zrušen a nepodařilo se zjistit poslední známou polohu
- **lastPositionLng** - poslední známá zeměpisná délka vozidla
    - _poznámka_: nepoužívá se a může být null, pokud je spoj zrušen a nepodařilo se zjistit poslední známou polohu
- **lastPositionOriginTimestamp** - `origin_timestamp` poslední pozice (timestamp odeslání zprávy z vozidla)
    - _poznámka_: využití během propagace zpoždění a určení duplikovaných zpráv. :warning: unix timestamp v milisekundách
- **lastPositionTracking** - pokud je poslední pozice tracked, pak je zde uložena jako GeoJSON objekt, jinak null
    - _poznámka_: využití během určení stavu vozidla jedoucího z/do garáže, projetí poslední zastávky a ujeté trasy `shape_dist_traveled` a azimutu u propagované pozice
- **lastPositionCanceled** - indikátor, zda byl spoj předchozí zprávou deklarován jako zrušený
    - _poznámka_: využití během aktualizace tripu v databázi. Zbytečné a lze nahradit stavem pozice
- **lastPositionLastStop** - informace o poslední zastávce, kterou vozidlo projelo
    - _poznámka_: využití pouze pro výpočet zpoždění na zastávce
    - **id** - GTFS ID zastávky. V současnosti je vždy null a nepoužívá se
    - **sequence** - pořadí zastávky v rámci GTFS stop times
    - **arrival_time** - čas příjezdu na zastávku podle GTFS
    - **arrival_delay** - vypočítané zpoždění příjezdu na zastávku oproti GTFS v sekundách
    - **departure_time** - čas odjezdu ze zastávky podle GTFS
    - **departure_delay** - vypočítané zpoždění odjezdu ze zastávky oproti GTFS v sekundách
- **lastPositionDelay** - poslední vypočítané zpoždění vozidla na spoji
    - _poznámka_: využití pouze pro výpočet zpoždění na zastávce
- **atStopStreak** - informace o délce pobytu vozidla na zastávce
    - _poznámka_: využití pro přesnější určení zpoždění vozidla během pobytu na zastávce a taky pro výpočet zpoždění během příjezdu a odjezdu na zastávku
    - **firstPositionTimestamp** - timestamp první pozice na zastávce
    - **firstPositionDelay** - zpoždění v sekundách během první pozice na zastávce. Liší se od zpoždění během příjezdu na zastávku, které se počítá jinak
    - **stop_sequence** - pořadí zastávky v rámci GTFS stop times
- **lastPositionBeforeTrackDelayed** - dodatečné informace o poslední pozici
    - _poznámka_: vyplněno pouze v případě, že poslední pozice spoje byla zpropagována z předchozího spoje na oběhu, jinak null. Využití pro určení zpozdění vozidla a taky pro určení stavu vozidla jedoucího z/do garáže
    - **delay** - zpoždění poslední pozice oproti GTFS v sekundách
    - **origin_timestamp** - timestamp poslední pozice (timestamp odeslání zprávy z vozidla)
- **lastPositionState** - stav vozidla během poslední pozice
    - _poznámka_: využití pro určení stavu a správné určení segmentu trasy (mezi jakými zastávkami se vozidlo nachází, díky tomu přesnější zpoždění vozidla)
- **lastStopSequence** - pořadí poslední projeté zastávky v rámci GTFS stop times
    - _poznámka_: využití během určení, zda se vozidlo navrátilo na trase zpět
- **lastPositionStateChange** - timestamp poslední změny stavu vozidla
    - _poznámka_: využití pro určení stavu vozidla a zda se má vůbec vypočítat zpoždění
- **tripId** - RT ID spoje, ke kterému se kontext vztahuje. Koresponduje ID záznamu v tabulce `vehiclepositions_trips`
    - _poznámka_: využití během aktualizace tripu v databázi. Zbytečné, šlo by udělat lépe
