Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
SearchEngineFactory
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 3
156
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 create
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
42
 getSearchEngineClass
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3use MediaWiki\HookContainer\HookContainer;
4use Wikimedia\ObjectFactory\ObjectFactory;
5use Wikimedia\Rdbms\IConnectionProvider;
6
7/**
8 * Factory class for SearchEngine.
9 * Allows to create engine of the specific type.
10 */
11class SearchEngineFactory {
12    /**
13     * Configuration for SearchEngine classes.
14     * @var SearchEngineConfig
15     */
16    private $config;
17
18    /** @var HookContainer */
19    private $hookContainer;
20
21    private IConnectionProvider $dbProvider;
22
23    /**
24     * @param SearchEngineConfig $config
25     * @param HookContainer $hookContainer
26     * @param IConnectionProvider $dbProvider
27     */
28    public function __construct(
29        SearchEngineConfig $config,
30        HookContainer $hookContainer,
31        IConnectionProvider $dbProvider
32    ) {
33        $this->config = $config;
34        $this->hookContainer = $hookContainer;
35        $this->dbProvider = $dbProvider;
36    }
37
38    /**
39     * Create SearchEngine of the given type.
40     *
41     * @param string|null $type
42     * @return SearchEngine
43     */
44    public function create( $type = null ) {
45        $configuredClass = $this->config->getSearchType();
46        $alternativesClasses = $this->config->getSearchTypes();
47
48        if ( $type !== null && in_array( $type, $alternativesClasses ) ) {
49            $class = $type;
50        } elseif ( $configuredClass !== null ) {
51            $class = $configuredClass;
52        } else {
53            $class = self::getSearchEngineClass( $this->dbProvider );
54        }
55
56        $mappings = $this->config->getSearchMappings();
57
58        // Convert non mapped classes to ObjectFactory spec
59        $spec = $mappings[$class] ?? [ 'class' => $class ];
60
61        $args = [];
62
63        if ( isset( $spec['class'] ) && is_subclass_of( $spec['class'], SearchDatabase::class ) ) {
64            $args['extraArgs'][] = $this->dbProvider;
65        }
66
67        // ObjectFactory::getObjectFromSpec accepts an array, not just a callable (phan bug)
68        // @phan-suppress-next-line PhanTypeInvalidCallableArraySize
69        $engine = ObjectFactory::getObjectFromSpec( $spec, $args );
70        /** @var SearchEngine $engine */
71        $engine->setHookContainer( $this->hookContainer );
72        return $engine;
73    }
74
75    /**
76     * @param IConnectionProvider $dbProvider
77     * @return string SearchEngine subclass name
78     * @since 1.28
79     */
80    public static function getSearchEngineClass( IConnectionProvider $dbProvider ) {
81        $type = $dbProvider->getReplicaDatabase()->getType();
82
83        switch ( $type ) {
84            case 'sqlite':
85                return SearchSqlite::class;
86            case 'mysql':
87                return SearchMySQL::class;
88            case 'postgres':
89                return SearchPostgres::class;
90            default:
91                return SearchEngineDummy::class;
92        }
93    }
94}