jenkins-bot has submitted this change and it was merged.

Change subject: \SMW\AggregatablePrinter use an explicit indicator to aggregate 
numbers
......................................................................


\SMW\AggregatablePrinter use an explicit indicator to aggregate numbers

We do not assume a specific grouping preference, rather expect an explicit
decision on how numbers should be aggregated.

## Parameter
|aggregation=property (subject by default) to determine grouping preference

Change-Id: I6cce1067cc3db5892d007cf170bd60d6d6927bdf
---
M includes/queryprinters/AggregatablePrinter.php
M tests/phpunit/MockObjectRepository.php
M tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
3 files changed, 196 insertions(+), 38 deletions(-)

Approvals:
  Mwjames: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/includes/queryprinters/AggregatablePrinter.php 
b/includes/queryprinters/AggregatablePrinter.php
index 2428f67..cc4a442 100644
--- a/includes/queryprinters/AggregatablePrinter.php
+++ b/includes/queryprinters/AggregatablePrinter.php
@@ -173,10 +173,15 @@
 
                                foreach ( $subject as $field ) {
 
+                                       // Use the aggregation parameter to 
determine the source of
+                                       // the number composition
+                                       if ( $this->params['aggregation'] === 
'property' ) {
+                                               $name = 
$field->getPrintRequest()->getLabel();
+                                       }
+
                                        // Aggregated array key depends on the 
mainlabel which is
                                        // either the subject or a printout 
property
                                        if ( $this->params['mainlabel'] === '-' 
) {
-                                               $name = 
$field->getPrintRequest()->getLabel();
 
                                                // In case of '-', 
getNextDataValue() already shifted the
                                                // array forward which means 
the first column
@@ -262,6 +267,12 @@
                        'lowerbound' => 1,
                );
 
+               $definitions['aggregation'] = array(
+                       'message' => 'smw-paramdesc-aggregation',
+                       'default' => 'subject',
+                       'values' => array( 'property', 'subject' ),
+               );
+
                return $definitions;
        }
 
diff --git a/tests/phpunit/MockObjectRepository.php 
b/tests/phpunit/MockObjectRepository.php
index 99f7261..1729ddf 100644
--- a/tests/phpunit/MockObjectRepository.php
+++ b/tests/phpunit/MockObjectRepository.php
@@ -1046,6 +1046,10 @@
                        ->will( $this->returnValue( $this->builder->setValue( 
'getText', $this->builder->newRandomString( 10, 'Auto-printRequest' ) ) ) );
 
                $printRequest->expects( $this->any() )
+                       ->method( 'getLabel' )
+                       ->will( $this->returnValue( $this->builder->setValue( 
'getLabel' ) ) );
+
+               $printRequest->expects( $this->any() )
                        ->method( 'getMode' )
                        ->will( $this->returnValue( $this->builder->setValue( 
'getMode', SMWPrintRequest::PRINT_THIS ) ) );
 
diff --git a/tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php 
b/tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
index df98934..c50512e 100644
--- a/tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
+++ b/tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
@@ -5,8 +5,6 @@
 use SMWDataItem;
 use SMWDINumber;
 
