Пример #1
0
  @Test
  public void testIntSorting2() {
    // DROOLS-15
    String str =
        "global java.util.List list\n"
            + "rule R\n"
            + "dialect \"mvel\"\n"
            + "when\n"
            + "   $number : Number()\n"
            + "   not Number(intValue > $number.intValue)\n"
            + "then\n"
            + "   list.add($number);\n"
            + "   retract($number);\n"
            + "end";

    KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    List<Integer> list = new ArrayList<Integer>();
    ksession.setGlobal("list", list);

    ksession.insert(3);
    ksession.insert(7);
    ksession.insert(4);
    ksession.insert(5);
    ksession.insert(2);
    ksession.insert(1);
    ksession.insert(6);

    ksession.fireAllRules();

    assertEquals(Arrays.asList(7, 6, 5, 4, 3, 2, 1), list);
  }
Пример #2
0
  @Test
  public void testJitConstraintWithOperationOnBigDecimal() {
    // DROOLS-32
    String str =
        "import org.drools.integrationtests.MiscTest2.Model;\n"
            + "import java.math.BigDecimal;\n"
            + "\n"
            + "rule \"minCost\" dialect \"mvel\" \n"
            + "when\n"
            + "    $product : Model(price < (cost + 0.10B))\n"
            + "then\n"
            + "    modify ($product) { price = $product.cost + 0.10B }\n"
            + "end";

    KnowledgeBase kbase = loadKnowledgeBaseFromString(str);

    final Model model = new Model();
    model.setCost(new BigDecimal("2.43"));
    model.setPrice(new BigDecimal("2.43"));

    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    ksession.insert(model);

    int fired = ksession.fireAllRules(2);
    if (fired > 1) throw new RuntimeException("loop");
  }
Пример #3
0
  @Test
  public void testUpdateWithNonEffectiveActivations() throws Exception {
    // JBRULES-3604
    String str =
        "package inheritance\n"
            + "\n"
            + "import org.drools.Address\n"
            + "\n"
            + "rule \"Parent\"\n"
            + "    enabled false\n"
            + "    when \n"
            + "        $a : Address(suburb == \"xyz\")\n"
            + "    then \n"
            + "        System.out.println( $a ); \n"
            + "end \n"
            + "rule \"Child\" extends \"Parent\" \n"
            + "    when \n"
            + "        $b : Address( this == $a, street == \"123\")\n"
            + "    then \n"
            + "        System.out.println( $b ); \n"
            + "end";

    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();

    builder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);

    if (builder.hasErrors()) {
      throw new RuntimeException(builder.getErrors().toString());
    }
    KieBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
    kconf.setOption(LRUnlinkingOption.ENABLED);
    KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(kconf);
    knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());

    StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();

    Address address = new Address();

    address.setSuburb("xyz");
    org.kie.runtime.rule.FactHandle addressHandle = ksession.insert(address);

    int rulesFired = ksession.fireAllRules();

    assertEquals(0, rulesFired);

    address.setStreet("123");

    ksession.update(addressHandle, address);

    rulesFired = ksession.fireAllRules();

    System.out.println(rulesFired);
    assertEquals(1, rulesFired);

    ksession.dispose();
  }
  public static void main(final String[] args) {

    final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(
        ResourceFactory.newClassPathResource(
            "WorkItemConsequence1.drl", WorkItemConsequenceExample1.class),
        ResourceType.DRL);

    final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

    if (kbuilder.hasErrors()) {
      throw new RuntimeException("Compilation error.\n" + kbuilder.getErrors().toString());
    }

    final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    ksession
        .getWorkItemManager()
        .registerWorkItemHandler("EmailWorkItemHandler", new EmailWorkItemHandler());

    //        KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession,
    // "log/WorkItemConsequence.log");

    // Brains does not cause concern
    PersonLocation brains = new PersonLocation("Brains", 5);
    ksession.insert(brains);
    ksession.fireAllRules();

    // Gargamel is too far away to care
    PersonLocation gargamel = new PersonLocation("Gargamel", 10);
    FactHandle gargamelFactHandle = ksession.insert(gargamel);
    ksession.fireAllRules();

    // Uh oh, Gargamel moves closer
    gargamel.setDistance(5);
    ksession.update(gargamelFactHandle, gargamel);
    ksession.fireAllRules();

    //        logger.close();

    ksession.dispose(); // Stateful rule session must always be disposed when finished
  }
