From bee765071b7d8abd5474e0cda8dd272aa1ad2e2c Mon Sep 17 00:00:00 2001 From: Andrey Savchenko Date: Fri, 9 Feb 2018 15:15:23 +0200 Subject: [PATCH] Implemented initial handling of arbitrary nesting events. See #11 --- src/Events/Recursive_Event_Iterator.php | 55 +++++++++++++++++++++++++ src/Laps.php | 36 ++++++---------- 2 files changed, 67 insertions(+), 24 deletions(-) create mode 100644 src/Events/Recursive_Event_Iterator.php diff --git a/src/Events/Recursive_Event_Iterator.php b/src/Events/Recursive_Event_Iterator.php new file mode 100644 index 0000000..173f63b --- /dev/null +++ b/src/Events/Recursive_Event_Iterator.php @@ -0,0 +1,55 @@ + $event ) { + + foreach ( $events as $check_key => $check_event ) { + + if ( $check_key <= $key ) { + continue; + } + + if ( $this->overlaps( $event, $check_event ) ) { + + unset( $events[ $check_key ] ); + $this->children[] = $check_event; + } + + } + } + + parent::__construct( $events, $flags ); + } + + /** + * @param array $event_a + * @param array $event_b + * + * @return bool True if event B starts after A and before it finishes. + */ + protected function overlaps( $event_a, $event_b ) { + + if ( $event_a['origin'] > $event_b['origin'] ) { + return false; + } + + return $event_b['origin'] < ( $event_a['origin'] + $event_a['duration'] ); + } + + public function hasChildren() { + + return ! empty( $this->children ); + } + + public function getChildren() { + + return new static( $this->children ); + } +} \ No newline at end of file diff --git a/src/Laps.php b/src/Laps.php index 702a44d..728d89f 100644 --- a/src/Laps.php +++ b/src/Laps.php @@ -7,6 +7,7 @@ use Pimple\ServiceProviderInterface; use Rarst\Laps\Events\Events_Provider_Interface; use Rarst\Laps\Events\Hook_Events_Provider; use Rarst\Laps\Events\Http_Events_Provider; +use Rarst\Laps\Events\Recursive_Event_Iterator; use Rarst\Laps\Events\Sql_Events_Provider; use Symfony\Component\Stopwatch\Stopwatch; @@ -143,35 +144,22 @@ class Laps extends Container { $end = microtime( true ) * 1000; $total = $end - $start; $event_data = []; - $http_data = []; - $query_data = []; foreach ( $events as $event ) { - $event['offset'] = round( ( $event['origin'] - $start ) / $total * 100, 2 ); - $event['width'] = round( $event['duration'] / $total * 100, 2 ); - - switch ($event['category']) { - case 'http': - $http_data[] = $event; - continue 2; - - case 'query-read': - case 'query-write': - $query_data[] = $event; - continue 2; - } - - $event_data[] = $event; + $event['offset'] = round( ( $event['origin'] - $start ) / $total * 100, 2 ); + $event['width'] = round( $event['duration'] / $total * 100, 2 ); + $event_data[] = $event; } - $timelines = array_filter( [ - [ 'events' => $event_data ], - [ 'events' => $query_data ], - [ 'events' => $http_data ], - ], function ( $data ) { - return ! empty( $data['events'] ); - } ); + $iterator = new Recursive_Event_Iterator( $event_data ); + $timelines = [ [ 'events' => $iterator ] ]; + + while ( $iterator->hasChildren() ) { + $children = $iterator->getChildren(); + $timelines[] = [ 'events' => $children ]; + $iterator = $children; + } $wp_admin_bar->add_node( [ 'id' => 'laps',