Skip to content

Commit 95c9fa4

Browse files
Merge pull request #17889 from kamil-tekiela/Index-controllers
Refactor Index controllers
2 parents 44a0844 + 2f769c0 commit 95c9fa4

11 files changed

Lines changed: 117 additions & 287 deletions

File tree

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpMyAdmin\Controllers\Table\Structure;
6+
7+
use PhpMyAdmin\Controllers\AbstractController;
8+
use PhpMyAdmin\Controllers\Table\StructureController;
9+
use PhpMyAdmin\Http\ServerRequest;
10+
use PhpMyAdmin\Query\Generator;
11+
use PhpMyAdmin\ResponseRenderer;
12+
use PhpMyAdmin\Table\Indexes;
13+
use PhpMyAdmin\Template;
14+
15+
use function __;
16+
use function is_array;
17+
18+
abstract class AbstractIndexController extends AbstractController
19+
{
20+
/** @var StructureController */
21+
protected $structureController;
22+
23+
/** @var Indexes */
24+
protected $indexes;
25+
26+
public function __construct(
27+
ResponseRenderer $response,
28+
Template $template,
29+
StructureController $structureController,
30+
Indexes $indexes
31+
) {
32+
parent::__construct($response, $template);
33+
$this->structureController = $structureController;
34+
$this->indexes = $indexes;
35+
}
36+
37+
public function handleIndexCreation(ServerRequest $request, string $indexType): void
38+
{
39+
$GLOBALS['message'] = $GLOBALS['message'] ?? null;
40+
41+
$selected = $request->getParsedBodyParam('selected_fld', []);
42+
43+
if (! is_array($selected) || $selected === []) {
44+
$this->response->setRequestStatus(false);
45+
$this->response->addJSON('message', __('No column selected.'));
46+
47+
return;
48+
}
49+
50+
$GLOBALS['sql_query'] = Generator::getAddIndexSql($indexType, $GLOBALS['table'], $selected);
51+
52+
$GLOBALS['message'] = $this->indexes->executeAddIndexSql($GLOBALS['db'], $GLOBALS['sql_query']);
53+
54+
($this->structureController)($request);
55+
}
56+
}

libraries/classes/Controllers/Table/Structure/AddIndexController.php

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,12 @@
44

55
namespace PhpMyAdmin\Controllers\Table\Structure;
66

7-
use PhpMyAdmin\Controllers\AbstractController;
8-
use PhpMyAdmin\Controllers\Table\StructureController;
9-
use PhpMyAdmin\DatabaseInterface;
107
use PhpMyAdmin\Http\ServerRequest;
11-
use PhpMyAdmin\Message;
12-
use PhpMyAdmin\ResponseRenderer;
13-
use PhpMyAdmin\Template;
14-
use PhpMyAdmin\Util;
158

16-
use function __;
17-
use function count;
18-
use function is_array;
19-
20-
final class AddIndexController extends AbstractController
9+
final class AddIndexController extends AbstractIndexController
2110
{
22-
/** @var DatabaseInterface */
23-
private $dbi;
24-
25-
/** @var StructureController */
26-
private $structureController;
27-
28-
public function __construct(
29-
ResponseRenderer $response,
30-
Template $template,
31-
DatabaseInterface $dbi,
32-
StructureController $structureController
33-
) {
34-
parent::__construct($response, $template);
35-
$this->dbi = $dbi;
36-
$this->structureController = $structureController;
37-
}
38-
3911
public function __invoke(ServerRequest $request): void
4012
{
41-
$GLOBALS['message'] = $GLOBALS['message'] ?? null;
42-
43-
$selected = $request->getParsedBodyParam('selected_fld', []);
44-
45-
if (! is_array($selected) || $selected === []) {
46-
$this->response->setRequestStatus(false);
47-
$this->response->addJSON('message', __('No column selected.'));
48-
49-
return;
50-
}
51-
52-
$i = 1;
53-
$selectedCount = count($selected);
54-
$GLOBALS['sql_query'] = 'ALTER TABLE ' . Util::backquote($GLOBALS['table']) . ' ADD INDEX(';
55-
56-
foreach ($selected as $field) {
57-
$GLOBALS['sql_query'] .= Util::backquote($field);
58-
$GLOBALS['sql_query'] .= $i++ === $selectedCount ? ');' : ', ';
59-
}
60-
61-
$this->dbi->selectDb($GLOBALS['db']);
62-
$result = $this->dbi->tryQuery($GLOBALS['sql_query']);
63-
64-
if (! $result) {
65-
$GLOBALS['message'] = Message::error($this->dbi->getError());
66-
}
67-
68-
if (empty($GLOBALS['message'])) {
69-
$GLOBALS['message'] = Message::success();
70-
}
71-
72-
($this->structureController)($request);
13+
$this->handleIndexCreation($request, 'INDEX');
7314
}
7415
}

