diff --git a/modules/statistics/lib/StatDataset.php b/modules/statistics/lib/StatDataset.php index b8c333f65b5ff67a4ca523bc9a70ba4be32dc36c..4beb34f8264d572707eedb7021a13c030163e46b 100644 --- a/modules/statistics/lib/StatDataset.php +++ b/modules/statistics/lib/StatDataset.php @@ -1,311 +1,328 @@ <?php -/* + + +/** * @author Andreas Ă…kre Solberg <andreas.solberg@uninett.no> * @package simpleSAMLphp */ -class sspmod_statistics_StatDataset { - - protected $statconfig; - protected $ruleconfig; - protected $timeresconfig; - protected $ruleid; - - protected $fileslot; - protected $timeres; - - protected $delimiter; - protected $results; - protected $summary; - protected $max; - - protected $datehandlerFile; - protected $datehandlerTick; - - /** - * Constructor - */ - public function __construct($statconfig, $ruleconfig, $ruleid, $timeres, $fileslot) { - assert('$statconfig instanceof SimpleSAML_Configuration'); - assert('$ruleconfig instanceof SimpleSAML_Configuration'); - $this->statconfig = $statconfig; - $this->ruleconfig = $ruleconfig; - - $timeresconfigs = $statconfig->getConfigItem('timeres'); - $this->timeresconfig = $timeresconfigs->getConfigItem($timeres); - - $this->ruleid = $ruleid; - $this->fileslot = $fileslot; - $this->timeres = $timeres; - - - $this->delimiter = '_'; - $this->max = 0; - - $this->datehandlerTick = new sspmod_statistics_DateHandler($this->statconfig->getValue('offset', 0)); - if ($this->timeresconfig->getValue('customDateHandler', 'default') === 'month') { - $this->datehandlerFile = new sspmod_statistics_DateHandlerMonth(0); - } else { - $datehandlerFile = $this->datehandlerTick; - } - - - $this->loadData(); - - - } - - public function getFileSlot() { - return $this->fileslot; - } - - public function getTimeRes() { - return $this->timeres; - } - - public function setDelimiter($delimiter = '_') { - if (empty($delimiter)) $delimiter = '_'; - $this->delimiter = $delimiter; - } - public function getDelimiter() { - if ($this->delimiter === '_') return NULL; - return $this->delimiter; - } - - public function calculateMax() { - - /* - * Get rule specific configuration from the configuration file. - */ - $slotsize = $this->ruleconfig->getValue('slot'); - $dateformat_period = $this->timeresconfig->getValue('dateformat-period'); - $dateformat_intra = $this->timeresconfig->getValue('dateformat-intra'); - - - $maxvalue = 0; $maxvaluetime = NULL; - foreach($this->results AS $slot => &$res) { - if (!array_key_exists($this->delimiter, $res)) $res[$this->delimiter] = 0; - if ($res[$this->delimiter] > $maxvalue) { - $maxvaluetime = $this->datehandlerTick->prettyDateSlot($slot, $slotsize, $dateformat_intra); - } - $maxvalue = max($res[$this->delimiter],$maxvalue); - } - $this->max = sspmod_statistics_Graph_GoogleCharts::roof($maxvalue); - } - - public function getDebugData() { - $debugdata = array(); - - $slotsize = $this->timeresconfig->getValue('slot'); - $dateformat_period = $this->timeresconfig->getValue('dateformat-period'); - $dateformat_intra = $this->timeresconfig->getValue('dateformat-intra'); - - foreach($this->results AS $slot => &$res) { - $debugdata[$slot] = array($this->datehandlerTick->prettyDateSlot($slot, $slotsize, $dateformat_intra), $res[$this->delimiter] ); - } - return $debugdata; - } - - public function aggregateSummary() { - - /** - * Aggregate summary table from dataset. To be used in the table view. - */ - $this->summary = array(); - foreach($this->results AS $slot => $res) { - foreach ($res AS $key => $value) { - if (array_key_exists($key, $this->summary)) { - $this->summary[$key] += $value; - } else { - $this->summary[$key] = $value; - } - } - } - asort($this->summary); - $this->summary = array_reverse($this->summary, TRUE); - } - - public function getTopDelimiters() { - /* - * Create a list of delimiter keys that has the highest total summary in this period. - */ - $topdelimiters = array(); - $maxdelimiters = 4; $i = 0; - foreach($this->summary AS $key => $value) { - if ($key !== '_') - $topdelimiters[] = $key; - if ($i++ >= $maxdelimiters) break; - } - return $topdelimiters; - - } - - public function availDelimiters() { - $availDelimiters = array(); - foreach($this->summary AS $key => $value) { - if ($key !== '_') - $topdelimiters[] = $key; - $availdelimiters[$key] = 1; - } - return array_keys($availdelimiters); - } - - public function getPieData() { - - $piedata = array(); $sum = 0; - $topdelimiters = $this->getTopDelimiters(); - - foreach($topdelimiters AS $td) { - $sum += $this->summary[$td]; - $piedata[] = number_format(100*$this->summary[$td] / $this->summary['_'], 2); - } - $piedata[] = number_format(100 - 100*($sum /$this->summary['_']), 2); - return $piedata; - } - - public function getMax() { - return $this->max; - } - - public function getSummary() { - return $this->summary; - } - - public function getResults() { - return $this->results; - } - - public function getAxis() { - $slotsize = $this->timeresconfig->getValue('slot'); - $dateformat_period = $this->timeresconfig->getValue('dateformat-period'); - $dateformat_intra = $this->timeresconfig->getValue('dateformat-intra'); - $axislabelint = $this->timeresconfig->getValue('axislabelint'); - - - $axis = array(); - $axispos = array(); - $xentries = count($this->results); - $lastslot = 0; $i = 0; - - foreach($this->results AS $slot => $res) { - - // check if there should be an axis here... - if ( $slot % $axislabelint == 0) { - $axis[] = $this->datehandlerTick->prettyDateSlot($slot, $slotsize, $dateformat_intra); - $axispos[] = (($i)/($xentries-1)); - } - $lastslot = $slot; - $i++; - } - - $axis[] = $this->datehandlerTick->prettyDateSlot($lastslot+1, $slotsize, $dateformat_intra); - - return array('axis' => $axis, 'axispos' => $axispos); - } - - - /* - * Walk through dataset to get percent values from max into dataset[]. - */ - public function getPercentValues() { - - - $slotsize = $this->timeresconfig->getValue('slot'); - $dateformat_period = $this->timeresconfig->getValue('dateformat-period'); - $dateformat_intra = $this->timeresconfig->getValue('dateformat-intra'); - $axislabelint = $this->timeresconfig->getValue('axislabelint'); - - $xentries = count($this->results); - $lastslot = 0; $i = 0; - - - $dataset = array(); - foreach($this->results AS $slot => $res) { - if (array_key_exists($this->delimiter, $res)) { - if ($res[$this->delimiter] === NULL) { - $dataset[] = -1; - } else { - $dataset[] = number_format(100*$res[$this->delimiter] / $this->max, 2); - } - } else { - $dataset[] = '0'; - } - $lastslot = $slot; - $i++; - } - - return $dataset; - } - - - - public function getDelimiterPresentation() { - $config = SimpleSAML_Configuration::getInstance(); - $t = new SimpleSAML_XHTML_Template($config, 'statistics:statistics-tpl.php'); - - $availdelimiters = $this->availDelimiters(); - - - - /* - * Create a delimiter presentation filter for this rule... - */ - if ($this->ruleconfig->hasValue('fieldPresentation')) { - $fieldpresConfig = $this->ruleconfig->getConfigItem('fieldPresentation'); - $classname = SimpleSAML_Module::resolveClass($fieldpresConfig->getValue('class'), 'Statistics_FieldPresentation'); - if (!class_exists($classname)) - throw new Exception('Could not find field presentation plugin [' . $classname . ']: No class found'); - $presentationHandler = new $classname($availdelimiters, $fieldpresConfig->getValue('config'), $t); - - return $presentationHandler->getPresentation(); - } - - return array(); - } - - public function getDelimiterPresentationPie() { - $topdelimiters = $this->getTopDelimiters(); - $delimiterPresentation = $this->getDelimiterPresentation(); - - $pieaxis = array(); - foreach($topdelimiters AS $key) { - $keyName = $key; - if(array_key_exists($key, $delimiterPresentation)) $keyName = $delimiterPresentation[$key]; - $pieaxis[] = $keyName; - } - $pieaxis[] = 'Others'; - return $pieaxis; - } - - - - public function loadData() { - - $statdir = $this->statconfig->getValue('statdir'); - $resarray = array(); - $rules = SimpleSAML\Utils\Arrays::arrayize($this->ruleid); - foreach($rules AS $rule) { - // Get file and extract results. - $resultFileName = $statdir . '/' . $rule . '-' . $this->timeres . '-'. $this->fileslot . '.stat'; - if (!file_exists($resultFileName)) - throw new Exception('Aggregated statitics file [' . $resultFileName . '] not found.'); - if (!is_readable($resultFileName)) - throw new Exception('Could not read statitics file [' . $resultFileName . ']. Bad file permissions?'); - $resultfile = file_get_contents($resultFileName); - $newres = unserialize($resultfile); - if (empty($newres)) - throw new Exception('Aggregated statistics in file [' . $resultFileName . '] was empty.'); - $resarray[] = $newres; - } - - $combined = $resarray[0]; - $count = count($resarray); - if($count > 1) { - for($i = 1; $i < $count; $i++) { - $combined = $this->combine($combined, $resarray[$i]); - } - } - $this->results = $combined; - } +class sspmod_statistics_StatDataset +{ + + protected $statconfig; + protected $ruleconfig; + protected $timeresconfig; + protected $ruleid; + + protected $fileslot; + protected $timeres; + + protected $delimiter; + protected $results; + protected $summary; + protected $max; + + protected $datehandlerFile; + protected $datehandlerTick; + + + /** + * Constructor + */ + public function __construct($statconfig, $ruleconfig, $ruleid, $timeres, $fileslot) + { + assert('$statconfig instanceof SimpleSAML_Configuration'); + assert('$ruleconfig instanceof SimpleSAML_Configuration'); + $this->statconfig = $statconfig; + $this->ruleconfig = $ruleconfig; + + $timeresconfigs = $statconfig->getConfigItem('timeres'); + $this->timeresconfig = $timeresconfigs->getConfigItem($timeres); + + $this->ruleid = $ruleid; + $this->fileslot = $fileslot; + $this->timeres = $timeres; + + $this->delimiter = '_'; + $this->max = 0; + + $this->datehandlerTick = new sspmod_statistics_DateHandler($this->statconfig->getValue('offset', 0)); + if ($this->timeresconfig->getValue('customDateHandler', 'default') === 'month') { + $this->datehandlerFile = new sspmod_statistics_DateHandlerMonth(0); + } else { + $this->datehandlerFile = $this->datehandlerTick; + } + + $this->loadData(); + } + + + public function getFileSlot() + { + return $this->fileslot; + } + + + public function getTimeRes() + { + return $this->timeres; + } + + + public function setDelimiter($delimiter = '_') + { + if (empty($delimiter)) { + $delimiter = '_'; + } + $this->delimiter = $delimiter; + } + + + public function getDelimiter() + { + if ($this->delimiter === '_') { + return null; + } + return $this->delimiter; + } + + + public function calculateMax() + { + $maxvalue = 0; + foreach ($this->results as $slot => &$res) { + if (!array_key_exists($this->delimiter, $res)) { + $res[$this->delimiter] = 0; + } + $maxvalue = max($res[$this->delimiter], $maxvalue); + } + $this->max = sspmod_statistics_Graph_GoogleCharts::roof($maxvalue); + } + + + public function getDebugData() + { + $debugdata = array(); + + $slotsize = $this->timeresconfig->getValue('slot'); + $dateformat_intra = $this->timeresconfig->getValue('dateformat-intra'); + + foreach ($this->results as $slot => &$res) { + $debugdata[$slot] = array( + $this->datehandlerTick->prettyDateSlot($slot, $slotsize, $dateformat_intra), + $res[$this->delimiter] + ); + } + return $debugdata; + } + + + public function aggregateSummary() + { + // aggregate summary table from dataset. To be used in the table view + $this->summary = array(); + foreach ($this->results as $slot => $res) { + foreach ($res as $key => $value) { + if (array_key_exists($key, $this->summary)) { + $this->summary[$key] += $value; + } else { + $this->summary[$key] = $value; + } + } + } + asort($this->summary); + $this->summary = array_reverse($this->summary, true); + } + + + public function getTopDelimiters() + { + // create a list of delimiter keys that has the highest total summary in this period + $topdelimiters = array(); + $maxdelimiters = 4; + $i = 0; + foreach ($this->summary as $key => $value) { + if ($key !== '_') { + $topdelimiters[] = $key; + } + if ($i++ >= $maxdelimiters) { + break; + } + } + return $topdelimiters; + } + + + public function availDelimiters() + { + $availDelimiters = array(); + foreach ($this->summary as $key => $value) { + $availDelimiters[$key] = 1; + } + return array_keys($availDelimiters); + } + + + public function getPieData() + { + $piedata = array(); + $sum = 0; + $topdelimiters = $this->getTopDelimiters(); + + foreach ($topdelimiters as $td) { + $sum += $this->summary[$td]; + $piedata[] = number_format(100 * $this->summary[$td] / $this->summary['_'], 2); + } + $piedata[] = number_format(100 - 100 * ($sum / $this->summary['_']), 2); + return $piedata; + } + + + public function getMax() + { + return $this->max; + } + + + public function getSummary() + { + return $this->summary; + } + + + public function getResults() + { + return $this->results; + } + + + public function getAxis() + { + $slotsize = $this->timeresconfig->getValue('slot'); + $dateformat_period = $this->timeresconfig->getValue('dateformat-period'); + $dateformat_intra = $this->timeresconfig->getValue('dateformat-intra'); + $axislabelint = $this->timeresconfig->getValue('axislabelint'); + + $axis = array(); + $axispos = array(); + $xentries = count($this->results); + $lastslot = 0; + $i = 0; + + foreach ($this->results as $slot => $res) { + // check if there should be an axis here... + if ($slot % $axislabelint == 0) { + $axis[] = $this->datehandlerTick->prettyDateSlot($slot, $slotsize, $dateformat_intra); + $axispos[] = (($i) / ($xentries - 1)); + } + $lastslot = $slot; + $i++; + } + + $axis[] = $this->datehandlerTick->prettyDateSlot($lastslot + 1, $slotsize, $dateformat_intra); + + return array('axis' => $axis, 'axispos' => $axispos); + } + + + /* + * Walk through dataset to get percent values from max into dataset[]. + */ + public function getPercentValues() + { + $i = 0; + $dataset = array(); + foreach ($this->results as $slot => $res) { + if (array_key_exists($this->delimiter, $res)) { + if ($res[$this->delimiter] === null) { + $dataset[] = -1; + } else { + $dataset[] = number_format(100 * $res[$this->delimiter] / $this->max, 2); + } + } else { + $dataset[] = '0'; + } + $i++; + } + + return $dataset; + } + + + public function getDelimiterPresentation() + { + $config = SimpleSAML_Configuration::getInstance(); + $t = new SimpleSAML_XHTML_Template($config, 'statistics:statistics-tpl.php'); + + $availdelimiters = $this->availDelimiters(); + + // create a delimiter presentation filter for this rule... + if ($this->ruleconfig->hasValue('fieldPresentation')) { + $fieldpresConfig = $this->ruleconfig->getConfigItem('fieldPresentation'); + $classname = SimpleSAML_Module::resolveClass( + $fieldpresConfig->getValue('class'), + 'Statistics_FieldPresentation' + ); + if (!class_exists($classname)) { + throw new Exception('Could not find field presentation plugin ['.$classname.']: No class found'); + } + $presentationHandler = new $classname($availdelimiters, $fieldpresConfig->getValue('config'), $t); + + return $presentationHandler->getPresentation(); + } + + return array(); + } + + + public function getDelimiterPresentationPie() + { + $topdelimiters = $this->getTopDelimiters(); + $delimiterPresentation = $this->getDelimiterPresentation(); + + $pieaxis = array(); + foreach ($topdelimiters as $key) { + $keyName = $key; + if (array_key_exists($key, $delimiterPresentation)) { + $keyName = $delimiterPresentation[$key]; + } + $pieaxis[] = $keyName; + } + $pieaxis[] = 'Others'; + return $pieaxis; + } + + + public function loadData() + { + $statdir = $this->statconfig->getValue('statdir'); + $resarray = array(); + $rules = SimpleSAML\Utils\Arrays::arrayize($this->ruleid); + foreach ($rules as $rule) { + // Get file and extract results. + $resultFileName = $statdir.'/'.$rule.'-'.$this->timeres.'-'.$this->fileslot.'.stat'; + if (!file_exists($resultFileName)) { + throw new Exception('Aggregated statitics file ['.$resultFileName.'] not found.'); + } + if (!is_readable($resultFileName)) { + throw new Exception('Could not read statitics file ['.$resultFileName.']. Bad file permissions?'); + } + $resultfile = file_get_contents($resultFileName); + $newres = unserialize($resultfile); + if (empty($newres)) { + throw new Exception('Aggregated statistics in file ['.$resultFileName.'] was empty.'); + } + $resarray[] = $newres; + } + + $combined = $resarray[0]; + $count = count($resarray); + if ($count > 1) { + for ($i = 1; $i < $count; $i++) { + $combined = $this->combine($combined, $resarray[$i]); + } + } + $this->results = $combined; + } }