-use ReflectionClass;
-
 /**
  * Tests for the AggregatablePrinter class
  *
@@ -38,57 +36,35 @@
        }
 
        /**
-        * Helper method that returns a SMWQueryResult object
-        *
-        * @since 1.9
-        *
-        * @return SMWQueryResult
-        */
-       private function getMockQueryResult( $error = 'Bar' ) {
-
-               $queryResult = $this->getMockBuilder( 'SMWQueryResult' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-
-               $queryResult->expects( $this->any() )
-                       ->method( 'getErrors' )
-                       ->will( $this->returnValue( array( $error ) ) );
-
-               return $queryResult;
-       }
-
-       /**
         * Helper method that returns a AggregatablePrinter object
         *
         * @return AggregatablePrinter
         */
-       private function getInstance( $parameters = array() ) {
-               return $this->getMockForAbstractClass( $this->getClass(), 
array( 'table' ) );
+       private function newInstance( $parameters = array() ) {
+               return $this->setParameters( $this->getMockForAbstractClass( 
$this->getClass(), array( 'table' ) ), $parameters );
        }
 
        /**
         * @test AggregatablePrinter::getResultText
+        * @dataProvider errorMessageProvider
         *
         * @since 1.9
         */
-       public function testGetResultTextErrorMessage() {
+       public function testGetResultTextErrorMessage( $setup, $expected ) {
 
-               $expectedMessage = wfMessage( 'smw-qp-aggregatable-empty-data' 
)->inContentLanguage()->text();
+               $instance    = $this->newInstance( $setup['parameters'] );
+               $queryResult = $setup['queryResult'];
 
-               $queryResult = $this->getMockQueryResult( $expectedMessage );
-
-               // Make protected method accessible
-               $reflection = new ReflectionClass( $this->getClass() );
+               $reflection = $this->newReflector();
                $method = $reflection->getMethod( 'getResultText' );
                $method->setAccessible( true );
 
-               // Invoke the instance
-               $result = $method->invoke( $this->getInstance(), $queryResult, 
SMW_OUTPUT_HTML );
+               $result = $method->invoke( $instance, $queryResult, 
SMW_OUTPUT_HTML );
 
                $this->assertEmpty( $result );
 
                foreach( $queryResult->getErrors() as $error ) {
-                       $this->assertEquals( $expectedMessage, $error );
+                       $this->assertEquals( $expected['message'], $error );
                }
        }
 
@@ -103,9 +79,8 @@
                $expected = array();
                $keys = array( 'test', 'foo', 'bar' );
 
-               // Make protected method accessible
-               $reflection = new ReflectionClass( $this->getClass() );
-               $method = $reflection->getMethod( 'addNumbersForDataItem' );
+               $reflector = $this->newReflector();
+               $method = $reflector->getMethod( 'addNumbersForDataItem' );
                $method->setAccessible( true );
 
                for ( $i = 1; $i <= 10; $i++ ) {
@@ -124,10 +99,178 @@
                        $this->assertEquals( SMWDataItem::TYPE_NUMBER, 
$dataItem->getDIType() );
 
                        // Invoke the instance
-                       $result = $method->invokeArgs( $this->getInstance(), 
array( $dataItem, &$values, $name ) );
+                       $result = $method->invokeArgs( $this->newInstance(), 
array( $dataItem, &$values, $name ) );
 
                        $this->assertInternalType( 'integer', $values[$name] );
                        $this->assertEquals( $expected[$name], $values[$name] );
                }
        }
+
+       /**
+        * @test AggregatablePrinter::getNumericResults
+        * @dataProvider numberDataProvider
+        *
+        * @since 1.9
+        */
+       public function testGetNumericResults( $setup, $expected ) {
+
+               $instance  = $this->newInstance( $setup['parameters'] );
+
+               $reflector = $this->newReflector();
+               $method = $reflector->getMethod( 'getNumericResults' );
+               $method->setAccessible( true );
+
+               $result = $method->invoke( $instance, $setup['queryResult'], 
SMW_OUTPUT_HTML );
+
+               $this->assertInternalType(
+                       'array',
+                       $result,
+                       'Asserts that getNumericResults() returns an array'
+               );
+
+               $this->assertEquals(
+                       $expected['result'],
+                       $result,
+                       'Asserts that the getNumericResults() output matches 
the expected result'
+               );
+
+       }
+
+       /**
+        * @return array
+        */
+       public function errorMessageProvider() {
+
+               $message = wfMessage( 'smw-qp-aggregatable-empty-data' 
)->inContentLanguage()->text();
+
+               $provider = array();
+
+               // #0
+               $queryResult = $this->newMockBuilder()->newObject( 
'QueryResult', array(
+                       'getErrors' => array( $message )
+               ) );
+
+               $provider[] = array(
+                       array(
+                               'parameters'  => array( 'distribution' => true 
),
+                               'queryResult' => $queryResult
+                               ),
+                       array(
+                               'message'     => $message
+                       )
+               );
+
+               // #1
+               $provider[] = array(
+                       array(
+                               'parameters'  => array( 'distribution' => false 
),
+                               'queryResult' => $queryResult
+                               ),
+                       array(
+                               'message'     => $message
+                       )
+               );
+               return $provider;
+       }
+
+       /**
+        * @return array
+        */
+       public function numberDataProvider() {
+
+               $provider = array();
+
+               $setup = array(
+                       array( 'printRequest' => 'Foo', 'number' => 10, 
'dataValue' => 'Quuey' ),
+                       array( 'printRequest' => 'Bar', 'number' => 20, 
'dataValue' => 'Quuey' ),
+                       array( 'printRequest' => 'Bar', 'number' => 20, 
'dataValue' => 'Xuuey' )
+               );
+
+               // #0 aggregation = subject
+               $parameters = array(
+                       'headers'     => SMW_HEADERS_PLAIN,
+                       'offset'      => 0,
+                       'aggregation' => 'subject',
+                       'mainlabel'   => ''
+               );
+
+               $provider[] = array(
+                       array(
+                               'parameters'  => $parameters,
+                               'queryResult' => $this->buildMockQueryResult( 
$setup )
+                               ),
+                       array(
+                               'result'      => array( 'Quuey' => 50 )
+                       )
+               );
+
+               // #1 aggregation = property
+               $parameters = array(
+                       'headers'     => SMW_HEADERS_PLAIN,
+                       'offset'      => 0,
+                       'aggregation' => 'property',
+                       'mainlabel'   => ''
+               );
+
+               $provider[] = array(
+                       array(
+                               'parameters'  => $parameters,
+                               'queryResult' => $this->buildMockQueryResult( 
$setup )
+                               ),
+                       array(
+                               'result'      => array( 'Foo' => 10, 'Bar' => 
40 )
+                       )
+               );
+
+               return $provider;
+       }
+
+       /**
+        * @return QueryResult
+        */
+       private function buildMockQueryResult( $setup ) {
+
+               $printRequests = array();
+               $resultArray   = array();
+
+               foreach ( $setup as $value ) {
+
+                       $printRequest = $this->newMockBuilder()->newObject( 
'PrintRequest', array(
+                               'getText'  => $value['printRequest'],
+                               'getLabel' => $value['printRequest']
+                       ) );
+
+                       $printRequests[] = $printRequest;
+
+                       $dataItem = $this->newMockBuilder()->newObject( 
'DataItem', array(
+                               'getDIType' => SMWDataItem::TYPE_NUMBER,
+                               'getNumber' => $value['number']
+                       ) );
+
+                       $dataValue = $this->newMockBuilder()->newObject( 
'DataValue', array(
+                               'DataValueType'    => 'SMWNumberValue',
+                               'getTypeID'        => '_num',
+                               'getShortWikiText' => $value['dataValue'],
+                               'getDataItem'      => $dataItem
+                       ) );
+
+                       $resultArray[] = $this->newMockBuilder()->newObject( 
'ResultArray', array(
+                               'getText'          => $value['printRequest'],
+                               'getPrintRequest'  => $printRequest,
+                               'getNextDataValue' => $dataValue,
+                               'getNextDataItem'  => $dataItem
+                       ) );
+
+               }
+
+               $queryResult = $this->newMockBuilder()->newObject( 
'QueryResult', array(
+                       'getPrintRequests'  => $printRequests,
+                       'getNext'           => $resultArray,
+                       'getLink'           => new \SMWInfolink( true, 'Lala' , 
'Lula' ),
+                       'hasFurtherResults' => true
+               ) );
+
+               return $queryResult;
+       }
+
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/82364
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I6cce1067cc3db5892d007cf170bd60d6d6927bdf
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/SemanticMediaWiki
Gerrit-Branch: master
Gerrit-Owner: Mwjames <[email protected]>
Gerrit-Reviewer: Jamie Thingelstad <[email protected]>
Gerrit-Reviewer: Mwjames <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to