Skip to content

Commit fc7ef7b

Browse files
committed
TER-59 Command to check duplicates in table
1 parent 04958c1 commit fc7ef7b

3 files changed

Lines changed: 94 additions & 17 deletions

File tree

src/Table/Teradata/TeradataTableQueryBuilder.php

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class TeradataTableQueryBuilder implements TableQueryBuilderInterface
2323
];
2424

2525
private const INVALID_PKS_FOR_TABLE = 'invalidPKs';
26-
const PK_CONSTRAINT_NAME = 'kbc_pk';
26+
private const PK_CONSTRAINT_NAME = 'kbc_pk';
2727

2828
public function getCreateTempTableCommand(string $schemaName, string $tableName, ColumnCollection $columns): string
2929
{
@@ -145,7 +145,7 @@ public function getCreateTableCommand(
145145

146146
if ($primaryKeys !== []) {
147147
$columnsSql .= sprintf(
148-
",\nCONSTRAINT %s PRIMARY KEY (%s)",
148+
',\nCONSTRAINT %s PRIMARY KEY (%s)',
149149
self::PK_CONSTRAINT_NAME,
150150
implode(
151151
', ',
@@ -187,7 +187,7 @@ public function getCreateTableCommandFromDefinition(
187187
public function getAddPrimaryKeyCommand(string $schemaName, string $tableName, array $columns): string
188188
{
189189
return sprintf(
190-
"ALTER TABLE %s.%s ADD CONSTRAINT %s PRIMARY KEY (%s);",
190+
'ALTER TABLE %s.%s ADD CONSTRAINT %s PRIMARY KEY (%s);',
191191
TeradataQuote::quoteSingleIdentifier($schemaName),
192192
TeradataQuote::quoteSingleIdentifier($tableName),
193193
self::PK_CONSTRAINT_NAME,
@@ -198,10 +198,34 @@ public function getAddPrimaryKeyCommand(string $schemaName, string $tableName, a
198198
public function getDropPrimaryKeyCommand(string $schemaName, string $tableName): string
199199
{
200200
return sprintf(
201-
"ALTER TABLE %s.%s DROP CONSTRAINT %s;",
201+
'ALTER TABLE %s.%s DROP CONSTRAINT %s;',
202202
TeradataQuote::quoteSingleIdentifier($schemaName),
203203
TeradataQuote::quoteSingleIdentifier($tableName),
204204
self::PK_CONSTRAINT_NAME
205205
);
206206
}
207+
208+
/**
209+
* @param string[] $columns
210+
*/
211+
public function getCommandForDuplicates(string $schemaName, string $tableName, array $columns): string
212+
{
213+
$formattedColumns = implode(
214+
',',
215+
array_map(fn($item) => TeradataQuote::quoteSingleIdentifier($item), $columns)
216+
);
217+
return sprintf(
218+
<<<SQL
219+
SELECT MAX("_row_number_") AS "count" FROM
220+
(
221+
SELECT ROW_NUMBER() OVER (PARTITION BY %s ORDER BY %s) AS "_row_number_" FROM %s.%s
222+
) "data"
223+
SQL
224+
,
225+
$formattedColumns,
226+
$formattedColumns,
227+
TeradataQuote::quoteSingleIdentifier($schemaName),
228+
TeradataQuote::quoteSingleIdentifier($tableName),
229+
);
230+
}
207231
}

tests/Functional/Teradata/Table/TeradataTableQueryBuilderTest.php

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,12 @@ public function testGetDropTableCommand(): void
108108
* @dataProvider createTableTestSqlProvider
109109
*/
110110
public function testGetCreateCommand(
111-
array $columns,
112-
array $primaryKeys,
113-
array $expectedColumnNames,
114-
array $expectedPKs,
111+
array $columns,
112+
array $primaryKeys,
113+
array $expectedColumnNames,
114+
array $expectedPKs,
115115
string $expectedSql
116-
): void
117-
{
116+
): void {
118117
$sql = $this->qb->getCreateTableCommand(
119118
$this->getDatabaseName(),
120119
self::TABLE_GENERIC,
@@ -346,10 +345,9 @@ public function createTableTestFromDefinitionSqlProvider(): Generator
346345
*/
347346
public function testGetCreateTableCommandFromDefinition(
348347
TeradataTableDefinition $definition,
349-
string $expectedSql,
350-
bool $createPrimaryKeys
351-
): void
352-
{
348+
string $expectedSql,
349+
bool $createPrimaryKeys
350+
): void {
353351
$this->cleanDatabase($this->getDatabaseName());
354352
$this->createDatabase($this->getDatabaseName());
355353
$sql = $this->qb->getCreateTableCommandFromDefinition($definition, $createPrimaryKeys);
@@ -370,7 +368,7 @@ public function testGetCreateTableCommandFromDefinition(
370368
}
371369
}
372370

373-
public function testAddAndDropPK()
371+
public function testAddAndDropPK(): void
374372
{
375373
$testDb = $this->getDatabaseName();
376374
$tableName = self::TABLE_GENERIC;
@@ -411,4 +409,51 @@ public function testAddAndDropPK()
411409
$ref1 = new TeradataTableReflection($this->connection, $testDb, $tableName);
412410
$this->assertEmpty($ref1->getPrimaryKeysNames());
413411
}
412+
413+
414+
public function testDeduplication(): void
415+
{
416+
$testDb = $this->getDatabaseName();
417+
$tableName = self::TABLE_GENERIC;
418+
419+
// definition for table
420+
$definition = new TeradataTableDefinition(
421+
$testDb,
422+
$tableName,
423+
false,
424+
new ColumnCollection(
425+
[
426+
TeradataColumn::createGenericColumn('col1'),
427+
TeradataColumn::createGenericColumn('col2'),
428+
TeradataColumn::createGenericColumn('col3'),
429+
]
430+
),
431+
[]
432+
);
433+
434+
$sql = $this->qb->getCreateTableCommandFromDefinition($definition, true);
435+
$this->connection->executeQuery($sql);
436+
437+
foreach ([['1', '1', '1'], ['2', '2', '2'], ['3', '3', '3']] as $i) {
438+
$this->connection->executeStatement(sprintf(
439+
'INSERT INTO %s.%s VALUES (%s)',
440+
TeradataQuote::quoteSingleIdentifier($testDb),
441+
TeradataQuote::quoteSingleIdentifier($tableName),
442+
implode(',', $i)
443+
));
444+
}
445+
$duplicatedSql = $this->qb->getCommandForDuplicates($testDb, $tableName, ['col2', 'col3']);
446+
$data = $this->connection->fetchOne($duplicatedSql);
447+
$this->assertEquals('1', $data);
448+
449+
$this->connection->executeStatement(sprintf(
450+
'INSERT INTO %s.%s VALUES (5,3,3)',
451+
TeradataQuote::quoteSingleIdentifier($testDb),
452+
TeradataQuote::quoteSingleIdentifier($tableName)
453+
));
454+
455+
$duplicatedSql = $this->qb->getCommandForDuplicates($testDb, $tableName, ['col2', 'col3']);
456+
$data = $this->connection->fetchOne($duplicatedSql);
457+
$this->assertEquals('2', $data);
458+
}
414459
}

tests/Unit/Table/Teradata/TeradataTableQueryBuilderTest.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ public function testGetPKCommand(): void
7575
'ALTER TABLE "myDB"."myTable" ADD CONSTRAINT kbc_pk PRIMARY KEY ("my","rules");',
7676
$this->qb->getAddPrimaryKeyCommand('myDB', 'myTable', ['my', 'rules'])
7777
);
78-
79-
8078
}
8179

8280
public function testGetDropPKCommand(): void
@@ -85,6 +83,16 @@ public function testGetDropPKCommand(): void
8583
'ALTER TABLE "myDB"."myTable" DROP CONSTRAINT kbc_pk;',
8684
$this->qb->getDropPrimaryKeyCommand('myDB', 'myTable')
8785
);
86+
}
8887

88+
public function testGetDuplicationCommand(): void
89+
{
90+
$this->assertEquals(
91+
'SELECT MAX("_row_number_") AS "count" FROM
92+
(
93+
SELECT ROW_NUMBER() OVER (PARTITION BY "my","rules" ORDER BY "my","rules") AS "_row_number_" FROM "myDB"."myTable"
94+
) "data"',
95+
$this->qb->getCommandForDuplicates('myDB', 'myTable', ['my', 'rules'])
96+
);
8997
}
9098
}

0 commit comments

Comments
 (0)