From 0ebfb987338a45795c6958c5ad2220449a4f5034 Mon Sep 17 00:00:00 2001 From: Vojtech Kolomicenko Date: Wed, 28 Mar 2018 15:06:35 +0200 Subject: [PATCH] solution by vojtech.kolomicenko@intraworlds.com --- new.php | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 new.php diff --git a/new.php b/new.php new file mode 100644 index 0000000..58d52bf --- /dev/null +++ b/new.php @@ -0,0 +1,102 @@ +_previousFilter = $filter; + } + + function filter(string $str): string { + if ($this->_previousFilter) { + return $this->_previousFilter->filter($str); + } else { + return $str; + } + } +} + +class IsNotDebug extends CascadeFilter { + function filter(string $str): string { + $str = parent::filter($str); + return $str == 'debug' ? '' : $str; + } +} + +class ExtractLogLevel extends CascadeFilter { + const PATTERN = '/test\.(\w+)/'; + + function filter(string $str): string { + $str = parent::filter($str); + + if (preg_match(self::PATTERN, $str, $matches)) { + return strtolower($matches[1]); + } else { + return ''; + } + } +} + + +class FileRowReader extends FilterIterator { + private $_filter = null; + + function __construct(string $filename, Filter $filter) { + $this->_filter = $filter; + + // parent is a generator + parent::__construct( + (function($filename){ + $f = fopen($filename, 'r'); + try { + while ($row = fgets($f)) { + yield $row; + } + } finally { + fclose($f); + } + })($filename) + ); + } + + public function current() { + return $this->_filter->filter($this->getInnerIterator()->current()); + } + + public function accept() { + if ($this->current() == '') { + return false; + } + return true; + } +} + +// read and parse file +$filter = new IsNotDebug(new ExtractLogLevel(null)); +$fileReader = new FileRowReader($argv[1], $filter); + +// build stats +$stats = new class($fileReader) extends ArrayIterator { + function __construct(Iterable $iterator) { + $stats = array(); + foreach ($iterator as $level) { + if (array_key_exists($level, $stats)) { + $stats[$level]++; + } else { + $stats[$level] = 1; + } + } + arsort($stats); + parent::__construct($stats); + } +}; + +// show stats +foreach ($stats as $level => $count) { + echo "$level: $count" . PHP_EOL; +}