/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.compiler.integrationtests; import java.util.ArrayList; import java.util.List; import org.drools.compiler.Bar; import org.drools.compiler.CommonTestMethodBase; import org.drools.compiler.Foo; import org.junit.Test; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieSession; import org.kie.internal.utils.KieHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MatchTest extends CommonTestMethodBase { private static Logger logger = LoggerFactory.getLogger(MatchTest.class); @Test public void testGetObjectsOnePattern() { // DROOLS-1470 String str = "import org.drools.compiler.Foo\n" + "import org.drools.compiler.Bar\n" + "global java.util.List list\n" + "rule R when\n" + " Foo(id == \"Lotus Elise\")\n" + "then\n" + " list.addAll(kcontext.getMatch().getObjects());\n" + "end\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL).build().newKieSession(); List<Object> list = new ArrayList<>(); ksession.setGlobal("list", list); Bar roadsterType = new Bar("roadster"); ksession.insert(roadsterType); Foo bmwZ4 = new Foo("BMW Z4", roadsterType); ksession.insert(bmwZ4); Foo lotusElise = new Foo("Lotus Elise", roadsterType); ksession.insert(lotusElise); Foo mazdaMx5 = new Foo("Mazda MX-5", roadsterType); ksession.insert(mazdaMx5); Bar miniVanType = new Bar("minivan"); ksession.insert(miniVanType); Foo kieCarnival = new Foo("Kia Carnival", miniVanType); ksession.insert(kieCarnival); Foo renaultEspace = new Foo("Renault Espace", miniVanType); ksession.insert(renaultEspace); ksession.fireAllRules(); assertEquals(1, list.size()); assertTrue(list.contains(lotusElise)); ksession.dispose(); } @Test public void testGetObjectsTwoPatterns() { // DROOLS-1470 String str = "import org.drools.compiler.Foo\n" + "import org.drools.compiler.Bar\n" + "global java.util.List list\n" + "rule R when\n" + " $b : Bar(id == \"minivan\")\n" + " Foo(bar == $b)\n" + "then\n" + " list.addAll(kcontext.getMatch().getObjects());\n" + "end\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL).build().newKieSession(); List<Object> list = new ArrayList<>(); ksession.setGlobal("list", list); Bar roadsterType = new Bar("roadster"); ksession.insert(roadsterType); Foo bmwZ4 = new Foo("BMW Z4", roadsterType); ksession.insert(bmwZ4); Foo lotusElise = new Foo("Lotus Elise", roadsterType); ksession.insert(lotusElise); Foo mazdaMx5 = new Foo("Mazda MX-5", roadsterType); ksession.insert(mazdaMx5); Bar miniVanType = new Bar("minivan"); ksession.insert(miniVanType); Foo kieCarnival = new Foo("Kia Carnival", miniVanType); ksession.insert(kieCarnival); Foo renaultEspace = new Foo("Renault Espace", miniVanType); ksession.insert(renaultEspace); ksession.fireAllRules(); assertTrue(list.contains(miniVanType)); assertTrue(list.contains(kieCarnival)); assertTrue(list.contains(renaultEspace)); ksession.dispose(); } @Test public void testGetObjectsAccumulate() { // DROOLS-1470 String str = "import org.drools.compiler.Foo\n" + "import org.drools.compiler.Bar\n" + "global java.util.List list\n" + "rule R when\n" + " $b : Bar(id == \"roadster\")\n" + " accumulate(\n" + " $f : Foo(bar == $b);\n" + " $t : count($f)\n" + " )\n" + "then\n" + " list.addAll(((org.drools.core.spi.Activation)kcontext.getMatch()).getObjectsDeep());\n" + "end\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL).build().newKieSession(); List<Object> list = new ArrayList<>(); ksession.setGlobal("list", list); Bar roadsterType = new Bar("roadster"); ksession.insert(roadsterType); Foo bmwZ4 = new Foo("BMW Z4", roadsterType); ksession.insert(bmwZ4); Foo lotusElise = new Foo("Lotus Elise", roadsterType); ksession.insert(lotusElise); Foo mazdaMx5 = new Foo("Mazda MX-5", roadsterType); ksession.insert(mazdaMx5); Bar miniVanType = new Bar("minivan"); ksession.insert(miniVanType); Foo kieCarnival = new Foo("Kia Carnival", miniVanType); ksession.insert(kieCarnival); Foo renaultEspace = new Foo("Renault Espace", miniVanType); ksession.insert(renaultEspace); ksession.fireAllRules(); assertTrue(list.contains(roadsterType)); assertTrue(list.contains(bmwZ4)); assertTrue(list.contains(lotusElise)); assertTrue(list.contains(mazdaMx5)); ksession.dispose(); } @Test public void testGetObjectsAccumulateWithNoMatchingFacts() { // DROOLS-1470 String drl = "global java.util.List list\n" + "rule R when\n" + " accumulate(\n" + " Object(false);\n" + " $total : count()\n" + " )\n" + "then\n" + " list.addAll(((org.drools.core.spi.Activation)kcontext.getMatch()).getObjectsDeep());\n" + "end\n"; KieSession ksession = new KieHelper().addContent(drl, ResourceType.DRL).build().newKieSession(); List<Object> list = new ArrayList<>(); ksession.setGlobal("list", list); ksession.fireAllRules(); assertTrue(list.contains(0L)); ksession.dispose(); } @Test public void testGetObjectsExists() { // DROOLS-1474 String str = "import org.drools.compiler.Foo\n" + "import org.drools.compiler.Bar\n" + "global java.util.List list\n" + "rule R when\n" + " $b : Bar(id == \"roadster\")\n" + " exists Foo(bar == $b)\n" + "then\n" + " list.addAll(((org.drools.core.spi.Activation)kcontext.getMatch()).getObjectsDeep());\n" + "end\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL).build().newKieSession(); List<Object> list = new ArrayList<>(); ksession.setGlobal("list", list); Bar roadsterType = new Bar("roadster"); ksession.insert(roadsterType); Foo bmwZ4 = new Foo("BMW Z4", roadsterType); ksession.insert(bmwZ4); Foo lotusElise = new Foo("Lotus Elise", roadsterType); ksession.insert(lotusElise); Foo mazdaMx5 = new Foo("Mazda MX-5", roadsterType); ksession.insert(mazdaMx5); Bar miniVanType = new Bar("minivan"); ksession.insert(miniVanType); Foo kiaCarnival = new Foo("Kia Carnival", miniVanType); ksession.insert(kiaCarnival); Foo renaultEspace = new Foo("Renault Espace", miniVanType); ksession.insert(renaultEspace); ksession.fireAllRules(); assertTrue(list.contains(roadsterType)); assertTrue(list.contains(bmwZ4)); assertTrue(list.contains(lotusElise)); assertTrue(list.contains(mazdaMx5)); assertFalse(list.contains(miniVanType)); assertFalse(list.contains(kiaCarnival)); assertFalse(list.contains(renaultEspace)); ksession.dispose(); } @Test public void testGetObjectsAccumulateWithNestedExists() { // DROOLS-1474 String str = "import org.drools.compiler.Foo\n" + "import org.drools.compiler.Bar\n" + "global java.util.List list\n" + "rule R when\n" + " $b1 : Bar(id == \"roadster\")\n" + " accumulate(\n" + " $b2 : Bar(this != $b1) and exists Foo(bar == $b2);\n" + " $t : count($b2)\n" + " )\n" + "then\n" + " list.addAll(((org.drools.core.spi.Activation)kcontext.getMatch()).getObjectsDeep());\n" + "end\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL).build().newKieSession(); List<Object> list = new ArrayList<>(); ksession.setGlobal("list", list); Bar roadsterType = new Bar("roadster"); ksession.insert(roadsterType); Foo bmwZ4 = new Foo("BMW Z4", roadsterType); ksession.insert(bmwZ4); Foo lotusElise = new Foo("Lotus Elise", roadsterType); ksession.insert(lotusElise); Foo mazdaMx5 = new Foo("Mazda MX-5", roadsterType); ksession.insert(mazdaMx5); Bar miniVanType = new Bar("minivan"); ksession.insert(miniVanType); Foo kiaCarnival = new Foo("Kia Carnival", miniVanType); ksession.insert(kiaCarnival); Foo renaultEspace = new Foo("Renault Espace", miniVanType); ksession.insert(renaultEspace); ksession.fireAllRules(); assertTrue(list.contains(roadsterType)); assertFalse(list.contains(bmwZ4)); assertFalse(list.contains(lotusElise)); assertFalse(list.contains(mazdaMx5)); assertTrue(list.contains(miniVanType)); assertTrue(list.contains(kiaCarnival)); assertTrue(list.contains(renaultEspace)); ksession.dispose(); } }