es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo comprobar el tamaño de un conjunto en las reglas de drools

Tengo la siguiente regla en Drool:

rule klFor2001 salience 30
when
 exists( Vgdokfag( Fagkode() == "FOR2001", ( Merknadkode() != "FAM13" ||
                   Merknadparameter() in ("FO1010", "FO1030", "FO1040"))))
 vgs: HashSet() from collect(Vgdokfag( Fagkode() contains "UPF",
                                 (Merknadkode() == "FAM13" ||
                                 Merknadparameter() in ("FO1010","FO1030", "FO1040"))) )

then
  insert(getKlIdr20xx("KL_IDR2001",true));
end

Entonces, lo que estoy tratando de hacer es lo siguiente:

  1. Comprobar si existe un Vgdokfag con For2001 como Fagkode y con Merknadkode distinto de “FAM13” o Merknadparameter es una de las siguientes cadenas (“FO1010”, “FO1030”, “FO1040”).
  2. Comprobar que existan al menos dos hechos VgdokFag que tienen “UPF” en su “Fagkode” y que Merknadkode sea igual a “FAM13” o Merknadparameter sea una de las siguientes cadenas (“FO1010”, “FO1030”, “FO1040”).

No sé cómo hacer el segundo punto. Estoy tratando de obtener todos los hechos que cumplan las condiciones dadas y luego comprobar de alguna manera si el tamaño del conjunto es mayor que 2, pero por alguna razón no puedo escribir algo como esto:

eval(vgs.size() > 2)

Estoy seguro de que estoy haciendo algo mal aquí, ¿alguien puede ayudarme por favor?

Un saludo.

Tags:  

Answer

  1. Avatar for davy.ai

    Hola,

    Para verificar que hay al menos dos hechos en el HashSet, puedes modificar la cláusula “when” de la siguiente manera:

    when
       exists( Vgdokfag( Fagkode() == "FOR2001", ( Merknadkode() != "FAM13" ||
                       Merknadparameter() in ("FO1010", "FO1030", "FO1040"))))
       $vgs1: Vgdokfag( Fagkode() contains "UPF", (Merknadkode() == "FAM13" ||
                                         Merknadparameter() in ("FO1010","FO1030", "FO1040"))) 
       $vgs2: Vgdokfag( Fagkode() contains "UPF", (Merknadkode() == "FAM13" ||
                                         Merknadparameter() in ("FO1010","FO1030", "FO1040")),
                                         this != $vgs1 ) from $vgs1
    
       $vgsSet: HashSet() from collect($vgs1, $vgs2)
    then
      eval($vgsSet.size() >= 2)
      insert(getKlIdr20xx("KL_IDR2001",true));
    end
    

    En la cláusula “when” modificada, primero verificamos que haya al menos un hecho Vgdokfag que cumpla las condiciones mencionadas en el punto 1. Luego agregamos dos nuevas vinculaciones, $vgs1 y $vgs2. Vinculamos el primer hecho VgdokFag que cumple las condiciones del punto 2 a $vgs1, y luego vinculamos un segundo hecho VgdokFag a $vgs2 que cumpla estas condiciones y no sea igual al primer hecho (this != $vgs1). Esto asegura que tengamos al menos dos hechos que cumplan la segunda condición.

    Finalmente, creamos un nuevo HashSet usando la función collect y agregamos los dos hechos al conjunto. Luego, evaluamos la regla verificando que el tamaño del conjunto sea mayor o igual a 2. Si la condición se cumple, podemos insertar el objeto requerido KL_IDR2001 en la memoria de trabajo.

    ¡Espero que esto te ayude! Hazme saber si tienes alguna pregunta adicional.

    Saludos,

    [Tu nombre]

Comments are closed.