2014-06-09 3 views
0

Je travaille sur un projet qui exécute Drools 5.5 pour un système de moteur de promotion. J'ai du mal à comprendre l'étape de la compilation lorsque je construis la base de connaissances.Est-ce que ce drl doit être compilé?

C'est le cas: J'ai un drl qui effectue une collecte (LHS) sur une liste avec la condition taille> = int. Le système qui génère le drl, l'a fait mal et maintenant j'ai des exceptions d'exécution. Maintenant, j'essaie de comprendre comment la compilation fonctionne sur les baves pour cette affaire.

La chose est, sur ce Collect, la contrainte (taille> = quelque chose, où quelque chose n'est pas un entier) n'est pas validé par les Drools 5.5 compilateur, et l'exception n'exploser dans l'exécution:

$COLLECT_ALL : ArrayList (size >= something) 
    from collect (Product (...)) 

Mais, le même code est validé sur les drools 5.0.0 et je suis capable de supprimer cette règle avant la création de la base de connaissances.

Je ne sais pas si c'est un bug ou une mauvaise compréhension du LHS sur les baves.

Quoi qu'il en soit, c'est l'étape de validation que je travaille sur

KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
builder.add(ResourceFactory.newByteArrayResource(rule.getBytes()) , ResourceType.DRL); 
if (builder.hasErrors()) { 
    createErrorMessage(builder); 
} 

Répondre

0

L'analyseur DRL a undergon une longue série d'améliorations après 5.0.0, et puis il y avait une refonte complète entre (IIRC) 5.2 et 5.3.

Pour comprendre ce qui se passe avec ArrayList(size >= something) en 5.5 à la compilation et à l'exécution, il faut savoir ce que « quelque chose » est. Une discussion complète de tout à la place de "quelque chose" est hors de portée, mais, en règle générale, si l'expression Java est valide, elle doit compiler et ne pas gronder, gronder ou dégringoler à l'exécution - encore moins "exploser" (espérons qu'il n'a pas endommagé un noyau).

plus tard

La raison est que (quelque part le long de la ligne de développement) une distinction a été faite, de ne pas appliquer la « sécurité de type » aux collections alors que toutes les autres classes sont « typesafe » par défaut, implique une vérification à la compilation.

Vous pouvez activer ce en utilisant, par exemple, pour ArrayList en ajoutant ceci à votre fichier DRL:

declare ArrayList 
@typesafe(true) 
end 
+0

Techniquement, ce n'est pas une déclaration java valide. "quelque chose" est vraiment quelque chose. Je sais que cela semble étrange, mais c'est juste un mot dans le fichier. Ressemble à une variable, mais elle n'est jamais déclarée. Exemple: 'rule" XYZ "quand $ COLLECT_ALL: ArrayList (taille> = tag-xyz) de collect (Produit (...)) puis ...' – VitorBtf

+0

Merci pour la clarification. - Il semble qu'il y ait une différence w.r.t. rapport d'erreurs. Une erreur similaire dans 'Product' est signalée au moment de la compilation. Je poursuis cela sur la liste des utilisateurs de Drools. – laune

+0

Voir l'ajout à ma réponse. – laune

Questions connexes