ChangeOpQualifierRemove::__construct()   A
last analyzed

Complexity

Conditions 5
Paths 3

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.5555
c 0
b 0
f 0
cc 5
nc 3
nop 2
1
<?php
2
3
namespace Wikibase\Repo\ChangeOp;
4
5
use InvalidArgumentException;
6
use ValueValidators\Result;
7
use Wikibase\DataModel\Entity\EntityDocument;
8
use Wikibase\DataModel\Snak\Snak;
9
use Wikibase\DataModel\Snak\SnakList;
10
use Wikibase\DataModel\Statement\StatementListProvider;
11
use Wikibase\Lib\Summary;
12
13
/**
14
 * Class for qualifier removal change operation
15
 *
16
 * @license GPL-2.0-or-later
17
 * @author Addshore
18
 */
19
class ChangeOpQualifierRemove extends ChangeOpBase {
20
21
	/**
22
	 * @var string
23
	 */
24
	private $statementGuid;
25
26
	/**
27
	 * @var string
28
	 */
29
	private $snakHash;
30
31
	/**
32
	 * Constructs a new qualifier removal change operation
33
	 *
34
	 * @param string $statementGuid
35
	 * @param string $snakHash
36
	 *
37
	 * @throws InvalidArgumentException
38
	 */
39
	public function __construct( $statementGuid, $snakHash ) {
40
		if ( !is_string( $statementGuid ) || $statementGuid === '' ) {
41
			throw new InvalidArgumentException( '$statementGuid needs to be a string and must not be empty' );
42
		}
43
44
		if ( !is_string( $snakHash ) || $snakHash === '' ) {
45
			throw new InvalidArgumentException( '$snakHash needs to be a string and must not be empty' );
46
		}
47
48
		$this->statementGuid = $statementGuid;
49
		$this->snakHash = $snakHash;
50
	}
51
52
	/**
53
	 * @see ChangeOp::apply()
54
	 *
55
	 * @param EntityDocument $entity
56
	 * @param Summary|null $summary
57
	 *
58
	 * @throws InvalidArgumentException
59
	 * @throws ChangeOpException
60
	 */
61
	public function apply( EntityDocument $entity, Summary $summary = null ) {
62
		if ( !( $entity instanceof StatementListProvider ) ) {
63
			throw new InvalidArgumentException( '$entity must be a StatementListProvider' );
64
		}
65
66
		$statements = $entity->getStatements();
67
		$statement = $statements->getFirstStatementWithGuid( $this->statementGuid );
68
69
		if ( $statement === null ) {
70
			throw new ChangeOpException( "Entity does not have a statement with GUID $this->statementGuid" );
71
		}
72
73
		$qualifiers = $statement->getQualifiers();
74
75
		$this->removeQualifier( $qualifiers, $summary );
76
77
		$statement->setQualifiers( $qualifiers );
78
79
		// @phan-suppress-next-line PhanUndeclaredMethod Phan is confused by intersection types
80
		return new GenericChangeOpResult( $entity->getId(), true );
81
	}
82
83
	/**
84
	 * @param SnakList $qualifiers
85
	 * @param Summary|null $summary
86
	 *
87
	 * @throws ChangeOpException
88
	 */
89
	protected function removeQualifier( SnakList $qualifiers, Summary $summary = null ) {
90
		if ( !$qualifiers->hasSnakHash( $this->snakHash ) ) {
91
			throw new ChangeOpException( "Qualifier with hash $this->snakHash does not exist" );
92
		}
93
		$removedQualifier = $qualifiers->getSnak( $this->snakHash );
94
		$qualifiers->removeSnakHash( $this->snakHash );
95
		$this->updateSummary( $summary, 'remove', '', $this->getSnakSummaryArgs( $removedQualifier ) );
0 ignored issues
show
Bug introduced by
It seems like $removedQualifier defined by $qualifiers->getSnak($this->snakHash) on line 93 can also be of type boolean; however, Wikibase\Repo\ChangeOp\C...e::getSnakSummaryArgs() does only seem to accept object<Wikibase\DataModel\Snak\Snak>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
96
	}
97
98
	/**
99
	 * @param Snak $snak
100
	 *
101
	 * @return array
102
	 */
103
	protected function getSnakSummaryArgs( Snak $snak ) {
104
		$propertyId = $snak->getPropertyId();
105
		return [ [ $propertyId->getSerialization() => $snak ] ];
106
	}
107
108
	/**
109
	 * @see ChangeOp::validate
110
	 *
111
	 * @param EntityDocument $entity
112
	 *
113
	 * @return Result Always successful.
114
	 */
115
	public function validate( EntityDocument $entity ) {
116
		//TODO: move validation logic from apply() here.
117
		return Result::newSuccess();
118
	}
119
120
}
121