17.17 Mise à jour d'attribut sur des collections de documents
17.17.1 Présentation
Afin de modifier une valeur d'attribut sur un ensemble de document vous pouvez utiliser une itération sur la liste en question comme le montre l'exemple ci- dessous
$s = new \SearchDoc('', 'TST_MYFAMILY'); $s->setObjectReturn(); $s->setOrder('initid'); $s->setSlice(1000); $dl=$s->search()->getDocumentList(); foreach ($dl as $doc) { $doc->setValue('tst_example','my new value'); $err=$doc->store(); }
Plus le nombre de documents est important, plus le temps de modification sera conséquent. L'utilisateur ayant déclenché ce programme risque de perdre patience.
La classe UpdateAttribute
permet de réaliser un traitement équivalent
de manière optimisée.
$s = new \SearchDoc('', 'TST_MYFAMILY'); $s->setObjectReturn(); $s->setOrder('initid'); $s->setSlice(1000); $dl=$s->search()->getDocumentList(); $ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->setValue('tst_example','my new value'); $err=$ua->getError();
Ceci ne réalise pas tout à fait la même action. En effet dans la version optimisée les post-traitement spécifiques et internes ne sont pas réalisés. Cela veut dire que le titre, le profil, les attributs calculés ne sont pas mis à jour.
En contrepartie, le temps de traitement est bien moindre. Sur une mise à jour "classique" pour un temps de réponse d'environ 45 secondes pour 1000 documents, la version optimisée réalise le traitement en moins de 2 secondes.
17.17.2 Paramétrage général
17.17.2.1 Réviser les documents
Les documents peuvent être révisés avant la modification. Cela est indiqué par
la méthode ::addRevision()
.
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->addRevision('my revision'); $ua->setValue('tst_example','my new value');
La révision est faite sur les documents qui seront modifiés. Dans le cas du setValue si la valeur est déjà celle que l'on veut mettre, la révision ne sera pas effectuée. De manière générale si le document ne subit pas de modification, il ne sera pas révisé.
L'activation de ce paramètre va entraîner un temps de réponse plus important car cela entraîne de nombreuses écritures supplémentaires pour les révisions.
17.17.2.2 Recalculer le profil
Si vos documents sont lié à un profil dynamique et que la modification est faite
sur un attribut lié au profil, vous devez ajouter l'appel à la méthode
::useProfileUpdating()
.
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->useProfileUpdating(); $ua->setValue('tst_redactor','MY_NEWREDACTOR');
17.17.2.3 Ajouter un commentaire d'historique
Un commentaire spécifique, avec la méthode ::addHistoryComment()
peut être
ajouté dans l'historique sur chacun des documents. À la différence de la
révision, il est appliqué sur tous les documents qu'il soit changé ou non.
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->addHistoryComment("my message"); $ua->setValue('tst_example','my new value');
17.17.2.4 Activer le mode transactionnel
Le mode transactionnel, permet d'éviter de faire un traitement partiel en cas d'erreur. Par défaut ce mode n'est pas activé.
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->useTransaction(true); $ua->setValue('tst_example','my new value');
S'il y a une exception levée ou si ::getError()
n'est pas vide le traitement
sera abandonné.
17.17.2.5 Récupérer les statuts
Lorsque le traitement est fini, le statut de chacun des documents est donné par
la méthode ::getResults()
. Cela donne une table avec pour chacun des éléments,
des indications sur ce qui a été fait, l'index du tableau est l'initid du
document.
- [
changed
] => est à vrai si le document a subit une modification - [
revisionError
] => message d'erreur de la révision (si révision) - [
profilingError
] => message d'erreur du recalcul de profil - [
profiled
] => est à vrai si le document a été reprofilé - [
revised
] => est à vrai si le document a été révisé - [
historyUpdated
] => est à vrai si l'historique a été mis à jour
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->setValue('tst_example','my new value'); $status=$ua->getResults(); $changed=$unChanged=0; foreach ($status as $initid=>$aStatus) { if ($aStatus->changed) $changed++; else $unChanged++; } printf("%d document changed, %d document unchanged\n", $changed,$unChanged);
17.17.2.6 Estimation des temps de réponse
Ces temps sont donnés à titre indicatif pour le traitement de 1000 documents. Ces temps peuvent fluctuer en fonction de votre configuration serveur et de la configuration de la famille.
Pour 1000 documents | Temps en secondes |
---|---|
setValue par boucle traditionnelle | 45,64 |
setValue seul | 1,27 |
setValue + revision | 68,83 |
setValue + profiling | 1,84 |
setValue + historique | 1,41 |
setValue + revision + profiling | 73,30 |
17.17.3 Fonctions de modifications
Les quatre fonctions de modification permettent de réaliser des modifications sur un attribut en particulier pour l'ensemble des documents donné.
17.17.3.1 setValue
La méthode ::setValue()
permet de changer de manière systématique la valeur
d'un attribut. Si la valeur d'un document est déjà celle choisie, alors le
document n'est pas modifié.
Si l'attribut est dans un tableau, c'est toute la colonne qui est modifiée. Il est possible d'indiquer un tableau de valeur dans la cas d'un attribut multiple ou d'un attribut qui est dans un tableau.
17.17.3.2 replaceValue
La méthode ::replaceValue()
permet de changer une valeur par une autre.
Si la valeur à changer n'est pas présente, le document ne sera pas changé.
Pour les attributs multiples, le test de remplacement se fait sur chacune des valeurs du multiple. De même, pour les multiples dans les tableaux, le test de remplacement se fera sur les valeurs finales.
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->replaceValue('tst_example','my old value','my new value');
17.17.3.3 removeValue
La méthode ::removeValue()
permet de supprimer une certaine valeur d'un
attribut. Cela ne permet pas de supprimer la valeur de l'attribut de manière
systématique. Si la valeur à supprimer n'est pas présente le document ne sera
pas changé.
Comme pour ::replaceValue()
, pour les attribut multiple, le test de
suppression se fait chacune des valeurs du multiple.
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->removeValue('tst_example','value to remove');
Lorsque l'attribut est dans un tableau, cela laissera un vide dans le tableau où la valeur se située.
17.17.3.4 addValue
La méthode ::addValue()
ne fonctionne qu'avec les attributs "multiples". Elle
permet d'ajouter une nouvelle valeur à la liste des valeurs de l'attribut. Si
l'attribut est déclaré multiple alors seuls les documents n'ayant pas encore
cette valeur seront changés. Si c'est un attribut simple qui est dans un tableau
alors une nouvelle rangée sera ajoutée au tableau.
Si c'est un attribut multiple qui est dans un tableau alors la valeur sera ajoutée à tous les éléments du multiple.
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $ua->addValue('tst_multiple','value to add');
17.17.4 Éxécution en tâche de fond
Comme ces tâches peuvent être longues, il est possible de les lancer en tâche de fond. Cela est fait en remplaçant l'appel des fonctions de modification par leur équivalent en tâche de fond.
::bgSetValue()
::bgReplaceValue()
::bgRemoveValue()
::bgAddValue()
$ua = new \UpdateAttribute(); $ua->useCollection($dl); $fileStatus=$ua->bgAddValue('tst_multiple','value to add');
À la différence des fonctions lancées en synchrone, cette fonction retourne un chemin vers un fichier qui sera mis à jour au fur et à mesure de l'avancement par le processus lancé en tâche de fond. L'exploitation de ce fichier se fait via la classe UpdateAttributeStatus. Elle permet de contrôler l'avancement de la tâche.
$sua= new UpdateAttributeStatus($statusFile); while (! $sua->isFinished()) { print_r($sua->getLastMessage()); sleep(1); } if ($err=$sua->getError()) { print "Process failed : ".$err; } else { $status=$sua->getResults(); $changed=$unChanged=0; foreach ($status as $initid=>$aStatus) { if ($aStatus->changed) $changed++; else $unChanged++; } printf("%d document changed, %d document unchanged\n", $changed,$unChanged); }
La méthode ::getLastMessage()
retourne un objet UpdateAttributeStatusLine
avec les informations suivantes :
-
date
: date d'exécution (format ISO 8601) -
processCode
: nom de la méthode utilisée -
message
: message d'information
Extrait du fichier de status :
2012-06-28T16:16:30 setValue BEGIN 2012-06-28T16:16:30 setValue traitement [219656,220655,220656,220657,220658,220659,220660,220661,220662,220663,220664,22066 5,220666,220667,220668,220669,220670,22067 1,220672,220673,220674,220675,220676,220677,220678,220679,220680,220681] 2012-06-28T16:16:30 executeRevision traitement des révisions pour 28 documents 2012-06-28T16:16:32 executeRevision 10/28 révisions effectuées 2012-06-28T16:16:34 executeRevision 20/28 révisions effectuées 2012-06-28T16:16:35 executeRevision 28/28 révisions effectuées 2012-06-28T16:16:35 executeRevision traitement des révisions effectué 2012-06-28T16:16:35 executeSetValue traitement d'affectation de valeur pour 28 documents 2012-06-28T16:16:35 executeSetValue argument tst_redactor=>1181 2012-06-28T16:16:35 executeSetValue 28 documents mis à jour 2012-06-28T16:16:35 executeProfiling 10/28 mise à jour de profils effectués 2012-06-28T16:16:36 executeProfiling 20/28 mise à jour de profils effectués 2012-06-28T16:16:36 executeProfiling 28/28 mise à jour de profils effectués ... 2012-06-28T16:16:36 setValue END