StatementSerializer::getSerialized()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 8
cts 8
cp 1
rs 9.8333
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Wikibase\DataModel\Serializers;
4
5
use Serializers\DispatchableSerializer;
6
use Serializers\Exceptions\SerializationException;
7
use Serializers\Exceptions\UnsupportedObjectException;
8
use Serializers\Serializer;
9
use Wikibase\DataModel\Snak\Snak;
10
use Wikibase\DataModel\Snak\SnakList;
11
use Wikibase\DataModel\Statement\Statement;
12
13
/**
14
 * Package private
15
 *
16
 * @license GPL-2.0-or-later
17
 * @author Thomas Pellissier Tanon
18
 */
19
class StatementSerializer implements DispatchableSerializer {
20
21
	private $rankLabels = [
22
		Statement::RANK_DEPRECATED => 'deprecated',
23
		Statement::RANK_NORMAL => 'normal',
24
		Statement::RANK_PREFERRED => 'preferred'
25
	];
26
27
	/**
28
	 * @var Serializer
29
	 */
30
	private $mainSnakSerializer;
31
32
	/**
33
	 * @var Serializer
34
	 */
35
	private $qualifierSnaksSerializer;
36
37
	/**
38
	 * @var Serializer
39
	 */
40
	private $referencesSerializer;
41
42 38
	public function __construct(
43
		Serializer $mainSnakSerializer,
44
		Serializer $qualifierSnaksSerializer,
45
		Serializer $referencesSerializer
46
	) {
47 38
		$this->mainSnakSerializer = $mainSnakSerializer;
48 38
		$this->qualifierSnaksSerializer = $qualifierSnaksSerializer;
49 38
		$this->referencesSerializer = $referencesSerializer;
50 38
	}
51
52
	/**
53
	 * @see Serializer::isSerializerFor
54
	 *
55
	 * @param mixed $object
56
	 *
57
	 * @return bool
58
	 */
59 26
	public function isSerializerFor( $object ) {
60 26
		return $object instanceof Statement;
61
	}
62
63
	/**
64
	 * @see Serializer::serialize
65
	 *
66
	 * @param Statement $object
67
	 *
68
	 * @throws SerializationException
69
	 * @return array
70
	 */
71 22
	public function serialize( $object ) {
72 22
		if ( !$this->isSerializerFor( $object ) ) {
73 3
			throw new UnsupportedObjectException(
74 3
				$object,
75 3
				'StatementSerializer can only serialize Statement objects'
76
			);
77
		}
78
79 19
		return $this->getSerialized( $object );
80
	}
81
82 19
	private function getSerialized( Statement $statement ) {
83
		$serialization = [
84 19
			'mainsnak' => $this->mainSnakSerializer->serialize( $statement->getMainSnak() ),
85 19
			'type' => 'statement'
86
		];
87
88 19
		$this->addQualifiersToSerialization( $statement, $serialization );
89 19
		$this->addGuidToSerialization( $statement, $serialization );
90 19
		$this->addRankToSerialization( $statement, $serialization );
91 19
		$this->addReferencesToSerialization( $statement, $serialization );
92
93 19
		return $serialization;
94
	}
95
96 19
	private function addGuidToSerialization( Statement $statement, array &$serialization ) {
97 19
		$guid = $statement->getGuid();
98 19
		if ( $guid !== null ) {
99 5
			$serialization['id'] = $guid;
100
		}
101 19
	}
102
103 19
	private function addRankToSerialization( Statement $statement, array &$serialization ) {
104 19
		$serialization['rank'] = $this->rankLabels[$statement->getRank()];
105 19
	}
106
107 19
	private function addReferencesToSerialization( Statement $statement, array &$serialization ) {
108 19
		$references = $statement->getReferences();
109
110 19
		if ( $references->count() != 0 ) {
111 2
			$serialization['references'] = $this->referencesSerializer->serialize(
112 2
				$statement->getReferences()
113
			);
114
		}
115 19
	}
116
117 19
	private function addQualifiersToSerialization( Statement $statement, &$serialization ) {
118 19
		$qualifiers = $statement->getQualifiers();
119
120 19
		if ( $qualifiers->count() !== 0 ) {
121 3
			$serialization['qualifiers'] = $this->qualifierSnaksSerializer->serialize( $qualifiers );
122 3
			$serialization['qualifiers-order'] = $this->buildQualifiersOrderList( $qualifiers );
123
		}
124 19
	}
125
126 3
	private function buildQualifiersOrderList( SnakList $snaks ) {
127 3
		$list = [];
128
129
		/**
130
		 * @var Snak $snak
131
		 */
132 3
		foreach ( $snaks as $snak ) {
133 3
			$id = $snak->getPropertyId()->getSerialization();
134 3
			if ( !in_array( $id, $list ) ) {
135 3
				$list[] = $id;
136
			}
137
		}
138
139 3
		return $list;
140
	}
141
142
}
143