@@ -8,41 +8,6 @@ import { DAY, HOUR } from '$lib/util/time';
8
8
import type { UnixtimeMs } from '$lib/util/UnixtimeMs' ;
9
9
10
10
export async function getCompanyCosts ( ) {
11
- const iterateIntervalArrays = < T , U > (
12
- arr1 : Interval [ ] ,
13
- arr2 : T [ ] ,
14
- toInterval : ( t : T ) => Interval ,
15
- onOverlap : ( idx1 : number , v2 : T , maps : Map < VehicleId , U > [ ] ) => void
16
- ) => {
17
- const maps = new Array < Map < VehicleId , U > > ( arr1 . length ) ;
18
- if ( arr1 . length === 0 || arr2 . length === 0 ) {
19
- return maps ;
20
- }
21
- let idx1 = 0 ;
22
- let idx2 = 0 ;
23
- let v1 = arr1 [ 0 ] ;
24
- let v2 = arr2 [ 0 ] ;
25
- let interval = toInterval ( v2 ) ;
26
- maps [ 0 ] = new Map < VehicleId , U > ( ) ;
27
- while ( idx1 < arr1 . length && idx2 < arr2 . length ) {
28
- if ( v1 . overlaps ( interval ) ) {
29
- onOverlap ( idx1 , v2 , maps ) ;
30
- }
31
- if ( v1 . endTime < interval . endTime ) {
32
- v1 = arr1 [ ++ idx1 ] ;
33
- if ( idx1 < arr1 . length ) {
34
- maps [ idx1 ] = new Map < VehicleId , U > ( ) ;
35
- }
36
- } else {
37
- v2 = arr2 [ ++ idx2 ] ;
38
- if ( idx2 < arr2 . length ) {
39
- interval = toInterval ( v2 ) ;
40
- }
41
- }
42
- }
43
- return maps ;
44
- } ;
45
-
46
11
const tours : ( TourWithRequests & { interval : Interval } ) [ ] = (
47
12
await getToursWithRequests ( false )
48
13
) . map ( ( t ) => {
@@ -71,6 +36,7 @@ export async function getCompanyCosts() {
71
36
. where ( 'availability.endTime' , '>=' , earliestTime )
72
37
. where ( 'availability.startTime' , '<=' , today )
73
38
. select ( [ 'availability.vehicle as vehicleId' , 'availability.startTime' , 'availability.endTime' ] )
39
+ . orderBy ( 'availability.endTime' , 'asc' )
74
40
. execute ( ) ;
75
41
76
42
// create an array of intervals representing the individual days in the two relevant years
@@ -89,53 +55,33 @@ export async function getCompanyCosts() {
89
55
availabilitiesPerVehicle . forEach ( ( availabilities , vehicle ) =>
90
56
availabilitiesPerVehicle . set ( vehicle , Interval . merge ( availabilities ) )
91
57
) ;
92
-
93
- // get list of all merged availabilities
94
- const allAvailabilities = Array . from ( availabilitiesPerVehicle ) . flatMap ( ( [ vehicleId , intervals ] ) =>
95
- intervals . map ( ( interval ) => ( { vehicleId, interval } ) )
96
- ) ;
97
-
98
- allAvailabilities . sort ( ( a1 , a2 ) => a1 . interval . startTime - a2 . interval . startTime ) ;
99
58
// cumulate the total duration of availability on every relevant day for each vehicle
100
- const availabilitiesPerDayAndVehicle = iterateIntervalArrays (
101
- days ,
102
- allAvailabilities ,
103
- ( a ) => a . interval ,
104
- (
105
- dayIdx : number ,
106
- availability : {
107
- vehicleId : number ;
108
- interval : Interval ;
109
- } ,
110
- maps : Map < VehicleId , number > [ ]
111
- ) =>
112
- maps [ dayIdx ] . set (
113
- availability . vehicleId ,
114
- ( maps [ dayIdx ] . get ( availability . vehicleId ) ?? 0 ) +
115
- ( days [ dayIdx ] . intersect ( availability . interval ) ?. getDurationMs ( ) ?? 0 )
116
- )
117
- ) ;
59
+ const availabilitiesPerDayAndVehicle = new Array < Map < number , number > > ( days . length ) ;
60
+ days . forEach ( ( day , dayIdx ) => {
61
+ availabilitiesPerDayAndVehicle [ dayIdx ] = new Map < number , number > ( ) ;
62
+ availabilitiesPerVehicle . forEach ( ( availabilities , vehicle ) => availabilities . forEach ( ( availability ) => {
63
+ if ( day . overlaps ( availability ) ) {
64
+ availabilitiesPerDayAndVehicle [ dayIdx ] . set ( vehicle , ( availabilitiesPerDayAndVehicle [ dayIdx ] . get ( vehicle ) ?? 0 ) + availability . getDurationMs ( ) ) ;
65
+ }
66
+ } ) ) ;
67
+ } ) ;
118
68
119
69
// cumulate the total taxameter readings on every relevant day for each vehicle
120
- const taxameterPerDayAndVehicle = iterateIntervalArrays (
121
- days ,
122
- tours ,
123
- ( t : TourWithRequests & { interval : Interval } ) => t . interval ,
124
- (
125
- idx1 ,
126
- v2 ,
127
- maps : Map < VehicleId , { taxameter : number ; customerCount : number ; timestamp : UnixtimeMs } > [ ]
128
- ) => {
129
- maps [ idx1 ] . set ( v2 . vehicleId , {
130
- taxameter : ( maps [ idx1 ] . get ( v2 . vehicleId ) ?. taxameter ?? 0 ) + ( v2 . fare ?? 0 ) ,
131
- customerCount :
132
- ( maps [ idx1 ] . get ( v2 . vehicleId ) ?. customerCount ?? 0 ) +
133
- v2 . requests . reduce ( ( acc , current ) => current . passengers + acc , 0 ) ,
134
- timestamp : v2 . startTime
135
- } ) ;
136
- }
137
- ) ;
138
-
70
+ const taxameterPerDayAndVehicle = new Array < Map < number , { taxameter : number ; customerCount : number ; timestamp : UnixtimeMs } > > ( days . length ) ;
71
+ days . forEach ( ( day , dayIdx ) => {
72
+ taxameterPerDayAndVehicle [ dayIdx ] = new Map < number , { taxameter : number ; customerCount : number ; timestamp : UnixtimeMs } >
73
+ tours . forEach ( ( tour ) => {
74
+ if ( day . overlaps ( tour . interval ) ) {
75
+ taxameterPerDayAndVehicle [ dayIdx ] . set ( tour . vehicleId , {
76
+ taxameter : ( taxameterPerDayAndVehicle [ dayIdx ] . get ( tour . vehicleId ) ?. taxameter ?? 0 ) + ( tour . fare ?? 0 ) ,
77
+ customerCount :
78
+ ( taxameterPerDayAndVehicle [ dayIdx ] . get ( tour . vehicleId ) ?. customerCount ?? 0 ) +
79
+ tour . requests . reduce ( ( acc , current ) => current . passengers + acc , 0 ) ,
80
+ timestamp : tour . startTime
81
+ } )
82
+ }
83
+ } )
84
+ } )
139
85
const costPerDayAndVehicle = new Array <
140
86
Map <
141
87
VehicleId ,
0 commit comments