Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
85.29% covered (warning)
85.29%
29 / 34
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
FullTextKeywordRegistry
85.29% covered (warning)
85.29%
29 / 34
50.00% covered (danger)
50.00%
1 / 2
5.08
0.00% covered (danger)
0.00%
0 / 1
 __construct
84.85% covered (warning)
84.85%
28 / 33
0.00% covered (danger)
0.00%
0 / 1
4.06
 getKeywords
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace CirrusSearch\Parser;
4
5use CirrusSearch\CachedSparqlClient;
6use CirrusSearch\CirrusSearchHookRunner;
7use CirrusSearch\Query\BoostTemplatesFeature;
8use CirrusSearch\Query\ContentModelFeature;
9use CirrusSearch\Query\DateRangeFeature;
10use CirrusSearch\Query\DeepcatFeature;
11use CirrusSearch\Query\FileTypeFeature;
12use CirrusSearch\Query\HasTemplateFeature;
13use CirrusSearch\Query\InCategoryFeature;
14use CirrusSearch\Query\IndexedNumericFieldFeature;
15use CirrusSearch\Query\InSourceFeature;
16use CirrusSearch\Query\InTitleFeature;
17use CirrusSearch\Query\KeywordFeature;
18use CirrusSearch\Query\LanguageFeature;
19use CirrusSearch\Query\LinksToFeature;
20use CirrusSearch\Query\LocalFeature;
21use CirrusSearch\Query\MoreLikeFeature;
22use CirrusSearch\Query\MoreLikeThisFeature;
23use CirrusSearch\Query\PageIdFeature;
24use CirrusSearch\Query\PreferRecentFeature;
25use CirrusSearch\Query\PrefixFeature;
26use CirrusSearch\Query\SimpleKeywordFeature;
27use CirrusSearch\Query\SubPageOfFeature;
28use CirrusSearch\Query\TextFieldFilterFeature;
29use CirrusSearch\SearchConfig;
30use MediaWiki\Logger\LoggerFactory;
31use MediaWiki\MediaWikiServices;
32
33/**
34 * Registry of keywords suited for fulltext searches
35 */
36class FullTextKeywordRegistry implements KeywordRegistry {
37    /**
38     * @var KeywordFeature[]
39     */
40    private $features;
41
42    /**
43     * @param SearchConfig $config
44     * @param CirrusSearchHookRunner|null $cirrusSearchHookRunner
45     * @param NamespacePrefixParser|null $namespacePrefixParser
46     * @param CachedSparqlClient|null $sparql
47     */
48    public function __construct(
49        SearchConfig $config,
50        ?CirrusSearchHookRunner $cirrusSearchHookRunner = null,
51        ?NamespacePrefixParser $namespacePrefixParser = null,
52        ?CachedSparqlClient $sparql = null
53    ) {
54        $this->features = [
55            // Handle morelike keyword (greedy). Kept for BC reasons with existing clients.
56            // The morelikethis keyword should be preferred.
57            new MoreLikeFeature( $config ),
58            // Handle title prefix notation (greedy). Kept for BC reasons with existing clients.
59            // The subpageof keyword should be preferred.
60            new PrefixFeature( $namespacePrefixParser ),
61            // Handle prefer-recent keyword
62            new PreferRecentFeature( $config ),
63            // Handle local keyword
64            new LocalFeature(),
65            // Handle boost-templates keyword
66            new BoostTemplatesFeature(),
67            // Handle hastemplate keyword
68            new HasTemplateFeature(),
69            // Handle linksto keyword
70            new LinksToFeature(),
71            // Handle incategory keyword
72            new InCategoryFeature( $config ),
73            // Handle non-regex insource keyword
74            new InSourceFeature( $config ),
75            // Handle intitle keyword
76            new InTitleFeature( $config ),
77            // inlanguage keyword
78            new LanguageFeature( $config ),
79            // File types
80            new FileTypeFeature( $config ),
81            // File mime types
82            new TextFieldFilterFeature( 'filemime', 'file_mime' ),
83            // File numeric characteristics - size, resolution, etc.
84            new IndexedNumericFieldFeature(),
85            // Content model feature
86            new ContentModelFeature(),
87            // subpageof keyword
88            new SubPageOfFeature(),
89            // deepcat feature
90            new DeepcatFeature( $config, $sparql ),
91            // morelikethis feature: a non-greedy version of the morelike keyword.
92            new MoreLikeThisFeature( $config ),
93            // ids query
94            new PageIdFeature(),
95            // date range features
96            DateRangeFeature::factory( $config, 'lasteditdate', 'timestamp' ),
97            DateRangeFeature::factory( $config, 'creationdate', 'create_timestamp' ),
98        ];
99
100        $extraFeatures = [];
101        $cirrusSearchHookRunner = $cirrusSearchHookRunner ?: new CirrusSearchHookRunner(
102            MediaWikiServices::getInstance()->getHookContainer() );
103        $cirrusSearchHookRunner->onCirrusSearchAddQueryFeatures( $config, $extraFeatures );
104        foreach ( $extraFeatures as $extra ) {
105            if ( $extra instanceof SimpleKeywordFeature ) {
106                $this->features[] = $extra;
107            } else {
108                LoggerFactory::getInstance( 'CirrusSearch' )
109                    ->warning( 'Skipped invalid feature of class ' . get_class( $extra ) .
110                               ' - should be instanceof SimpleKeywordFeature' );
111            }
112        }
113    }
114
115    /**
116     * @return KeywordFeature[]
117     */
118    public function getKeywords() {
119        return $this->features;
120    }
121}