libraries/classes/Controllers/Table/Structure/FulltextController.php

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,12 @@
44

55
namespace PhpMyAdmin\Controllers\Table\Structure;
66

7-
use PhpMyAdmin\Controllers\AbstractController;
8-
use PhpMyAdmin\Controllers\Table\StructureController;
9-
use PhpMyAdmin\DatabaseInterface;
107
use PhpMyAdmin\Http\ServerRequest;
11-
use PhpMyAdmin\Message;
12-
use PhpMyAdmin\ResponseRenderer;
13-
use PhpMyAdmin\Template;
14-
use PhpMyAdmin\Util;
158

16-
use function __;
17-
use function count;
18-
use function is_array;
19-
20-
final class FulltextController extends AbstractController
9+
final class FulltextController extends AbstractIndexController
2110
{
22-
/** @var DatabaseInterface */
23-
private $dbi;
24-
25-
/** @var StructureController */
26-
private $structureController;
27-
28-
public function __construct(
29-
ResponseRenderer $response,
30-
Template $template,
31-
DatabaseInterface $dbi,
32-
StructureController $structureController
33-
) {
34-
parent::__construct($response, $template);
35-
$this->dbi = $dbi;
36-
$this->structureController = $structureController;
37-
}
38-
3911
public function __invoke(ServerRequest $request): void
4012
{
41-
$GLOBALS['message'] = $GLOBALS['message'] ?? null;
42-
43-
$selected = $request->getParsedBodyParam('selected_fld', []);
44-
45-
if (! is_array($selected) || $selected === []) {
46-
$this->response->setRequestStatus(false);
47-
$this->response->addJSON('message', __('No column selected.'));
48-
49-
return;
50-
}
51-
52-
$i = 1;
53-
$selectedCount = count($selected);
54-
$GLOBALS['sql_query'] = 'ALTER TABLE ' . Util::backquote($GLOBALS['table']) . ' ADD FULLTEXT(';
55-
56-
foreach ($selected as $field) {
57-
$GLOBALS['sql_query'] .= Util::backquote($field);
58-
$GLOBALS['sql_query'] .= $i++ === $selectedCount ? ');' : ', ';
59-
}
60-
61-
$this->dbi->selectDb($GLOBALS['db']);
62-
$result = $this->dbi->tryQuery($GLOBALS['sql_query']);
63-
64-
if (! $result) {
65-
$GLOBALS['message'] = Message::error($this->dbi->getError());
66-
}
67-
68-
if (empty($GLOBALS['message'])) {
69-
$GLOBALS['message'] = Message::success();
70-
}
71-
72-
($this->structureController)($request);
13+
$this->handleIndexCreation($request, 'FULLTEXT');
7314
}
7415
}

libraries/classes/Controllers/Table/Structure/SpatialController.php

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,12 @@
44

55
namespace PhpMyAdmin\Controllers\Table\Structure;
66

7-
use PhpMyAdmin\Controllers\AbstractController;
8-
use PhpMyAdmin\Controllers\Table\StructureController;
9-
use PhpMyAdmin\DatabaseInterface;
107
use PhpMyAdmin\Http\ServerRequest;
11-
use PhpMyAdmin\Message;
12-
use PhpMyAdmin\ResponseRenderer;
13-
use PhpMyAdmin\Template;
14-
use PhpMyAdmin\Util;
158

