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