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