Пример #5
0
  @Test
  public void testPropertyReactivityWithNestedAccessorsInModify() {
    // JBRULES-3691
    String str =
        "package com.ilesteban.rulenotbeingfired;\n"
            + "\n"
            + "import java.util.Map;\n"
            + "import java.util.EnumMap;\n"
            + "import org.drools.integrationtests.MiscTest2.Parameter\n"
            + "import org.drools.integrationtests.MiscTest2.DataSample\n"
            + "\n"
            + "declare Recommendation\n"
            + "    parameter : Parameter\n"
            + "    value : double\n"
            + "end\n"
            + "\n"
            + "rule \"Init\" salience 100\n"
            + "when\n"
            + "then\n"
            + "    insert(new Recommendation(Parameter.PARAM_A, 1.0));"
            + "end\n"
            + "rule \"Rule 1\"\n"
            + "when\n"
            + "    $d: DataSample()\n"
            + "    $re: Recommendation ($p: parameter, $v: value)\n"
            + "then\n"
            + "    System.out.println(drools.getRule().getName());\n"
            + "    modify($d){\n"
            + "        addValue($re.getParameter(), $re.getValue())\n"
            + "    }\n"
            + "end\n"
            + "\n"
            + "rule \"Data with messages\"\n"
            + "salience -100\n"
            + "when\n"
            + "    $d: DataSample(notEmpty == true)\n"
            + "then\n"
            + "    System.out.println(drools.getRule().getName());\n"
            + "end\n";

    KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    ksession.insert(new DataSample());

    assertEquals(3, ksession.fireAllRules());
  }
Пример #6
0
  @Test
  public void testNumberCoercionOnNonGenericMap() {
    // JBRULES-3708
    String str =
        "package com.ilesteban.jit;\n"
            + "\n"
            + "import java.util.Map;\n"
            + "import java.util.EnumMap;\n"
            + "import org.drools.integrationtests.MiscTest2.Parameter\n"
            + "import org.drools.integrationtests.MiscTest2.DataSample\n"
            + "\n"
            + "declare TestObject\n"
            + "    data    :   java.util.Map\n"
            + "end\n"
            + "\n"
            + "rule \"Rule 1\"\n"
            + "when\n"
            + "    $d: DataSample()\n"
            + "then\n"
            + "    //create a new object copying the Map<Parameter, Double> to a Map<Object, Object>\n"
            + "    insert( new TestObject($d.getValues()));\n"
            + "end\n"
            + "\n"
            + "rule \"Rule 2\"\n"
            + "when\n"
            + "    TestObject(data[Parameter.PARAM_A] > 3)\n"
            + "then\n"
            + "end\n";

    KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    Map<Parameter, Double> values = new EnumMap<Parameter, Double>(Parameter.class);
    values.put(Parameter.PARAM_A, 4.0);
    DataSample data = new DataSample();
    data.setValues(values);
    ksession.insert(data);

    assertEquals(2, ksession.fireAllRules());
  }
Пример #7
0
  @Test
  public void testBigDecimalComparison() throws Exception {
    // JBRULES-3715
    String str =
        "import org.drools.Person;\n"
            + "rule \"Big Decimal Comparison\"\n"
            + "    dialect \"mvel\"\n"
            + "when\n"
            + "    Person( bigDecimal == 0.0B )\n"
            + "then\n"
            + "end";

    KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
    final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    Person p = new Person("Mario", 38);
    p.setBigDecimal(new BigDecimal("0"));
    ksession.insert(p);

    assertEquals(1, ksession.fireAllRules());
    ksession.dispose();
  }
Пример #8
0
  @Test
  public void testMvelAssignmentToPublicField() {
    String str =
        "import org.drools.integrationtests.MiscTest2.Foo\n"
            + "rule R\n"
            + "dialect \"mvel\"\n"
            + "when\n"
            + "   $foo : Foo()\n"
            + "then\n"
            + "   $foo.x = 1;\n"
            + "end";

    KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    Foo foo1 = new Foo();
    Foo foo2 = new Foo();
    ksession.insert(foo1);
    ksession.insert(foo2);
    ksession.fireAllRules();
    assertEquals(1, foo1.x);
    assertEquals(1, foo2.x);
  }
  private String insertMessageAndFire(String message, boolean stateful)
      throws IllegalAccessException, InstantiationException {
    System.out.println("********** Firing rules");

    String result = null;

    FactType testFactType = kagent.getKnowledgeBase().getFactType("test", "TestFact");
    Object fact = testFactType.newInstance();
    testFactType.set(fact, "message", message);

    if (stateful) {
      StatefulKnowledgeSession session = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
      session.insert(fact);
      session.fireAllRules();
      result = (String) testFactType.get(fact, "message");
      session.dispose();
    } else {
      StatelessKnowledgeSession session = kagent.getKnowledgeBase().newStatelessKnowledgeSession();
      session.execute(fact);
      result = (String) testFactType.get(fact, "message");
    }

    return result;
  }
