Merge "Selenium: replace UserLoginPage with BlankPage where possible"
[lhc/web/wiklou.git] / includes / search / SearchEngineFactory.php
1 <?php
2
3 use Wikimedia\Rdbms\IDatabase;
4 use Wikimedia\Rdbms\ILoadBalancer;
5 use MediaWiki\MediaWikiServices;
6
7 /**
8 * Factory class for SearchEngine.
9 * Allows to create engine of the specific type.
10 */
11 class SearchEngineFactory {
12 /**
13 * Configuration for SearchEngine classes.
14 * @var SearchEngineConfig
15 */
16 private $config;
17
18 public function __construct( SearchEngineConfig $config ) {
19 $this->config = $config;
20 }
21
22 /**
23 * Create SearchEngine of the given type.
24 * @param string|null $type
25 * @return SearchEngine
26 */
27 public function create( $type = null ) {
28 $configuredClass = $this->config->getSearchType();
29 $alternativesClasses = $this->config->getSearchTypes();
30
31 $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
32 if ( $type !== null && in_array( $type, $alternativesClasses ) ) {
33 $class = $type;
34 } elseif ( $configuredClass !== null ) {
35 $class = $configuredClass;
36 } else {
37 $class = self::getSearchEngineClass( $lb );
38 }
39
40 if ( is_subclass_of( $class, SearchDatabase::class ) ) {
41 return new $class( $lb );
42 } else {
43 return new $class();
44 }
45 }
46
47 /**
48 * @param IDatabase|ILoadBalancer $dbOrLb
49 * @return string SearchEngine subclass name
50 * @since 1.28
51 */
52 public static function getSearchEngineClass( $dbOrLb ) {
53 $type = ( $dbOrLb instanceof IDatabase )
54 ? $dbOrLb->getType()
55 : $dbOrLb->getServerType( $dbOrLb->getWriterIndex() );
56
57 switch ( $type ) {
58 case 'sqlite':
59 return SearchSqlite::class;
60 case 'mysql':
61 return SearchMySQL::class;
62 case 'postgres':
63 return SearchPostgres::class;
64 case 'mssql':
65 return SearchMssql::class;
66 case 'oracle':
67 return SearchOracle::class;
68 default:
69 return SearchEngineDummy::class;
70 }
71 }
72 }