Skip to content
Snippets Groups Projects
Commit 69f85f2c authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Changement de stratégie Select > MV

parent c4a0aa8e
Branches
No related tags found
No related merge requests found
Pipeline #37170 failed
......@@ -39,7 +39,7 @@ return [
'Inscription SUAC' => 'orm_suac',
'Inscription SUAPS' => 'orm_suaps',
'Mes Formations' => 'orm_mesformations',
// 'Inscription SUAPS' => 'orm_suaps',
'Nos Indicateurs' => 'orm_default',
],
'perimetreService' => PerimetreService::class,
......
......@@ -101,7 +101,7 @@ class CategorieController extends AbstractActionController
$vm = new ViewModel();
if ($categorie !== null) {
$vm->setTemplate('unicaen-indicateur/default/confirmation');
$vm->setTemplate('default/confirmation');
$vm->setVariables([
'title' => "Suppression de la catégorie " . $categorie->getLibelle(),
'text' => "La suppression est définitive êtes-vous sûr·e de vouloir continuer ?",
......
......@@ -71,7 +71,7 @@ class IndicateurController extends AbstractActionController {
$perimetres = $this->getPerimetreService()->getPerimetres($user, $role);
$exists = $this->getIndicateurService()->verifierExistanceMaterializedView($indicateur);
$exists = $this->getIndicateurService()->verifierExistenceMaterializedView($indicateur);
// if ($exists === true) $result = $this->getIndicateurService()->getIndicateurData($indicateur, $perimetres);
$result = $this->getIndicateurService()->getIndicateurData($indicateur, $perimetres);
......@@ -96,7 +96,7 @@ class IndicateurController extends AbstractActionController {
public function creerAction() : ViewModel|Response
{
$indicateur = new Indicateur();
$indicateur = new Indicateur(); $indicateur->setSelectOnly(false);
$namespace = $this->params()->fromQuery('namespace');
$form = $this->getIndicateurForm();
......@@ -115,10 +115,10 @@ class IndicateurController extends AbstractActionController {
$indicateur->setDernierRafraichissement(new DateTime());
$this->getIndicateurService()->create($indicateur);
if (!$indicateur->isSelectOnly()) $this->getIndicateurService()->createView($indicateur);
$this->getIndicateurService()->createView($indicateur);
$count = $this->getIndicateurService()->getCount($indicateur);
$indicateur->setNbElements($count);
$this->getIndicateurService()->update($indicateur);
//$this->getIndicateurService()->update($indicateur);
return $this->redirect()->toRoute('indicateur/afficher', ['indicateur' => $indicateur->getId()], [], true);
}
}
......@@ -184,7 +184,7 @@ class IndicateurController extends AbstractActionController {
$vm = new ViewModel();
if ($indicateur !== null) {
$vm->setTemplate('unicaen-indicateur/default/confirmation');
$vm->setTemplate('default/confirmation');
$vm->setVariables([
'title' => "Suppression de l'indicateur " . $indicateur->getTitre(),
'text' => "La suppression est définitive êtes-vous sûr·e de vouloir continuer ?",
......@@ -198,7 +198,7 @@ class IndicateurController extends AbstractActionController {
{
$indicateur = $this->getIndicateurService()->getRequestedIndicateur($this);
$indicateur->setDernierRafraichissement(new DateTime());
if (!$indicateur->isSelectOnly()) $this->getIndicateurService()->createView($indicateur);
$this->getIndicateurService()->createView($indicateur);
$this->getIndicateurService()->update($indicateur);
$retour = $this->params()->fromQuery('retour');
......
......@@ -79,15 +79,10 @@ class IndicateurService
/** GESTION DES VUES **********************************************************************************************/
public function verifierExistanceMaterializedView(Indicateur $indicateur): bool
public function verifierExistenceMaterializedView(Indicateur $indicateur): bool
{
if ($indicateur->isSelectOnly()) return true;
$viewname = $indicateur->getViewId();
$this->setObjectManagerWithOrm($indicateur->getOrm());
try {
$sql = "SELECT EXISTS (SELECT FROM pg_matviews WHERE matviewname='" . $viewname . "')";
$sql = "SELECT EXISTS (SELECT FROM pg_matviews WHERE matviewname='" . $indicateur->getViewId() . "')";
$res = $this->getObjectManager()->getConnection()->executeQuery($sql, [], []);
$tmp = $res->fetchAllAssociative();
} catch (Exception) {
......@@ -98,33 +93,17 @@ class IndicateurService
/**
* @param Indicateur $indicateur
* @param ?array $userPerimetre (un tableau des ids associé aux élements dans le périmetre de l'utilisateur connecté)
* @param ?array $userPerimetre (un tableau des ids associé aux élements dans le périmètre de l'utilisateur connecté)
* @return array|null
*/
public function fetch(Indicateur $indicateur, ?array $userPerimetre = null): ?array
{
$this->setObjectManagerWithOrm($indicateur->getOrm());
if ($indicateur->isSelectOnly()) $sql = $indicateur->getRequete();
else {
$exist = $this->verifierExistanceMaterializedView($indicateur);
$exist = $this->verifierExistenceMaterializedView($indicateur);
if ($exist === false) return null;
$sql = "SELECT * FROM " . $indicateur->getViewId() . " WHERE 1=1";
}
if ($indicateur->getPerimetre() !== null and $indicateur->getPerimetre() !== "aucun") {
$perimetresActifs = explode(PerimetreServiceInterface::PERIMETRE_SEPARATOR, $indicateur->getPerimetre());
foreach ($perimetresActifs as $perimetreActif) {
if ($userPerimetre !== null) {
if (!empty($userPerimetre) AND isset($userPerimetre[$perimetreActif])) {
$sql .= " AND perimetre_" . $perimetreActif . "_id IN (" . implode(",", $userPerimetre[$perimetreActif]) . ")";
} else {
$sql .= " AND perimetre_" . $perimetreActif . "_id IS NULL";
}
}
}
}
// Les périmètres ont été retirés, car inutile dans le contexte (à reprendre du module au besoin).
$sql = "SELECT * FROM " . $indicateur->getViewId();
try {
$this->getObjectManager()->getConnection()->prepare($sql);
......@@ -141,10 +120,10 @@ class IndicateurService
}
public function manipulateDatabaseView(Indicateur $indicateur, string $sql): void
public function manipulateDatabaseView(?Indicateur $indicateur, string $sql): void
{
$this->setObjectManagerWithOrm($indicateur->getOrm());
if ($indicateur) $this->setObjectManagerWithOrm($indicateur->getOrm());
else $this->setObjectManagerWithOrm('Nos Indicateurs');
try {
$query = $this->getObjectManager()->getConnection()->prepare($sql);
......@@ -163,10 +142,12 @@ class IndicateurService
*/
public function refresh(Indicateur $indicateur): void
{
$this->setObjectManagerWithOrm($indicateur->getOrm());
if ($this->verifierExistenceMaterializedView($indicateur)) {
$this->updateView($indicateur);
} else {
$this->createView($indicateur);
}
$sql = "REFRESH MATERIALIZED VIEW " . $indicateur->getViewId();
$this->manipulateDatabaseView($indicateur, $sql);
$indicateur->setDernierRafraichissement(new DateTime());
$count = $this->getCount($indicateur);
$indicateur->setNbElements($count);
......@@ -178,10 +159,8 @@ class IndicateurService
*/
public function dropView(Indicateur $indicateur): void
{
$this->setObjectManagerWithOrm($indicateur->getOrm());
$sql = "DROP MATERIALIZED VIEW IF EXISTS " . $indicateur->getViewId();
$this->manipulateDatabaseView($indicateur, $sql);
$this->manipulateDatabaseView(null, $sql);
}
/**
......@@ -189,13 +168,51 @@ class IndicateurService
*/
public function createView(Indicateur $indicateur): void
{
//recupération des données à partie du SGBD source
$this->setObjectManagerWithOrm($indicateur->getOrm());
$sql = "CREATE MATERIALIZED VIEW " . $indicateur->getViewId() . " AS " . $indicateur->getRequete();
$this->manipulateDatabaseView($indicateur, $sql);
$sql = $indicateur->getRequete();
try {
$this->getObjectManager()->getConnection()->prepare($sql);
} catch (DBA_Exception $e) {
throw new RuntimeException("Un problème est survenu lors de la récupération de la session.", 0, $e);
}
try {
$res = $this->getObjectManager()->getConnection()->executeQuery($sql, [], []);
$tmp = $res->fetchAllAssociative();
} catch (DBA_Driver_Exception $e) {
throw new RuntimeException("Un problème est survenu lors de la récupération de des données de l'indicateur.", 0, $e);
}
$sql = "CREATE MATERIALIZED VIEW " . $indicateur->getViewId() . " AS ";
$resItems = [];
foreach ($tmp as $item) {
$element = [];
foreach ($item as $key => $value) {
$value = str_replace("'", "''", $value);
$element[] = "'".$value."' as ".$key;
}
$resItems[] = "select " . implode(",", $element);
}
$sql .= implode(" union ", $resItems);
$this->setObjectManagerWithOrm('Nos Indicateurs');
try {
$this->getObjectManager()->getConnection()->prepare($sql);
} catch (DBA_Exception $e) {
throw new RuntimeException("Un problème est survenu lors de la récupération de la session.", 0, $e);
}
try {
$this->getObjectManager()->getConnection()->executeQuery($sql, [], []);
} catch (DBA_Driver_Exception $e) {
throw new RuntimeException("Un problème est survenu lors de la récupération de des données de l'indicateur.", 0, $e);
}
//TODO :: redondant si refresh est utilisé
$indicateur->setDernierRafraichissement(new DateTime());
$count = $this->getCount($indicateur);
$indicateur->setNbElements($count);
$this->update($indicateur);
}
/**
......@@ -203,9 +220,6 @@ class IndicateurService
*/
public function updateView(Indicateur $indicateur): void
{
$this->setObjectManagerWithOrm($indicateur->getOrm());
$this->dropView($indicateur);
$this->createView($indicateur);
$count = $this->getCount($indicateur);
......@@ -216,9 +230,7 @@ class IndicateurService
public function createQueryBuilder(): QueryBuilder
{
$qb = $this->getObjectManager()->getRepository(Indicateur::class)->createQueryBuilder('indicateur');
return $qb;
return $this->getObjectManager()->getRepository(Indicateur::class)->createQueryBuilder('indicateur');
}
/**
......@@ -231,8 +243,7 @@ class IndicateurService
$qb = $this->getObjectManager()->getRepository(Indicateur::class)->createQueryBuilder('indicateur')
->orderBy('indicateur.' . $attribut, $ordre);
$result = $qb->getQuery()->getResult();
return $result;
return $qb->getQuery()->getResult();
}
/**
......@@ -277,19 +288,6 @@ class IndicateurService
return $indicateur;
}
/**
* @return Indicateur[]
*/
public function getIndicateursByNamespace(?string $namespace): array
{
$qb = $this->getObjectManager()->getRepository(Indicateur::class)->createQueryBuilder('indicateur')
->andWhere('indicateur.namespace = :namespace')
->setParameter('namespace', $namespace);
return $qb->getQuery()->getResult();
}
/** FACADE **************************************************************/
/** RECUPERATION DONNEES ******************************************************************************************/
/**
......@@ -300,7 +298,7 @@ class IndicateurService
public function getIndicateurData(Indicateur $indicateur, ?array $perimetres = null): ?array
{
$exist = $this->verifierExistanceMaterializedView($indicateur);
$exist = $this->verifierExistenceMaterializedView($indicateur);
if (!$exist) return null;
$userPerimetre = $this->extractPerimetres($perimetres);
......@@ -315,29 +313,6 @@ class IndicateurService
}
}
}
// if ($indicateur->getEntity() === Indicateur::ENTITY_ADAPTATIF) {
// if (!empty($rawdata)) {
// foreach ($rawdata[0] as $key => $value) $rubriques[] = $key;
// }
// }
// if ($indicateur->getEntity() === Indicateur::ENTITY_STRUCTURE) {
// $rubriques = [
// 'Code' => 'code',
// 'Libelle' => 'libelle_court',
// 'Libelle long' => 'libelle_long',
// 'Type' => 'type',
//
// ];
// }
// if ($indicateur->getEntity() === Indicateur::ENTITY_AGENT) {
// $rubriques = [
// 'ID' => 'c_src_individu',
// 'SOURCE' => 'c_source',
// 'Prenom' => 'prenom',
// 'Nom' => 'nom_usage',
// ];
// }
/** RETRAIT DES RUBRIQUES ASSOCIEES AUX PERIMETRES */
$perimetresActifs = [];
......@@ -360,7 +335,7 @@ class IndicateurService
public function getCount(Indicateur $indicateur, ?array $perimetres = null): ?int
{
$exist = $this->verifierExistanceMaterializedView($indicateur);
$exist = $this->verifierExistenceMaterializedView($indicateur);
if (!$exist) return null;
$userPerimetre = $this->extractPerimetres($perimetres);
......
......@@ -97,7 +97,7 @@ $width = 12 / ((int) ($tableau?$tableau->getNbColumn():1));
</div>
</div>
<?php
$exists = $indicateurService->verifierExistanceMaterializedView($indicateur->getViewId());
$exists = $indicateurService->verifierExistenceMaterializedView($indicateur->getViewId());
if ($exists === true) {
$result = $indicateurService->getIndicateurData($indicateur);
$header = $result[0];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment