Skip to content

Commit 7d875e8

Browse files
author
Dale Sikkema
committed
MAGETWO-37848: Generate data fails when table prefix exceeds length of 5
- place compression logic in MySql adapter - write tests for modified compression methods - update tests for new methods in ExpressionConverter
1 parent 99f3ede commit 7d875e8

File tree

5 files changed

+87
-48
lines changed

5 files changed

+87
-48
lines changed

lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Magento\Framework\DB\Select;
2020
use Magento\Framework\DB\Statement\Parameter;
2121
use Magento\Framework\Exception\LocalizedException;
22+
use Magento\Framework\Mview\View\Subscription;
2223
use Magento\Framework\Phrase;
2324
use Magento\Framework\Stdlib\DateTime;
2425
use Magento\Framework\Stdlib\String;
@@ -3118,20 +3119,27 @@ public function getDateExtractSql($date, $unit)
31183119
}
31193120

31203121
/**
3121-
* Retrieve valid table name
3122-
* Check table name length and allowed symbols
3122+
* Returns a compressed version of the table name if it is too long
31233123
*
31243124
* @param string $tableName
31253125
* @return string
3126+
* @codeCoverageIgnore Covered by tests on ExpressionConverter
31263127
*/
31273128
public function getTableName($tableName)
31283129
{
31293130
return ExpressionConverter::shortenEntityName($tableName, 't_');
31303131
}
31313132

3133+
/**
3134+
* Returns a compressed version of the trigger name if it is too long
3135+
*
3136+
* @param string $triggerName
3137+
* @return string
3138+
* @codeCoverageIgnore Covered by tests on ExpressionConverter
3139+
*/
31323140
public function getTriggerName($triggerName)
31333141
{
3134-
return ExpressionConverter::shortenEntityName($triggerName, 'trg_');
3142+
return ExpressionConverter::shortenEntityName($triggerName, Subscription::TRIGGER_NAME_QUALIFIER);
31353143
}
31363144

31373145
/**

lib/internal/Magento/Framework/DB/Test/Unit/Adapter/Pdo/MysqlTest.php

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
*/
1212
namespace Magento\Framework\DB\Test\Unit\Adapter\Pdo;
1313