Пример #10
0
  @Test
  public void testDynamicAddRule() {
    // DROOLS-17
    String str =
        "import org.drools.integrationtests.MiscTest2.A\n"
            + "rule r1 when\n"
            + "    $a : A( f1 == 1 )\n"
            + "then\n"
            + "end\n"
            + "\n"
            + "rule r2 when\n"
            + "    $a : A( f2 == 1 )\n"
            + "then\n"
            + "end\n"
            + "\n"
            + "rule r3 when\n"
            + "    $a : A( f3 == 1 )"
            + "then\n"
            + "end";

    String str2 =
        "import org.drools.integrationtests.MiscTest2.A\n"
            + "rule r4 when\n"
            + "    $a : A( f2 == 1, f4 == 1 )"
            + "then\n"
            + "end";

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);

    if (kbuilder.hasErrors()) {
      fail(kbuilder.getErrors().toString());
    }

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    FactHandle fh = ksession.insert(new A(1, 1, 1, 1));

    ksession.fireAllRules();

    kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str2.getBytes()), ResourceType.DRL);

    if (kbuilder.hasErrors()) {
      fail(kbuilder.getErrors().toString());
    }
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

    ksession.fireAllRules();

    // this second insert forces the regeneration of the otnIds
    ksession.insert(new A(2, 2, 2, 2));

    LeftTuple leftTuple = ((DefaultFactHandle) fh).getFirstLeftTuple();
    ObjectTypeNode.Id letTupleOtnId = leftTuple.getLeftTupleSink().getLeftInputOtnId();
    leftTuple = leftTuple.getLeftParentNext();
    while (leftTuple != null) {
      assertTrue(letTupleOtnId.before(leftTuple.getLeftTupleSink().getLeftInputOtnId()));
      letTupleOtnId = leftTuple.getLeftTupleSink().getLeftInputOtnId();
      leftTuple = leftTuple.getLeftParentNext();
    }
  }
Пример #11
0
  @Test
  @Ignore
  public void testReuseAgendaAfterException() throws Exception {
    // JBRULES-3677

    String str =
        "import org.drools.Person;\n"
            + "global java.util.List results;"
            + "rule R1\n"
            + "ruleflow-group \"test\"\n"
            + "when\n"
            + "   Person( $age : age ) \n"
            + "then\n"
            + "   if ($age > 40) throw new RuntimeException(\"Too old\");\n"
            + "   results.add(\"OK\");"
            + "end";

    KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
    final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    List<String> res = new ArrayList<String>();
    ksession.setGlobal("results", res);

    AgendaEventListener agendaEventListener =
        new AgendaEventListener() {
          public void matchCreated(org.kie.event.rule.MatchCreatedEvent event) {}

          public void matchCancelled(org.kie.event.rule.MatchCancelledEvent event) {}

          public void beforeMatchFired(org.kie.event.rule.BeforeMatchFiredEvent event) {}

          public void afterMatchFired(org.kie.event.rule.AfterMatchFiredEvent event) {}

          public void agendaGroupPopped(org.kie.event.rule.AgendaGroupPoppedEvent event) {}

          public void agendaGroupPushed(org.kie.event.rule.AgendaGroupPushedEvent event) {}

          public void beforeRuleFlowGroupActivated(
              org.kie.event.rule.RuleFlowGroupActivatedEvent event) {}

          public void afterRuleFlowGroupActivated(
              org.kie.event.rule.RuleFlowGroupActivatedEvent event) {
            ksession.fireAllRules();
          }

          public void beforeRuleFlowGroupDeactivated(
              org.kie.event.rule.RuleFlowGroupDeactivatedEvent event) {}

          public void afterRuleFlowGroupDeactivated(
              org.kie.event.rule.RuleFlowGroupDeactivatedEvent event) {}
        };

    ksession.addEventListener(agendaEventListener);

    FactHandle fact1 = ksession.insert(new Person("Mario", 38));
    ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test");

    assertEquals(1, res.size());
    res.clear();

    ksession.retract(fact1);

    FactHandle fact2 = ksession.insert(new Person("Mario", 48));
    try {
      ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test");
      fail("should throw an Exception");
    } catch (Exception e) {
    }
    ksession.retract(fact2);

    assertEquals(0, res.size());

    // try to reuse the ksession after the Exception
    FactHandle fact3 = ksession.insert(new Person("Mario", 38));
    ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test");
    assertEquals(1, res.size());
    ksession.retract(fact3);

    ksession.dispose();
  }