Completed
Push — master ( 2a3272...f39d74 )
by Thomas
08:55
created

WikidataRequestHandler::buildResponse()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 29
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2.4066

Importance

Changes 12
Bugs 0 Features 2
Metric Value
c 12
b 0
f 2
dl 0
loc 29
ccs 8
cts 15
cp 0.5333
rs 8.8571
cc 2
eloc 19
nc 2
nop 1
crap 2.4066
1
<?php
2
3
namespace PPP\Wikidata;
4
5
use Doctrine\Common\Cache\Cache;
6
use Mediawiki\Api\MediawikiApi;
7
use PPP\DataModel\AbstractNode;
8
use PPP\DataModel\ResourceListNode;
9
use PPP\Module\AbstractRequestHandler;
10
use PPP\Module\DataModel\ModuleRequest;
11
use PPP\Module\DataModel\ModuleResponse;
12
use PPP\Module\TreeSimplifier\NodeSimplifierFactory;
13
use PPP\Wikidata\TreeSimplifier\WikibaseNodeSimplifierFactory;
14
use PPP\Wikidata\ValueFormatters\WikibaseResourceNodeFormatterFactory;
15
use Wikibase\EntityStore\Config\EntityStoreFromConfigurationBuilder;
16
use Wikibase\EntityStore\EntityStore;
17
18
/**
19
 * Module entry point.
20
 *
21
 * @licence GPLv2+
22
 * @author Thomas Pellissier Tanon
23
 */
24
class WikidataRequestHandler extends AbstractRequestHandler {
25
26
	/**
27
	 * @var EntityStore
28
	 */
29
	public $entityStore;
30
31
	/**
32
	 * @var MediawikiApi[]
33
	 */
34
	private $sitesApi;
35
36
	/**
37
	 * @var Cache
38
	 */
39
	public $cache;
40
41
	/**
42
	 * @var int
43
	 */
44
	private $requestStartTime;
45
46
	/**
47
	 * @param $configFileName
48
	 * @param string[] $sitesUrls
49
	 */
50 1
	public function __construct($configFileName, array $sitesUrls) {
51
		$configurationBuilder = new EntityStoreFromConfigurationBuilder();
52
		$this->entityStore = $configurationBuilder->buildEntityStore($configFileName);
53
		$this->cache = $configurationBuilder->buildCache($configFileName);
54
		$this->requestStartTime = time();
55
56 1
		$this->sitesApi = array();
57
		foreach($sitesUrls as $siteId => $url) {
58
			$this->sitesApi[$siteId] = new MediawikiApi($url);
59
		}
60
	}
61
62
	/**
63
	 * @see RequestHandler::buildResponse
64
	 */
65 19
	public function buildResponse(ModuleRequest $request) {
66
		$simplifiedTree = $this->buildTreeSimplifier($request->getLanguageCode())->simplify($request->getSentenceTree());
67
68
		$formattedTree = $this->buildNodeFormatter($request->getLanguageCode())->simplify($simplifiedTree);
69
70
		if($formattedTree->equals(new ResourceListNode())) {
71 3
			return array();
72
		}
73
74
		$measures = $this->buildMeasures($formattedTree, $request->getMeasures());
75
76
		$trace = $request->getTrace();
77
		array_unshift($trace, array(
78 16
			'module' => 'Wikidata',
79
			'tree' => $formattedTree,
80
			'measures' => $measures,
81
			'times' => array(
82 16
				'start' => $this->requestStartTime,
83 16
				'end' => time()
84 16
			)
85
		));
86
87
		return array(new ModuleResponse(
88 16
			$request->getLanguageCode(),
89
			$formattedTree,
90
			$measures,
91
			$trace
92
		));
93 19
	}
94
95 16
	private function buildMeasures(AbstractNode $node, array $measures) {
96
		if(array_key_exists('accuracy', $measures)) {
97 1
			$measures['accuracy'] /= 2;
98
		}
99
100 16
		if($node instanceof ResourceListNode) {
101 14
			$measures['relevance'] = 1;
102
		}
103
104 16
		return $measures;
105 16
	}
106
107 19
	private function buildTreeSimplifier($languageCode) {
108
		$factory = new WikibaseNodeSimplifierFactory(
109 19
			$this->entityStore,
110
			$languageCode
111
		);
112
		return $factory->newNodeSimplifier();
113
	}
114
115
	private function buildNodeFormatter($languageCode) {
116
		$formatterFactory = new WikibaseResourceNodeFormatterFactory($languageCode, $this->entityStore, $this->sitesApi, $this->cache);
117
		$simplifierFactory = new NodeSimplifierFactory(array(
118
			new ResourceListNodeFormatter($formatterFactory->newWikibaseResourceNodeFormatter())
119
		));
120
		return $simplifierFactory->newNodeSimplifier();
121
	}
122
}
123