From c88dc690a62384f4e84f578677b9ebee697b2e40 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 28 Sep 2018 13:24:50 -0400 Subject: [PATCH] Make getNearEvents smarter. When Sorting by something other than Id, include Id in the sort so that events with identical starttime for example maintain the correct chronological order. --- web/ajax/status.php | 52 ++++++++++++++++++------------- web/skins/classic/views/event.php | 1 - 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/web/ajax/status.php b/web/ajax/status.php index ee9a554a4..63357c1ff 100644 --- a/web/ajax/status.php +++ b/web/ajax/status.php @@ -383,7 +383,7 @@ function getNearEvents() { parseSort(); if ( $user['MonitorIds'] ) - $midSql = ' and MonitorId in ('.join( ',', preg_split( '/["\'\s]*,["\'\s]*/', $user['MonitorIds'] ) ).')'; + $midSql = ' AND MonitorId IN ('.join( ',', preg_split( '/["\'\s]*,["\'\s]*/', $user['MonitorIds'] ) ).')'; else $midSql = ''; @@ -392,32 +392,40 @@ function getNearEvents() { $sortOrder = 'asc'; } - $sql = "SELECT E.Id AS Id, E.StartTime AS StartTime FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE $sortColumn ".($sortOrder=='asc'?'<=':'>=')." '".$event[$_REQUEST['sort_field']]."'".$_REQUEST['filter']['sql'].$midSql." ORDER BY $sortColumn ".($sortOrder=='asc'?'desc':'asc') . ' LIMIT 2'; - $result = dbQuery( $sql ); - while ( $id = dbFetchNext( $result, 'Id' ) ) { - if ( $id == $eventId ) { - $prevEvent = dbFetchNext( $result ); - break; - } + $sql = "SELECT E.Id AS Id, E.StartTime AS StartTime FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE $sortColumn ".($sortOrder=='asc'?'<=':'>=')." '".$event[$_REQUEST['sort_field']]."'".$_REQUEST['filter']['sql'].$midSql.' AND E.Id!='.$event['Id'] . " ORDER BY $sortColumn ".($sortOrder=='asc'?'desc':'asc'); + if ( $sortColumn != 'E.Id' ) { + # When sorting by starttime, if we have two events with the same starttime (diffreent monitors) then we should sort secondly by Id + $sql .= ', E.Id DESC'; } + $sql .= ' LIMIT 1'; + $result = dbQuery( $sql ); + $prevEvent = dbFetchNext( $result ); - $sql = "SELECT E.Id AS Id, E.StartTime AS StartTime FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE $sortColumn ".($sortOrder=='asc'?'>=':'<=')." '".$event[$_REQUEST['sort_field']]."'".$_REQUEST['filter']['sql'].$midSql." ORDER BY $sortColumn $sortOrder LIMIT 2"; - $result = dbQuery( $sql ); - while ( $id = dbFetchNext( $result, 'Id' ) ) { - if ( $id == $eventId ) { - $nextEvent = dbFetchNext( $result ); - break; - } + $sql = "SELECT E.Id AS Id, E.StartTime AS StartTime FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE $sortColumn ".($sortOrder=='asc'?'>=':'<=')." '".$event[$_REQUEST['sort_field']]."'".$_REQUEST['filter']['sql'].$midSql.' AND E.Id!='.$event['Id'] . " ORDER BY $sortColumn $sortOrder"; + if ( $sortColumn != 'E.Id' ) { + # When sorting by starttime, if we have two events with the same starttime (diffreent monitors) then we should sort secondly by Id + $sql .= ', E.Id ASC'; } + $sql .= ' LIMIT 1'; + $result = dbQuery( $sql ); + $nextEvent = dbFetchNext( $result ); $result = array( 'EventId'=>$eventId ); - $result['PrevEventId'] = empty($prevEvent)?0:$prevEvent['Id']; - $result['NextEventId'] = empty($nextEvent)?0:$nextEvent['Id']; - $result['PrevEventStartTime'] = empty($prevEvent)?0:$prevEvent['StartTime']; - $result['NextEventStartTime'] = empty($nextEvent)?0:$nextEvent['StartTime']; - $result['PrevEventDefVideoPath'] = empty($prevEvent)?0:(getEventDefaultVideoPath($prevEvent['Id'])); - $result['NextEventDefVideoPath'] = empty($nextEvent)?0:(getEventDefaultVideoPath($nextEvent['Id'])); - return( $result ); + if ( $prevEvent ) { + $result['PrevEventId'] = $prevEvent['Id']; + $result['PrevEventStartTime'] = $prevEvent['StartTime']; + $result['PrevEventDefVideoPath'] = getEventDefaultVideoPath($prevEvent['Id']); + } else { + $result['PrevEventId'] = $result['PrevEventStartTime'] = $result['PrevEventDefVideoPath'] = 0; + } + if ( $nextEvent ) { + $result['NextEventId'] = $nextEvent['Id']; + $result['NextEventStartTime'] = $nextEvent['StartTime']; + $result['NextEventDefVideoPath'] = getEventDefaultVideoPath($nextEvent['Id']); + } else { + $result['NextEventId'] = $result['NextEventStartTime'] = $result['NextEventDefVideoPath'] = 0; + } + return $result; } ?> diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index e22b886f3..8671bfc03 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -174,7 +174,6 @@ if ( ZM_WEB_STREAM_METHOD == 'mpeg' && ZM_MPEG_LIVE_FORMAT ) { outputVideoStream( "evtStream", $streamSrc, reScale( $Event->Width(), $scale ), reScale( $Event->Height(), $scale ), ZM_MPEG_LIVE_FORMAT ); } else { $streamSrc = $Event->getStreamSrc( array( 'mode'=>'jpeg', 'frame'=>$fid, 'scale'=>$scale, 'rate'=>$rate, 'maxfps'=>ZM_WEB_VIDEO_MAXFPS, 'replay'=>$replayMode) ); -Warning("Streamsrc: $streamSrc"); if ( canStreamNative() ) { outputImageStream( 'evtStream', $streamSrc, reScale( $Event->Width(), $scale ), reScale( $Event->Height(), $scale ), validHtmlStr($Event->Name()) ); } else {