From e7e0431773773c5e5d616869cfd982f907101689 Mon Sep 17 00:00:00 2001 From: plp-GTR Date: Sat, 9 Dec 2023 01:56:07 +0100 Subject: [PATCH 1/3] Fetching activities by at least 0 minutes (instead of longer than 1 day) --- config/packages/doctrine.yaml | 1 + src/Doctrine/Functions/TimestampDiff.php | 53 ++++++++++++++++++++++++ src/Repository/ActivityRepository.php | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/Doctrine/Functions/TimestampDiff.php diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index ffcafbabdb..a23e6838d4 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -95,5 +95,6 @@ doctrine: dql: datetime_functions: datediff: App\Doctrine\Functions\DateDiff + timestampdiff: App\Doctrine\Functions\TimestampDiff yearweek: App\Doctrine\Functions\YearWeek geodistance: App\Doctrine\Functions\GeoDistance diff --git a/src/Doctrine/Functions/TimestampDiff.php b/src/Doctrine/Functions/TimestampDiff.php new file mode 100644 index 0000000000..9c129d8300 --- /dev/null +++ b/src/Doctrine/Functions/TimestampDiff.php @@ -0,0 +1,53 @@ +match(Lexer::T_IDENTIFIER); + $parser->match(Lexer::T_OPEN_PARENTHESIS); + $parser->match(Lexer::T_IDENTIFIER); + $lexer = $parser->getLexer(); + $this->unit = $lexer->token['value']; + $parser->match(Lexer::T_COMMA); + $this->firstDatetimeExpression = $parser->ArithmeticPrimary(); + $parser->match(Lexer::T_COMMA); + $this->secondDatetimeExpression = $parser->ArithmeticPrimary(); + $parser->match(Lexer::T_CLOSE_PARENTHESIS); + } + + public function getSql(SqlWalker $sqlWalker) + { + return 'TIMESTAMPDIFF(' . + $this->unit . ', ' . + $this->firstDatetimeExpression->dispatch($sqlWalker) . ', ' . + $this->secondDatetimeExpression->dispatch($sqlWalker) . + ')'; + } +} diff --git a/src/Repository/ActivityRepository.php b/src/Repository/ActivityRepository.php index 7b6228f557..75acbb0cc3 100644 --- a/src/Repository/ActivityRepository.php +++ b/src/Repository/ActivityRepository.php @@ -76,7 +76,7 @@ public function queryProblematicActivities() ->join('App:ActivityAttendee', 'aa', Join::WITH, 'aa.activity = a and aa.organizer = 1') ->join('App:Member', 'm', Join::WITH, 'aa.attendee = m') ->where("m.status = 'Banned'") - ->orWhere('DATEDIFF(a.ends, a.starts) > 1') + ->orWhere('TIMESTAMPDIFF(MINUTE, a.starts, a.ends) >= 0') ->orderBy('a.id', 'desc') ->getQuery(); } From 4da1dff0eb26c68de10faf2d8f4958228640da2e Mon Sep 17 00:00:00 2001 From: plp-GTR Date: Sat, 9 Dec 2023 02:17:56 +0100 Subject: [PATCH 2/3] Fixed datatype description --- src/Doctrine/Functions/TimestampDiff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Doctrine/Functions/TimestampDiff.php b/src/Doctrine/Functions/TimestampDiff.php index 9c129d8300..3d169e551a 100644 --- a/src/Doctrine/Functions/TimestampDiff.php +++ b/src/Doctrine/Functions/TimestampDiff.php @@ -14,7 +14,7 @@ class TimestampDiff extends FunctionNode { /** - * @var Node|null + * @var string|null */ public $unit = null; From 1ecdf9e18f551606aad2d28dc16e0dc9ab0aae45 Mon Sep 17 00:00:00 2001 From: plp-GTR Date: Sat, 9 Dec 2023 02:36:54 +0100 Subject: [PATCH 3/3] Cleaned up code in TimestampDiff doctrine function --- src/Doctrine/Functions/TimestampDiff.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Doctrine/Functions/TimestampDiff.php b/src/Doctrine/Functions/TimestampDiff.php index 3d169e551a..728d3f4289 100644 --- a/src/Doctrine/Functions/TimestampDiff.php +++ b/src/Doctrine/Functions/TimestampDiff.php @@ -9,7 +9,8 @@ use Doctrine\ORM\Query\SqlWalker; /** - * TimestampDiffFunction ::= "TIMESTAMPDIFF" "(" ArithmeticPrimary "," ArithmeticPrimary "," ArithmeticPrimary ")". + * TimestampDiffFunction ::= + * "TIMESTAMPDIFF" "(" ArithmeticPrimary Identifier "," ArithmeticPrimary "," ArithmeticPrimary ")". */ class TimestampDiff extends FunctionNode { @@ -33,12 +34,19 @@ public function parse(Parser $parser) $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $parser->match(Lexer::T_IDENTIFIER); + + /** @var Lexer $lexer */ $lexer = $parser->getLexer(); $this->unit = $lexer->token['value']; + $parser->match(Lexer::T_COMMA); + $this->firstDatetimeExpression = $parser->ArithmeticPrimary(); + $parser->match(Lexer::T_COMMA); + $this->secondDatetimeExpression = $parser->ArithmeticPrimary(); + $parser->match(Lexer::T_CLOSE_PARENTHESIS); }