/*
* Copyright 2016 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;
import org.junit.Test;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.internal.utils.KieHelper;
import java.math.BigDecimal;
import java.math.BigInteger;
import static org.junit.Assert.assertEquals;
public class NodeHashingTest {
@Test
public void testNodeHashTypeMismatch() throws Exception {
// BZ-1328380
// 2 rules -- Mvel coercion
String drl1 = "import " + Person.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( status == 1 )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( status == 2 )\n" +
"then\n" +
"end\n";
KieSession ksession1 = new KieHelper().addContent( drl1, ResourceType.DRL )
.build()
.newKieSession();
Person p1 = new Person();
p1.setStatus( "1" );
ksession1.insert( p1 );
assertEquals( 1, ksession1.fireAllRules() );
ksession1.dispose();
// 3 rules -- Node Hashing
String drl2 = "import " + Person.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( status == 1 )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( status == 2 )\n" +
"then\n" +
"end\n" +
"rule \"rule3\"\n" +
"when\n" +
" Person( status == 3 )\n" +
"then\n" +
"end\n";
KieSession ksession2 = new KieHelper().addContent( drl2, ResourceType.DRL )
.build()
.newKieSession();
Person p2 = new Person();
p2.setStatus( "1" );
ksession2.insert( p2 );
assertEquals( 1, ksession2.fireAllRules() );
ksession2.dispose();
}
@Test
public void testNodeHashTypeMismatchWithBigInteger() throws Exception {
// BZ-1328380
// 2 rules -- Mvel coercion
String drl1 = "import " + Person.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( bigInteger == \"1\" )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( bigInteger == \"2\" )\n" +
"then\n" +
"end\n";
KieSession ksession1 = new KieHelper().addContent( drl1, ResourceType.DRL )
.build()
.newKieSession();
Person p1 = new Person();
p1.setBigInteger( new BigInteger( "1" ) );
ksession1.insert( p1 );
assertEquals( 1, ksession1.fireAllRules() );
ksession1.dispose();
// 3 rules -- Node Hashing
String drl2 = "import " + Person.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( bigInteger == \"1\" )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( bigInteger == \"2\" )\n" +
"then\n" +
"end\n" +
"rule \"rule3\"\n" +
"when\n" +
" Person( bigInteger == \"3\" )\n" +
"then\n" +
"end\n";
KieSession ksession2 = new KieHelper().addContent( drl2, ResourceType.DRL )
.build()
.newKieSession();
Person p2 = new Person();
p2.setBigInteger( new BigInteger( "1" ) );
ksession2.insert( p2 );
assertEquals( 1, ksession2.fireAllRules() );
ksession2.dispose();
}
@Test
public void testNodeHashTypeMismatchWithBigDecimal() throws Exception {
// BZ-1328380
// 2 rules -- Mvel coercion
String drl1 = "import " + Person.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( bigDecimal == \"1.00\" )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( bigDecimal == \"2.00\" )\n" +
"then\n" +
"end\n";
KieSession ksession1 = new KieHelper().addContent( drl1, ResourceType.DRL )
.build()
.newKieSession();
Person p1 = new Person();
p1.setBigDecimal( new BigDecimal( "1.00" ) );
ksession1.insert( p1 );
assertEquals( 1, ksession1.fireAllRules() );
ksession1.dispose();
// 3 rules -- Node Hashing
String drl2 = "import " + Person.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( bigDecimal == \"1.00\" )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( bigDecimal == \"2.00\" )\n" +
"then\n" +
"end\n" +
"rule \"rule3\"\n" +
"when\n" +
" Person( bigDecimal == \"3.00\" )\n" +
"then\n" +
"end\n";
KieSession ksession2 = new KieHelper().addContent( drl2, ResourceType.DRL )
.build()
.newKieSession();
Person p2 = new Person();
p2.setBigDecimal( new BigDecimal( "1.00" ) );
ksession2.insert( p2 );
assertEquals( 1, ksession2.fireAllRules() );
ksession2.dispose();
}
@Test
public void testNodeHashTypeMismatchFromBigDecimal() throws Exception {
// BZ-1328380
// 2 rules -- Mvel coercion
String drl1 = "import " + Person.class.getCanonicalName() + ";\n" +
"import " + BigDecimal.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( age == new BigDecimal( 1 ) )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( age == new BigDecimal( 2 ) )\n" +
"then\n" +
"end\n";
KieSession ksession1 = new KieHelper().addContent( drl1, ResourceType.DRL )
.build()
.newKieSession();
Person p1 = new Person();
p1.setAge( 1 );
ksession1.insert( p1 );
assertEquals( 1, ksession1.fireAllRules() );
ksession1.dispose();
// 3 rules -- Node Hashing
String drl2 = "import " + Person.class.getCanonicalName() + ";\n" +
"import " + BigDecimal.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( age == new BigDecimal( 1 ) )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( age == new BigDecimal( 2 ) )\n" +
"then\n" +
"end\n" +
"rule \"rule3\"\n" +
"when\n" +
" Person( age == new BigDecimal( 3 ) )\n" +
"then\n" +
"end\n";
KieSession ksession2 = new KieHelper().addContent( drl2, ResourceType.DRL )
.build()
.newKieSession();
Person p2 = new Person();
p2.setAge( 1 );
ksession2.insert( p2 );
assertEquals( 1, ksession2.fireAllRules() );
ksession2.dispose();
}
@Test
public void testNodeHashTypeMismatchWithPrimitiveDouble() throws Exception {
// BZ-1328380
// 2 rules -- Mvel coercion
String drl1 = "import " + Person.class.getCanonicalName() + ";\n" +
"import " + BigDecimal.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( age == 1.0 )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( age == 2.0 )\n" +
"then\n" +
"end\n";
KieSession ksession1 = new KieHelper().addContent( drl1, ResourceType.DRL )
.build()
.newKieSession();
Person p1 = new Person();
p1.setAge( 1 );
ksession1.insert( p1 );
assertEquals( 1, ksession1.fireAllRules() );
ksession1.dispose();
// 3 rules -- Node Hashing
String drl2 = "import " + Person.class.getCanonicalName() + ";\n" +
"import " + BigDecimal.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( age == 1.0 )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( age == 2.0 )\n" +
"then\n" +
"end\n" +
"rule \"rule3\"\n" +
"when\n" +
" Person( age == 3.0 )\n" +
"then\n" +
"end\n";
KieSession ksession2 = new KieHelper().addContent( drl2, ResourceType.DRL )
.build()
.newKieSession();
Person p2 = new Person();
p2.setAge( 1 );
ksession2.insert( p2 );
assertEquals( 1, ksession2.fireAllRules() );
ksession2.dispose();
}
@Test
public void testNodeHashTypeMismatchWithBigIntegerAndDecimal() throws Exception {
// BZ-1328380
// 2 rules -- Mvel coercion
String drl1 = "import " + Person.class.getCanonicalName() + ";\n" +
"import " + BigInteger.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( bigDecimal == new BigInteger( \"1\" ) )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( bigDecimal == new BigInteger( \"2\" ) )\n" +
"then\n" +
"end\n";
KieSession ksession1 = new KieHelper().addContent( drl1, ResourceType.DRL )
.build()
.newKieSession();
Person p1 = new Person();
p1.setBigDecimal( new BigDecimal( 1 ) );
ksession1.insert( p1 );
assertEquals( 1, ksession1.fireAllRules() );
ksession1.dispose();
// 3 rules -- Node Hashing
String drl2 = "import " + Person.class.getCanonicalName() + ";\n" +
"import " + BigInteger.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" Person( bigDecimal == new BigInteger( \"1\" ) )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" Person( bigDecimal == new BigInteger( \"2\" ) )\n" +
"then\n" +
"end\n" +
"rule \"rule3\"\n" +
"when\n" +
" Person( bigDecimal == new BigInteger( \"3\" ) )\n" +
"then\n" +
"end\n";
KieSession ksession2 = new KieHelper().addContent( drl2, ResourceType.DRL )
.build()
.newKieSession();
Person p2 = new Person();
p2.setBigDecimal( new BigDecimal( 1 ) );
ksession2.insert( p2 );
assertEquals( 1, ksession2.fireAllRules() );
ksession2.dispose();
}
public static class DoubleValue {
private final Double value;
public DoubleValue( Double value ) {
this.value = value;
}
public Double getValue() {
return value;
}
}
@Test
public void testNodeHashTypeMismatchWithDouble() throws Exception {
// BZ-1328380
// 2 rules -- Mvel coercion
String drl1 = "import " + DoubleValue.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" DoubleValue( value == \"1.00\" )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" DoubleValue( value == \"2.00\" )\n" +
"then\n" +
"end\n";
KieSession ksession1 = new KieHelper().addContent( drl1, ResourceType.DRL )
.build()
.newKieSession();
ksession1.insert( new DoubleValue(1.00) );
assertEquals( 1, ksession1.fireAllRules() );
ksession1.dispose();
// 3 rules -- Node Hashing
String drl2 = "import " + DoubleValue.class.getCanonicalName() + ";\n" +
"rule \"rule1\"\n" +
"when\n" +
" DoubleValue( value == \"1.00\" )\n" +
"then\n" +
"end\n" +
"rule \"rule2\"\n" +
"when\n" +
" DoubleValue( value == \"2.00\" )\n" +
"then\n" +
"end\n" +
"rule \"rule3\"\n" +
"when\n" +
" DoubleValue( value == \"3.00\" )\n" +
"then\n" +
"end\n";
KieSession ksession2 = new KieHelper().addContent( drl2, ResourceType.DRL )
.build()
.newKieSession();
ksession2.insert( new DoubleValue(1.00) );
assertEquals( 1, ksession2.fireAllRules() );
ksession2.dispose();
}
@Test
public void testHashingOnClassConstraint() {
String drl =
"import " + A.class.getCanonicalName() + "\n" +
"rule R1 when\n" +
" A( configClass == String.class );\n" +
"then\n" +
"end\n" +
"\n" +
"rule R2 when\n" +
" A( configClass == String.class );\n" +
"then\n" +
"end\n" +
"\n" +
"rule R3 when\n" +
" A( configClass == String.class );\n" +
"then\n" +
"end\n\n";
KieSession kieSession = new KieHelper().addContent( drl, ResourceType.DRL )
.build().newKieSession();
kieSession.insert( new A( ) );
assertEquals( 3, kieSession.fireAllRules() );
}
public static class A {
public Class<?> getConfigClass() {
return String.class;
}
}
}