TimetableAPI-Upgrade (#64)
Partial implementation of: #47 The 2022.2.1 release currently live is based off of the TimetableAPI-Upgrade branch. Partial PIS code matching is now implemented in cases where x number of stops need skipping at the start of a route. Reviewed-on: #64
This commit is contained in:
102
src/utils/pis.utils.ts
Normal file
102
src/utils/pis.utils.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
export function getPartialEndTiplocMatchPipeline(query: string[]) {
|
||||
return [
|
||||
{
|
||||
$match: {
|
||||
tiplocs: {
|
||||
$all: query,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$addFields: {
|
||||
reversedTiplocs: {
|
||||
$reverseArray: "$tiplocs",
|
||||
},
|
||||
query: {
|
||||
$literal: query,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$addFields: {
|
||||
reversedQuery: {
|
||||
$reverseArray: "$query",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$match: {
|
||||
$expr: {
|
||||
$eq: [
|
||||
{
|
||||
$slice: [
|
||||
"$reversedTiplocs",
|
||||
0,
|
||||
{
|
||||
$size: "$reversedQuery",
|
||||
},
|
||||
],
|
||||
},
|
||||
"$reversedQuery",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$addFields: {
|
||||
skipStops: {
|
||||
$subtract: [
|
||||
{
|
||||
$size: "$tiplocs",
|
||||
},
|
||||
{
|
||||
$size: "$reversedQuery",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$sort: {
|
||||
skipStops: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
$limit: 1,
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
code: 1,
|
||||
skipStops: 1,
|
||||
toc: 1,
|
||||
_id: 0,
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
export function getFullTiplocMatchPipeline(query: string[]) {
|
||||
return [
|
||||
{
|
||||
$match: {
|
||||
tiplocs: query,
|
||||
},
|
||||
},
|
||||
{
|
||||
$limit: 1,
|
||||
},
|
||||
{
|
||||
$addFields: {
|
||||
skipStops: 0,
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
code: 1,
|
||||
toc: 1,
|
||||
skipStops: 1,
|
||||
_id: 0,
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
@@ -111,7 +111,10 @@ function transformTrainServices(input: any): TrainServices[] {
|
||||
|
||||
function checkIsSupressed(service: TrainServices): string | undefined {
|
||||
logger.trace("utils/translators/ldb/staffStation.checkIsSupressed: Running");
|
||||
if (service.serviceIsSupressed === "true" || service.isPassengerService === "false") {
|
||||
if (
|
||||
service.serviceIsSupressed === "true" ||
|
||||
service.isPassengerService === "false"
|
||||
) {
|
||||
return "true";
|
||||
} else {
|
||||
return undefined;
|
||||
76
src/utils/processors/timetable/timetableProcessor.utils.ts
Normal file
76
src/utils/processors/timetable/timetableProcessor.utils.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import type {
|
||||
Service,
|
||||
OB_TrainTT_service,
|
||||
OB_Pis_SimpleObject,
|
||||
OB_TrainTT_stopDetail,
|
||||
Stop,
|
||||
} from "@owlboard/ts-types";
|
||||
import { logger } from "../../logger.utils";
|
||||
|
||||
export function formatTimetableDetail(
|
||||
service: Service,
|
||||
pis: OB_Pis_SimpleObject | null
|
||||
): OB_TrainTT_service {
|
||||
const formattedService: OB_TrainTT_service = {
|
||||
stpIndicator: service.stpIndicator,
|
||||
operator: service.operator,
|
||||
trainUid: service.trainUid,
|
||||
headcode: service.headcode,
|
||||
powerType: service.powerType,
|
||||
planSpeed: convertStringToNumber(service.planSpeed),
|
||||
scheduleStart: service.scheduleStartDate,
|
||||
scheduleEnd: service.scheduleEndDate,
|
||||
daysRun: service.daysRun,
|
||||
stops: formatStops(service.stops),
|
||||
vstp: service.vstp,
|
||||
};
|
||||
|
||||
if (pis) {
|
||||
formattedService.pis = pis;
|
||||
}
|
||||
|
||||
return formattedService;
|
||||
}
|
||||
|
||||
function formatStops(stops: Stop[]): OB_TrainTT_stopDetail[] {
|
||||
// Cleanly coerce Stop[] to OB_TrainTT_stopDetail[]
|
||||
const formattedStops: OB_TrainTT_stopDetail[] = [];
|
||||
|
||||
for (const stop of stops) {
|
||||
formattedStops.push(formatStopTimes(stop));
|
||||
}
|
||||
|
||||
return formattedStops;
|
||||
}
|
||||
|
||||
function formatStopTimes(stop: Stop): OB_TrainTT_stopDetail {
|
||||
// Cleanly converts a single stop to a stopdetail object
|
||||
let formattedStop: OB_TrainTT_stopDetail = {
|
||||
tiploc: stop.tiploc,
|
||||
isPublic: false,
|
||||
};
|
||||
if (stop.publicArrival) {
|
||||
formattedStop.publicArrival = stop.publicArrival;
|
||||
formattedStop.isPublic = true;
|
||||
}
|
||||
if (stop.publicDeparture) {
|
||||
formattedStop.publicDeparture = stop.publicDeparture;
|
||||
formattedStop.isPublic = true;
|
||||
}
|
||||
if (stop.wttArrival) {
|
||||
formattedStop.wttArrival = stop.wttArrival;
|
||||
}
|
||||
if (stop.wttDeparture) {
|
||||
formattedStop.wttDeparture = stop.wttDeparture;
|
||||
}
|
||||
return formattedStop;
|
||||
}
|
||||
|
||||
function convertStringToNumber(str: string): number {
|
||||
const number = parseFloat(str);
|
||||
if (isNaN(number)) {
|
||||
return 0;
|
||||
} else {
|
||||
return number;
|
||||
}
|
||||
}
|
||||
29
src/utils/trainService.utils.ts
Normal file
29
src/utils/trainService.utils.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
export function getFindByHeadcodePipeline(query: any) {
|
||||
return [
|
||||
{
|
||||
$match: query,
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
operator: 1,
|
||||
stops: {
|
||||
$concatArrays: [
|
||||
[{ $first: "$stops" }],
|
||||
[{ $arrayElemAt: ["$stops", -1] }],
|
||||
],
|
||||
},
|
||||
trainUid: 1,
|
||||
stpIndicator: 1,
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
export function getFindByTrainUidPipeline(query: any) {
|
||||
return [
|
||||
{
|
||||
$match: query,
|
||||
},
|
||||
{ $project: { _id: 0 } },
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user