From 403db711c9e88d5715be28a7699e6811c9efc8e6 Mon Sep 17 00:00:00 2001
From: Bertrand Gauthier <bertrand.gauthier@unicaen.fr>
Date: Fri, 5 Jun 2020 18:35:13 +0200
Subject: [PATCH] Ajout temporaire de la fonction Doctrine pasHistorise
---
config/module.config.php | 4 ++
.../ORM/Query/Functions/PasHistorise.php | 71 +++++++++++++++++++
2 files changed, 75 insertions(+)
create mode 100644 src/UnicaenOracle/ORM/Query/Functions/PasHistorise.php
diff --git a/config/module.config.php b/config/module.config.php
index a3e32f4..1847f0a 100755
--- a/config/module.config.php
+++ b/config/module.config.php
@@ -3,6 +3,7 @@
namespace UnicaenOracle;
use Doctrine\DBAL\Driver\OCI8\Driver as OCI8;
+use UnicaenOracle\ORM\Query\Functions\PasHistorise;
use UnicaenOracle\Controller\Factory\IndexControllerFactory;
use UnicaenOracle\Controller\IndexController;
use UnicaenOracle\DBAL\Event\Listeners\OracleSessionInit;
@@ -29,6 +30,9 @@ return [
// fonctions du package PL/SQL "UNICAEN_ORACLE" (cf. "../data/package.sql")
'compriseEntre' => CompriseEntre::class,
+
+ // fonction réalisant compriseEntre(histoCreation, histoDestruction, dateObservation)
+ 'pasHistorise' => PasHistorise::class,
],
],
],
diff --git a/src/UnicaenOracle/ORM/Query/Functions/PasHistorise.php b/src/UnicaenOracle/ORM/Query/Functions/PasHistorise.php
new file mode 100644
index 0000000..0d8ae2f
--- /dev/null
+++ b/src/UnicaenOracle/ORM/Query/Functions/PasHistorise.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace UnicaenOracle\ORM\Query\Functions;
+
+use Doctrine\ORM\Query\AST\Functions\FunctionNode;
+use Doctrine\ORM\Query\Lexer;
+use Doctrine\ORM\Query\Parser;
+use Doctrine\ORM\Query\SqlWalker;
+
+/**
+ * Fonction DQL maison "pasHistorise()".
+ *
+ * NB: le format DQL attendu est "pasHistorise(EntityExpression)".
+ * Exemples :
+ * <pre>
+ * $qb->andWhere("1 = pasHistorise(sr)")
+ * $qb->andWhere("1 = pasHistorise(int.serviceReferentiel)")
+ * </pre>
+ *
+ * Fait appel à la fonction Oracle UNICAEN_ORACLE.COMPRISE_ENTRE().
+ */
+class PasHistorise extends FunctionNode
+{
+ public $alias;
+ public $dateObservation;
+
+ /**
+ * Parsing.
+ *
+ * NB: le format DQL attendu est "pasHistorise(EntityExpression)".
+ * Exemple :
+ * pasHistorise(s)
+ * pasHistorise(int.serviceReferentiel)
+ *
+ * @param Parser $parser
+ */
+ public function parse(Parser $parser)
+ {
+ $lexer = $parser->getLexer();
+ $parser->match(Lexer::T_IDENTIFIER);
+ $parser->match(Lexer::T_OPEN_PARENTHESIS);
+ $this->alias = $parser->EntityExpression();
+ if(Lexer::T_COMMA === $lexer->lookahead['type']){
+ $parser->match(Lexer::T_COMMA);
+ $this->dateObservation = $parser->ArithmeticPrimary();
+ }
+ $parser->match(Lexer::T_CLOSE_PARENTHESIS);
+ }
+
+ /**
+ * Génère le code SQL.
+ *
+ * @param SqlWalker $sqlWalker
+ * @return string
+ */
+ public function getSql(SqlWalker $sqlWalker)
+ {
+ $expr1 = clone($this->alias);
+ $expr2 = clone($this->alias);
+
+ $expr1->field = 'histoCreation';
+ $expr2->field = 'histoDestruction';
+
+ $sql = sprintf('UNICAEN_ORACLE.COMPRISE_ENTRE(%s, %s, %s)',
+ $expr1->dispatch($sqlWalker),
+ $expr2->dispatch($sqlWalker),
+ $this->dateObservation ? $this->dateObservation->dispatch($sqlWalker) : 'null');
+
+ return $sql;
+ }
+}
\ No newline at end of file
--
GitLab