2017-07-25 4 views
0

Nous travaillons sur une règle qui est structuré comme suit:Modifier élément/Mise à jour dans ArrayList en mémoire de travail en règle Drools

  • Nous avons une liste qui contient des éléments validés et non validés. La différence entre validée et non validée est faite en donnant un statut différent aux éléments.
  • Nous obtenons les éléments non validés de la liste.
  • Chaque élément non validé est comparé aux éléments validés dans la même liste.
  • Après comparaison, un élément non validé devient un élément validé qui doit être pris en compte lors de la validation des éléments non validés.

Le problème se pose lorsque nous souhaitons mettre à jour l'ArrayList d'origine des éléments. Nous devons être en mesure de mettre à jour l'élément non validé qui vient d'être validé dans son ArrayList d'origine dans la mémoire de travail afin que la boucle puisse prendre en compte le ArrayList "actualisé".

Trois questions:

Tout d'abord, quelle est la différence exacte entre l'utilisation de modifier et mettre à jour en Drools. Selon la documentation Drools:

« Sur le côté droit d'une règle du modifystatement est recommandée, car elle apporte les modifications et en informe le moteur en une seule instruction . »

Ainsi, la différence entre un et l'autre serait tout simplement sémantique simples comme:

modify($sprinkler) { setOn(true) }; 

et

$sprinkler.setOn(true); 
update($sprinkler); 

Cette hypothèse est correcte?

Deuxièmement, est-il possible de mettre à jour ou de modifier un élément spécifique dans ArrayList dans la mémoire de travail dans Drools sans utiliser un itérateur Java (un "for"). Dans notre cas, chaque élément est identifié avec un identifiant unique que nous obtenons dans la liste, nous aurons donc une référence valide pour mettre à jour son statut (validé ou non-validé). Enfin, nous sommes conscients que la mise à jour de la mémoire de travail entraînerait une nouvelle exécution de la règle. Disons que nous avons une ArrayList avec deux éléments non validés. Si nous devions obtenir tous les éléments non validés pour les valider, je crée une règle « premier » qui se déclenche deux fois, pour chaque élément non validé une fois:

rule "first" 
    when 
    $listOfElements : java.util.ArrayList () 
    $itemsToValidate : Element (status == "not validated") from $listOfElements 
    then 
    //do something or not 
end 

Si dans une deuxième règle, je valider certains articles et qui souhaitent changer le statut de l'élément non validé à valider dans la mémoire de travail comme celui-ci:

rule "second" extends "first" 
    when 
    //we validate attributes of the non-validated element against attributes of the validated elements 
    then 
    //my second question is if something like this is actually possible (solution without Java iterator) 
    $itemsToValidate.setStatus("validated") 
    modify ($listOfElements) { $itemsToValidate }; 
end 

Comment cela affecterait tout le processus? L'actualisation de la mémoire de travail provoquera la réévaluation de la première règle. Cette règle serait déjà lancée deux fois car nous avions rencontré deux éléments non validés. L'élément restant sera-t-il évalué seulement une fois ou plus d'une fois?

Répondre

0

La réponse à votre première question est qu'il n'y a pas de différence entre les deux extraits.(Les instructions insérées entre les deux de la seconde influenceraient ma réponse.)

Le scénario de la deuxième question n'utilise pas de mise à jour sous la même forme. Insérer une liste en tant que fait mais en utilisant des éléments de liste est généralement considéré comme mauvais. Insérez les éléments de la liste. Le conteneur peut ou peut ne pas être utile en tant que conteneur contenant les éléments de liste pour une transaction ou autre.

+0

Merci beaucoup pour votre réponse: à propos de la première question pour la clarification, et de la deuxième question pour souligner la mauvaise pratique. J'ai recodé la règle suivant votre ligne directrice et cela fonctionne maintenant parfaitement. Dans mon cas, le conteneur est toujours utile mais il est hors de la mémoire de travail, ce qui économise beaucoup de problèmes potentiels. Existe-t-il une documentation ou un lien disponible qui fournit des informations sur les mauvaises pratiques lors du codage avec Drools? – Ruurd