From 6884e0efd8ae926b8a4dc0e592615fc8c55b87ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= <laurent.lecluse@unicaen.fr>
Date: Tue, 5 May 2020 10:38:03 +0200
Subject: [PATCH] =?UTF-8?q?Recalcul=20des=20vues=20mat=C3=A9rialis=C3=A9es?=
 =?UTF-8?q?=20lors=20de=20la=20mise=20=C3=A0=20jour?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 CHANGELOG.md                                  |  1 +
 admin/actions/update-bdd.php                  |  2 ++
 admin/src/BddAdmin/Bdd.php                    | 23 +++++++++++++++++++
 .../Driver/Oracle/MaterializedViewManager.php | 14 +++++++++++
 .../MaterializedViewManagerInteface.php       |  5 +++-
 5 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index dd7ac080d8..aee518eab2 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 ## Nouveautés
 
 * Les modèles de pièces justificatives peuvent être téléchargés en fonction de l'année courante (paramètre :annee à ajouter dans l'URL qui sera remplacé dynamiquement par l'année en cours)
+* Les vues matérialisées sont recalculées à chaque mise à jour
 
 ## Notes de mise à jour
 
diff --git a/admin/actions/update-bdd.php b/admin/actions/update-bdd.php
index c4d670ce03..c7b0739624 100644
--- a/admin/actions/update-bdd.php
+++ b/admin/actions/update-bdd.php
@@ -63,6 +63,8 @@ $dataGen->update();
 $c->println('');
 $mm->migration('post');
 
+// Recalcul des vues matérialisées
+$bdd->refreshMaterializedViews();
 
 // Néttoyage des caches
 $oa->run('clear-cache');
\ No newline at end of file
diff --git a/admin/src/BddAdmin/Bdd.php b/admin/src/BddAdmin/Bdd.php
index cd3cd15742..b3d720f102 100644
--- a/admin/src/BddAdmin/Bdd.php
+++ b/admin/src/BddAdmin/Bdd.php
@@ -680,6 +680,29 @@ class Bdd
 
 
 
+    public function refreshMaterializedViews($ddl = null)
+    {
+        if (!$ddl) {
+            $ddl = $this->materializedView()->get();
+        } else {
+            $ddl = Ddl::normalize($ddl)->get(Ddl::MATERIALIZED_VIEW);
+            if (!$ddl) $ddl = [];
+        }
+
+        $this->logBegin("Recalcul de toutes les vues matérialisées");
+        foreach ($ddl as $mv) {
+            try {
+                $this->logMsg("Vue matérialisée " . $mv['name'] . " ...", true);
+                $this->materializedView()->refresh($mv);
+            } catch (\Throwable $e) {
+                $this->logError($e);
+            }
+        }
+        $this->logEnd();
+    }
+
+
+
     /**
      * @return array
      * @throws BddCompileException
diff --git a/admin/src/BddAdmin/Driver/Oracle/MaterializedViewManager.php b/admin/src/BddAdmin/Driver/Oracle/MaterializedViewManager.php
index 0e9e9d9271..6880580057 100644
--- a/admin/src/BddAdmin/Driver/Oracle/MaterializedViewManager.php
+++ b/admin/src/BddAdmin/Driver/Oracle/MaterializedViewManager.php
@@ -100,4 +100,18 @@ class MaterializedViewManager extends AbstractManager implements MaterializedVie
         $this->drop($oldName);
         $this->create($new);
     }
+
+
+
+    /**
+     * @param string|array $name
+     */
+    public function refresh($name)
+    {
+        if (is_array($name)) {
+            $name = $name['name'];
+        }
+
+        $this->addQuery("BEGIN DBMS_SNAPSHOT.REFRESH( '$name','C'); END;", 'Mise à jour de la vue matérialisée ' . $name);
+    }
 }
\ No newline at end of file
diff --git a/admin/src/BddAdmin/Manager/MaterializedViewManagerInteface.php b/admin/src/BddAdmin/Manager/MaterializedViewManagerInteface.php
index 1ee33bbdca..5fe6afbe45 100644
--- a/admin/src/BddAdmin/Manager/MaterializedViewManagerInteface.php
+++ b/admin/src/BddAdmin/Manager/MaterializedViewManagerInteface.php
@@ -4,5 +4,8 @@ namespace BddAdmin\Manager;
 
 interface MaterializedViewManagerInteface extends ManagerInterface
 {
-
+    /**
+     * @param string|array $name
+     */
+    public function refresh($name);
 }
-- 
GitLab