@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 testCollect() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "collect.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final CollectDescr collect = (CollectDescr) outPattern.getSource(); final PatternDescr pattern = (PatternDescr) collect.getInputPattern(); assertEquals( "Person", pattern.getObjectType() ); }
@Test public void testSimpleMethodCallWithFrom() throws Exception { final RuleDescr rule = (RuleDescr) parseResource( "rule", "test_SimpleMethodCallWithFrom.drl" ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final FromDescr from = (FromDescr) pattern.getSource(); final MVELExprDescr method = (MVELExprDescr) from.getDataSource(); assertEquals( "something.doIt( foo,bar,42,\"hello\",[ a : \"b\", \"something\" : 42, \"a\" : foo, x : [x:y]],\"end\", [a, \"b\", 42] )", method.getExpression() ); }
@Test public void testSimpleFunctionCallWithFrom() throws Exception { final RuleDescr rule = (RuleDescr) parseResource( "rule", "test_SimpleFunctionCallWithFrom.drl" ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final FromDescr from = (FromDescr) pattern.getSource(); final MVELExprDescr func = (MVELExprDescr) from.getDataSource(); assertEquals( "doIt( foo,bar,42,\"hello\",[ a : \"b\", \"something\" : 42, \"a\" : foo, x : [x:y]],\"end\", [a, \"b\", 42] )", func.getExpression() ); }
@Test public void testAccumulateWithNestedFrom() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "accumulate_with_nested_from.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final AccumulateDescr accumulate = (AccumulateDescr) out.getSource(); PatternDescr person = (PatternDescr) accumulate.getInputPattern(); assertEquals( "Person", person.getObjectType() ); final CollectDescr collect2 = (CollectDescr) person.getSource(); final PatternDescr people = collect2.getInputPattern(); assertEquals( "People", people.getObjectType() ); }
@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 testCollectWithNestedFrom() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "collect_with_nested_from.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final CollectDescr collect = (CollectDescr) out.getSource(); PatternDescr person = (PatternDescr) collect.getInputPattern(); assertEquals( "Person", person.getObjectType() ); final CollectDescr collect2 = (CollectDescr) person.getSource(); final PatternDescr people = collect2.getInputPattern(); assertEquals( "People", people.getObjectType() ); }
@Test public void testForallWithFrom() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "forallwithfrom.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final ForallDescr forall = (ForallDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( 2, forall.getDescrs().size() ); final PatternDescr pattern = forall.getBasePattern(); assertEquals( "Person", pattern.getObjectType() ); assertEquals( "$village", ((FromDescr) pattern.getSource()).getDataSource().toString() ); final List<BaseDescr> remaining = forall.getRemainingPatterns(); assertEquals( 1, remaining.size() ); final PatternDescr cheese = (PatternDescr) remaining.get( 0 ); assertEquals( "Cheese", cheese.getObjectType() ); assertEquals( "$cheesery", ((FromDescr) cheese.getSource()).getDataSource().toString() ); }
@Test public void testSimpleAccessorWithFrom() throws Exception { final RuleDescr rule = (RuleDescr) parseResource( "rule", "test_SimpleAccessorWithFrom.drl" ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final FromDescr from = (FromDescr) pattern.getSource(); final MVELExprDescr accessor = (MVELExprDescr) from.getDataSource(); assertEquals( "something.doIt", accessor.getExpression() ); }
@Test public void testSimpleAccessorAndArgWithFrom() throws Exception { final RuleDescr rule = (RuleDescr) parseResource( "rule", "test_SimpleAccessorArgWithFrom.drl" ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final FromDescr from = (FromDescr) pattern.getSource(); final MVELExprDescr accessor = (MVELExprDescr) from.getDataSource(); assertEquals( "something.doIt[\"key\"]", accessor.getExpression() ); }
@Test public void testComplexChainedAcessor() throws Exception { final RuleDescr rule = (RuleDescr) parseResource( "rule", "test_ComplexChainedCallWithFrom.drl" ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final FromDescr from = (FromDescr) pattern.getSource(); final MVELExprDescr accessor = (MVELExprDescr) from.getDataSource(); assertEquals( "doIt1( foo,bar,42,\"hello\",[ a : \"b\"], [a, \"b\", 42] ).doIt2(bar, [a, \"b\", 42]).field[\"key\"]", accessor.getExpression() ); }
@Test public void testFromWithInlineList() throws Exception { String source = "rule XYZ \n" + " when \n" + " o: Order( ) \n" + " not( Number( ) from [1, 2, 3] ) \n" + " then \n" + " System.err.println(\"Invalid customer id found!\"); \n" + " o.addError(\"Invalid customer id\"); \n" + "end \n"; PackageDescr pkg = (PackageDescr) parse( "compilationUnit", source ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( "XYZ", rule.getName() ); PatternDescr number = (PatternDescr) ((NotDescr) rule.getLhs().getDescrs().get( 1 )).getDescrs().get( 0 ); assertEquals( "[1, 2, 3]", ((FromDescr) number.getSource()).getDataSource().toString() ); }
@Test public void testParseFrom() throws Exception { final XmlPackageReader xmlPackageReader = getXmReader(); xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseFrom.xml" ) ) ); final PackageDescr packageDescr = xmlPackageReader.getPackageDescr(); assertNotNull( packageDescr ); RuleDescr obj = (RuleDescr) packageDescr.getRules().get( 0 ); PatternDescr patterndescr = (PatternDescr) obj.getLhs().getDescrs().get( 0 ); FromDescr from = (FromDescr) patterndescr.getSource(); MVELExprDescr accessordescriptor = (MVELExprDescr) from.getDataSource(); assertEquals( "cheesery.getCheeses(i+4)", accessordescriptor.getExpression() ); assertEquals( patterndescr.getObjectType(), "Cheese" ); assertEquals( patterndescr.getIdentifier(), "cheese" ); }
@Test public void testFromWithInlineListMethod() throws Exception { String source = "rule XYZ \n" + " when \n" + " o: Order( ) \n" + " Number( ) from [1, 2, 3].sublist(1, 2) \n" + " then \n" + " System.err.println(\"Invalid customer id found!\"); \n" + " o.addError(\"Invalid customer id\"); \n" + "end \n"; PackageDescr pkg = (PackageDescr) parse( "compilationUnit", source ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( "XYZ", rule.getName() ); assertFalse( parser.hasErrors() ); PatternDescr number = (PatternDescr) rule.getLhs().getDescrs().get( 1 ); assertEquals( "[1, 2, 3].sublist(1, 2)", ((FromDescr) number.getSource()).getDataSource().toString() ); }
@Test public void testFromWithInlineListIndex() throws Exception { String source = "rule XYZ \n" + " when \n" + " o: Order( ) \n" + " Number( ) from [1, 2, 3][1] \n" + " then \n" + " System.err.println(\"Invalid customer id found!\"); \n" + " o.addError(\"Invalid customer id\"); \n" + "end \n"; PackageDescr pkg = (PackageDescr) parse( "compilationUnit", source ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( "XYZ", rule.getName() ); assertFalse( parser.hasErrors() ); PatternDescr number = (PatternDescr) rule.getLhs().getDescrs().get( 1 ); assertEquals( "[1, 2, 3][1]", ((FromDescr) number.getSource()).getDataSource().toString() ); }
@Test public void testAccumulateExternalFunction() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "accumulateExternalFunction.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final AccumulateDescr accum = (AccumulateDescr) out.getSource(); assertEqualsIgnoreWhitespace( "$age", accum.getFunctions().get( 0 ).getParams()[0] ); assertEqualsIgnoreWhitespace( "average", accum.getFunctions().get( 0 ).getFunction() ); assertTrue( accum.isExternalFunction() ); final PatternDescr pattern = (PatternDescr) accum.getInputPattern(); assertEquals( "Person", pattern.getObjectType() ); }
@Test public void testFromWithTernaryFollowedByQuery() throws Exception { // the 'from' expression requires a ";" to disambiguate the "?" // prefix for queries from the ternary operator "? :" final String text = "rule X when Cheese() from (isFull ? $cheesery : $market) ?person( \"Mark\", 42; ) then end"; RuleDescr rule = (RuleDescr) parse( "rule", text ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( "Cheese", pattern.getObjectType() ); assertEquals( "from (isFull ? $cheesery : $market)", pattern.getSource().getText() ); assertFalse( pattern.isQuery() ); pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 ); assertEquals( "person", pattern.getObjectType() ); assertTrue( pattern.isQuery() ); }
@Test public void testAccumulate() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "accumulate.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource(); assertEqualsIgnoreWhitespace( "int x = 0 ;", accum.getInitCode() ); assertEqualsIgnoreWhitespace( "x++;", accum.getActionCode() ); assertNull( accum.getReverseCode() ); assertEqualsIgnoreWhitespace( "new Integer(x)", accum.getResultCode() ); assertFalse( accum.isExternalFunction() ); final PatternDescr pattern = (PatternDescr) accum.getInputPattern(); assertEquals( "Person", pattern.getObjectType() ); }
@Test public void testAccumulateReverse() throws Exception { final PackageDescr pkg = (PackageDescr) parseResource( "compilationUnit", "accumulateReverse.drl" ); assertEquals( 1, pkg.getRules().size() ); final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 ); assertEquals( 1, rule.getLhs().getDescrs().size() ); final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); final AccumulateDescr accum = (AccumulateDescr) out.getSource(); assertEqualsIgnoreWhitespace( "int x = 0 ;", accum.getInitCode() ); assertEqualsIgnoreWhitespace( "x++;", accum.getActionCode() ); assertEqualsIgnoreWhitespace( "x--;", accum.getReverseCode() ); assertEqualsIgnoreWhitespace( "new Integer(x)", accum.getResultCode() ); assertFalse( accum.isExternalFunction() ); final PatternDescr pattern = (PatternDescr) accum.getInputPattern(); assertEquals( "Person", pattern.getObjectType() ); }
@Test public void testFromFollowedByQuery() throws Exception { // the 'from' expression requires a ";" to disambiguate the "?" // prefix for queries from the ternary operator "? :" final String text = "rule X when Cheese() from $cheesery ?person( \"Mark\", 42; ) then end"; RuleDescr rule = (RuleDescr) parse( "rule", text ); assertFalse( parser.getErrors().toString(), parser.hasErrors() ); PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 ); assertEquals( "Cheese", pattern.getObjectType() ); assertEquals( "from $cheesery", pattern.getSource().getText() ); assertFalse( pattern.isQuery() ); pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 ); assertEquals( "person", pattern.getObjectType() ); assertTrue( pattern.isQuery() ); }