* @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; // echo 'delimiter set to ' . $delimiter; exit; } 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'); // $axislabelint = $this->ruleconfig->getValue('axislabelint'); $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'); // $axislabelint = $this->ruleconfig->getValue('axislabelint'); 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); // echo '
'; print_r($summaryDataset); exit;
	}
	
	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));		
				// echo 'set axis on [' . $slot . '] = [' . $datehandler->prettyDateSlot($slot, $slotsize, $dateformat_intra) . ']';
			}
			$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');
	
		#$max = 25;
		$xentries = count($this->results);
		$lastslot = 0; $i = 0;


		$dataset = array();
		foreach($this->results AS $slot => $res) {
			#echo ('

new value: ' . number_format(100*$res[$delimiter] / $max, 2)); // echo('


delimiter [' .$delimiter . '].'); // echo('

Res

'); print_r($res); echo( '
'); // echo('

return

'); print_r(isset($res[$delimiter]) ? $res[$delimiter] : 'NO'); echo('
'); 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'; } // foreach(array_keys($res) AS $nd) $availdelimiters[$nd] = 1; $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_Utilities::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]; if(count($resarray) > 1) { for($i = 1; $i < count($resarray); $i++) { $combined = $this->combine($combined, $resarray[$i]); } } $this->results = $combined; } }