Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
92.86% covered (success)
92.86%
26 / 28
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
SuggesterParamsParser
92.86% covered (success)
92.86%
26 / 28
50.00% covered (danger)
50.00%
1 / 2
7.02
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 parseAndValidate
92.31% covered (success)
92.31%
24 / 26
0.00% covered (danger)
0.00%
0 / 1
6.02
1<?php
2
3namespace PropertySuggester;
4
5use MediaWiki\Status\Status;
6
7/**
8 * Parses the suggester parameters
9 *
10 * @author BP2013N2
11 * @license GPL-2.0-or-later
12 */
13class SuggesterParamsParser {
14
15    /**
16     * @var int
17     */
18    private $defaultSuggestionLimit;
19
20    /**
21     * @var float
22     */
23    private $defaultMinProbability;
24
25    /**
26     * @param int $defaultSuggestionLimit
27     * @param float $defaultMinProbability
28     */
29    public function __construct( $defaultSuggestionLimit, $defaultMinProbability ) {
30        $this->defaultSuggestionLimit = $defaultSuggestionLimit;
31        $this->defaultMinProbability = $defaultMinProbability;
32    }
33
34    /**
35     * parses and validates the parameters of GetSuggestion
36     * @param array $params
37     * @return Status containing SuggesterParams
38     */
39    public function parseAndValidate( array $params ): Status {
40        $result = new SuggesterParams();
41
42        $result->entity = $params['entity'];
43        $result->properties = $params['properties'];
44
45        if ( !( $result->entity xor $result->properties ) ) {
46            return Status::newFatal( 'propertysuggester-wbsgetsuggestions-either-entity-or-properties' );
47        }
48
49        $result->types = $params['types'];
50
51        // The entityselector doesn't allow a search for '' so '*' gets mapped to ''
52        if ( $params['search'] !== '*' ) {
53            $result->search = trim( $params['search'] );
54        } else {
55            $result->search = '';
56        }
57
58        $result->limit = $params['limit'];
59        $result->continue = (int)$params['continue'];
60        $result->resultSize = $result->limit + $result->continue;
61
62        if ( $result->resultSize > $this->defaultSuggestionLimit ) {
63            $result->resultSize = $this->defaultSuggestionLimit;
64        }
65
66        $result->language = $params['language'];
67        $result->context = $params['context'];
68
69        if ( $result->search ) {
70            // the results matching '$search' can be at the bottom of the list
71            // however very low ranked properties are not interesting and can
72            // still be found during the merge with search result later.
73            $result->suggesterLimit = $this->defaultSuggestionLimit;
74            $result->minProbability = 0.0;
75        } else {
76            $result->suggesterLimit = $result->resultSize;
77            $result->minProbability = $this->defaultMinProbability;
78        }
79
80        if ( $params['include'] === 'all' ) {
81            $result->include = 'all';
82        } else {
83            $result->include = '';
84        }
85
86        $result->event = $params['event'];
87
88        return Status::newGood( $result );
89    }
90
91}