Skip to content

Commit a6544a5

Browse files
committed
Add filter method to StatementList
This fixes #505
1 parent 200e88f commit a6544a5

5 files changed

Lines changed: 147 additions & 0 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Wikibase\DataModel\Statement;
4+
5+
/**
6+
* @since 4.1
7+
*
8+
* @licence GNU GPL v2+
9+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
10+
*/
11+
class ReferencedStatementFilter implements StatementFilter {
12+
13+
/**
14+
* @param Statement $statement
15+
*
16+
* @return boolean
17+
*/
18+
public function statementMatches( Statement $statement ) {
19+
return count( $statement->getReferences() ) !== 0;
20+
}
21+
22+
}

src/Statement/StatementFilter.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Wikibase\DataModel\Statement;
4+
5+
/**
6+
* @since 4.1
7+
*
8+
* @licence GNU GPL v2+
9+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
10+
*/
11+
interface StatementFilter {
12+
13+
/**
14+
* @param Statement $statement
15+
*
16+
* @return boolean
17+
*/
18+
public function statementMatches( Statement $statement );
19+
20+
}

src/Statement/StatementList.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,4 +306,23 @@ public function getFirstStatementWithGuid( $statementGuid ) {
306306
return null;
307307
}
308308

309+
/**
310+
* @since 4.1
311+
*
312+
* @param StatementFilter $filter
313+
*
314+
* @return self
315+
*/
316+
public function filter( StatementFilter $filter ) {
317+
$statementList = new self();
318+
319+
foreach ( $this->statements as $statement ) {
320+
if ( $filter->statementMatches( $statement ) ) {
321+
$statementList->addStatement( $statement );
322+
}
323+
}
324+
325+
return $statementList;
326+
}
327+
309328
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
namespace Wikibase\DataModel\Tests\Statement;
4+
5+
use DataValues\StringValue;
6+
use Wikibase\DataModel\Claim\Claims;
7+
use Wikibase\DataModel\Entity\PropertyId;
8+
use Wikibase\DataModel\Reference;
9+
use Wikibase\DataModel\ReferenceList;
10+
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
11+
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
12+
use Wikibase\DataModel\Snak\PropertyValueSnak;
13+
use Wikibase\DataModel\Snak\SnakList;
14+
use Wikibase\DataModel\Statement\ReferencedStatementFilter;
15+
use Wikibase\DataModel\Statement\Statement;
16+
use Wikibase\DataModel\Statement\StatementList;
17+
18+
/**
19+
* @covers Wikibase\DataModel\Statement\ReferencedStatementFilter
20+
*
21+
* @licence GNU GPL v2+
22+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
23+
*/
24+
class ReferencedStatementFilterTest extends \PHPUnit_Framework_TestCase {
25+
26+
public function testReturnsFalseForMinimalStatement() {
27+
$filter = new ReferencedStatementFilter();
28+
$this->assertFalse( $filter->statementMatches( new Statement( new PropertyNoValueSnak( 42 ) ) ) );
29+
}
30+
31+
public function testReturnsFalseForVerboseStatementWithoutReferences() {
32+
$statement = new Statement( new PropertyValueSnak( 42, new StringValue( '\o/' ) ) );
33+
$statement->setGuid( 'kittens of doom' );
34+
$statement->setRank( Statement::RANK_PREFERRED );
35+
$statement->setQualifiers( new SnakList( array(
36+
new PropertyValueSnak( 1, new StringValue( 'wee' ) ),
37+
new PropertyValueSnak( 2, new StringValue( 'woo' ) ),
38+
new PropertyValueSnak( 3, new StringValue( 'waa' ) )
39+
) ) );
40+
41+
$filter = new ReferencedStatementFilter();
42+
$this->assertFalse( $filter->statementMatches( $statement ) );
43+
}
44+
45+
public function testReturnsTrueForMinimalStatementWithReferences() {
46+
$statement = new Statement( new PropertyValueSnak( 42, new StringValue( '\o/' ) ) );
47+
$statement->setReferences( new ReferenceList( array(
48+
new Reference( array(
49+
new PropertyValueSnak( 1, new StringValue( 'wee' ) )
50+
) ),
51+
new Reference( array(
52+
new PropertyValueSnak( 2, new StringValue( 'woo' ) ),
53+
new PropertyValueSnak( 3, new StringValue( 'waa' ) )
54+
) )
55+
) ) );
56+
57+
$filter = new ReferencedStatementFilter();
58+
$this->assertTrue( $filter->statementMatches( $statement ) );
59+
}
60+
61+
}

tests/unit/Statement/StatementListTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
use DataValues\StringValue;
66
use Wikibase\DataModel\Claim\Claims;
77
use Wikibase\DataModel\Entity\PropertyId;
8+
use Wikibase\DataModel\Reference;
9+
use Wikibase\DataModel\ReferenceList;
810
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
911
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
1012
use Wikibase\DataModel\Snak\PropertyValueSnak;
1113
use Wikibase\DataModel\Snak\SnakList;
14+
use Wikibase\DataModel\Statement\ReferencedStatementFilter;
1215
use Wikibase\DataModel\Statement\Statement;
1316
use Wikibase\DataModel\Statement\StatementList;
1417

@@ -626,4 +629,26 @@ public function testGivenInvalidGuid_getFirstStatementWithGuidReturnsNull() {
626629
$this->assertNull( $statements->getFirstStatementWithGuid( false ) );
627630
}
628631

632+
public function testFilter() {
633+
$statement1 = new Statement( new PropertyNoValueSnak( 1 ) );
634+
$statement2 = new Statement( new PropertyNoValueSnak( 2 ) );
635+
$statement3 = new Statement( new PropertyNoValueSnak( 3 ) );
636+
$statement4 = new Statement( new PropertyNoValueSnak( 4 ) );
637+
638+
$statement2->setReferences( new ReferenceList( array(
639+
new Reference( array( new PropertyNoValueSnak( 20 ) ) )
640+
) ) );
641+
642+
$statement3->setReferences( new ReferenceList( array(
643+
new Reference( array( new PropertyNoValueSnak( 30 ) ) )
644+
) ) );
645+
646+
$statements = new StatementList( $statement1, $statement2, $statement3, $statement4 );
647+
648+
$this->assertEquals(
649+
new StatementList( $statement2, $statement3 ),
650+
$statements->filter( new ReferencedStatementFilter() )
651+
);
652+
}
653+
629654
}

0 commit comments

Comments
 (0)