IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Drools - syntaxe des regles


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut Drools - syntaxe des regles
    Bonjour, je travaille depuis plusieurs semaines sur un problème de régles Drools et je n'arrive pas à m'en sortir. Le but final est d'automatiser le traitement de certaines pensions.
    Si quelqu'un pouvait me donner une piste , ce serait parfait.

    J'utilise java jdk 1.6.0_13, eclipse galileo, avec les plugins gef et drools.

    Dans une version très expurgée, j'ai une classe principale Go.java,
    2 classes ( FaitTest et FaitsProposition ), un fichier de regles identification.drl
    et une sortie console. Les voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    //===========  Go.java  ========================
    package sre.main;
     
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Date;
    import java.util.List;
     
    import org.drools.KnowledgeBase;
    import org.drools.KnowledgeBaseFactory;
    import org.drools.builder.KnowledgeBuilder;
    import org.drools.builder.KnowledgeBuilderFactory;
    import org.drools.builder.ResourceType;
    import org.drools.io.ResourceFactory;
    import org.drools.logger.KnowledgeRuntimeLogger;
    import org.drools.logger.KnowledgeRuntimeLoggerFactory;
    import org.drools.runtime.StatefulKnowledgeSession;
    import org.drools.runtime.StatelessKnowledgeSession;
     
    import sre.faits.FaitTest;
    import sre.faits.FaitsProposition;
     
    public class Go {                    
     
        public static void main(String[] args) throws Exception {
                // Début du programme
                System.out.println("Debut");
     
                Reader reglesidentif = new InputStreamReader( Go.class.getResourceAsStream( "identification.drl" ) );
     
                // Instancier plusieurs packages à partir des règles fournies
                KnowledgeBuilder kPersonne =  KnowledgeBuilderFactory.newKnowledgeBuilder();        
                kPersonne.add( ResourceFactory.newReaderResource( reglesidentif ), ResourceType.DRL );
     
                //Créer la base de règles et ajouter les packages (deployer le paquet de regles).
                KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
                kbase.addKnowledgePackages( kPersonne.getKnowledgePackages() );
     
                // Creation d'une session "stateless
                StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
     
                Collection laliste = new ArrayList();
     
                FaitTest f1 = new FaitTest();
                f1.setCle("cle1");
                f1.setValeur("valeur2");
     
                FaitTest f2 = new FaitTest();
                f2.setCle("cle2");
                f2.setValeur("");
     
                // Une proposition complète
                FaitsProposition p1 = new FaitsProposition(    "DESAVION","VroomVroom",
                                                            "Yvan","rue du chat ui pleure",
                                                            "",    "",    "","44123",
                                                            "Ville","23454323",
                                                            "98788","00001");
                // Une proposition sans nom patronymique. La regle 1 doit être déclenchée
                FaitsProposition p2 = new FaitsProposition(    "","SONTRACTEUR",
                                                            "Ygor","rue du devers",
                                                            "",    "",    "","44123",
                                                            "Ville","23454323",
                                                            "98788","00001");
     
                laliste.add(f1);
                laliste.add(f2);
                laliste.add(p1);
                laliste.add(p2);
     
                System.out.println("Contenu de l'arraylist laliste");
                   System.out.println(((ArrayList) laliste).toString());
     
     
                System.out.println("execution");            
                ksession.execute(laliste);
     
                System.out.println("Fin");                               
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     //===========   FaitTest  ==================
    package sre.faits;
     
    public class FaitTest {
        String cle;
        String valeur;
     
        public FaitTest(){
            this.cle = "";
            this.valeur = "";
            }
     
        public FaitTest(String _cle, String _valeur){
            this.cle=_cle;
            this.valeur=_valeur;
            }
     
        public void setCle(String _cle){
            this.cle=_cle;
            }
     
        public void setValeur(String _valeur){
            this.valeur=_valeur;
            }
     
        public String getCle(){
            return this.cle;
            }
     
        public String getValeur(){
            return this.valeur;
            }
     
        //public String toString(){
        //    return "fait [ " + this.cle + ", " + this.valeur + "]";
        //    }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     //=========  FaitsProposition  ===================
    package sre.faits;
     
    public class FaitsProposition {
     
        // Attributs
        /* Tous les attributs issus des propositions
         *  seront préfixés par la lettre p.
         *  
         *  Chaque champ du DEDP sera considéré et le
         *   fait qu'il soit servi ou pas sera un fait.     *  
         */
        String pnompatro;
        String pnomusage;
        String pprenom;
        String padresse1;
        String padresse2;
        String padresse3;
        String padresse4;
        String pcp;
        String pville;
        String pnumbordereau;
        String pnumproposition;
        String pnumdossier;
     
        public FaitsProposition(){    
            }
     
        public FaitsProposition(
                                String _pnompatro,
                                String _pnomusage,
                                String _pprenom,
                                String _padresse1,
                                String _padresse2,
                                String _padresse3,
                                String _padresse4,
                                String _pcp,
                                String _pville,
                                String _pnumbordereau,
                                String _pnumproposition,
                                String _pnumdossier
                                ){
            this.pnompatro=_pnompatro;
            this.pnomusage=_pnomusage;
            this.pprenom=_pprenom;
            this.padresse1=_padresse1;
            this.padresse2=_padresse2;
            this.padresse3=_padresse3;
            this.padresse4=_padresse4;
            this.pcp=_pcp;
            this.pville=_pville;
            this.pnumbordereau=_pnumbordereau;
            this.pnumproposition=_pnumproposition;
            this.pnumdossier=_pnumdossier;
            }
     
        public String getPNompatro(){        
            return this.pnompatro;
            }
        public String getPNomusage(){        
            return this.pnomusage;
            }
        public String getPPrenom(){        
            return this.pprenom;
            }
        public String getPAdresse1(){        
            return this.padresse1;
            }
        public String getPAdresse2(){        
            return this.padresse2;
            }
        public String getPAdresse3(){        
            return this.padresse3;
            }
        public String getPAdresse4(){        
            return this.padresse4;
            }
        public String getPCP(){        
            return this.pcp;
            }
        public String getVille(){        
            return this.pville;
            }
        public String getNumBordereau(){        
            return this.pnumbordereau;
            }
        public String getNumProposition(){        
            return this.pnumproposition;
            }
        public String getNumDossier(){        
            return this.pnumdossier;
            }
        public void setPNomPatro(String _pnompatro){        
            this.pnompatro= _pnompatro;
            }
        public void setPNomUsage(String _pnomusage){        
            this.pnomusage= _pnomusage;
            }
        public void setPPrenom(String _pprenom){        
            this.pprenom= _pprenom;
            }
        public void setAdresse1(String _padresse1){        
            this.padresse1= _padresse1;
            }
        public void setAdresse2(String _padresse2){        
            this.padresse1= _padresse2;
            }
        public void setAdresse3(String _padresse3){        
            this.padresse2= _padresse3;
            }
        public void setAdresse4(String _padresse4){        
            this.padresse4= _padresse4;
            }
        public void setPCP(String _pcp){        
            this.pcp= _pcp;
            }
        public void setPVille(String _pville){        
            this.pville= _pville;
            }
        public void setPNumBordereau(String _pnumbordereau){        
            this.pnumbordereau= _pnumbordereau;
            }
        public void setPNumDossier(String _pnumdossier){        
            this.pnumdossier= _pnumdossier;
            }
        public void setPNumProposition(String _pnumproposition){        
            this.pnumproposition= _pnumproposition;
            }
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     //=========  identification.drl  ==================
    #created on: 21 sept. 2009
    package pensions
     
    import sre.faits.FaitTest;
    import sre.faits.FaitsProposition;
     
    rule "regle un"
    dialect "mvel"
        when
        FaitsProposition ( PNompatro == "" || PNompatro == null )
        then
            System.out.println("application regle un");
    end 
     
    rule "regle trois"
    dialect "mvel"
        when
            FaitTest()
        then
            System.out.println("application regle 3");
    end
    ============= Sortie console ======================
    Debut
    Contenu de l'arraylist laliste
    [sre.faits.FaitTest@9ffe3f, sre.faits.FaitTest@1ed1b0b, sre.faits.FaitsProposition@18a8ce2, sre.faits.FaitsProposition@12789d2]
    execution
    application regle un
    application regle 3
    application regle 3
    Fin

    ============================================
    Donc jusque là tout est normal
    mais lorsque je veux faire un peu plus de controle en changeant
    la regle 3 plus rien ne fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ========== Le fichier de regles, modifié  =============
    #created on: 21 sept. 2009
    package pensions
     
    import sre.faits.FaitTest;
    import sre.faits.FaitsProposition;
     
    rule "regle un"
    dialect "mvel"
        when
        FaitsProposition ( PNompatro == "" || PNompatro == null )
        then
            System.out.println("application regle un");
    end 
     
    rule "regle trois"
    dialect "mvel"
        when
            FaitTest(  Valeur == "Valeur")
        then
            System.out.println("application regle 3");
    end
    =========== Sortie console dans ce cas =======
    Debut
    Contenu de l'arraylist laliste
    [sre.faits.FaitTest@15718f2, sre.faits.FaitTest@126f827, sre.faits.FaitsProposition@16dfa45, sre.faits.FaitsProposition@149eb9f]
    execution
    Fin
    En fait, d'une part je ne vois pas l'erreur dans ma declaration,
    Je suis persuadé de respecter les directives du manuel drools, alors je ne comprends pas
    d'autre part j'aurai pu comprendre que la regle 3 ne fonctionne pas s'il y a une erreur ( mais laquelle ?) mais même la règle 1 ne fonctionne pas

    Je suis preneur de toute piste

    Merci à tous

    Mrtldvd

  2. #2
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Par défaut
    Salut,

    J'aurais tendance à dire que dans ton test, tu devrais comparer ta variable "valeur" (et non "Valeur" d'ailleurs) au moyen de la méthode "equals".
    Ensuite, tu compares à "valeur" donc ta règle ne sera jamais vérifiée car tes "FaitTest" ont pour valeur : "valeur2" et "" ..

    PS : moi aussi je débute et à ce sujet, si quelqu'un a trouvé une très bonne doc, je suis aussi preneur (car la doc de Jboss passe du cas de base à du ultra complexe en 10 lignes ... )

    Edit : en fait, equals ne semble pas obligatoire par contre la casse des objets comparés sans doute que oui

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut [Résolu] pb de Majuscule
    Citation Envoyé par parkerlewis Voir le message
    Salut,

    J'aurais tendance à dire que dans ton test, tu devrais comparer ta variable "valeur" (et non "Valeur" d'ailleurs) au moyen de la méthode "equals".
    Ensuite, tu compares à "valeur" donc ta règle ne sera jamais vérifiée car tes "FaitTest" ont pour valeur : "valeur2" et "" ..

    PS : moi aussi je débute et à ce sujet, si quelqu'un a trouvé une très bonne doc, je suis aussi preneur (car la doc de Jboss passe du cas de base à du ultra complexe en 10 lignes ... )

    Edit : en fait, equals ne semble pas obligatoire par contre la casse des objets comparés sans doute que oui
    J'ai fini par trouver hier soir après avoir chercher plus de 6 semaines. Effectivement c'était bien un pb de majuscule. C'est le coeur du pb, quand on reprend le getChose sans le get, faut-il conserver la majuscule de "Chose" ou non. Apparement non. Mais alors pourquoi cela fonctionne t-il pour l'attribut PCP de la classe FaitsProposition

    Je bosse avec drools par oblgation, mais ce n'est pas un plaisir.
    En tout cas merci de m'avoir confirmé mon erreur.

Discussions similaires

  1. [css] annuler des regles
    Par sampq dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 01/11/2005, 06h53
  2. vive la syntaxe des languages !
    Par D@rKness74 dans le forum Windows
    Réponses: 2
    Dernier message: 15/09/2004, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo