[rules-users] [Drools Fusion] Can't detect 2 occurrences with sliding window

Xavier Coulon xcoulon at gmail.com
Thu May 27 10:00:50 EDT 2010


Hello Edson,

Ok, it's clear now.
I'll try my first attempt with the new 5.1M2 version.

Thank you very much !

Best regards,
Xavier

2010/5/27 Edson Tirelli <tirelli at post.com>

>     Xavier (and others),
>
>     First, let me explain the problem: the temporal distance algorithm in
> 5.0.1 was not taking sliding windows into consideration when calculating the
> expiration offset for the objects. So, even declaring a 60s sliding window,
> the engine thought your expiration offset was 0s, and was expiring them
> right away. When using "after", then engine correctly evaluates the
> expiration offset and the problem does not happen.
>
>     There was a workaround (although for your case using "after" IMO) that
> is to explicit declare an expiration offset:
>
> declare Operation
>     @role(event)
>     @timestamp(date)
>         @expires( 60s )
> end
>
>     This is fixed in 5.1M2 and now the engine does take sliding windows
> into consideration.
>
>     In your case, though, using temporal operators like "after" is probably
> semantically better. Sliding windows are useful when used with
> accumulate/collect. For instance, if you want to count how many operations
> the user did in the last 60 seconds:
>
> Number( $count : intValue )  from accumulate(
>     Operation() from entry-point "OperationStream",
>     count(1) )
>
>    Sorry for the late answer... I was offline during the last couple
> weeks.
>
>    Wolfgang, loved your new terminology: pseudo-too-old, pseudo-too-late.
> :)
>
>     Edson
>
>
> 2010/5/27 Xavier Coulon <xcoulon at gmail.com>
>
> Hello again,
>>
>> I'm back on my problem and a colleague of mime suggested me the following
>> rule instead :
>>
>>
>> # declare events
>> declare Operation
>>     @role(event)
>>     @timestamp(date)
>> end
>>
>> rule "overActivity"
>> dialect "mvel"
>>     when
>>         #condition : 2 operation in less than 1 minute
>>        * $operation1 : Operation($ipAddress1 : ipAddress) **
>>             from entry-point "OperationStream"
>>         $operation2 : Operation(this != $operation1, ipAddress ==
>> $ipAddress1,
>>             this after[ 0s,30s ] $operation1) from entry-point
>> "OperationStream"*
>>     then
>>         #actions
>>         System.out.println("over-active user " + $ipAddress1 );
>> end
>>
>>
>> It works, and the main difference is the use of *after[]* instead of *
>> window:time()*
>> Is it because the window:time() was used outside of an *accumulate()*function ?
>> I'd just like to understand this.
>> If anyone can take a few minutes to answer, thank you in advance
>>
>> Best regards,
>>
>> Xavier
>>
>>
>>
>>
>> On Wed, May 19, 2010 at 10:08 AM, Xavier Coulon <xcoulon at gmail.com>wrote:
>>
>>>
>>> Hello Wolfgang,
>>>
>>> sorry, I wasn't available yesterday.
>>> I just followed your instructions:
>>>
>>> Here's my test method now :
>>>
>>> @SuppressWarnings("unchecked")
>>>    @Test
>>>    public void testActivity() throws IOException, ParseException,
>>>            InterruptedException {
>>>        // parse the log file
>>>        Resource logFile = new ClassPathResource(
>>>                 "activity/activity18h20-18h30-extract.log");
>>>         // converter and inject tracks in the session,
>>>        List<String> logLines = FileUtils.readLines(logFile.getFile(),
>>> "UTF-8");
>>>         LOGGER.info("loading events");
>>>        // load events from stream
>>>         Operation previousOperation = null;
>>>         for (String logLine : logLines) {
>>>            Operation operation = LineConverterUtil.getOperation(logLine);
>>>             Assert.assertFalse("Current operation equals() previous one",
>>>                    operation.equals(previousOperation));
>>>            Assert.assertFalse("Current operation == previous one",
>>>                    operation == previousOperation);
>>>             previousOperation = operation;
>>>             LOGGER.debug("Moving clock from "
>>>                    + (new Date(clock.getCurrentTime())).toString() + " to
>>> "
>>>                    + operation.getDate());
>>>            clock.advanceTime(operation.getDate().getTime()
>>>                    - clock.getCurrentTime(), TimeUnit.MILLISECONDS);
>>>            // clock.advanceTime(10, TimeUnit.SECONDS);
>>>             LOGGER.debug("Inserting " + operation);
>>>            FactHandle operationHandle = entryPoint.insert(operation);
>>>            LOGGER.debug("Insertion done: " +
>>> operationHandle.toExternalForm());
>>>
>>>        }
>>>         session.fireAllRules();
>>>
>>>        LOGGER.info("done with events");
>>>        // check...
>>>        Assert.assertTrue("Rule not fired...", listener
>>>                .isRuleFired("overActivity"));
>>>    }
>>>
>>> And the logs in the console :
>>>
>>> Console> 2010-05-19 09:57:06|INFO
>>> ||DroolsRulesTestCase.testActivity|loading
>>> events
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Moving
>>> clock from Thu Jan 01 01:00:00 CET 1970 to Fri Apr 30 18:26:47 CEST 2010
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Inserting Operation
>>> [date=Fri Apr 30 18:26:47 CEST 2010, executionTime=1, hostname=server1,
>>> ipAddress=1.2.3.4, operation=null, requestSize=0, responseSize=0]
>>> Console> 2010-05-19 09:57:06|WARN
>>> ||TrackingWorkingMemoryEventListener.objectInserted|Object inserted:
>>> [event
>>> fid:1:1:Operation [date=Fri Apr 30 18:26:47 CEST 2010, executionTime=1,
>>> hostname=server1, ipAddress=1.2.3.4, operation=null, requestSize=0,
>>> responseSize=0]]
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Insertion done: [event
>>> fid:1:1:Operation [date=Fri Apr 30 18:26:47 CEST 2010, executionTime=1,
>>> hostname=server1, ipAddress=1.2.3.4, operation=null, requestSize=0,
>>> responseSize=0]]
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Moving
>>> clock from Fri Apr 30 18:26:47 CEST 2010 to Fri Apr 30 18:27:11 CEST 2010
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Inserting Operation
>>> [date=Fri Apr 30 18:27:11 CEST 2010, executionTime=164, hostname=server1,
>>> ipAddress=1.2.3.4, operation=CONSULTATION, requestSize=1299,
>>> responseSize=895]
>>> Console> 2010-05-19 09:57:06|WARN
>>> ||TrackingWorkingMemoryEventListener.objectRetracted|Object retracted:
>>> [event fid:1:1:Operation [date=Fri Apr 30 18:26:47 CEST 2010,
>>> executionTime=1, hostname=server1, ipAddress=1.2.3.4, operation=null,
>>> requestSize=0, responseSize=0]]
>>> Console> 2010-05-19 09:57:06|WARN
>>> ||TrackingWorkingMemoryEventListener.objectInserted|Object inserted:
>>> [event
>>> fid:2:2:Operation [date=Fri Apr 30 18:27:11 CEST 2010, executionTime=164,
>>> hostname=server1, ipAddress=1.2.3.4, operation=CONSULTATION,
>>> requestSize=1299, responseSize=895]]
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Insertion done: [event
>>> fid:2:2:Operation [date=Fri Apr 30 18:27:11 CEST 2010, executionTime=164,
>>> hostname=server1, ipAddress=1.2.3.4, operation=CONSULTATION,
>>> requestSize=1299, responseSize=895]]
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Moving
>>> clock from Fri Apr 30 18:27:11 CEST 2010 to Fri Apr 30 18:28:47 CEST 2010
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Inserting Operation
>>> [date=Fri Apr 30 18:28:47 CEST 2010, executionTime=1, hostname=server1,
>>> ipAddress=1.2.3.4, operation=null, requestSize=0, responseSize=0]
>>> Console> 2010-05-19 09:57:06|WARN
>>> ||TrackingWorkingMemoryEventListener.objectRetracted|Object retracted:
>>> [event fid:2:2:Operation [date=Fri Apr 30 18:27:11 CEST 2010,
>>> executionTime=164, hostname=server1, ipAddress=1.2.3.4,
>>> operation=CONSULTATION, requestSize=1299, responseSize=895]]
>>> Console> 2010-05-19 09:57:06|WARN
>>> ||TrackingWorkingMemoryEventListener.objectInserted|Object inserted:
>>> [event
>>> fid:3:3:Operation [date=Fri Apr 30 18:28:47 CEST 2010, executionTime=1,
>>> hostname=server1, ipAddress=1.2.3.4, operation=null, requestSize=0,
>>> responseSize=0]]
>>> Console> 2010-05-19
>>> 09:57:06|DEBUG||DroolsRulesTestCase.testActivity|Insertion done: [event
>>> fid:3:3:Operation [date=Fri Apr 30 18:28:47 CEST 2010, executionTime=1,
>>> hostname=server1, ipAddress=1.2.3.4, operation=null, requestSize=0,
>>> responseSize=0]]
>>> Console> 2010-05-19 09:57:06|INFO ||DroolsRulesTestCase.testActivity|done
>>> with events
>>>
>>>
>>> Strangely, the first operation is retracted when the second one is
>>> inserted,
>>> yet, they are not equals()...
>>>
>>> /Xavier
>>> --
>>> View this message in context:
>>> http://drools-java-rules-engine.46999.n3.nabble.com/Drools-Fusion-Can-t-detect-2-occurrences-with-sliding-window-tp823141p828505.html
>>> Sent from the Drools - User mailing list archive at Nabble.com.
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>
>>
>>
>> --
>> Xavier
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
>
> --
>  Edson Tirelli
>  JBoss Drools Core Development
>  JBoss by Red Hat @ www.jboss.com
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>


-- 
Xavier
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20100527/aaada9cb/attachment.html 


More information about the rules-users mailing list