00001 <?php
00002
00015 class SRFMath extends SMWResultPrinter {
00016
00021 public function getName() {
00022 return wfMsg( 'srf_printername_' . $this->mFormat );
00023 }
00024
00029 public function getResult( SMWQueryResult $results, array $params, $outputmode ) {
00030 $this->handleParameters( $params, $outputmode );
00031 global $wgLang;
00032 return $wgLang->formatNum( $this->getResultText( $results, SMW_OUTPUT_HTML ) );
00033 }
00034
00039 protected function getResultText( SMWQueryResult $res, $outputmode ) {
00040 $numbers = $this->getNumbers( $res );
00041
00042 if ( count( $numbers ) == 0 ) {
00043 return $this->params['default'];
00044 }
00045
00046 switch ( $this->mFormat ) {
00047 case 'max':
00048 return max( $numbers );
00049 break;
00050 case 'min':
00051 return min( $numbers );
00052 break;
00053 case 'sum':
00054 return array_sum( $numbers );
00055 break;
00056 case 'product':
00057 return array_product( $numbers );
00058 break;
00059 case 'average':
00060 return array_sum( $numbers ) / count( $numbers );
00061 break;
00062 case 'median':
00063 sort( $numbers, SORT_NUMERIC );
00064 $position = ( count( $numbers ) + 1 ) / 2 - 1;
00065 return ( $numbers[ceil( $position )] + $numbers[floor( $position )] ) / 2;
00066 break;
00067 }
00068 }
00069
00079 protected function getNumbers( SMWQueryResult $res ) {
00080 $numbers = array();
00081
00082 while ( $row = $res->getNext() ) {
00083 foreach( $row as $resultArray ) {
00084 foreach ( $resultArray->getContent() as $dataItem ) {
00085 self::addNumbersForDataItem( $dataItem, $numbers );
00086 }
00087 }
00088 }
00089
00090 return $numbers;
00091 }
00092
00101 public static function addNumbersForDataItem( SMWDataItem $dataItem, array &$numbers ) {
00102 switch ( $dataItem->getDIType() ) {
00103 case SMWDataItem::TYPE_NUMBER:
00104 $numbers[] = $dataItem->getNumber();
00105 break;
00106 case SMWDataItem::TYPE_CONTAINER:
00107 foreach ( $dataItem->getDataItems() as $di ) {
00108 self::addNumbersForDataItem( $di, $numbers );
00109 }
00110 break;
00111 default:
00112 }
00113 }
00114
00119 public function getParameters() {
00120 $params = parent::getParameters();
00121
00122 $params['limit'] = new Parameter( 'limit', Parameter::TYPE_INTEGER );
00123 $params['limit']->setMessage( 'srf_paramdesc_limit' );
00124 $params['limit']->setDefault( 1000 );
00125
00126 $params['default'] = new Parameter( 'default' );
00127 $params['default']->setMessage( 'srf-paramdesc-default' );
00128 $params['default']->setDefault( '' );
00129
00130 return $params;
00131 }
00132
00133 }