@Test public void testConstraintOrConnective() throws Exception { final String text = "rule X when Person( age < 42 || location==\"atlanta\") then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( 1, pattern.getDescrs().size() ); ExprConstraintDescr fcd = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "age < 42 || location==\"atlanta\"", fcd.getExpression() ); }
@Test public void testConstraintAndConnective() throws Exception { final String text = "rule X when Person( age < 42 && location==\"atlanta\") then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( 1, pattern.getDescrs().size() ); ExprConstraintDescr fcd = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "age < 42 && location==\"atlanta\"", fcd.getExpression() ); }
@Test public void testBigLiterals() throws Exception { final String text = "rule X when Primitives( bigInteger == (10I), " + " bigDecimal == (10B), " + " bigInteger < 50I, " + " bigDecimal < 50B ) then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( 4, pattern.getDescrs().size() ); ExprConstraintDescr ecd = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "bigInteger == (10I)", ecd.getExpression() ); ecd = (ExprConstraintDescr) pattern.getDescrs().get( 1 ); assertEquals( "bigDecimal == (10B)", ecd.getExpression() ); ecd = (ExprConstraintDescr) pattern.getDescrs().get( 2 ); assertEquals( "bigInteger < 50I", ecd.getExpression() ); ecd = (ExprConstraintDescr) pattern.getDescrs().get( 3 ); assertEquals( "bigDecimal < 50B", ecd.getExpression() ); }
@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() ); }
@Test public void testBoundVariables() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "bindings.drl" ); final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 ); final AndDescr lhs = ruleDescr.getLhs(); assertEquals( 2, lhs.getDescrs().size() ); final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 ); assertEquals( "Cheese", cheese.getObjectType() ); assertEquals( 1, cheese.getDescrs().size() ); ExprConstraintDescr fieldBinding = (ExprConstraintDescr) cheese.getDescrs().get( 0 ); assertEquals( "$type : type == \"stilton\"", fieldBinding.getExpression() ); final PatternDescr person = (PatternDescr) lhs.getDescrs().get( 1 ); assertEquals( 2, person.getDescrs().size() ); fieldBinding = (ExprConstraintDescr) person.getDescrs().get( 0 ); assertEquals( "$name : name == \"bob\"", fieldBinding.getExpression() ); ExprConstraintDescr fld = (ExprConstraintDescr) person.getDescrs().get( 1 ); assertEquals( "likes == $type", fld.getExpression() ); }
@Test public void testUnificationBinding() throws Exception { final String text = "rule X when $p := Person( $name := name, $loc : location ) then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( "$p", pattern.getIdentifier() ); assertTrue( pattern.isUnification() ); assertEquals( 2, pattern.getDescrs().size() ); ExprConstraintDescr bindingDescr = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "$name := name", bindingDescr.getExpression() ); bindingDescr = (ExprConstraintDescr) pattern.getDescrs().get( 1 ); assertEquals( "$loc : location", bindingDescr.getExpression() ); }
@Test public void testNullConstraints() throws Exception { final String text = "rule X when Person( name == null ) then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( 1, pattern.getDescrs().size() ); ExprConstraintDescr fcd = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "name == null", fcd.getExpression() ); assertEquals( 0, fcd.getPosition() ); assertEquals( ExprConstraintDescr.Type.NAMED, fcd.getType() ); }
@Test public void testRuleParseLhsWithStringQuotes() throws Exception { final String text = "rule X when Person( location==\"atlanta\\\"\") then end\n"; RuleDescr rule = (RuleDescr) parse( "rule", text ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); assertNotNull( rule ); AndDescr lhs = rule.getLhs(); ExprConstraintDescr constr = (ExprConstraintDescr) ((PatternDescr) lhs.getDescrs().get( 0 )).getDescrs().get( 0 ); assertEquals( "location==\"atlanta\\\"\"", constr.getText() ); }
@Test public void testRuleParseLhsWithStringQuotes2() throws Exception { final String text = "rule X when Cheese( $x: type, type == \"s\\tti\\\"lto\\nn\" ) then end\n"; RuleDescr rule = (RuleDescr) parse( "rule", text ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); assertNotNull( rule ); AndDescr lhs = rule.getLhs(); ExprConstraintDescr constr = (ExprConstraintDescr) ((PatternDescr) lhs.getDescrs().get( 0 )).getDescrs().get( 1 ); assertEquals( "type == \"s\\tti\\\"lto\\nn\"", constr.getText() ); }
@Test public void testEntryPoint2() throws Exception { final String text = "rule X when StockTick( symbol==\"ACME\") from entry-point \"StreamA\" then end"; PackageDescr pkg = (PackageDescr) parse( "compilationUnit", text ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); RuleDescr rule = pkg.getRules().get( 0 ); PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( 1, pattern.getDescrs().size() ); ExprConstraintDescr fcd = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "symbol==\"ACME\"", fcd.getExpression() ); assertNotNull( pattern.getSource() ); EntryPointDescr entry = (EntryPointDescr) pattern.getSource(); assertEquals( "StreamA", entry.getEntryId() ); }
@Test public void testPositionalConstraintsOnly() throws Exception { final String text = "rule X when Person( \"Mark\", 42; ) then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( 2, pattern.getDescrs().size() ); ExprConstraintDescr fcd = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "\"Mark\"", fcd.getExpression() ); assertEquals( 0, fcd.getPosition() ); assertEquals( ExprConstraintDescr.Type.POSITIONAL, fcd.getType() ); fcd = (ExprConstraintDescr) pattern.getDescrs().get( 1 ); assertEquals( "42", fcd.getExpression() ); assertEquals( 1, fcd.getPosition() ); assertEquals( ExprConstraintDescr.Type.POSITIONAL, fcd.getType() ); }
@Test public void testEntryPoint() throws Exception { final String text = "rule X when StockTick( symbol==\"ACME\") from entry-point StreamA then end"; PackageDescr pkg = (PackageDescr) parse( "compilationUnit", text ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); RuleDescr rule = pkg.getRules().get( 0 ); PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( 1, pattern.getDescrs().size() ); ExprConstraintDescr fcd = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "symbol==\"ACME\"", fcd.getExpression() ); assertNotNull( pattern.getSource() ); EntryPointDescr entry = (EntryPointDescr) pattern.getSource(); assertEquals( "StreamA", entry.getEntryId() ); }
@Test public void testCompatibleRestriction() throws Exception { String source = "package com.sample rule test when Test( ( text == null || text2 matches \"\" ) ) then end"; PackageDescr pkg = (PackageDescr) parse( "compilationUnit", source ); assertEquals( "com.sample", pkg.getName() ); RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( "test", rule.getName() ); ExprConstraintDescr expr = (ExprConstraintDescr) ((PatternDescr) rule.getLhs().getDescrs().get( 0 )).getDescrs().get( 0 ); assertEquals( "( text == null || text2 matches \"\" )", expr.getText() ); }
@Test public void testRuleOldSyntax2() throws Exception { final String source = "rule \"Test\" when ( $r :LiteralRestriction( operator == Operator.EQUAL ) ) then end"; PackageDescr pkg = (PackageDescr) parse( "compilationUnit", source ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( "Test", rule.getName() ); assertEquals( 1, rule.getLhs().getDescrs().size() ); PatternDescr patternDescr = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( "$r", patternDescr.getIdentifier() ); assertEquals( 1, patternDescr.getDescrs().size() ); ExprConstraintDescr fieldConstraintDescr = (ExprConstraintDescr) patternDescr.getDescrs().get( 0 ); assertEquals( "operator == Operator.EQUAL", fieldConstraintDescr.getExpression() ); }
@Test public void testIsQuery() throws Exception { final String text = "rule X when ?person( \"Mark\", 42; ) then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertTrue( pattern.isQuery() ); assertEquals( 2, pattern.getDescrs().size() ); ExprConstraintDescr fcd = (ExprConstraintDescr) pattern.getDescrs().get( 0 ); assertEquals( "\"Mark\"", fcd.getExpression() ); assertEquals( 0, fcd.getPosition() ); assertEquals( ExprConstraintDescr.Type.POSITIONAL, fcd.getType() ); fcd = (ExprConstraintDescr) pattern.getDescrs().get( 1 ); assertEquals( "42", fcd.getExpression() ); assertEquals( 1, fcd.getPosition() ); assertEquals( ExprConstraintDescr.Type.POSITIONAL, fcd.getType() ); }
@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 testRuleOldSyntax1() throws Exception { final String source = "rule \"Test\" when ( not $r :LiteralRestriction( operator == Operator.EQUAL ) ) then end"; PackageDescr pkg = (PackageDescr) parse( "compilationUnit", source ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( "Test", rule.getName() ); assertEquals( 1, rule.getLhs().getDescrs().size() ); assertEquals( 1, ((NotDescr) rule.getLhs().getDescrs().get( 0 )).getDescrs().size() ); NotDescr notDescr = (NotDescr) rule.getLhs().getDescrs().get( 0 ); PatternDescr patternDescr = (PatternDescr) notDescr.getDescrs().get( 0 ); assertEquals( "$r", patternDescr.getIdentifier() ); assertEquals( 1, patternDescr.getDescrs().size() ); ExprConstraintDescr fieldConstraintDescr = (ExprConstraintDescr) patternDescr.getDescrs().get( 0 ); assertEquals( "operator == Operator.EQUAL", fieldConstraintDescr.getExpression() ); }
@Test public void testWithPredicate() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "with_predicate.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 ); AndDescr and = (AndDescr) col.getConstraint(); assertEquals( 2, and.getDescrs().size() ); final ExprConstraintDescr field = (ExprConstraintDescr) col.getDescrs().get( 0 ); final ExprConstraintDescr pred = (ExprConstraintDescr) and.getDescrs().get( 1 ); assertEquals( "$age2:age", field.getExpression() ); assertEqualsIgnoreWhitespace( "$age2 == $age1+2", pred.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() ); }
@Test public void testBindingComposite() throws Exception { final String text = "rule X when Person( $name : name == \"Bob\" || $loc : location == \"Montreal\" ) then end"; PatternDescr pattern = (PatternDescr) ((RuleDescr) parse( "rule", text )).getLhs().getDescrs().get( 0 ); assertEquals( "Person", pattern.getObjectType() ); assertFalse( pattern.isUnification() ); // assertEquals( 2, // pattern.getDescrs().size() ); // BindingDescr bindingDescr = pattern.getDescrs().get( 0 ); // assertEquals( "$name", // bindingDescr.getVariable() ); // assertEquals( "name", // bindingDescr.getExpression() ); // assertFalse( bindingDescr.isUnification() ); // // bindingDescr = pattern.getDescrs().get( 1 ); // assertEquals( "$loc", // bindingDescr.getVariable() ); // assertEquals( "location", // bindingDescr.getExpression() ); // assertFalse( bindingDescr.isUnification() ); // embedded bindings are extracted at compile time List< ? > constraints = pattern.getDescrs(); assertEquals( 1, constraints.size() ); assertEquals( "$name : name == \"Bob\" || $loc : location == \"Montreal\"", ((ExprConstraintDescr) constraints.get( 0 )).getExpression() ); }