Completed
Pull Request — master (#123)
by Valentin
07:18
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 11
Bugs 0 Features 2
Metric Value
c 11
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 17
	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 14
            "module" => "Wikidata",
79
            "tree" => $formattedTree,
80
            "measures" => $measures,
81
            "times" => array(
82 14
                "start" => $this->requestStartTime,
83 14
                "end" => time()
84 14
            )
85
        ));
86
87
		return array(new ModuleResponse(
88 14
			$request->getLanguageCode(),
89
			$formattedTree,
90
            $measures,
91
            $trace
92
		));
93 17
	}
94
95 14
	private function buildMeasures(AbstractNode $node, array $measures) {
96
		if(array_key_exists('accuracy', $measures)) {
97 1
			$measures['accuracy'] /= 2;
98
		}
99
100 14
		if($node instanceof ResourceListNode) {
101 12
			$measures['relevance'] = 1;
102
		}
103
104 14
		return $measures;
105 14
	}
106
107 17
	private function buildTreeSimplifier($languageCode) {
108
		$factory = new WikibaseNodeSimplifierFactory(
109 17
			$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