no thats OK. Perhaps you might want to write it up on the wiki ??? ;) Yes, re my previous email, if there is a need to put it on the LHS and the RHS, on the LHS an extra expression will be needed to wrap the eval() around it.
On 4/4/06, Paul Smith <[EMAIL PROTECTED]> wrote: > > I've worked it out. My mistake in not understanding how this works > correctly. What my .drl file should have looked like was: > > package testing > > import java.lang.String > > function boolean doSomething(String s) { > System.out.println(s); > return true; > } > > rule "testFunctionCallRHS" > > when > ad$ : String() > eval(doSomething("when do something"); > then > doSomething("then do something"); > end > > ie) on the LHS we require an eval whilst on the RHS we don't. > > Since I was using a dsl this meant that my drl was expanded to > > when > ad$ : String() > eval(doSomething("when do something")); > then > eval(doSomething("then do something")); > > > or > > when > ad$ : String() > doSomething("when do something"); > then > doSomething("then do something"); > > which are both invalid but for slightly different reasons. > > Sorry for wasting time but valuable for other users as a bit of a gotcha. > > On 4/4/06, Paul Smith <[EMAIL PROTECTED]> wrote: > > > > Will do. Thanks > > > > > > On 4/4/06, Michael Neale <[EMAIL PROTECTED]> wrote: > > > > > > to eliminate layers, can you manually expand it, and make sure it > fails > > > the > > > same? Also, there is a test_EvalException that shows a function call > in > > > a > > > eval - I wonder what the difference is as to why that one works. > > > > > > Finally, probably should shift this discussion over to the dev list if > > > possible. > > > > > > On 4/4/06, Paul Smith <[EMAIL PROTECTED]> wrote: > > > > > > > > That's what I tried initially and got the same result. It's actually > > > > eval(doSomething("{s}")) > > > > > > > > On 4/4/06, Michael Neale <[EMAIL PROTECTED]> wrote: > > > > > > > > > > should just be eval(doSomething()) > > > > > as long as doSomething returns true, should be OK. > > > > > > > > > > On 4/4/06, Paul Smith <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > OK, > > > > > > > > > > > > modified the function to read > > > > > > > > > > > > function boolean doSomething(String s) { > > > > > > System.out.println(s); > > > > > > return true; > > > > > > } > > > > > > > > > > > > and the .dsl file to read > > > > > > > > > > > > eval(doSomething("{s}") == true); > > > > > > > > > > > > but we get > > > > > > > > > > > > org.drools.rule.InvalidRulePackage: Rule Compilation error The > > > method > > > > > > eval(boolean) is undefined for the type > > > > MandatoryStreet1AddressNotNull_0 > > > > > > > > > > > > at org.drools.rule.Package.checkValidity(Package.java:370) > > > > > > at org.drools.reteoo.RuleBaseImpl.addPackage( > RuleBaseImpl.java > > > > :247) > > > > > > at testing.FunctionTest.testFunction(FunctionTest.java :26) > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native > Method) > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown > Source) > > > > > > at sun.reflect.DelegatingMethodAccessorImpl.invoke (Unknown > > > Source) > > > > > > at java.lang.reflect.Method.invoke(Unknown Source) > > > > > > at junit.framework.TestCase.runTest(TestCase.java:154) > > > > > > at junit.framework.TestCase.runBare (TestCase.java:127) > > > > > > at junit.framework.TestResult$1.protect(TestResult.java:106) > > > > > > at junit.framework.TestResult.runProtected(TestResult.java > > > :124) > > > > > > at junit.framework.TestResult.run (TestResult.java:109) > > > > > > at junit.framework.TestCase.run(TestCase.java:118) > > > > > > at junit.framework.TestSuite.runTest(TestSuite.java:208) > > > > > > at junit.framework.TestSuite.run (TestSuite.java:203) > > > > > > at > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests > > > > ( > > > > > > RemoteTestRunner.java:478) > > > > > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run( > > > > > > RemoteTestRunner.java:344) > > > > > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main > > > ( > > > > > > RemoteTestRunner.java:196) > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 4/4/06, Michael Neale <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > anything used in the LHS (when) must return a boolean, and be > > > used > > > > > > inside > > > > > > > an > > > > > > > eval() etc... it can't just appear freeform in a when. Slap an > > > > eval() > > > > > > > around > > > > > > > the doSomething() (it will need to return true) and see if > that > > > > works > > > > > > for > > > > > > > you. > > > > > > > > > > > > > > On 4/4/06, Paul Smith <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > > > I was basically trying a few different constructs but the > > > > following > > > > > is > > > > > > > not > > > > > > > > valid: > > > > > > > > > > > > > > > > package testing > > > > > > > > > > > > > > > > import testing.AddressDetail > > > > > > > > > > > > > > > > expander crm.dsl > > > > > > > > > > > > > > > > function void doSomething(String s) { > > > > > > > > System.out.println(s); > > > > > > > > } > > > > > > > > > > > > > > > > rule "MandatoryStreet1AddressNotNull" > > > > > > > > > > > > > > > > when > > > > > > > > The first street address line is empty > > > > > > > > Send 'in when' to doSomething <-- If I take this > line > > > out > > > > > then > > > > > > > > it's > > > > > > > > legal but with it in I get the stack trace below > > > > > > > > then > > > > > > > > Add the message that the first street address cannot > > > be > > > > > empty > > > > > > > > Send 'do something' to doSomething > > > > > > > > end > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------------------------------------------------------------------------- > > > > > > > > org.drools.rule.InvalidRulePackage : Unable to resolve > > > ObjectType > > > > > > > > 'doSomething' > > > > > > > > > > > > > > > > at org.drools.rule.Package.checkValidity(Package.java > :370) > > > > > > > > at org.drools.reteoo.RuleBaseImpl.addPackage( > > > RuleBaseImpl.java > > > > > > :247) > > > > > > > > at testing.FunctionTest.testFunction(FunctionTest.java > :26) > > > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native > > > Method) > > > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown > > > Source) > > > > > > > > at sun.reflect.DelegatingMethodAccessorImpl.invoke > (Unknown > > > > > Source) > > > > > > > > at java.lang.reflect.Method.invoke(Unknown Source) > > > > > > > > at junit.framework.TestCase.runTest(TestCase.java:154) > > > > > > > > at junit.framework.TestCase.runBare (TestCase.java:127) > > > > > > > > at junit.framework.TestResult$1.protect(TestResult.java > > > :106) > > > > > > > > at junit.framework.TestResult.runProtected( > TestResult.java > > > > :124) > > > > > > > > at junit.framework.TestResult.run(TestResult.java:109) > > > > > > > > at junit.framework.TestCase.run(TestCase.java:118) > > > > > > > > at junit.framework.TestSuite.runTest (TestSuite.java > :208) > > > > > > > > at junit.framework.TestSuite.run(TestSuite.java:203) > > > > > > > > at > > > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests > > > > > > ( > > > > > > > > RemoteTestRunner.java:478) > > > > > > > > at > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run( > > > > > > > > RemoteTestRunner.java:344) > > > > > > > > at > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main > > > > ( > > > > > > > > RemoteTestRunner.java:196) > > > > > > > > > > > > > > > > The .dsl file is as follows: > > > > > > > > > > > > > > > > #Customer Relationship Management domain specific language. > > > > > > > > [when]The first street address line is empty=$ad : > > > > > > AddressDetail(street1 > > > > > > > > == > > > > > > > > "") > > > > > > > > [when]The postcode is empty=$ad : AddressDetail(postcode == > " > > > ") > > > > > > > > [then]Add the message that the first street address cannot > be > > > > empty= > > > > > > > > System.out.println("Enter the street address dummy"); > > > > > > > > Send '{s}' to doSomething=doSomething("{s}"); > > > > > > > > > > > > > > > > > > > > > > > > I realise it's a bit of dumb example but for arguments sake, > > > > > > doSomething > > > > > > > > may > > > > > > > > be performing a bit more of a complex evaluation. > > > > > > > > > > > > > > > > On 4/4/06, Michael Neale <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > > > > > my mistake, you should be able to call it, there are a > fair > > > few > > > > > > > > > integration > > > > > > > > > tests that cover that (Mark tells me). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 4/4/06, Michael Neale < [EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > > > > > > > When in the "when" (he heee) do you want to call it? The > > > only > > > > > > places > > > > > > > > are > > > > > > > > > > in an eval, or predicate or return value... I am not > sure > > > if > > > > > they > > > > > > > are > > > > > > > > > > allowed in there by design. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 4/4/06, Paul Smith <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > > > > > > > > > I don't seem to be able to call functions from within > > > the > > > > > 'when' > > > > > > > > > clause > > > > > > > > > > > of a > > > > > > > > > > > drl in Drools 3.0. Is this by design or a flaw? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >