Skip to content

Commit a2cd0b2

Browse files
committed
Add postgres RANDOM
1 parent 2e24c3d commit a2cd0b2

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ MySQL, Oracle, PostgreSQL and SQLite.
1616
| 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, 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_LENGTH, LAG, LAST_DAY, LEAD, LEAST, LOG, LOG10, LOG2, LPAD, MAKEDATE, MATCH, MD5, MINUTE, MONTH, MONTHNAME, NOW, NULLIF, OVER, PERIOD_DIFF, PI, POWER, QUARTER, RADIANS, RAND, REGEXP, REPLACE, ROUND, RPAD, SECOND, SECTOTIME, SHA1, SHA2, SIN, SOUNDEX, STD, STDDEV, STRTODATE, 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` |
1717
| Oracle | `CEIL, DAY, FLOOR, HOUR, LISTAGG, MINUTE, MONTH, NVL, SECOND, TO_CHAR, TO_DATE, TRUNC, YEAR` |
1818
| SQLite | `CASE WHEN THEN ELSE END, DATE, DATE_FORMAT*, DAY, HOUR, IFNULL, JULIANDAY, MINUTE, MONTH, REPLACE, ROUND, SECOND, STRFTIME, WEEK, WEEKDAY, YEAR` |
19-
| PostgreSQL | `AT_TIME_ZONE, COUNT_FILTER, DATE, DATE_PART, DATE_TRUNC, DAY, EXTRACT, GREATEST, HOUR, LEAST, MINUTE, MONTH, REGEXP_REPLACE, SECOND, STRING_AGG, TO_CHAR, TO_DATE, YEAR` |
19+
| PostgreSQL | `AT_TIME_ZONE, COUNT_FILTER, DATE, DATE_PART, DATE_TRUNC, DAY, EXTRACT, GREATEST, HOUR, LEAST, MINUTE, MONTH, RANDOM, REGEXP_REPLACE, SECOND, STRING_AGG, TO_CHAR, TO_DATE, YEAR` |
2020

2121
> Note: SQLite date functions are implemented as `strftime(format, value)`.
2222
SQLite only supports the [most common formats](https://www.sqlite.org/lang_datefunc.html),

config/postgres.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ doctrine:
2121
string_agg: DoctrineExtensions\Query\Postgresql\StringAgg
2222
greatest: DoctrineExtensions\Query\Postgresql\Greatest
2323
least: DoctrineExtensions\Query\Postgresql\Least
24+
random: DoctrineExtensions\Query\Postgresql\Random
2425
regexp_replace: DoctrineExtensions\Query\Postgresql\RegexpReplace

src/Query/Postgresql/Random.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace DoctrineExtensions\Query\Postgresql;
4+
5+
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
6+
use Doctrine\ORM\Query\AST\SimpleArithmeticExpression;
7+
use Doctrine\ORM\Query\Parser;
8+
use Doctrine\ORM\Query\SqlWalker;
9+
use Doctrine\ORM\Query\TokenType;
10+
11+
class Random extends FunctionNode
12+
{
13+
/** @var SimpleArithmeticExpression */
14+
private $expression = null;
15+
16+
public function getSql(SqlWalker $sqlWalker): string
17+
{
18+
if ($this->expression) {
19+
return 'RANDOM(' . $this->expression->dispatch($sqlWalker) . ')';
20+
}
21+
22+
return 'RANDOM()';
23+
}
24+
25+
public function parse(Parser $parser): void
26+
{
27+
$lexer = $parser->getLexer();
28+
$parser->match(TokenType::T_IDENTIFIER);
29+
$parser->match(TokenType::T_OPEN_PARENTHESIS);
30+
31+
if ($lexer->lookahead->type !== TokenType::T_CLOSE_PARENTHESIS) {
32+
$this->expression = $parser->SimpleArithmeticExpression();
33+
}
34+
35+
$parser->match(TokenType::T_CLOSE_PARENTHESIS);
36+
}
37+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace DoctrineExtensions\Tests\Query\Postgresql;
4+
5+
use DoctrineExtensions\Tests\Query\PostgresqlTestCase;
6+
7+
class RandomTest extends PostgresqlTestCase
8+
{
9+
public function testRandWithParameter(): void
10+
{
11+
$this->assertDqlProducesSql(
12+
'SELECT RANDOM(2) from DoctrineExtensions\Tests\Entities\Blank b',
13+
'SELECT RANDOM(2) AS sclr_0 FROM Blank b0_'
14+
);
15+
}
16+
17+
public function testRandWithoutParameter(): void
18+
{
19+
$this->assertDqlProducesSql(
20+
'SELECT RANDOM() from DoctrineExtensions\Tests\Entities\Blank b',
21+
'SELECT RANDOM() AS sclr_0 FROM Blank b0_'
22+
);
23+
}
24+
}

0 commit comments

Comments
 (0)