Question sur la fonction history::all

Bonjour,

Je n’ai pas encore mon accès developpeur, je pose donc la question ici :

la fonction history::all retourne-t-elle systématiquement des valeurs ordonnées entre date de début et date de fin ?

Mon contexte :

j’ajoute des valeurs dans l’historique d’une commande avant la dernière valeur existante avec la commande addHistoryValue

Avant de faire cet ajout, les lignes suivantes retournent bien la dernière date d’historique, soit $dateEnd :

$all = history::all($cmdId, $dateBegin, $dateEnd);
$dateCollectPreviousIndex = count($all) ? $all[count($all) - 1]->getDatetime() : null; 

Après l’ajout, la même commande retourne la date de l’historique ajouté. C’est ce qui a été constaté hier par un utilisateur de mon plugin.

Aujourd’hui,s’il exécute la même commande (dans un scénario), la date retournée est bien la dernière date du même intervalle :thinking:

Avez-vous une idée de cette observation ?

[2021-01-16 18:50:58][DEBUG] : [Virtuel][Plugin Veolia ] Commande = 27966 Récupération historique index entre le 2020-12-31 23:55:00 et le 2021-01-14 23:55:00 Diff = 1
[2021-01-16 18:50:58][DEBUG] : [Virtuel][Plugin Veolia ] Date de collecte précédente de l'index = 2021-01-14 23:55:00
[2021-01-16 19:50:39][INFO] : [Virtuel][Plugin Veolia ] Enregistrement mesure manquante :  Cmd = 27966 Date = 2021-01-11 23:55:00 => Mesure = 586703
[2021-01-16 19:50:39][DEBUG] : [Virtuel][Plugin Veolia ] Commande = 27966 Récupération historique index entre le 2020-12-31 23:55:00 et le 2021-01-14 23:55:00 Diff = 1
[2021-01-16 19:50:39][DEBUG] : [Virtuel][Plugin Veolia ] Date de collecte précédente de l'index = 2021-01-11 23:55:00

Résolution : ajouter une fonction de tri :

function sortHisto($a, $b)
{
  if (is_null($a) || is_null($b)) {
    return 0;
  }

  $dateA = $a->getDatetime();
  $dateB = $b->getDatetime();

  if ($dateA == $dateB) {
    return 0;
  }
  elseif ($dateA < $dateB) {
    return -1;
  }
  else {
    return 1;
  }
}

$all = history::all($cmdId, $dateBegin, $dateEnd);
usort($all, "sortHisto");

Bonjour @Aegis

Il suffit d’aller vérifier la fonction all dans la classe history ( core/class/history.class.php )
il y a bien un $sql .= ' ORDER BY datetime ASC'; pour chaque requête dans les tables history et historyArch

Le array_merge($result2, $result1) des résultats sur les 2 tables peut faire que le résultat ne soit pas dans l’ordre.

Hello, merci pour ton retour, donc il faut donc que je gère çà dans le code du plugin pour être sûr de prendre la date la plus récente.

Normalement historyarch est forcément plus ancienne que history.

Du coup ça n’explique pas l’observation ?

Oui normalement.
Dans les logs au dessus, la requete de 18h50 ajoute dans history une mesure manquante pour le 11 janvier.

A 19h50 c’est cette mesure de la table history qui est récupérée. Alors qu’il existe une mesure plus récente dans historyArch

Cas très particulier non ?

Sinon plutôt que le gérer dans les plugins, on peut pas le faire directement dans le Core ? Avec un minimum d’impact en performance !

Dès que l’on ajoute un history avec une date forcée dans le passé, il y a ce pb.

Ca pourrait etre fait dans le core pour une version future…
Pour les plugins qui doivent tourner avec les versions existantes, pas d’autre choix que de faire un sort du résultat d’history::all

En effet !

Ok merci pour votre éclairage à tous les deux :+1:

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.