16-
use function __;
17-
use function count;
18-
use function is_array;
19-
20-
final class SpatialController extends AbstractController
9+
final class SpatialController extends AbstractIndexController
2110
{
22-
/** @var DatabaseInterface */
23-
private $dbi;
24-
25-
/** @var StructureController */
26-
private $structureController;
27-
28-
public function __construct(
29-
ResponseRenderer $response,
30-
Template $template,
31-
DatabaseInterface $dbi,
32-
StructureController $structureController
33-
) {
34-
parent::__construct($response, $template);
35-
$this->dbi = $dbi;
36-
$this->structureController = $structureController;
37-
}
38-
3911
public function __invoke(ServerRequest $request): void
4012
{
41-
$GLOBALS['message'] = $GLOBALS['message'] ?? null;
42-
43-
$selected = $request->getParsedBodyParam('selected_fld', []);
44-
45-
if (! is_array($selected) || $selected === []) {
46-
$this->response->setRequestStatus(false);
47-
$this->response->addJSON('message', __('No column selected.'));
48-
49-
return;
50-
}
51-
52-
$i = 1;
53-
$selectedCount = count($selected);
54-
$GLOBALS['sql_query'] = 'ALTER TABLE ' . Util::backquote($GLOBALS['table']) . ' ADD SPATIAL(';
55-
56-
foreach ($selected as $field) {
57-
$GLOBALS['sql_query'] .= Util::backquote($field);
58-
$GLOBALS['sql_query'] .= $i++ === $selectedCount ? ');' : ', ';
59-
}
60-
61-
$this->dbi->selectDb($GLOBALS['db']);
62-
$result = $this->dbi->tryQuery($GLOBALS['sql_query']);
63-
64-
if (! $result) {
65-
$GLOBALS['message'] = Message::error($this->dbi->getError());
66-
}
67-
68-
if (empty($GLOBALS['message'])) {
69-
$GLOBALS['message'] = Message::success();
70-
}
71-
72-
($this->structureController)($request);
13+
$this->handleIndexCreation($request, 'SPATIAL');
7314
}
7415
}

libraries/classes/Controllers/Table/Structure/UniqueController.php

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,12 @@
44

55
namespace PhpMyAdmin\Controllers\Table\Structure;
66

7-
use PhpMyAdmin\Controllers\AbstractController;
8-
use PhpMyAdmin\Controllers\Table\StructureController;
9-
use PhpMyAdmin\DatabaseInterface;
107
use PhpMyAdmin\Http\ServerRequest;
11-
use PhpMyAdmin\Message;
12-
use PhpMyAdmin\ResponseRenderer;
13-
use PhpMyAdmin\Template;
14-
use PhpMyAdmin\Util;
158

16-
use function __;
17-
use function count;
18-
use function is_array;
19-
20-
final class UniqueController extends AbstractController
9+
final class UniqueController extends AbstractIndexController
2110
{
22-
/** @var DatabaseInterface */
23-
private $dbi;
24-
25-
/** @var StructureController */
26-
private $structureController;
27-
28-
public function __construct(
29-
ResponseRenderer $response,
30-
Template $template,
31-
DatabaseInterface $dbi,
32-
StructureController $structureController
33-
) {
34-
parent::__construct($response, $template);
35-
$this->dbi = $dbi;
36-
$this->structureController = $structureController;
37-
}
38-
3911
public function __invoke(ServerRequest $request): void
4012
{
41-
$GLOBALS['message'] = $GLOBALS['message'] ?? null;
42-
43-
$selected = $request->getParsedBodyParam('selected_fld', []);
44-
45-
if (! is_array($selected) || $selected === []) {
46-
$this->response->setRequestStatus(false);
47-
$this->response->addJSON('message', __('No column selected.'));
48-
49-
return;
50-
}
51-
52-
$i = 1;
53-
$selectedCount = count($selected);
54-
$GLOBALS['sql_query'] = 'ALTER TABLE ' . Util::backquote($GLOBALS['table']) . ' ADD UNIQUE(';
55-
56-
foreach ($selected as $field) {
57-
$GLOBALS['sql_query'] .= Util::backquote($field);
58-
$GLOBALS['sql_query'] .= $i++ === $selectedCount ? ');' : ', ';
59-
}
60-
61-
$this->dbi->selectDb($GLOBALS['db']);
62-
$result = $this->dbi->tryQuery($GLOBALS['sql_query']);
63-
64-
if (! $result) {
65-
$GLOBALS['message'] = Message::error($this->dbi->getError());
66-
}
67-
68-
if (empty($GLOBALS['message'])) {
69-
$GLOBALS['message'] = Message::success();
70-
}
71-
72-
($this->structureController)($request);
13+
$this->handleIndexCreation($request, 'UNIQUE');
7314
}
7415
}

libraries/classes/Query/Generator.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PhpMyAdmin\Util;
88

9+
use function array_map;
910
use function count;
1011
use function implode;
1112
use function is_array;
@@ -408,4 +409,14 @@ public static function getQueryForPartitioningTable(
408409

409410
return $sql_query . implode(', ', $partitionNames) . ';';
410411
}
412+
413+
/**
414+
* @param string[] $selectedColumns
415+
*/
416+
public static function getAddIndexSql(string $indexType, string $table, array $selectedColumns): string
417+
{
418+
$columnsSql = implode(', ', array_map([Util::class, 'backquote'], $selectedColumns));
419+
420+
return 'ALTER TABLE ' . Util::backquote($table) . ' ADD ' . $indexType . '(' . $columnsSql . ');';
421+
}
411422
}

0 commit comments

Comments
 (0)