Skip to content

Commit 359330b

Browse files
When loading prev/next event, sort by StartDateTime, not Id. Id's are not guaranteed to be time-wise sequential. Maybe Fixes #4186
1 parent d42040d commit 359330b

File tree

1 file changed

+17
-39
lines changed

1 file changed

+17
-39
lines changed

web/ajax/status.php

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@
212212
'EventId' => true,
213213
'Type' => true,
214214
'TimeStamp' => true,
215-
'TimeStampShort' => array( 'sql' => 'date_format( StartDateTime, \''.MYSQL_FMT_DATETIME_SHORT.'\' )' ),
215+
'TimeStampShort' => array( 'sql' => 'date_format( StartDateTime, \''.MYSQL_FMT_DATETIME_SHORT.'\' )' ),
216216
'Delta' => true,
217217
'Score' => true,
218218
//'Image' => array( 'postFunc' => 'getFrameImage' ),
@@ -515,34 +515,23 @@ function getNearEvents() {
515515
}
516516

517517
$sql = '
518-
SELECT
519-
E.Id
520-
AS Id,
521-
E.StartDateTime
522-
AS StartDateTime
523-
FROM Events
524-
AS E
525-
INNER JOIN Monitors
526-
AS M
527-
ON E.MonitorId = M.Id
528-
LEFT JOIN Events_Tags
529-
AS ET
530-
ON E.Id = ET.EventId
531-
LEFT JOIN Tags
532-
AS T
533-
ON T.Id = ET.TagId
534-
WHERE '.$sortColumn.'
518+
SELECT E.Id AS Id, E.StartDateTime AS StartDateTime
519+
FROM Events AS E
520+
INNER JOIN Monitors AS M ON E.MonitorId = M.Id
521+
LEFT JOIN Events_Tags AS ET ON E.Id = ET.EventId
522+
LEFT JOIN Tags AS T ON T.Id = ET.TagId
523+
WHERE '.$sortColumn.'
535524
'.($sortOrder=='ASC'?'<=':'>=').' \''.$event[$_REQUEST['sort_field']].'\'';
536525
if ($filter->sql()) {
537526
$sql .= ' AND ('.$filter->sql().')';
538527
}
539-
$sql .= ' AND E.Id<'.$event['Id'] . ' ORDER BY '.$sortColumn.' '.($sortOrder=='ASC'?'DESC':'ASC');
528+
$sql .= ' AND E.StartDateTime < ? ORDER BY '.$sortColumn.' '.($sortOrder=='ASC'?'DESC':'ASC');
540529
if ( $sortColumn != 'E.Id' ) {
541530
# When sorting by starttime, if we have two events with the same starttime (different monitors) then we should sort secondly by Id
542531
$sql .= ', E.Id DESC';
543532
}
544533
$sql .= ' LIMIT 1';
545-
$result = dbQuery($sql);
534+
$result = dbQuery($sql, [$event['StartDateTime']]);
546535
if ( !$result ) {
547536
ZM\Error('Failed to load previous event using '.$sql);
548537
return $NearEvents;
@@ -551,34 +540,23 @@ function getNearEvents() {
551540
$prevEvent = dbFetchNext($result);
552541

553542
$sql = '
554-
SELECT
555-
E.Id
556-
AS Id,
557-
E.StartDateTime
558-
AS StartDateTime
559-
FROM Events
560-
AS E
561-
INNER JOIN Monitors
562-
AS M
563-
ON E.MonitorId = M.Id
564-
LEFT JOIN Events_Tags
565-
AS ET
566-
ON E.Id = ET.EventId
567-
LEFT JOIN Tags
568-
AS T
569-
ON T.Id = ET.TagId
570-
WHERE '.$sortColumn.'
543+
SELECT E.Id AS Id, E.StartDateTime AS StartDateTime
544+
FROM Events AS E
545+
INNER JOIN Monitors AS M ON E.MonitorId = M.Id
546+
LEFT JOIN Events_Tags AS ET ON E.Id = ET.EventId
547+
LEFT JOIN Tags AS T ON T.Id = ET.TagId
548+
WHERE '.$sortColumn.'
571549
'.($sortOrder=='ASC'?'>=':'<=').' \''.$event[$_REQUEST['sort_field']].'\'';
572550
if ($filter->sql()) {
573551
$sql .= ' AND ('.$filter->sql().')';
574552
}
575-
$sql .= ' AND E.Id>'.$event['Id'] . ' ORDER BY '.$sortColumn.' '.($sortOrder=='ASC'?'ASC':'DESC');
553+
$sql .= ' AND E.StartDateTime > ? ORDER BY '.$sortColumn.' '.($sortOrder=='ASC'?'ASC':'DESC');
576554
if ( $sortColumn != 'E.Id' ) {
577555
# When sorting by starttime, if we have two events with the same starttime (different monitors) then we should sort secondly by Id
578556
$sql .= ', E.Id ASC';
579557
}
580558
$sql .= ' LIMIT 1';
581-
$result = dbQuery($sql);
559+
$result = dbQuery($sql, [$event['StartDateTime']]);
582560
if ( !$result ) {
583561
ZM\Error('Failed to load next event using '.$sql);
584562
return $NearEvents;

0 commit comments

Comments
 (0)