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