Skip to content

Commit

Permalink
Merge pull request #46 from ToshY/feature/35-mysql-bin-to-uuid
Browse files Browse the repository at this point in the history
Add MySQL BinToUuid and UuidToBin
  • Loading branch information
Chris53897 authored Nov 7, 2023
2 parents b6943c7 + 441e24a commit b7068c6
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ MySQL, Oracle, PostgreSQL and SQLite.

| DB | Functions |
|:--:|:---------:|
| MySQL | `ACOS, ADDTIME, AES_DECRYPT, AES_ENCRYPT, ANY_VALUE, ASCII, ASIN, ATAN, ATAN2, BINARY, BIT_COUNT, BIT_XOR, CAST, CEIL, CHAR_LENGTH, COLLATE, CONCAT_WS, CONV, CONVERT_TZ, COS, COT, COUNTIF, CRC32, DATE, DATE_FORMAT, DATEADD, DATEDIFF, DATESUB, DAY, DAYNAME, DAYOFWEEK, DAYOFYEAR, DEGREES, DIV, EXP, EXTRACT, FIELD, FIND_IN_SET, FLOOR, FORMAT, FROM_BASE64, FROM_UNIXTIME, GREATEST, GROUP_CONCAT, HEX, HOUR, IFELSE, IFNULL, INET_ATON, INET_NTOA, INET6_ATON, INET6_NTOA, INSTR, IS_IPV4, IS_IPV4_COMPAT, IS_IPV4_MAPPED, IS_IPV6, JSON_CONTAINS, JSON_DEPTH, JSON_EXTRACT, JSON_LENGTH, JSON_UNQUOTE, LAG, LAST_DAY, LAST_INSERT_ID, LEAD, LEAST, LOG, LOG10, LOG2, LPAD, MAKEDATE, MATCH, MD5, MINUTE, MOD, MONTH, MONTHNAME, NOW, NULLIF, OVER, PERIOD_DIFF, PI, POINT, POWER, QUARTER, RADIANS, RAND, REGEXP, REGEXP_REPLACE, REGEXP_SUBSTR, REPLACE, ROUND, RPAD, SECOND, SECTOTIME, SHA1, SHA2, SIN, SOUNDEX, STD, STDDEV, STRTODATE, ST_DISTANCE_SPHERE, STR_TO_DATE, SUBSTRING_INDEX, TAN, TIME, TIMEDIFF, TIMESTAMPADD, TIMESTAMPDIFF, TIMETOSEC, TRUNCATE, UNHEX, UNIX_TIMESTAMP, UTC_TIMESTAMP, UUID_SHORT, VARIANCE, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARMONTH, YEARWEEK` |
| MySQL | `ACOS, ADDTIME, AES_DECRYPT, AES_ENCRYPT, ANY_VALUE, ASCII, ASIN, ATAN, ATAN2, BIN_TO_UUID, BINARY, BIT_COUNT, BIT_XOR, CAST, CEIL, CHAR_LENGTH, COLLATE, CONCAT_WS, CONV, CONVERT_TZ, COS, COT, COUNTIF, CRC32, DATE, DATE_FORMAT, DATEADD, DATEDIFF, DATESUB, DAY, DAYNAME, DAYOFWEEK, DAYOFYEAR, DEGREES, DIV, EXP, EXTRACT, FIELD, FIND_IN_SET, FLOOR, FORMAT, FROM_BASE64, FROM_UNIXTIME, GREATEST, GROUP_CONCAT, HEX, HOUR, IFELSE, IFNULL, INET_ATON, INET_NTOA, INET6_ATON, INET6_NTOA, INSTR, IS_IPV4, IS_IPV4_COMPAT, IS_IPV4_MAPPED, IS_IPV6, JSON_CONTAINS, JSON_DEPTH, JSON_EXTRACT, JSON_LENGTH, JSON_UNQUOTE, LAG, LAST_DAY, LAST_INSERT_ID, LEAD, LEAST, LOG, LOG10, LOG2, LPAD, MAKEDATE, MATCH, MD5, MINUTE, MOD, MONTH, MONTHNAME, NOW, NULLIF, OVER, PERIOD_DIFF, PI, POINT, POWER, QUARTER, RADIANS, RAND, REGEXP, REGEXP_REPLACE, REGEXP_SUBSTR, REPLACE, ROUND, RPAD, SECOND, SECTOTIME, SHA1, SHA2, SIN, SOUNDEX, STD, STDDEV, STRTODATE, ST_DISTANCE_SPHERE, STR_TO_DATE, SUBSTRING_INDEX, TAN, TIME, TIMEDIFF, TIMESTAMPADD, TIMESTAMPDIFF, TIMETOSEC, TRUNCATE, UNHEX, UNIX_TIMESTAMP, UTC_TIMESTAMP, UUID_SHORT, UUID_TO_BIN, VARIANCE, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARMONTH, YEARWEEK` |
| Oracle | `CEIL, DAY, FLOOR, HOUR, LISTAGG, MINUTE, MONTH, NVL, SECOND, TO_CHAR, TO_DATE, TRUNC, YEAR` |
| SQLite | `CASE WHEN THEN ELSE END, DATE, DATE_FORMAT*, DAY, HOUR, IFNULL, JULIANDAY, MINUTE, MONTH, REPLACE, ROUND, SECOND, STRFTIME, WEEK, WEEKDAY, YEAR` |
| PostgreSQL | `AGE, AT_TIME_ZONE, COUNT_FILTER, DATE, DATE_PART, DATE_TRUNC, DAY, EXTRACT, GREATEST, HOUR, ILIKE, LEAST, MINUTE, MONTH, QUARTER, REGEXP_REPLACE, SECOND, STRING_AGG, TO_CHAR, TO_DATE, YEAR` |
Expand Down
2 changes: 2 additions & 0 deletions config/mysql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ doctrine:
any_value: DoctrineExtensions\Query\Mysql\AnyValue
ascii: DoctrineExtensions\Query\Mysql\Ascii
binary: DoctrineExtensions\Query\Mysql\Binary
bin_to_uuid: DoctrineExtensions\Query\Mysql\BinToUuid
cast: DoctrineExtensions\Query\Mysql\Cast
char_length: DoctrineExtensions\Query\Mysql\CharLength
collate: DoctrineExtensions\Query\Mysql\Collate
Expand Down Expand Up @@ -132,3 +133,4 @@ doctrine:
substring_index: DoctrineExtensions\Query\Mysql\SubstringIndex
unhex: DoctrineExtensions\Query\Mysql\Unhex
uuid_short: DoctrineExtensions\Query\Mysql\UuidShort
uuid_to_bin: DoctrineExtensions\Query\Mysql\UuidToBin
41 changes: 41 additions & 0 deletions src/Query/Mysql/BinToUuid.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace DoctrineExtensions\Query\Mysql;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

class BinToUuid extends FunctionNode
{
public $binaryUuid = null;

public $swapFlag = null;

public function parse(Parser $parser): void
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);

$this->binaryUuid = $parser->ArithmeticPrimary();

if (Lexer::T_COMMA === $parser->getLexer()->lookahead->type) {
$parser->match(Lexer::T_COMMA);
$this->swapFlag = $parser->Literal();
}

$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}

public function getSql(SqlWalker $sqlWalker): string
{
$sql = 'BIN_TO_UUID(' . $this->binaryUuid->dispatch($sqlWalker);
if ($this->swapFlag !== null) {
$sql .= ', ' . $this->swapFlag->dispatch($sqlWalker);
}
$sql .= ')';

return $sql;
}
}
41 changes: 41 additions & 0 deletions src/Query/Mysql/UuidToBin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace DoctrineExtensions\Query\Mysql;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

class UuidToBin extends FunctionNode
{
public $stringUuid = null;

public $swapFlag = null;

public function parse(Parser $parser): void
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);

$this->stringUuid = $parser->ArithmeticPrimary();

if (Lexer::T_COMMA === $parser->getLexer()->lookahead->type) {
$parser->match(Lexer::T_COMMA);
$this->swapFlag = $parser->Literal();
}

$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}

public function getSql(SqlWalker $sqlWalker): string
{
$sql = 'UUID_TO_BIN(' . $this->stringUuid->dispatch($sqlWalker);
if ($this->swapFlag !== null) {
$sql .= ', ' . $this->swapFlag->dispatch($sqlWalker);
}
$sql .= ')';

return $sql;
}
}
24 changes: 24 additions & 0 deletions tests/Query/Mysql/BinToUuidTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace DoctrineExtensions\Tests\Query\Mysql;

use DoctrineExtensions\Tests\Query\MysqlTestCase;

final class BinToUuidTest extends MysqlTestCase
{
public function testBinToUuid(): void
{
$this->assertDqlProducesSql(
"SELECT BIN_TO_UUID(b.id) from DoctrineExtensions\Tests\Entities\Blank b",
'SELECT BIN_TO_UUID(b0_.id) AS sclr_0 FROM Blank b0_'
);
}

public function testBinToUuidSwapFlag(): void
{
$this->assertDqlProducesSql(
"SELECT BIN_TO_UUID(b.id, 1) from DoctrineExtensions\Tests\Entities\Blank b",
'SELECT BIN_TO_UUID(b0_.id, 1) AS sclr_0 FROM Blank b0_'
);
}
}
24 changes: 24 additions & 0 deletions tests/Query/Mysql/UuidToBinTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace DoctrineExtensions\Tests\Query\Mysql;

use DoctrineExtensions\Tests\Query\MysqlTestCase;

final class UuidToBinTest extends MysqlTestCase
{
public function testUuidToBin(): void
{
$this->assertDqlProducesSql(
"SELECT UUID_TO_BIN(b.id) from DoctrineExtensions\Tests\Entities\Blank b",
'SELECT UUID_TO_BIN(b0_.id) AS sclr_0 FROM Blank b0_'
);
}

public function testBinToUuidSwapFlag(): void
{
$this->assertDqlProducesSql(
"SELECT BIN_TO_UUID(b.id, 1) from DoctrineExtensions\Tests\Entities\Blank b",
'SELECT BIN_TO_UUID(b0_.id, 1) AS sclr_0 FROM Blank b0_'
);
}
}

0 comments on commit b7068c6

Please sign in to comment.