@Test public void testCheckOrDescr() throws Exception { final String text = "rule X when Person( eval( age == 25 ) || ( eval( name.equals( \"bob\" ) ) && eval( age == 30 ) ) ) then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( 1, pattern.getDescrs().size() ); assertEquals( pattern.getConstraint().getClass(), AndDescr.class ); assertEquals( ExprConstraintDescr.class, pattern.getConstraint().getDescrs().get( 0 ).getClass() ); }
private RuleImpl createRule( final ConditionalElementDescr ceDescr, final KnowledgeBuilderImpl builder, final String consequence ) throws Exception { final PackageDescr packageDescr = new PackageDescr( "p1" ); final RuleDescr ruleDescr = new RuleDescr( "rule-1" ); packageDescr.addRule( ruleDescr ); final AndDescr lhs = new AndDescr(); ruleDescr.setLhs( lhs ); lhs.addDescr( (BaseDescr) ceDescr ); final PatternDescr patternDescr = new PatternDescr( Cheese.class.getName(), "stilton" ); patternDescr.addConstraint( new ExprConstraintDescr( "type == \"stilton\" ") ); ceDescr.addDescr( patternDescr ); ruleDescr.setConsequence( consequence ); builder.addPackage( packageDescr ); InternalKnowledgePackage pkg = builder.getPackage(packageDescr.getName()); final RuleImpl rule = pkg.getRule( "rule-1" ); assertEquals( "rule-1", rule.getName() ); return rule; }
@Test public void testEvalConstraintWithMvelOperator() { String drl = "rule \"yeah\" " + "\tdialect \"mvel\"\n when " + "Foo( eval( field soundslike \"water\" ) )" + " then " + "end"; DrlParser drlParser = new DrlParser(); PackageDescr packageDescr; try { packageDescr = drlParser.parse( true, drl ); } catch (DroolsParserException e) { throw new RuntimeException( e ); } RuleDescr r = packageDescr.getRules().get( 0 ); PatternDescr pd = (PatternDescr) r.getLhs().getDescrs().get( 0 ); assertEquals( 1, pd.getConstraint().getDescrs().size() ); }
@Test public void testPredicate2() throws Exception { // predicates are also prefixed by the eval keyword final RuleDescr rule = (RuleDescr) parse( "rule", "rule X when Foo(eval( $var.equals(\"xyz\") )) then end" ); final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final List< ? > constraints = pattern.getConstraint().getDescrs(); assertEquals( 1, constraints.size() ); final ExprConstraintDescr predicate = (ExprConstraintDescr) constraints.get( 0 ); assertEquals( "eval( $var.equals(\"xyz\") )", predicate.getExpression() ); }
@Test public void testMemberof() throws Exception { final String text = "rule X when Country( $cities : city )\nPerson( city memberOf $cities )\n then end"; AndDescr descrs = ((RuleDescr) parse( "rule", text )).getLhs(); assertEquals( 2, descrs.getDescrs().size() ); PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 ); ExprConstraintDescr fieldConstr = (ExprConstraintDescr) pat.getConstraint().getDescrs().get( 0 ); assertEquals( "city memberOf $cities", fieldConstr.getExpression() ); }
@Test public void testRestrictions() throws Exception { final String text = "rule X when Foo( bar > 1 || == 1 ) then end\n"; AndDescr descrs = (AndDescr) ((RuleDescr) parse( "rule", text )).getLhs(); assertEquals( 1, descrs.getDescrs().size() ); PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 ); ExprConstraintDescr fieldConstr = (ExprConstraintDescr) pat.getConstraint().getDescrs().get( 0 ); assertEquals( "bar > 1 || == 1", fieldConstr.getExpression() ); }
@Test public void testNotMemberof() throws Exception { final String text = "rule X when Country( $cities : city )\nPerson( city not memberOf $cities ) then end\n"; AndDescr descrs = ((RuleDescr) parse( "rule", text )).getLhs(); assertEquals( 2, descrs.getDescrs().size() ); PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 ); ExprConstraintDescr fieldConstr = (ExprConstraintDescr) pat.getConstraint().getDescrs().get( 0 ); assertEquals( "city not memberOf $cities", fieldConstr.getExpression() ); }
@Test public void testWithRetval() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "with_retval.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( 1, col.getConstraint().getDescrs().size() ); assertEquals( "Foo", col.getObjectType() ); final ExprConstraintDescr fld = (ExprConstraintDescr) col.getConstraint().getDescrs().get( 0 ); assertEquals( "name== (a + b)", fld.getExpression() ); }
@Test public void testPluggableOperators2() throws Exception { final String text = "rule \"tt\"\n" + " dialect \"mvel\"\n" + "when\n" + " exists (TelephoneCall( this finishes [1m] \"25-May-2011\" ))\n" + "then\n" + "end"; PatternDescr pattern = (PatternDescr) ((ExistsDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 )).getDescrs().get( 0 ); assertEquals( "TelephoneCall", pattern.getObjectType() ); ExprConstraintDescr constr = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); assertEquals( "this finishes [1m] \"25-May-2011\"", constr.getText() ); }
@Test public void testInfinityLiteral() throws Exception { final String text = "rule \"infinity\"\n" + "when\n" + " StockTick( this after[-*,*] $another )\n" + "then\n" + "end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( "StockTick", pattern.getObjectType() ); ExprConstraintDescr constr = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); assertEquals( "this after[-*,*] $another", constr.getText() ); }
@Test public void testEnumeration() throws Exception { final RuleDescr rule = (RuleDescr) parseResource( "rule", "enumeration.drl" ); assertEquals( "simple_rule", rule.getName() ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( "Foo", col.getObjectType() ); assertEquals( 1, col.getConstraint().getDescrs().size() ); final ExprConstraintDescr fld = (ExprConstraintDescr) col.getConstraint().getDescrs().get( 0 ); assertEquals( "bar == Foo.BAR", fld.getExpression() ); }
@Test public void testInlineEval() throws Exception { final String text = "rule \"inline eval\"\n" + "when\n" + " Person( eval( name.startsWith(\"b\") && name.finishesWith(\"b\")) )\n" + "then\n" + "end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( "Person", pattern.getObjectType() ); ExprConstraintDescr constr = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); assertEquals( "eval( name.startsWith(\"b\") && name.finishesWith(\"b\"))", constr.getText() ); }
@Test public void testBasicBinding() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "basic_binding.drl" ); final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 ); final AndDescr lhs = ruleDescr.getLhs(); assertEquals( 1, lhs.getDescrs().size() ); final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 ); assertEquals( "Cheese", cheese.getObjectType() ); assertEquals( 1, cheese.getConstraint().getDescrs().size() ); final ExprConstraintDescr fieldBinding = (ExprConstraintDescr) cheese.getDescrs().get( 0 ); assertEquals( "$type:type", fieldBinding.getExpression() ); }
@Test public void testNotWithConstraint() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "not_with_constraint.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 2, rule.getLhs().getDescrs().size() ); PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final ExprConstraintDescr fieldBinding = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "$likes:like", fieldBinding.getExpression() ); final NotDescr not = (NotDescr) rule.getLhs().getDescrs().get( 1 ); pattern = (PatternDescr) not.getDescrs().get( 0 ); final ExprConstraintDescr fld = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); assertEquals( "type == $likes", fld.getExpression() ); }
pattern.getObjectType() ); assertEquals( 1, pattern.getConstraint().getDescrs().size() ); ExprConstraintDescr fld = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); assertEquals( "age > 30 && < 40", fld.getExpression() ); pattern.getObjectType() ); assertEquals( 2, pattern.getConstraint().getDescrs().size() ); fld = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); assertEquals( "type in ( \"sedan\", \"wagon\" )", fld.getExpression() ); fld = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 1 ); assertEquals( "age < 3", fld.getExpression() );
@Test public void testExpanderMultipleConstraintsFlush() throws Exception { final DrlParser parser = new DrlParser(LanguageLevelOption.DRL6); // this is similar to the other test, but it requires a flush to add the // constraints final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints_flush.dslr" ), this.getReader( "multiple_constraints.dsl" ) ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( "Person", pattern.getObjectType() ); assertEquals( 2, pattern.getConstraint().getDescrs().size() ); assertEquals( "age < 42", ((ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getExpression() ); assertEquals( "location==atlanta", ((ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getExpression() ); assertNotNull( (String) rule.getConsequence() ); }
left.getConstraint().getDescrs().size() ); ExprConstraintDescr fld = (ExprConstraintDescr) left.getConstraint().getDescrs().get( 0 ); right.getConstraint().getDescrs().size() ); fld = (ExprConstraintDescr) right.getConstraint().getDescrs().get( 0 ); right.getObjectType() ); assertEquals( 1, left.getConstraint().getDescrs().size() ); fld = (ExprConstraintDescr) left.getConstraint().getDescrs().get( 0 ); right.getConstraint().getDescrs().size() ); fld = (ExprConstraintDescr) right.getConstraint().getDescrs().get( 0 );
pattern.getObjectType() ); assertEquals( 1, pattern.getConstraint().getDescrs().size() ); ExprConstraintDescr fld = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); assertEquals( "age > 30 && < 40", fld.getExpression() ); pattern.getObjectType() ); assertEquals( 2, pattern.getConstraint().getDescrs().size() ); fld = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); assertEquals( "type not in ( \"sedan\", \"wagon\" )", fld.getExpression() ); fld = (ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 1 ); assertEquals( "age < 3", fld.getExpression() );
@Test public void testExpanderMultipleConstraints() throws Exception { final DrlParser parser = new DrlParser(LanguageLevelOption.DRL6); final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints.dslr" ), this.getReader( "multiple_constraints.dsl" ) ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 2, rule.getLhs().getDescrs().size() ); PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( "Person", pattern.getObjectType() ); assertEquals( 2, pattern.getConstraint().getDescrs().size() ); assertEquals( "age < 42", ((ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getExpression() ); assertEquals( "location==atlanta", ((ExprConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getExpression() ); pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 ); assertEquals( "Bar", pattern.getObjectType() ); assertNotNull( (String) rule.getConsequence() ); }
eventB.getObjectType() ); assertEquals( 1, eventB.getConstraint().getDescrs().size() ); assertEquals( 1, eventB.getConstraint().getDescrs().size() ); final ExprConstraintDescr fcdB = (ExprConstraintDescr) eventB.getConstraint().getDescrs().get( 0 ); assertEquals( "this after[1,10] $a || this not after[15,20] $a", fcdB.getExpression() ); eventC.getObjectType() ); assertEquals( 1, eventC.getConstraint().getDescrs().size() ); final ExprConstraintDescr fcdC = (ExprConstraintDescr) eventC.getConstraint().getDescrs().get( 0 ); assertEquals( "this finishes $b", fcdC.getExpression() ); eventD.getObjectType() ); assertEquals( 1, eventD.getConstraint().getDescrs().size() ); final ExprConstraintDescr fcdD = (ExprConstraintDescr) eventD.getConstraint().getDescrs().get( 0 ); assertEquals( "this not starts $a", fcdD.getExpression() ); eventE.getObjectType() ); assertEquals( 1, eventE.getConstraint().getDescrs().size() ); ExprConstraintDescr fcdE = (ExprConstraintDescr) eventE.getConstraint().getDescrs().get( 0 );