14+
use Magento\Framework\DB\Adapter\AdapterInterface;
15+
1416
class MysqlTest extends \PHPUnit_Framework_TestCase
1517
{
1618
/**
@@ -149,7 +151,7 @@ public function testCheckNotDdlTransaction($query)
149151
} catch (\Exception $e) {
150152
$this->assertNotContains(
151153
$e->getMessage(),
152-
\Magento\Framework\DB\Adapter\AdapterInterface::ERROR_DDL_MESSAGE
154+
AdapterInterface::ERROR_DDL_MESSAGE
153155
);
154156
}
155157

@@ -160,7 +162,7 @@ public function testCheckNotDdlTransaction($query)
160162
} catch (\Exception $e) {
161163
$this->assertNotContains(
162164
$e->getMessage(),
163-
\Magento\Framework\DB\Adapter\AdapterInterface::ERROR_DDL_MESSAGE
165+
AdapterInterface::ERROR_DDL_MESSAGE
164166
);
165167
}
166168
}
@@ -226,7 +228,7 @@ public function testAsymmetricRollBackFailure()
226228
throw new \Exception('Test Failed!');
227229
} catch (\Exception $e) {
228230
$this->assertEquals(
229-
\Magento\Framework\DB\Adapter\AdapterInterface::ERROR_ASYMMETRIC_ROLLBACK_MESSAGE,
231+
AdapterInterface::ERROR_ASYMMETRIC_ROLLBACK_MESSAGE,
230232
$e->getMessage()
231233
);
232234
}
@@ -242,7 +244,7 @@ public function testAsymmetricCommitFailure()
242244
throw new \Exception('Test Failed!');
243245
} catch (\Exception $e) {
244246
$this->assertEquals(
245-
\Magento\Framework\DB\Adapter\AdapterInterface::ERROR_ASYMMETRIC_COMMIT_MESSAGE,
247+
AdapterInterface::ERROR_ASYMMETRIC_COMMIT_MESSAGE,
246248
$e->getMessage()
247249
);
248250
}
@@ -354,7 +356,7 @@ public function testIncompleteRollBackFailureOnCommit()
354356
throw new \Exception('Test Failed!');
355357
} catch (\Exception $e) {
356358
$this->assertEquals(
357-
\Magento\Framework\DB\Adapter\AdapterInterface::ERROR_ROLLBACK_INCOMPLETE_MESSAGE,
359+
AdapterInterface::ERROR_ROLLBACK_INCOMPLETE_MESSAGE,
358360
$e->getMessage()
359361
);
360362
$this->_adapter->rollBack();
@@ -377,7 +379,7 @@ public function testIncompleteRollBackFailureOnBeginTransaction()
377379
throw new \Exception('Test Failed!');
378380
} catch (\Exception $e) {
379381
$this->assertEquals(
380-
\Magento\Framework\DB\Adapter\AdapterInterface::ERROR_ROLLBACK_INCOMPLETE_MESSAGE,
382+
AdapterInterface::ERROR_ROLLBACK_INCOMPLETE_MESSAGE,
381383
$e->getMessage()
382384
);
383385
$this->_adapter->rollBack();
@@ -549,4 +551,27 @@ public function addColumnDataProvider()
549551
]
550552
];
551553
}
554+
555+
/**
556+
* @dataProvider getIndexNameDataProvider
557+
*/
558+
public function testGetIndexName($name, $fields, $indexType, $expectedName)
559+
{
560+
$this->assertTrue(
561+
strpos($this->_mockAdapter->getIndexName($name, $fields, $indexType), $expectedName) === 0,
562+
'Index name did not start with expected prefix'
563+
);
564+
}
565+
566+
public function getIndexNameDataProvider()
567+
{
568+
// 65 characters long - will be compressed
569+
$longTableName = '__________________________________________________long_table_name';
570+
return [
571+
[$longTableName, [], AdapterInterface::INDEX_TYPE_UNIQUE, 'UNQ_'],
572+
[$longTableName, [], AdapterInterface::INDEX_TYPE_FULLTEXT, 'FTI_'],
573+
[$longTableName, [], AdapterInterface::INDEX_TYPE_INDEX, 'IDX_'],
574+
['short_table_name', ['field1', 'field2'], '', 'SHORT_TABLE_NAME_FIELD1_FIELD2'],
575+
];
576+
}
552577
}

lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ class ExpressionConverterTest extends \PHPUnit_Framework_TestCase
1616
*/
1717
public function testShortenEntityName($in, $prefix, $expectedOut)
1818
{
19-
$this->assertSame($expectedOut, ExpressionConverter::shortenEntityName($in, $prefix));
19+
$this->assertTrue(
20+
strpos(ExpressionConverter::shortenEntityName($in, $prefix), $expectedOut) === 0,
21+
'Entity name did not start with expected prefix'
22+
);
2023
}
2124

2225
public function shortenEntityNameDataProvider()
2326
{
24-
/** Length of 64 characters, to go over max MySql identifier length */
2527
$length64 = '________________________________________________________________';
2628
$length40 = '________________________________________';
27-
$length20 = '____________________';
28-
echo $length20;
2929
return [
3030
'Short identifier' => [
3131
'already_short',
@@ -35,18 +35,22 @@ public function shortenEntityNameDataProvider()
3535
'Hashed identifer' => [
3636
$length64 . '_cannotBeAbbreviated',
3737
'pre_',
38-
'pre_be55448d703c761bf8a322a9993c9ed3'
38+
'pre_'
3939
],
4040
'Abbreviated identifier' => [
41-
$length40 . '_enterprise_notification_index',
41+
$length40 . 'enterprise_notification_index',
4242
'pre_',
43-
'_________________________________________ent_ntfc_idx'
44-
],
45-
'Reduced hash' => [
46-
$length64 . '_cannotBeAbbreviated',
47-
$length40,
48-
'448d703c761bf8a322a9993c'
43+
$length40 . 'ent_ntfc_idx'
4944
],
5045
];
5146
}
47+
48+
public function testShortenEntityNameReducedHash()
49+
{
50+
/** Length of 64 characters, to go over max MySql identifier length */
51+
$length64 = '________________________________________________________________';
52+
$longPrefix = 'pre_____________________________________';
53+
$shortenedName = ExpressionConverter::shortenEntityName($length64 . '_cannotBeAbbreviated', $longPrefix );
54+
$this->assertNotSame(0, strpos($shortenedName, 'pre'), 'Entity name not supposed to with long prefix');
55+
}
5256
}

lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,12 @@ public function testGetColumnName()
9494
public function testCreate()
9595
{
9696
$this->mockGetTableName();
97-
97+
$shortTriggerName = 'short_trigger_name';
98+
$this->connectionMock->expects($this->atLeastOnce())->method('getTriggerName')->willReturn($shortTriggerName);
9899
$triggerMock = $this->getMock('Magento\Framework\DB\Ddl\Trigger', [], [], '', false, false);
99100
$triggerMock->expects($this->exactly(3))
100101
->method('setName')
102+
->with($shortTriggerName)
101103
->will($this->returnSelf());
102104
$triggerMock->expects($this->exactly(3))
103105
->method('getName')
@@ -265,7 +267,7 @@ public function testRemove()
265267
*/
266268
protected function mockGetConnection($connection)
267269
{
268-
$this->resourceMock->expects($this->once())
270+
$this->resourceMock->expects($this->atLeastOnce())
269271
->method('getConnection')
270272
->will($this->returnValue($connection));
271273
}

lib/internal/Magento/Framework/Mview/View/Subscription.php

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
namespace Magento\Framework\Mview\View;
1010

11+
use Magento\Framework\App\Resource;
12+
use Magento\Framework\DB\Ddl\Trigger;
1113
use Magento\Framework\DB\ExpressionConverter;
1214

1315
class Subscription implements SubscriptionInterface
@@ -25,7 +27,7 @@ class Subscription implements SubscriptionInterface
2527
protected $write;
2628

2729
/**
28-
* @var \Magento\Framework\DB\Ddl\Trigger
30+
* @var Trigger
2931
*/
3032
protected $triggerFactory;
3133

@@ -57,20 +59,20 @@ class Subscription implements SubscriptionInterface
5759
protected $linkedViews = [];
5860

5961
/**
60-
* @var \Magento\Framework\App\Resource
62+
* @var Resource
6163
*/
6264
protected $resource;
6365

6466
/**
65-
* @param \Magento\Framework\App\Resource $resource
67+
* @param Resource $resource
6668
* @param \Magento\Framework\DB\Ddl\TriggerFactory $triggerFactory
6769
* @param \Magento\Framework\Mview\View\CollectionInterface $viewCollection
6870
* @param \Magento\Framework\Mview\ViewInterface $view
6971
* @param string $tableName
7072
* @param string $columnName
7173
*/
7274
public function __construct(
73-
\Magento\Framework\App\Resource $resource,
75+
Resource $resource,
7476
\Magento\Framework\DB\Ddl\TriggerFactory $triggerFactory,
7577
\Magento\Framework\Mview\View\CollectionInterface $viewCollection,
7678
\Magento\Framework\Mview\ViewInterface $view,
@@ -93,23 +95,22 @@ public function __construct(
9395
*/
9496
public function create()
9597
{
96-
foreach (\Magento\Framework\DB\Ddl\Trigger::getListOfEvents() as $event) {
98+
foreach (Trigger::getListOfEvents() as $event) {
9799
$triggerName = $this->getTriggerName(
98100
$this->resource->getTableName($this->getTableName()),
99-
\Magento\Framework\DB\Ddl\Trigger::TIME_AFTER,
101+
Trigger::TIME_AFTER,
100102
$event
101103
);
104+
/** Shorten if trigger name is too long - max is 64 characters */
105+
$shortenedTriggerName = $this->resource->getConnection(Resource::DEFAULT_READ_RESOURCE)
106+
->getTriggerName($triggerName, self::TRIGGER_NAME_QUALIFIER);
102107

103-
/** @var \Magento\Framework\DB\Ddl\Trigger $trigger */
104-
$trigger = $this->triggerFactory->create()->setName(
105-
$triggerName
106-
)->setTime(
107-
\Magento\Framework\DB\Ddl\Trigger::TIME_AFTER
108-
)->setEvent(
109-
$event
110-
)->setTable(
111-
$this->resource->getTableName($this->getTableName())
112-
);
108+
/** @var Trigger $trigger */
109+
$trigger = $this->triggerFactory->create()
110+
->setName($shortenedTriggerName)
111+
->setTime(Trigger::TIME_AFTER)
112+
->setEvent($event)
113+
->setTable($this->resource->getTableName($this->tableName));
113114

114115
$trigger->addStatement($this->buildStatement($event, $this->getView()->getChangelog()));
115116

@@ -133,18 +134,18 @@ public function create()
133134
*/
134135
public function remove()
135136
{
136-
foreach (\Magento\Framework\DB\Ddl\Trigger::getListOfEvents() as $event) {
137+
foreach (Trigger::getListOfEvents() as $event) {
137138
$triggerName = $this->getTriggerName(
138139
$this->resource->getTableName($this->getTableName()),
139-
\Magento\Framework\DB\Ddl\Trigger::TIME_AFTER,
140+
Trigger::TIME_AFTER,
140141
$event
141142
);
142143

143-
/** @var \Magento\Framework\DB\Ddl\Trigger $trigger */
144+
/** @var Trigger $trigger */
144145
$trigger = $this->triggerFactory->create()->setName(
145146
$triggerName
146147
)->setTime(
147-
\Magento\Framework\DB\Ddl\Trigger::TIME_AFTER
148+
Trigger::TIME_AFTER
148149
)->setEvent(
149150
$event
150151
)->setTable(
@@ -206,16 +207,16 @@ protected function getLinkedViews()
206207
protected function buildStatement($event, $changelog)
207208
{
208209
switch ($event) {
209-
case \Magento\Framework\DB\Ddl\Trigger::EVENT_INSERT:
210-
case \Magento\Framework\DB\Ddl\Trigger::EVENT_UPDATE:
210+
case Trigger::EVENT_INSERT:
211+
case Trigger::EVENT_UPDATE:
211212
return sprintf(
212213
"INSERT IGNORE INTO %s (%s) VALUES (NEW.%s);",
213214
$this->write->quoteIdentifier($this->resource->getTableName($changelog->getName())),
214215
$this->write->quoteIdentifier($changelog->getColumnName()),
215216
$this->write->quoteIdentifier($this->getColumnName())
216217
);
217218

218-
case \Magento\Framework\DB\Ddl\Trigger::EVENT_DELETE:
219+
case Trigger::EVENT_DELETE:
219220
return sprintf(
220221
"INSERT IGNORE INTO %s (%s) VALUES (OLD.%s);",
221222
$this->write->quoteIdentifier($this->resource->getTableName($changelog->getName())),
@@ -241,8 +242,7 @@ protected function buildStatement($event, $changelog)
241242
*/
242243
protected function getTriggerName($tableName, $time, $event)
243244
{
244-
$triggerName = $tableName . '_' . $time . '_' . $event;
245-
return ExpressionConverter::shortenEntityName($triggerName, self::TRIGGER_NAME_QUALIFIER);
245+
return self::TRIGGER_NAME_QUALIFIER . $tableName . '_' . $time . '_' . $event;
246246
}
247247

248248
/**

0 commit comments

Comments
 (0)