1804 lines
74 KiB
Plaintext
1804 lines
74 KiB
Plaintext
/*
|
|
* driver-working-time-derived-projections.epl
|
|
*
|
|
* Source-neutral driver working-time derived projection rules over canonical driver activity,
|
|
* vehicle-usage, and support-evidence interval streams. Tachograph is only one source
|
|
* that can produce these canonical input streams.
|
|
*/
|
|
|
|
create schema SignificantDrivingInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
firstSourceIntervalId string,
|
|
lastSourceIntervalId string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
registrationKey string,
|
|
vehicleKey string
|
|
);
|
|
|
|
create schema DrivingInterruptionInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string
|
|
);
|
|
|
|
create schema DrivingInterruptionVehicleChangeInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string
|
|
);
|
|
|
|
create schema DrivingInterruptionVehicleNotChangedInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateCoverageUnknownResolvedInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
cardAbsentDurationSeconds long,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateCoverageCardResolvedInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
cardAbsentDurationSeconds long,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateCoverageInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
cardAbsentDurationSeconds long,
|
|
cardAbsentCoveragePercent double,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string,
|
|
beginBoundaryOdometerKm java.lang.Long,
|
|
endBoundaryOdometerKm java.lang.Long,
|
|
beginGeoEventId string,
|
|
beginGeoEventDomain string,
|
|
beginGeoOccurredAtEpochSecond java.lang.Long,
|
|
beginLatitude java.lang.Double,
|
|
beginLongitude java.lang.Double,
|
|
beginGeoDistanceSeconds java.lang.Long,
|
|
beginGeoOdometerKm java.lang.Long,
|
|
endGeoEventId string,
|
|
endGeoEventDomain string,
|
|
endGeoOccurredAtEpochSecond java.lang.Long,
|
|
endLatitude java.lang.Double,
|
|
endLongitude java.lang.Double,
|
|
endGeoDistanceSeconds java.lang.Long,
|
|
endGeoOdometerKm java.lang.Long,
|
|
geoEvidenceMovementMeters java.lang.Long,
|
|
geoEvidenceMovementCategory string
|
|
);
|
|
|
|
create schema SupportGeoEvidence(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
eventId string,
|
|
eventDomain string,
|
|
occurredAtEpochSecond long,
|
|
registrationKey string,
|
|
vehicleKey string,
|
|
latitude java.lang.Double,
|
|
longitude java.lang.Double,
|
|
odometerKm java.lang.Long,
|
|
priority int
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateBeginGeoEvidenceCandidate(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
boundaryOdometerKm java.lang.Long,
|
|
eventId string,
|
|
eventDomain string,
|
|
occurredAtEpochSecond long,
|
|
latitude java.lang.Double,
|
|
longitude java.lang.Double,
|
|
odometerKm java.lang.Long,
|
|
odometerDeltaKm java.lang.Long,
|
|
distanceSeconds long,
|
|
rankScore long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateBeginGeoEvidenceBestScore(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
bestRankScore long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateBeginGeoEvidenceResolved(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
eventId string,
|
|
eventDomain string,
|
|
occurredAtEpochSecond long,
|
|
latitude java.lang.Double,
|
|
longitude java.lang.Double,
|
|
odometerKm java.lang.Long,
|
|
distanceSeconds long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateEndGeoEvidenceCandidate(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
boundaryOdometerKm java.lang.Long,
|
|
eventId string,
|
|
eventDomain string,
|
|
occurredAtEpochSecond long,
|
|
latitude java.lang.Double,
|
|
longitude java.lang.Double,
|
|
odometerKm java.lang.Long,
|
|
odometerDeltaKm java.lang.Long,
|
|
distanceSeconds long,
|
|
rankScore long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateBeginBoundaryOdometerCandidate(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
odometerKm java.lang.Long,
|
|
distanceSeconds long,
|
|
rankScore long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateBeginBoundaryOdometerBestScore(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
bestRankScore long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateBeginBoundaryOdometerResolved(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
odometerKm java.lang.Long,
|
|
distanceSeconds long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateEndBoundaryOdometerCandidate(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
odometerKm java.lang.Long,
|
|
distanceSeconds long,
|
|
rankScore long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateEndBoundaryOdometerBestScore(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
bestRankScore long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateEndBoundaryOdometerResolved(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
odometerKm java.lang.Long,
|
|
distanceSeconds long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateEndGeoEvidenceBestScore(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
bestRankScore long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateEndGeoEvidenceResolved(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
eventId string,
|
|
eventDomain string,
|
|
occurredAtEpochSecond long,
|
|
latitude java.lang.Double,
|
|
longitude java.lang.Double,
|
|
odometerKm java.lang.Long,
|
|
distanceSeconds long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateCoverageFinalizationRequest(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long
|
|
);
|
|
|
|
create schema DailyWeeklyRestCandidateCoverageEmittedKey(
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long
|
|
);
|
|
|
|
@public create context PerDriver partition by driverKey from TachographVehicleUsageIntervalInputEvent;
|
|
|
|
@public create window TachographVehicleUsageIntervalInputWindow#keepall as TachographVehicleUsageIntervalInputEvent;
|
|
|
|
insert into TachographVehicleUsageIntervalInputWindow
|
|
select *
|
|
from TachographVehicleUsageIntervalInputEvent;
|
|
|
|
create schema VuCardAbsentInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
previousUsageIntervalId string,
|
|
nextUsageIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string
|
|
);
|
|
|
|
@public create window VuCardAbsentIntervalWindow#keepall as VuCardAbsentInterval;
|
|
|
|
create schema PotentialHomeOvernightStayInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
cardAbsentDurationSeconds long,
|
|
cardAbsentCoveragePercent double,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string,
|
|
beginBoundaryOdometerKm java.lang.Long,
|
|
endBoundaryOdometerKm java.lang.Long,
|
|
beginGeoEventId string,
|
|
beginGeoEventDomain string,
|
|
beginGeoOccurredAtEpochSecond java.lang.Long,
|
|
beginLatitude java.lang.Double,
|
|
beginLongitude java.lang.Double,
|
|
beginGeoDistanceSeconds java.lang.Long,
|
|
beginGeoOdometerKm java.lang.Long,
|
|
endGeoEventId string,
|
|
endGeoEventDomain string,
|
|
endGeoOccurredAtEpochSecond java.lang.Long,
|
|
endLatitude java.lang.Double,
|
|
endLongitude java.lang.Double,
|
|
endGeoDistanceSeconds java.lang.Long,
|
|
endGeoOdometerKm java.lang.Long,
|
|
geoEvidenceMovementMeters java.lang.Long,
|
|
geoEvidenceMovementCategory string
|
|
);
|
|
|
|
create schema PotentialInVehicleOvernightStayInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
cardAbsentDurationSeconds long,
|
|
cardAbsentCoveragePercent double,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string,
|
|
beginBoundaryOdometerKm java.lang.Long,
|
|
endBoundaryOdometerKm java.lang.Long,
|
|
beginGeoEventId string,
|
|
beginGeoEventDomain string,
|
|
beginGeoOccurredAtEpochSecond java.lang.Long,
|
|
beginLatitude java.lang.Double,
|
|
beginLongitude java.lang.Double,
|
|
beginGeoDistanceSeconds java.lang.Long,
|
|
beginGeoOdometerKm java.lang.Long,
|
|
endGeoEventId string,
|
|
endGeoEventDomain string,
|
|
endGeoOccurredAtEpochSecond java.lang.Long,
|
|
endLatitude java.lang.Double,
|
|
endLongitude java.lang.Double,
|
|
endGeoDistanceSeconds java.lang.Long,
|
|
endGeoOdometerKm java.lang.Long,
|
|
geoEvidenceMovementMeters java.lang.Long,
|
|
geoEvidenceMovementCategory string
|
|
);
|
|
|
|
create schema UnclassifiedDailyWeeklyRestCandidateCoverageInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
cardAbsentDurationSeconds long,
|
|
cardAbsentCoveragePercent double,
|
|
previousDrivingSourceIntervalId string,
|
|
nextDrivingSourceIntervalId string,
|
|
previousRegistrationKey string,
|
|
nextRegistrationKey string,
|
|
previousVehicleKey string,
|
|
nextVehicleKey string,
|
|
beginBoundaryOdometerKm java.lang.Long,
|
|
endBoundaryOdometerKm java.lang.Long,
|
|
beginGeoEventId string,
|
|
beginGeoEventDomain string,
|
|
beginGeoOccurredAtEpochSecond java.lang.Long,
|
|
beginLatitude java.lang.Double,
|
|
beginLongitude java.lang.Double,
|
|
beginGeoDistanceSeconds java.lang.Long,
|
|
beginGeoOdometerKm java.lang.Long,
|
|
endGeoEventId string,
|
|
endGeoEventDomain string,
|
|
endGeoOccurredAtEpochSecond java.lang.Long,
|
|
endLatitude java.lang.Double,
|
|
endLongitude java.lang.Double,
|
|
endGeoDistanceSeconds java.lang.Long,
|
|
endGeoOdometerKm java.lang.Long,
|
|
geoEvidenceMovementMeters java.lang.Long,
|
|
geoEvidenceMovementCategory string
|
|
);
|
|
|
|
create schema PotentialInVehicleTripState(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
tripStartedAtEpochSecond long,
|
|
registrationKey string,
|
|
vehicleKey string,
|
|
containedPotentialInVehicleOvernightStayIntervalCount int,
|
|
containedPotentialInVehicleOvernightStayDurationSeconds long,
|
|
containedCardAbsentDurationSeconds long,
|
|
firstPotentialInVehicleOvernightStayStartedAtEpochSecond long,
|
|
lastPotentialInVehicleOvernightStayEndedAtEpochSecond long,
|
|
firstPreviousDrivingSourceIntervalId string,
|
|
lastNextDrivingSourceIntervalId string
|
|
);
|
|
|
|
create schema PotentialInVehicleTripInterval(
|
|
sessionId java.util.UUID,
|
|
driverKey string,
|
|
startedAtEpochSecond long,
|
|
endedAtEpochSecond long,
|
|
durationSeconds long,
|
|
registrationKey string,
|
|
vehicleKey string,
|
|
containedPotentialInVehicleOvernightStayIntervalCount int,
|
|
containedPotentialInVehicleOvernightStayDurationSeconds long,
|
|
containedCardAbsentDurationSeconds long,
|
|
firstPotentialInVehicleOvernightStayStartedAtEpochSecond long,
|
|
lastPotentialInVehicleOvernightStayEndedAtEpochSecond long,
|
|
firstPreviousDrivingSourceIntervalId string,
|
|
lastNextDrivingSourceIntervalId string
|
|
);
|
|
|
|
@public create window PreviousRestCandidateCoverageInterval#unique(driverKey) as DailyWeeklyRestCandidateCoverageInterval;
|
|
|
|
@public create window OpenPotentialInVehicleTripState#unique(driverKey) as PotentialInVehicleTripState;
|
|
|
|
@public create window SupportGeoEvidenceWindow#keepall as SupportGeoEvidence;
|
|
|
|
@public create window DailyWeeklyRestCandidateBeginGeoEvidenceCandidateWindow#keepall as DailyWeeklyRestCandidateBeginGeoEvidenceCandidate;
|
|
@public create window DailyWeeklyRestCandidateBeginGeoEvidenceBestScoreWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateBeginGeoEvidenceBestScore;
|
|
@public create window DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateBeginGeoEvidenceResolved;
|
|
|
|
@public create window DailyWeeklyRestCandidateEndGeoEvidenceCandidateWindow#keepall as DailyWeeklyRestCandidateEndGeoEvidenceCandidate;
|
|
@public create window DailyWeeklyRestCandidateEndGeoEvidenceBestScoreWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateEndGeoEvidenceBestScore;
|
|
@public create window DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateEndGeoEvidenceResolved;
|
|
@public create window DailyWeeklyRestCandidateBeginBoundaryOdometerCandidateWindow#keepall as DailyWeeklyRestCandidateBeginBoundaryOdometerCandidate;
|
|
@public create window DailyWeeklyRestCandidateBeginBoundaryOdometerBestScoreWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateBeginBoundaryOdometerBestScore;
|
|
@public create window DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateBeginBoundaryOdometerResolved;
|
|
@public create window DailyWeeklyRestCandidateEndBoundaryOdometerCandidateWindow#keepall as DailyWeeklyRestCandidateEndBoundaryOdometerCandidate;
|
|
@public create window DailyWeeklyRestCandidateEndBoundaryOdometerBestScoreWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateEndBoundaryOdometerBestScore;
|
|
@public create window DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateEndBoundaryOdometerResolved;
|
|
@public create window DailyWeeklyRestCandidateCoverageCardResolvedIntervalWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateCoverageCardResolvedInterval;
|
|
@public create window DailyWeeklyRestCandidateCoverageEmittedKeyWindow#unique(driverKey, startedAtEpochSecond, endedAtEpochSecond) as DailyWeeklyRestCandidateCoverageEmittedKey;
|
|
|
|
insert into SupportGeoEvidenceWindow
|
|
select
|
|
sessionId,
|
|
driverKey,
|
|
eventId,
|
|
eventDomain,
|
|
occurredAtEpochSecond,
|
|
registrationKey,
|
|
vehicleKey,
|
|
latitude,
|
|
longitude,
|
|
odometerKm,
|
|
priority
|
|
from TachographSupportGeoEvidenceInputEvent;
|
|
|
|
insert into SignificantDrivingInterval
|
|
select
|
|
sessionId,
|
|
driverKey,
|
|
firstSourceIntervalId,
|
|
lastSourceIntervalId,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond,
|
|
durationSeconds,
|
|
registrationKey,
|
|
vehicleKey
|
|
from TachographActivityIntervalInputEvent(activityType = 'DRIVE', durationSeconds > ${SIGNIFICANT_DRIVING_THRESHOLD_SECONDS});
|
|
|
|
@public create window PreviousSignificantDrivingInterval#unique(driverKey) as SignificantDrivingInterval;
|
|
|
|
on SignificantDrivingInterval as next
|
|
insert into DrivingInterruptionInterval
|
|
select
|
|
priorInterval.sessionId as sessionId,
|
|
priorInterval.driverKey as driverKey,
|
|
priorInterval.endedAtEpochSecond as startedAtEpochSecond,
|
|
next.startedAtEpochSecond as endedAtEpochSecond,
|
|
next.startedAtEpochSecond - priorInterval.endedAtEpochSecond as durationSeconds,
|
|
priorInterval.lastSourceIntervalId as previousDrivingSourceIntervalId,
|
|
next.firstSourceIntervalId as nextDrivingSourceIntervalId,
|
|
priorInterval.registrationKey as previousRegistrationKey,
|
|
next.registrationKey as nextRegistrationKey,
|
|
priorInterval.vehicleKey as previousVehicleKey,
|
|
next.vehicleKey as nextVehicleKey
|
|
from PreviousSignificantDrivingInterval as priorInterval
|
|
where priorInterval.driverKey = next.driverKey
|
|
and next.startedAtEpochSecond > priorInterval.endedAtEpochSecond;
|
|
|
|
@Priority(20)
|
|
on SignificantDrivingInterval
|
|
delete from PreviousSignificantDrivingInterval;
|
|
|
|
@Priority(10)
|
|
on SignificantDrivingInterval as current
|
|
insert into PreviousSignificantDrivingInterval
|
|
select *;
|
|
|
|
insert into DailyWeeklyRestCandidateInterval
|
|
select *
|
|
from DrivingInterruptionInterval(durationSeconds > ${MINIMUM_REST_PERIOD_THRESHOLD_SECONDS});
|
|
|
|
insert into DrivingInterruptionVehicleChangeInterval
|
|
select *
|
|
from DailyWeeklyRestCandidateInterval(
|
|
previousRegistrationKey is not null,
|
|
nextRegistrationKey is not null,
|
|
previousRegistrationKey != nextRegistrationKey
|
|
);
|
|
|
|
insert into DrivingInterruptionVehicleNotChangedInterval
|
|
select *
|
|
from DailyWeeklyRestCandidateInterval(
|
|
previousRegistrationKey is not null,
|
|
nextRegistrationKey is not null,
|
|
previousRegistrationKey = nextRegistrationKey
|
|
);
|
|
|
|
insert into DailyWeeklyRestCandidateCoverageUnknownResolvedInterval
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.durationSeconds as durationSeconds,
|
|
sum(
|
|
case
|
|
when u.startedAtEpochSecond <= c.startedAtEpochSecond and u.endedAtEpochSecond >= c.endedAtEpochSecond
|
|
then c.durationSeconds
|
|
when u.startedAtEpochSecond <= c.startedAtEpochSecond
|
|
then u.endedAtEpochSecond - c.startedAtEpochSecond
|
|
when u.endedAtEpochSecond >= c.endedAtEpochSecond
|
|
then c.endedAtEpochSecond - u.startedAtEpochSecond
|
|
else u.endedAtEpochSecond - u.startedAtEpochSecond
|
|
end
|
|
) as cardAbsentDurationSeconds,
|
|
c.previousDrivingSourceIntervalId as previousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as nextDrivingSourceIntervalId,
|
|
c.previousRegistrationKey as previousRegistrationKey,
|
|
c.nextRegistrationKey as nextRegistrationKey,
|
|
c.previousVehicleKey as previousVehicleKey,
|
|
c.nextVehicleKey as nextVehicleKey
|
|
from DailyWeeklyRestCandidateInterval as c unidirectional,
|
|
VuCardAbsentIntervalWindow as u
|
|
where u.driverKey = c.driverKey
|
|
and u.startedAtEpochSecond < c.endedAtEpochSecond
|
|
and u.endedAtEpochSecond > c.startedAtEpochSecond
|
|
group by
|
|
c.sessionId,
|
|
c.driverKey,
|
|
c.startedAtEpochSecond,
|
|
c.endedAtEpochSecond,
|
|
c.durationSeconds,
|
|
c.previousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId,
|
|
c.previousRegistrationKey,
|
|
c.nextRegistrationKey,
|
|
c.previousVehicleKey,
|
|
c.nextVehicleKey;
|
|
|
|
insert into DailyWeeklyRestCandidateCoverageUnknownResolvedInterval
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.durationSeconds as durationSeconds,
|
|
0L as cardAbsentDurationSeconds,
|
|
c.previousDrivingSourceIntervalId as previousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as nextDrivingSourceIntervalId,
|
|
c.previousRegistrationKey as previousRegistrationKey,
|
|
c.nextRegistrationKey as nextRegistrationKey,
|
|
c.previousVehicleKey as previousVehicleKey,
|
|
c.nextVehicleKey as nextVehicleKey
|
|
from DailyWeeklyRestCandidateInterval as c
|
|
where not exists (
|
|
select * from VuCardAbsentIntervalWindow as u
|
|
where u.driverKey = c.driverKey
|
|
and u.startedAtEpochSecond < c.endedAtEpochSecond
|
|
and u.endedAtEpochSecond > c.startedAtEpochSecond
|
|
);
|
|
|
|
insert into DailyWeeklyRestCandidateCoverageCardResolvedInterval
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.durationSeconds as durationSeconds,
|
|
c.cardAbsentDurationSeconds as cardAbsentDurationSeconds,
|
|
c.previousDrivingSourceIntervalId as previousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as nextDrivingSourceIntervalId,
|
|
c.previousRegistrationKey as previousRegistrationKey,
|
|
c.nextRegistrationKey as nextRegistrationKey,
|
|
c.previousVehicleKey as previousVehicleKey,
|
|
c.nextVehicleKey as nextVehicleKey
|
|
from DailyWeeklyRestCandidateCoverageUnknownResolvedInterval as c;
|
|
|
|
insert into DailyWeeklyRestCandidateCoverageCardResolvedIntervalWindow
|
|
select *
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedInterval;
|
|
|
|
@Priority(50)
|
|
insert into DailyWeeklyRestCandidateBeginBoundaryOdometerCandidateWindow
|
|
select
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
v.odometerBeginKm as odometerKm,
|
|
case
|
|
when v.startedAtEpochSecond >= c.startedAtEpochSecond
|
|
then v.startedAtEpochSecond - c.startedAtEpochSecond
|
|
else c.startedAtEpochSecond - v.startedAtEpochSecond
|
|
end as distanceSeconds,
|
|
(
|
|
(
|
|
case
|
|
when v.startedAtEpochSecond >= c.startedAtEpochSecond
|
|
then v.startedAtEpochSecond - c.startedAtEpochSecond
|
|
else c.startedAtEpochSecond - v.startedAtEpochSecond
|
|
end
|
|
) * 10000L
|
|
) + (
|
|
case
|
|
when v.startedAtEpochSecond >= c.startedAtEpochSecond
|
|
then 0L
|
|
else 1000L
|
|
end
|
|
) as rankScore
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedInterval as c unidirectional,
|
|
TachographVehicleUsageIntervalInputWindow as v
|
|
where v.driverKey = c.driverKey
|
|
and v.odometerBeginKm is not null
|
|
and v.startedAtEpochSecond >= c.startedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and v.startedAtEpochSecond <= c.startedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.previousVehicleKey is not null
|
|
and v.vehicleKey is not null
|
|
and c.previousVehicleKey = v.vehicleKey
|
|
)
|
|
or (
|
|
(c.previousVehicleKey is null or v.vehicleKey is null)
|
|
and c.previousRegistrationKey is not null
|
|
and v.registrationKey is not null
|
|
and c.previousRegistrationKey = v.registrationKey
|
|
)
|
|
);
|
|
|
|
@Priority(50)
|
|
insert into DailyWeeklyRestCandidateBeginBoundaryOdometerCandidateWindow
|
|
select
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
v.odometerEndKm as odometerKm,
|
|
case
|
|
when v.endedAtEpochSecond >= c.startedAtEpochSecond
|
|
then v.endedAtEpochSecond - c.startedAtEpochSecond
|
|
else c.startedAtEpochSecond - v.endedAtEpochSecond
|
|
end as distanceSeconds,
|
|
(
|
|
(
|
|
case
|
|
when v.endedAtEpochSecond >= c.startedAtEpochSecond
|
|
then v.endedAtEpochSecond - c.startedAtEpochSecond
|
|
else c.startedAtEpochSecond - v.endedAtEpochSecond
|
|
end
|
|
) * 10000L
|
|
) + (
|
|
case
|
|
when v.endedAtEpochSecond >= c.startedAtEpochSecond
|
|
then 0L
|
|
else 1000L
|
|
end
|
|
) as rankScore
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedInterval as c unidirectional,
|
|
TachographVehicleUsageIntervalInputWindow as v
|
|
where v.driverKey = c.driverKey
|
|
and v.endedAtEpochSecond is not null
|
|
and v.odometerEndKm is not null
|
|
and v.endedAtEpochSecond >= c.startedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and v.endedAtEpochSecond <= c.startedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.previousVehicleKey is not null
|
|
and v.vehicleKey is not null
|
|
and c.previousVehicleKey = v.vehicleKey
|
|
)
|
|
or (
|
|
(c.previousVehicleKey is null or v.vehicleKey is null)
|
|
and c.previousRegistrationKey is not null
|
|
and v.registrationKey is not null
|
|
and c.previousRegistrationKey = v.registrationKey
|
|
)
|
|
);
|
|
|
|
@Priority(45)
|
|
insert into DailyWeeklyRestCandidateBeginBoundaryOdometerBestScoreWindow
|
|
select
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond,
|
|
min(rankScore) as bestRankScore
|
|
from DailyWeeklyRestCandidateBeginBoundaryOdometerCandidateWindow
|
|
group by
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond;
|
|
|
|
@Priority(40)
|
|
insert into DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow
|
|
select
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.odometerKm as odometerKm,
|
|
c.distanceSeconds as distanceSeconds
|
|
from DailyWeeklyRestCandidateBeginBoundaryOdometerCandidateWindow as c,
|
|
DailyWeeklyRestCandidateBeginBoundaryOdometerBestScoreWindow as best
|
|
where c.driverKey = best.driverKey
|
|
and c.startedAtEpochSecond = best.startedAtEpochSecond
|
|
and c.endedAtEpochSecond = best.endedAtEpochSecond
|
|
and c.rankScore = best.bestRankScore;
|
|
|
|
@Priority(50)
|
|
insert into DailyWeeklyRestCandidateEndBoundaryOdometerCandidateWindow
|
|
select
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
v.odometerBeginKm as odometerKm,
|
|
case
|
|
when v.startedAtEpochSecond >= c.endedAtEpochSecond
|
|
then v.startedAtEpochSecond - c.endedAtEpochSecond
|
|
else c.endedAtEpochSecond - v.startedAtEpochSecond
|
|
end as distanceSeconds,
|
|
(
|
|
(
|
|
case
|
|
when v.startedAtEpochSecond >= c.endedAtEpochSecond
|
|
then v.startedAtEpochSecond - c.endedAtEpochSecond
|
|
else c.endedAtEpochSecond - v.startedAtEpochSecond
|
|
end
|
|
) * 10000L
|
|
) + (
|
|
case
|
|
when v.startedAtEpochSecond <= c.endedAtEpochSecond
|
|
then 0L
|
|
else 1000L
|
|
end
|
|
) as rankScore
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedInterval as c unidirectional,
|
|
TachographVehicleUsageIntervalInputWindow as v
|
|
where v.driverKey = c.driverKey
|
|
and v.odometerBeginKm is not null
|
|
and v.startedAtEpochSecond >= c.endedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and v.startedAtEpochSecond <= c.endedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.nextVehicleKey is not null
|
|
and v.vehicleKey is not null
|
|
and c.nextVehicleKey = v.vehicleKey
|
|
)
|
|
or (
|
|
(c.nextVehicleKey is null or v.vehicleKey is null)
|
|
and c.nextRegistrationKey is not null
|
|
and v.registrationKey is not null
|
|
and c.nextRegistrationKey = v.registrationKey
|
|
)
|
|
);
|
|
|
|
@Priority(50)
|
|
insert into DailyWeeklyRestCandidateEndBoundaryOdometerCandidateWindow
|
|
select
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
v.odometerEndKm as odometerKm,
|
|
case
|
|
when v.endedAtEpochSecond >= c.endedAtEpochSecond
|
|
then v.endedAtEpochSecond - c.endedAtEpochSecond
|
|
else c.endedAtEpochSecond - v.endedAtEpochSecond
|
|
end as distanceSeconds,
|
|
(
|
|
(
|
|
case
|
|
when v.endedAtEpochSecond >= c.endedAtEpochSecond
|
|
then v.endedAtEpochSecond - c.endedAtEpochSecond
|
|
else c.endedAtEpochSecond - v.endedAtEpochSecond
|
|
end
|
|
) * 10000L
|
|
) + (
|
|
case
|
|
when v.endedAtEpochSecond <= c.endedAtEpochSecond
|
|
then 0L
|
|
else 1000L
|
|
end
|
|
) as rankScore
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedInterval as c unidirectional,
|
|
TachographVehicleUsageIntervalInputWindow as v
|
|
where v.driverKey = c.driverKey
|
|
and v.endedAtEpochSecond is not null
|
|
and v.odometerEndKm is not null
|
|
and v.endedAtEpochSecond >= c.endedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and v.endedAtEpochSecond <= c.endedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.nextVehicleKey is not null
|
|
and v.vehicleKey is not null
|
|
and c.nextVehicleKey = v.vehicleKey
|
|
)
|
|
or (
|
|
(c.nextVehicleKey is null or v.vehicleKey is null)
|
|
and c.nextRegistrationKey is not null
|
|
and v.registrationKey is not null
|
|
and c.nextRegistrationKey = v.registrationKey
|
|
)
|
|
);
|
|
|
|
@Priority(45)
|
|
insert into DailyWeeklyRestCandidateEndBoundaryOdometerBestScoreWindow
|
|
select
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond,
|
|
min(rankScore) as bestRankScore
|
|
from DailyWeeklyRestCandidateEndBoundaryOdometerCandidateWindow
|
|
group by
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond;
|
|
|
|
@Priority(40)
|
|
insert into DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow
|
|
select
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.odometerKm as odometerKm,
|
|
c.distanceSeconds as distanceSeconds
|
|
from DailyWeeklyRestCandidateEndBoundaryOdometerCandidateWindow as c,
|
|
DailyWeeklyRestCandidateEndBoundaryOdometerBestScoreWindow as best
|
|
where c.driverKey = best.driverKey
|
|
and c.startedAtEpochSecond = best.startedAtEpochSecond
|
|
and c.endedAtEpochSecond = best.endedAtEpochSecond
|
|
and c.rankScore = best.bestRankScore;
|
|
|
|
@Priority(40)
|
|
insert into DailyWeeklyRestCandidateBeginGeoEvidenceCandidateWindow
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond) as boundaryOdometerKm,
|
|
g.eventId as eventId,
|
|
g.eventDomain as eventDomain,
|
|
g.occurredAtEpochSecond as occurredAtEpochSecond,
|
|
g.latitude as latitude,
|
|
g.longitude as longitude,
|
|
g.odometerKm as odometerKm,
|
|
case
|
|
when (
|
|
select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
) is null
|
|
or g.odometerKm is null
|
|
then null
|
|
when g.odometerKm >= (
|
|
select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
)
|
|
then g.odometerKm - (
|
|
select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
)
|
|
else (
|
|
select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
) - g.odometerKm
|
|
end as odometerDeltaKm,
|
|
case
|
|
when g.occurredAtEpochSecond >= c.startedAtEpochSecond
|
|
then g.occurredAtEpochSecond - c.startedAtEpochSecond
|
|
else c.startedAtEpochSecond - g.occurredAtEpochSecond
|
|
end as distanceSeconds,
|
|
(
|
|
(
|
|
case
|
|
when g.occurredAtEpochSecond >= c.startedAtEpochSecond
|
|
then g.occurredAtEpochSecond - c.startedAtEpochSecond
|
|
else c.startedAtEpochSecond - g.occurredAtEpochSecond
|
|
end
|
|
) * 10000L
|
|
) + (
|
|
case
|
|
when (
|
|
select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
) is not null
|
|
and g.odometerKm is not null
|
|
then (
|
|
case
|
|
when g.odometerKm >= (
|
|
select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
)
|
|
then g.odometerKm - (
|
|
select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
)
|
|
else (
|
|
select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
) - g.odometerKm
|
|
end
|
|
) * 10L
|
|
else 9990L
|
|
end
|
|
) + (
|
|
case
|
|
when g.occurredAtEpochSecond >= c.startedAtEpochSecond
|
|
then 0L
|
|
else 1000L
|
|
end
|
|
) + (1000L - g.priority) as rankScore
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedInterval as c unidirectional,
|
|
SupportGeoEvidenceWindow as g
|
|
where g.driverKey = c.driverKey
|
|
and g.occurredAtEpochSecond >= c.startedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and g.occurredAtEpochSecond <= c.startedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.previousVehicleKey is not null
|
|
and g.vehicleKey is not null
|
|
and c.previousVehicleKey = g.vehicleKey
|
|
)
|
|
or (
|
|
(c.previousVehicleKey is null or g.vehicleKey is null)
|
|
and c.previousRegistrationKey is not null
|
|
and g.registrationKey is not null
|
|
and c.previousRegistrationKey = g.registrationKey
|
|
)
|
|
);
|
|
|
|
@Priority(35)
|
|
insert into DailyWeeklyRestCandidateBeginGeoEvidenceBestScoreWindow
|
|
select
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond,
|
|
min(rankScore) as bestRankScore
|
|
from DailyWeeklyRestCandidateBeginGeoEvidenceCandidateWindow
|
|
group by
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond;
|
|
|
|
@Priority(30)
|
|
insert into DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.eventId as eventId,
|
|
c.eventDomain as eventDomain,
|
|
c.occurredAtEpochSecond as occurredAtEpochSecond,
|
|
c.latitude as latitude,
|
|
c.longitude as longitude,
|
|
c.odometerKm as odometerKm,
|
|
c.distanceSeconds as distanceSeconds
|
|
from DailyWeeklyRestCandidateBeginGeoEvidenceCandidateWindow as c,
|
|
DailyWeeklyRestCandidateBeginGeoEvidenceBestScoreWindow as best
|
|
where c.driverKey = best.driverKey
|
|
and c.startedAtEpochSecond = best.startedAtEpochSecond
|
|
and c.endedAtEpochSecond = best.endedAtEpochSecond
|
|
and c.rankScore = best.bestRankScore;
|
|
|
|
@Priority(40)
|
|
insert into DailyWeeklyRestCandidateEndGeoEvidenceCandidateWindow
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
(select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond) as boundaryOdometerKm,
|
|
g.eventId as eventId,
|
|
g.eventDomain as eventDomain,
|
|
g.occurredAtEpochSecond as occurredAtEpochSecond,
|
|
g.latitude as latitude,
|
|
g.longitude as longitude,
|
|
g.odometerKm as odometerKm,
|
|
case
|
|
when (
|
|
select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
) is null
|
|
or g.odometerKm is null
|
|
then null
|
|
when g.odometerKm >= (
|
|
select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
)
|
|
then g.odometerKm - (
|
|
select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
)
|
|
else (
|
|
select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
) - g.odometerKm
|
|
end as odometerDeltaKm,
|
|
case
|
|
when g.occurredAtEpochSecond >= c.endedAtEpochSecond
|
|
then g.occurredAtEpochSecond - c.endedAtEpochSecond
|
|
else c.endedAtEpochSecond - g.occurredAtEpochSecond
|
|
end as distanceSeconds,
|
|
(
|
|
(
|
|
case
|
|
when g.occurredAtEpochSecond >= c.endedAtEpochSecond
|
|
then g.occurredAtEpochSecond - c.endedAtEpochSecond
|
|
else c.endedAtEpochSecond - g.occurredAtEpochSecond
|
|
end
|
|
) * 10000L
|
|
) + (
|
|
case
|
|
when (
|
|
select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
) is not null
|
|
and g.odometerKm is not null
|
|
then (
|
|
case
|
|
when g.odometerKm >= (
|
|
select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
)
|
|
then g.odometerKm - (
|
|
select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
)
|
|
else (
|
|
select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as boundary
|
|
where boundary.driverKey = c.driverKey
|
|
and boundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and boundary.endedAtEpochSecond = c.endedAtEpochSecond
|
|
) - g.odometerKm
|
|
end
|
|
) * 10L
|
|
else 9990L
|
|
end
|
|
) + (
|
|
case
|
|
when g.occurredAtEpochSecond <= c.endedAtEpochSecond
|
|
then 0L
|
|
else 1000L
|
|
end
|
|
) + (1000L - g.priority) as rankScore
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedInterval as c unidirectional,
|
|
SupportGeoEvidenceWindow as g
|
|
where g.driverKey = c.driverKey
|
|
and g.occurredAtEpochSecond >= c.endedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and g.occurredAtEpochSecond <= c.endedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.nextVehicleKey is not null
|
|
and g.vehicleKey is not null
|
|
and c.nextVehicleKey = g.vehicleKey
|
|
)
|
|
or (
|
|
(c.nextVehicleKey is null or g.vehicleKey is null)
|
|
and c.nextRegistrationKey is not null
|
|
and g.registrationKey is not null
|
|
and c.nextRegistrationKey = g.registrationKey
|
|
)
|
|
);
|
|
|
|
@Priority(35)
|
|
insert into DailyWeeklyRestCandidateEndGeoEvidenceBestScoreWindow
|
|
select
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond,
|
|
min(rankScore) as bestRankScore
|
|
from DailyWeeklyRestCandidateEndGeoEvidenceCandidateWindow
|
|
group by
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond;
|
|
|
|
@Priority(30)
|
|
insert into DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.eventId as eventId,
|
|
c.eventDomain as eventDomain,
|
|
c.occurredAtEpochSecond as occurredAtEpochSecond,
|
|
c.latitude as latitude,
|
|
c.longitude as longitude,
|
|
c.odometerKm as odometerKm,
|
|
c.distanceSeconds as distanceSeconds
|
|
from DailyWeeklyRestCandidateEndGeoEvidenceCandidateWindow as c,
|
|
DailyWeeklyRestCandidateEndGeoEvidenceBestScoreWindow as best
|
|
where c.driverKey = best.driverKey
|
|
and c.startedAtEpochSecond = best.startedAtEpochSecond
|
|
and c.endedAtEpochSecond = best.endedAtEpochSecond
|
|
and c.rankScore = best.bestRankScore;
|
|
|
|
@Priority(20)
|
|
insert into DailyWeeklyRestCandidateCoverageFinalizationRequest
|
|
select
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedInterval as c
|
|
where not exists (
|
|
select * from SupportGeoEvidenceWindow as g
|
|
where g.driverKey = c.driverKey
|
|
and g.occurredAtEpochSecond >= c.startedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and g.occurredAtEpochSecond <= c.startedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.previousVehicleKey is not null
|
|
and g.vehicleKey is not null
|
|
and c.previousVehicleKey = g.vehicleKey
|
|
)
|
|
or (
|
|
(c.previousVehicleKey is null or g.vehicleKey is null)
|
|
and c.previousRegistrationKey is not null
|
|
and g.registrationKey is not null
|
|
and c.previousRegistrationKey = g.registrationKey
|
|
)
|
|
)
|
|
)
|
|
and not exists (
|
|
select * from SupportGeoEvidenceWindow as g
|
|
where g.driverKey = c.driverKey
|
|
and g.occurredAtEpochSecond >= c.endedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and g.occurredAtEpochSecond <= c.endedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.nextVehicleKey is not null
|
|
and g.vehicleKey is not null
|
|
and c.nextVehicleKey = g.vehicleKey
|
|
)
|
|
or (
|
|
(c.nextVehicleKey is null or g.vehicleKey is null)
|
|
and c.nextRegistrationKey is not null
|
|
and g.registrationKey is not null
|
|
and c.nextRegistrationKey = g.registrationKey
|
|
)
|
|
)
|
|
);
|
|
|
|
@Priority(20)
|
|
on DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
insert into DailyWeeklyRestCandidateCoverageFinalizationRequest
|
|
select
|
|
beginGeo.driverKey as driverKey,
|
|
beginGeo.startedAtEpochSecond as startedAtEpochSecond,
|
|
beginGeo.endedAtEpochSecond as endedAtEpochSecond
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedIntervalWindow as c
|
|
where c.driverKey = beginGeo.driverKey
|
|
and c.startedAtEpochSecond = beginGeo.startedAtEpochSecond
|
|
and c.endedAtEpochSecond = beginGeo.endedAtEpochSecond
|
|
and not exists (
|
|
select * from SupportGeoEvidenceWindow as g
|
|
where g.driverKey = c.driverKey
|
|
and g.occurredAtEpochSecond >= c.endedAtEpochSecond - ${REST_GEO_LOOKBACK_SECONDS}
|
|
and g.occurredAtEpochSecond <= c.endedAtEpochSecond + ${REST_GEO_LOOKAHEAD_SECONDS}
|
|
and (
|
|
(
|
|
c.nextVehicleKey is not null
|
|
and g.vehicleKey is not null
|
|
and c.nextVehicleKey = g.vehicleKey
|
|
)
|
|
or (
|
|
(c.nextVehicleKey is null or g.vehicleKey is null)
|
|
and c.nextRegistrationKey is not null
|
|
and g.registrationKey is not null
|
|
and c.nextRegistrationKey = g.registrationKey
|
|
)
|
|
)
|
|
);
|
|
|
|
@Priority(20)
|
|
on DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
insert into DailyWeeklyRestCandidateCoverageFinalizationRequest
|
|
select
|
|
endGeo.driverKey as driverKey,
|
|
endGeo.startedAtEpochSecond as startedAtEpochSecond,
|
|
endGeo.endedAtEpochSecond as endedAtEpochSecond
|
|
from DailyWeeklyRestCandidateCoverageCardResolvedIntervalWindow as c
|
|
where c.driverKey = endGeo.driverKey
|
|
and c.startedAtEpochSecond = endGeo.startedAtEpochSecond
|
|
and c.endedAtEpochSecond = endGeo.endedAtEpochSecond;
|
|
|
|
@Priority(10)
|
|
insert into DailyWeeklyRestCandidateCoverageInterval
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.durationSeconds as durationSeconds,
|
|
c.cardAbsentDurationSeconds as cardAbsentDurationSeconds,
|
|
(c.cardAbsentDurationSeconds * 100.0d) / c.durationSeconds as cardAbsentCoveragePercent,
|
|
c.previousDrivingSourceIntervalId as previousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as nextDrivingSourceIntervalId,
|
|
c.previousRegistrationKey as previousRegistrationKey,
|
|
c.nextRegistrationKey as nextRegistrationKey,
|
|
c.previousVehicleKey as previousVehicleKey,
|
|
c.nextVehicleKey as nextVehicleKey,
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginBoundaryOdometerResolvedWindow as beginBoundary
|
|
where beginBoundary.driverKey = c.driverKey
|
|
and beginBoundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginBoundary.endedAtEpochSecond = c.endedAtEpochSecond) as beginBoundaryOdometerKm,
|
|
(select odometerKm from DailyWeeklyRestCandidateEndBoundaryOdometerResolvedWindow as endBoundary
|
|
where endBoundary.driverKey = c.driverKey
|
|
and endBoundary.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endBoundary.endedAtEpochSecond = c.endedAtEpochSecond) as endBoundaryOdometerKm,
|
|
(select eventId from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) as beginGeoEventId,
|
|
(select eventDomain from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) as beginGeoEventDomain,
|
|
(select occurredAtEpochSecond from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) as beginGeoOccurredAtEpochSecond,
|
|
(select latitude from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) as beginLatitude,
|
|
(select longitude from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) as beginLongitude,
|
|
(select distanceSeconds from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) as beginGeoDistanceSeconds,
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) as beginGeoOdometerKm,
|
|
(select eventId from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) as endGeoEventId,
|
|
(select eventDomain from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) as endGeoEventDomain,
|
|
(select occurredAtEpochSecond from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) as endGeoOccurredAtEpochSecond,
|
|
(select latitude from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) as endLatitude,
|
|
(select longitude from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) as endLongitude,
|
|
(select distanceSeconds from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) as endGeoDistanceSeconds,
|
|
(select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) as endGeoOdometerKm,
|
|
case
|
|
when (select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) is null
|
|
or (select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) is null
|
|
then null
|
|
when (select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
>=
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
then (
|
|
(select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
-
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
) * 1000L
|
|
else (
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
-
|
|
(select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
) * 1000L
|
|
end as geoEvidenceMovementMeters,
|
|
case
|
|
when (select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond) is null
|
|
or (select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond) is null
|
|
then 'UNKNOWN'
|
|
when (
|
|
case
|
|
when (select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
>=
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
then (
|
|
(select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
-
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
) * 1000L
|
|
else (
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
-
|
|
(select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
) * 1000L
|
|
end
|
|
) <= ${REST_GEO_STATIONARY_MAX_METERS}
|
|
then 'STATIONARY'
|
|
when (
|
|
case
|
|
when (select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
>=
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
then (
|
|
(select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
-
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
) * 1000L
|
|
else (
|
|
(select odometerKm from DailyWeeklyRestCandidateBeginGeoEvidenceResolvedWindow as beginGeo
|
|
where beginGeo.driverKey = c.driverKey
|
|
and beginGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and beginGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
-
|
|
(select odometerKm from DailyWeeklyRestCandidateEndGeoEvidenceResolvedWindow as endGeo
|
|
where endGeo.driverKey = c.driverKey
|
|
and endGeo.startedAtEpochSecond = c.startedAtEpochSecond
|
|
and endGeo.endedAtEpochSecond = c.endedAtEpochSecond)
|
|
) * 1000L
|
|
end
|
|
) <= ${REST_GEO_MINOR_MOVEMENT_MAX_METERS}
|
|
then 'MINOR'
|
|
else 'MOVED'
|
|
end as geoEvidenceMovementCategory
|
|
from DailyWeeklyRestCandidateCoverageFinalizationRequest as request unidirectional,
|
|
DailyWeeklyRestCandidateCoverageCardResolvedIntervalWindow as c
|
|
where c.driverKey = request.driverKey
|
|
and c.startedAtEpochSecond = request.startedAtEpochSecond
|
|
and c.endedAtEpochSecond = request.endedAtEpochSecond
|
|
and not exists (
|
|
select * from DailyWeeklyRestCandidateCoverageEmittedKeyWindow as emitted
|
|
where emitted.driverKey = request.driverKey
|
|
and emitted.startedAtEpochSecond = request.startedAtEpochSecond
|
|
and emitted.endedAtEpochSecond = request.endedAtEpochSecond
|
|
);
|
|
|
|
insert into DailyWeeklyRestCandidateCoverageEmittedKeyWindow
|
|
select
|
|
driverKey,
|
|
startedAtEpochSecond,
|
|
endedAtEpochSecond
|
|
from DailyWeeklyRestCandidateCoverageInterval;
|
|
|
|
@public context PerDriver
|
|
create window PreviousVehicleUsageInterval#lastevent as TachographVehicleUsageIntervalInputEvent;
|
|
|
|
@Priority(30)
|
|
context PerDriver
|
|
on TachographVehicleUsageIntervalInputEvent as next
|
|
insert into VuCardAbsentInterval
|
|
select
|
|
priorInterval.sessionId as sessionId,
|
|
priorInterval.driverKey as driverKey,
|
|
priorInterval.endedAtEpochSecond + 1L as startedAtEpochSecond,
|
|
next.startedAtEpochSecond as endedAtEpochSecond,
|
|
next.startedAtEpochSecond - (priorInterval.endedAtEpochSecond + 1L) as durationSeconds,
|
|
priorInterval.lastSourceIntervalId as previousUsageIntervalId,
|
|
next.firstSourceIntervalId as nextUsageIntervalId,
|
|
priorInterval.registrationKey as previousRegistrationKey,
|
|
next.registrationKey as nextRegistrationKey,
|
|
priorInterval.vehicleKey as previousVehicleKey,
|
|
next.vehicleKey as nextVehicleKey
|
|
from PreviousVehicleUsageInterval as priorInterval
|
|
where priorInterval.endedAt is not null
|
|
and next.startedAt is not null
|
|
and next.startedAtEpochSecond > priorInterval.endedAtEpochSecond + 1L;
|
|
|
|
@Priority(20)
|
|
context PerDriver
|
|
on TachographVehicleUsageIntervalInputEvent
|
|
delete from PreviousVehicleUsageInterval;
|
|
|
|
@Priority(10)
|
|
context PerDriver
|
|
on TachographVehicleUsageIntervalInputEvent as current
|
|
insert into PreviousVehicleUsageInterval
|
|
select *;
|
|
|
|
insert into PotentialHomeOvernightStayInterval
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.durationSeconds as durationSeconds,
|
|
c.cardAbsentDurationSeconds as cardAbsentDurationSeconds,
|
|
c.cardAbsentCoveragePercent as cardAbsentCoveragePercent,
|
|
c.previousDrivingSourceIntervalId as previousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as nextDrivingSourceIntervalId,
|
|
c.previousRegistrationKey as previousRegistrationKey,
|
|
c.nextRegistrationKey as nextRegistrationKey,
|
|
c.previousVehicleKey as previousVehicleKey,
|
|
c.nextVehicleKey as nextVehicleKey,
|
|
c.beginBoundaryOdometerKm as beginBoundaryOdometerKm,
|
|
c.endBoundaryOdometerKm as endBoundaryOdometerKm,
|
|
c.beginGeoEventId as beginGeoEventId,
|
|
c.beginGeoEventDomain as beginGeoEventDomain,
|
|
c.beginGeoOccurredAtEpochSecond as beginGeoOccurredAtEpochSecond,
|
|
c.beginLatitude as beginLatitude,
|
|
c.beginLongitude as beginLongitude,
|
|
c.beginGeoDistanceSeconds as beginGeoDistanceSeconds,
|
|
c.beginGeoOdometerKm as beginGeoOdometerKm,
|
|
c.endGeoEventId as endGeoEventId,
|
|
c.endGeoEventDomain as endGeoEventDomain,
|
|
c.endGeoOccurredAtEpochSecond as endGeoOccurredAtEpochSecond,
|
|
c.endLatitude as endLatitude,
|
|
c.endLongitude as endLongitude,
|
|
c.endGeoDistanceSeconds as endGeoDistanceSeconds,
|
|
c.endGeoOdometerKm as endGeoOdometerKm,
|
|
c.geoEvidenceMovementMeters as geoEvidenceMovementMeters,
|
|
c.geoEvidenceMovementCategory as geoEvidenceMovementCategory
|
|
from DailyWeeklyRestCandidateCoverageInterval as c
|
|
where c.previousRegistrationKey is not null
|
|
and c.nextRegistrationKey is not null
|
|
and c.previousRegistrationKey != c.nextRegistrationKey
|
|
and c.cardAbsentDurationSeconds * 100L >= c.durationSeconds * 95L;
|
|
|
|
insert into PotentialInVehicleOvernightStayInterval
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.durationSeconds as durationSeconds,
|
|
c.cardAbsentDurationSeconds as cardAbsentDurationSeconds,
|
|
c.cardAbsentCoveragePercent as cardAbsentCoveragePercent,
|
|
c.previousDrivingSourceIntervalId as previousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as nextDrivingSourceIntervalId,
|
|
c.previousRegistrationKey as previousRegistrationKey,
|
|
c.nextRegistrationKey as nextRegistrationKey,
|
|
c.previousVehicleKey as previousVehicleKey,
|
|
c.nextVehicleKey as nextVehicleKey,
|
|
c.beginBoundaryOdometerKm as beginBoundaryOdometerKm,
|
|
c.endBoundaryOdometerKm as endBoundaryOdometerKm,
|
|
c.beginGeoEventId as beginGeoEventId,
|
|
c.beginGeoEventDomain as beginGeoEventDomain,
|
|
c.beginGeoOccurredAtEpochSecond as beginGeoOccurredAtEpochSecond,
|
|
c.beginLatitude as beginLatitude,
|
|
c.beginLongitude as beginLongitude,
|
|
c.beginGeoDistanceSeconds as beginGeoDistanceSeconds,
|
|
c.beginGeoOdometerKm as beginGeoOdometerKm,
|
|
c.endGeoEventId as endGeoEventId,
|
|
c.endGeoEventDomain as endGeoEventDomain,
|
|
c.endGeoOccurredAtEpochSecond as endGeoOccurredAtEpochSecond,
|
|
c.endLatitude as endLatitude,
|
|
c.endLongitude as endLongitude,
|
|
c.endGeoDistanceSeconds as endGeoDistanceSeconds,
|
|
c.endGeoOdometerKm as endGeoOdometerKm,
|
|
c.geoEvidenceMovementMeters as geoEvidenceMovementMeters,
|
|
c.geoEvidenceMovementCategory as geoEvidenceMovementCategory
|
|
from DailyWeeklyRestCandidateCoverageInterval as c
|
|
where c.previousRegistrationKey is not null
|
|
and c.nextRegistrationKey is not null
|
|
and c.previousRegistrationKey = c.nextRegistrationKey
|
|
and c.cardAbsentDurationSeconds = 0L;
|
|
|
|
insert into UnclassifiedDailyWeeklyRestCandidateCoverageInterval
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
c.startedAtEpochSecond as startedAtEpochSecond,
|
|
c.endedAtEpochSecond as endedAtEpochSecond,
|
|
c.durationSeconds as durationSeconds,
|
|
c.cardAbsentDurationSeconds as cardAbsentDurationSeconds,
|
|
c.cardAbsentCoveragePercent as cardAbsentCoveragePercent,
|
|
c.previousDrivingSourceIntervalId as previousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as nextDrivingSourceIntervalId,
|
|
c.previousRegistrationKey as previousRegistrationKey,
|
|
c.nextRegistrationKey as nextRegistrationKey,
|
|
c.previousVehicleKey as previousVehicleKey,
|
|
c.nextVehicleKey as nextVehicleKey,
|
|
c.beginBoundaryOdometerKm as beginBoundaryOdometerKm,
|
|
c.endBoundaryOdometerKm as endBoundaryOdometerKm,
|
|
c.beginGeoEventId as beginGeoEventId,
|
|
c.beginGeoEventDomain as beginGeoEventDomain,
|
|
c.beginGeoOccurredAtEpochSecond as beginGeoOccurredAtEpochSecond,
|
|
c.beginLatitude as beginLatitude,
|
|
c.beginLongitude as beginLongitude,
|
|
c.beginGeoDistanceSeconds as beginGeoDistanceSeconds,
|
|
c.beginGeoOdometerKm as beginGeoOdometerKm,
|
|
c.endGeoEventId as endGeoEventId,
|
|
c.endGeoEventDomain as endGeoEventDomain,
|
|
c.endGeoOccurredAtEpochSecond as endGeoOccurredAtEpochSecond,
|
|
c.endLatitude as endLatitude,
|
|
c.endLongitude as endLongitude,
|
|
c.endGeoDistanceSeconds as endGeoDistanceSeconds,
|
|
c.endGeoOdometerKm as endGeoOdometerKm,
|
|
c.geoEvidenceMovementMeters as geoEvidenceMovementMeters,
|
|
c.geoEvidenceMovementCategory as geoEvidenceMovementCategory
|
|
from DailyWeeklyRestCandidateCoverageInterval as c
|
|
where not (
|
|
c.previousRegistrationKey is not null
|
|
and c.nextRegistrationKey is not null
|
|
and c.previousRegistrationKey != c.nextRegistrationKey
|
|
and c.cardAbsentDurationSeconds * 100L >= c.durationSeconds * 95L
|
|
)
|
|
and not (
|
|
c.previousRegistrationKey is not null
|
|
and c.nextRegistrationKey is not null
|
|
and c.previousRegistrationKey = c.nextRegistrationKey
|
|
and c.cardAbsentDurationSeconds = 0L
|
|
);
|
|
|
|
@Priority(40)
|
|
on DailyWeeklyRestCandidateCoverageInterval as c
|
|
insert into PotentialInVehicleTripInterval
|
|
select
|
|
s.sessionId as sessionId,
|
|
s.driverKey as driverKey,
|
|
s.tripStartedAtEpochSecond as startedAtEpochSecond,
|
|
c.startedAtEpochSecond as endedAtEpochSecond,
|
|
c.startedAtEpochSecond - s.tripStartedAtEpochSecond as durationSeconds,
|
|
s.registrationKey as registrationKey,
|
|
s.vehicleKey as vehicleKey,
|
|
s.containedPotentialInVehicleOvernightStayIntervalCount as containedPotentialInVehicleOvernightStayIntervalCount,
|
|
s.containedPotentialInVehicleOvernightStayDurationSeconds as containedPotentialInVehicleOvernightStayDurationSeconds,
|
|
s.containedCardAbsentDurationSeconds as containedCardAbsentDurationSeconds,
|
|
s.firstPotentialInVehicleOvernightStayStartedAtEpochSecond as firstPotentialInVehicleOvernightStayStartedAtEpochSecond,
|
|
s.lastPotentialInVehicleOvernightStayEndedAtEpochSecond as lastPotentialInVehicleOvernightStayEndedAtEpochSecond,
|
|
s.firstPreviousDrivingSourceIntervalId as firstPreviousDrivingSourceIntervalId,
|
|
s.lastNextDrivingSourceIntervalId as lastNextDrivingSourceIntervalId
|
|
from OpenPotentialInVehicleTripState as s
|
|
where s.driverKey = c.driverKey
|
|
and c.startedAtEpochSecond > s.tripStartedAtEpochSecond
|
|
and (
|
|
not (
|
|
c.previousRegistrationKey is not null
|
|
and c.nextRegistrationKey is not null
|
|
and c.previousRegistrationKey = c.nextRegistrationKey
|
|
and c.cardAbsentDurationSeconds = 0L
|
|
)
|
|
or s.registrationKey != c.previousRegistrationKey
|
|
or (
|
|
s.vehicleKey is not null
|
|
and c.previousVehicleKey is not null
|
|
and s.vehicleKey != c.previousVehicleKey
|
|
)
|
|
);
|
|
|
|
@Priority(35)
|
|
on DailyWeeklyRestCandidateCoverageInterval as c
|
|
delete from OpenPotentialInVehicleTripState as s
|
|
where s.driverKey = c.driverKey
|
|
and not (
|
|
c.previousRegistrationKey is not null
|
|
and c.nextRegistrationKey is not null
|
|
and c.previousRegistrationKey = c.nextRegistrationKey
|
|
and c.cardAbsentDurationSeconds = 0L
|
|
);
|
|
|
|
@Priority(30)
|
|
on DailyWeeklyRestCandidateCoverageInterval as c
|
|
insert into OpenPotentialInVehicleTripState
|
|
select
|
|
s.sessionId as sessionId,
|
|
s.driverKey as driverKey,
|
|
s.tripStartedAtEpochSecond as tripStartedAtEpochSecond,
|
|
s.registrationKey as registrationKey,
|
|
s.vehicleKey as vehicleKey,
|
|
s.containedPotentialInVehicleOvernightStayIntervalCount + 1 as containedPotentialInVehicleOvernightStayIntervalCount,
|
|
s.containedPotentialInVehicleOvernightStayDurationSeconds + c.durationSeconds as containedPotentialInVehicleOvernightStayDurationSeconds,
|
|
s.containedCardAbsentDurationSeconds + c.cardAbsentDurationSeconds as containedCardAbsentDurationSeconds,
|
|
s.firstPotentialInVehicleOvernightStayStartedAtEpochSecond as firstPotentialInVehicleOvernightStayStartedAtEpochSecond,
|
|
c.endedAtEpochSecond as lastPotentialInVehicleOvernightStayEndedAtEpochSecond,
|
|
s.firstPreviousDrivingSourceIntervalId as firstPreviousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as lastNextDrivingSourceIntervalId
|
|
from OpenPotentialInVehicleTripState as s
|
|
where s.driverKey = c.driverKey
|
|
and c.previousRegistrationKey is not null
|
|
and c.nextRegistrationKey is not null
|
|
and c.previousRegistrationKey = c.nextRegistrationKey
|
|
and c.cardAbsentDurationSeconds = 0L
|
|
and s.registrationKey = c.previousRegistrationKey
|
|
and (
|
|
s.vehicleKey is null
|
|
or c.previousVehicleKey is null
|
|
or s.vehicleKey = c.previousVehicleKey
|
|
);
|
|
|
|
@Priority(20)
|
|
on DailyWeeklyRestCandidateCoverageInterval as c
|
|
insert into OpenPotentialInVehicleTripState
|
|
select
|
|
c.sessionId as sessionId,
|
|
c.driverKey as driverKey,
|
|
priorCoverage.endedAtEpochSecond as tripStartedAtEpochSecond,
|
|
c.previousRegistrationKey as registrationKey,
|
|
case
|
|
when c.previousVehicleKey is not null then c.previousVehicleKey
|
|
else c.nextVehicleKey
|
|
end as vehicleKey,
|
|
1 as containedPotentialInVehicleOvernightStayIntervalCount,
|
|
c.durationSeconds as containedPotentialInVehicleOvernightStayDurationSeconds,
|
|
c.cardAbsentDurationSeconds as containedCardAbsentDurationSeconds,
|
|
c.startedAtEpochSecond as firstPotentialInVehicleOvernightStayStartedAtEpochSecond,
|
|
c.endedAtEpochSecond as lastPotentialInVehicleOvernightStayEndedAtEpochSecond,
|
|
c.previousDrivingSourceIntervalId as firstPreviousDrivingSourceIntervalId,
|
|
c.nextDrivingSourceIntervalId as lastNextDrivingSourceIntervalId
|
|
from PreviousRestCandidateCoverageInterval as priorCoverage
|
|
where priorCoverage.driverKey = c.driverKey
|
|
and c.previousRegistrationKey is not null
|
|
and c.nextRegistrationKey is not null
|
|
and c.previousRegistrationKey = c.nextRegistrationKey
|
|
and c.cardAbsentDurationSeconds = 0L
|
|
and not exists (
|
|
select * from OpenPotentialInVehicleTripState as s
|
|
where s.driverKey = c.driverKey
|
|
and s.registrationKey = c.previousRegistrationKey
|
|
and (
|
|
s.vehicleKey is null
|
|
or c.previousVehicleKey is null
|
|
or s.vehicleKey = c.previousVehicleKey
|
|
)
|
|
);
|
|
|
|
@Priority(10)
|
|
on DailyWeeklyRestCandidateCoverageInterval
|
|
delete from PreviousRestCandidateCoverageInterval;
|
|
|
|
@Priority(5)
|
|
on DailyWeeklyRestCandidateCoverageInterval as current
|
|
insert into PreviousRestCandidateCoverageInterval
|
|
select *;
|
|
|
|
@name('drivingInterruptionIntervals')
|
|
select * from DrivingInterruptionInterval;
|
|
|
|
@name('dailyWeeklyRestCandidateIntervals')
|
|
select * from DailyWeeklyRestCandidateInterval;
|
|
|
|
@name('dailyWeeklyRestCandidateCoverageIntervals')
|
|
select * from DailyWeeklyRestCandidateCoverageInterval;
|
|
|
|
@name('drivingInterruptionVehicleChangeIntervals')
|
|
select * from DrivingInterruptionVehicleChangeInterval;
|
|
|
|
insert into VuCardAbsentIntervalWindow
|
|
select * from VuCardAbsentInterval;
|
|
|
|
@name('vuCardAbsentIntervals')
|
|
select * from VuCardAbsentInterval;
|
|
|
|
@name('potentialHomeOvernightStayIntervals')
|
|
select * from PotentialHomeOvernightStayInterval;
|
|
|
|
@name('potentialInVehicleOvernightStayIntervals')
|
|
select * from PotentialInVehicleOvernightStayInterval;
|
|
|
|
@name('potentialInVehicleTripIntervals')
|
|
select * from PotentialInVehicleTripInterval;
|
|
|
|
@name('unclassifiedDailyWeeklyRestCandidateCoverageIntervals')
|
|
select * from UnclassifiedDailyWeeklyRestCandidateCoverageInterval;
|