StatementListPatcher::patchStatementList()   A
last analyzed

Complexity

Conditions 6
Paths 6

Size

Total Lines 30
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 19
c 0
b 0
f 0
nc 6
nop 2
dl 0
loc 30
rs 9.0111
1
<?php
2
3
namespace Wikibase\DataModel\Services\Diff;
4
5
use Diff\DiffOp\Diff\Diff;
6
use Diff\DiffOp\DiffOpAdd;
7
use Diff\DiffOp\DiffOpChange;
8
use Diff\DiffOp\DiffOpRemove;
9
use Diff\Patcher\PatcherException;
10
use Wikibase\DataModel\Statement\Statement;
11
use Wikibase\DataModel\Statement\StatementList;
12
13
/**
14
 * @since 3.6
15
 *
16
 * @license GPL-2.0-or-later
17
 * @author Jeroen De Dauw < [email protected] >
18
 * @author Thiemo Kreuz
19
 */
20
class StatementListPatcher {
21
22
	/**
23
	 * @since 3.6
24
	 *
25
	 * @param StatementList $statements
26
	 * @param Diff $patch
27
	 *
28
	 * @throws PatcherException
29
	 */
30
	public function patchStatementList( StatementList $statements, Diff $patch ) {
31
		/**
32
		 * @var Statement $statement
33
		 * @var Statement $oldStatement
34
		 * @var Statement $newStatement
35
		 */
36
37
		foreach ( $patch as $diffOp ) {
38
			switch ( true ) {
39
				case $diffOp instanceof DiffOpAdd:
40
					$statement = $diffOp->getNewValue();
41
					$guid = $statement->getGuid();
42
					if ( $statements->getFirstStatementWithGuid( $guid ) === null ) {
43
						$statements->addStatement( $statement );
44
					}
45
					break;
46
47
				case $diffOp instanceof DiffOpChange:
48
					$oldStatement = $diffOp->getOldValue();
49
					$newStatement = $diffOp->getNewValue();
50
					$this->changeStatement( $statements, $oldStatement->getGuid(), $newStatement );
51
					break;
52
53
				case $diffOp instanceof DiffOpRemove:
54
					$statement = $diffOp->getOldValue();
55
					$statements->removeStatementsWithGuid( $statement->getGuid() );
56
					break;
57
58
				default:
59
					throw new PatcherException( 'Invalid statement list diff' );
60
			}
61
		}
62
	}
63
64
	/**
65
	 * @param StatementList $statements
66
	 * @param string|null $oldGuid
67
	 * @param Statement $newStatement
68
	 */
69
	private function changeStatement( StatementList $statements, $oldGuid, Statement $newStatement ) {
70
		foreach ( $statements->toArray() as $index => $statement ) {
71
			if ( $statement->getGuid() === $oldGuid ) {
72
				$statements->removeStatementsWithGuid( $oldGuid );
73
				$statements->addStatement( $newStatement, $index );
74
				return;
75
			}
76
		}
77
	}
78
79
}
80