Skip to content

Commit

Permalink
[BZ-1274696] fix rewriting of delete statements in consequences
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed Oct 27, 2015
1 parent f15068f commit 3e455f3
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 51 deletions.
Expand Up @@ -158,7 +158,7 @@ public int compare(JavaBlockDescr o1,
switch (block.getType()) { switch (block.getType()) {
case MODIFY: case MODIFY:
case UPDATE: case UPDATE:
case RETRACT: case DELETE:
rewriteDescr(context, rewriteDescr(context,
originalCode, originalCode,
mvel, mvel,
Expand Down Expand Up @@ -583,8 +583,8 @@ private static boolean rewriteDescr(final RuleBuildContext context,
case UPDATE: case UPDATE:
rewriteUpdateDescr(context, d, consequence, declr, obj); rewriteUpdateDescr(context, d, consequence, declr, obj);
break; break;
case RETRACT: case DELETE:
rewriteRetractDescr( context, d, consequence, declr, obj ); rewriteDeleteDescr( context, d, consequence, declr, obj );
break; break;
} }


Expand Down Expand Up @@ -838,21 +838,21 @@ private static Class<?> findFunctionReturnedClass(RuleBuildContext context, Stri
return function == null ? null : findClassByName(context, function.getReturnType()); return function == null ? null : findClassByName(context, function.getReturnType());
} }


private static boolean rewriteRetractDescr(RuleBuildContext context, private static boolean rewriteDeleteDescr( RuleBuildContext context,
JavaBlockDescr d, JavaBlockDescr d,
StringBuilder consequence, StringBuilder consequence,
Declaration declr, Declaration declr,
String obj) { String obj ) {
Class<?> typeClass = findModifiedClass(context, d, declr); Class<?> typeClass = findModifiedClass(context, d, declr);
if (typeClass != null) { if (typeClass != null) {
ConsequenceMetaData.Statement statement = new ConsequenceMetaData.Statement(ConsequenceMetaData.Statement.Type.RETRACT, typeClass); ConsequenceMetaData.Statement statement = new ConsequenceMetaData.Statement(ConsequenceMetaData.Statement.Type.RETRACT, typeClass);
context.getRule().getConsequenceMetaData().addStatement(statement); context.getRule().getConsequenceMetaData().addStatement(statement);
} }


if (declr != null && !declr.isInternalFact()) { if (declr != null && !declr.isInternalFact()) {
consequence.append("drools.retract( ").append(obj).append("__Handle__ ); }"); consequence.append("drools.delete( ").append(obj).append("__Handle__ ); }");
} else { } else {
consequence.append("drools.retract( ").append(obj).append("__Handle2__ ); }"); consequence.append("drools.delete( ").append(obj).append("__Handle2__ ); }");
} }


return declr != null; return declr != null;
Expand Down
Expand Up @@ -21,7 +21,7 @@
public interface JavaBlockDescr { public interface JavaBlockDescr {


public static enum BlockType { public static enum BlockType {
MODIFY, UPDATE, INSERT, RETRACT, DELETE, ENTRY, EXIT, CHANNEL, TRY, CATCH, FINAL, IF, ELSE, FOR, SWITCH, WHILE, THROW MODIFY, UPDATE, INSERT, DELETE, ENTRY, EXIT, CHANNEL, TRY, CATCH, FINAL, IF, ELSE, FOR, SWITCH, WHILE, THROW
} }


public BlockType getType(); public BlockType getType();
Expand Down
@@ -1,39 +1,31 @@
/* // $ANTLR 3.5 src/main/resources/org/drools/compiler/semantics/java/parser/Java.g 2015-10-27 17:56:25
* Copyright 2015 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

// $ANTLR 3.5 src/main/resources/org/drools/compiler/semantics/java/parser/Java.g 2014-11-07 09:17:19


package org.drools.compiler.rule.builder.dialect.java.parser; package org.drools.compiler.rule.builder.dialect.java.parser;
import java.util.Iterator; import org.antlr.runtime.BaseRecognizer;
import java.util.Queue; import org.antlr.runtime.BitSet;
import java.util.LinkedList; import org.antlr.runtime.CommonToken;
import java.util.Stack; import org.antlr.runtime.DFA;

import org.antlr.runtime.EarlyExitException;
import org.drools.compiler.rule.builder.dialect.java.parser.JavaLocalDeclarationDescr; import org.antlr.runtime.FailedPredicateException;
import org.drools.compiler.rule.builder.dialect.java.parser.JavaRootBlockDescr; import org.antlr.runtime.IntStream;
import org.drools.compiler.rule.builder.dialect.java.parser.JavaContainerBlockDescr; import org.antlr.runtime.MismatchedNotSetException;
import org.drools.compiler.rule.builder.dialect.java.parser.JavaBlockDescr; import org.antlr.runtime.MismatchedSetException;

import org.antlr.runtime.MismatchedTokenException;

import org.antlr.runtime.MismatchedTreeNodeException;

import org.antlr.runtime.NoViableAltException;
import org.antlr.runtime.*; import org.antlr.runtime.Parser;
import java.util.Stack; import org.antlr.runtime.ParserRuleReturnScope;
import java.util.List; import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.RecognizerSharedState;
import org.antlr.runtime.Token;
import org.antlr.runtime.TokenStream;

import java.util.ArrayList; import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;


/** A Java 1.5 grammar for ANTLR v3 derived from the spec /** A Java 1.5 grammar for ANTLR v3 derived from the spec
* *
Expand Down Expand Up @@ -7624,7 +7616,7 @@ public final void retractStatement() throws RecognitionException {
if (state.failed) return; if (state.failed) return;
c=(Token)match(input,32,FOLLOW_32_in_retractStatement4115); if (state.failed) return; c=(Token)match(input,32,FOLLOW_32_in_retractStatement4115); if (state.failed) return;
if ( state.backtracking==0 ) { if ( state.backtracking==0 ) {
JavaStatementBlockDescr d = new JavaStatementBlockDescr( (expression9!=null?input.toString(expression9.start,expression9.stop):null), JavaBlockDescr.BlockType.RETRACT ); JavaStatementBlockDescr d = new JavaStatementBlockDescr( (expression9!=null?input.toString(expression9.start,expression9.stop):null), JavaBlockDescr.BlockType.DELETE );
d.setStart( ((CommonToken)s).getStartIndex() ); d.setStart( ((CommonToken)s).getStartIndex() );
this.addBlockDescr( d ); this.addBlockDescr( d );
d.setEnd( ((CommonToken)c).getStopIndex() ); d.setEnd( ((CommonToken)c).getStopIndex() );
Expand Down
Expand Up @@ -952,7 +952,7 @@ retractStatement
expression expression
c = ')' c = ')'
{ {
JavaStatementBlockDescr d = new JavaStatementBlockDescr( $expression.text, JavaBlockDescr.BlockType.RETRACT ); JavaStatementBlockDescr d = new JavaStatementBlockDescr( $expression.text, JavaBlockDescr.BlockType.DELETE );
d.setStart( ((CommonToken)$s).getStartIndex() ); d.setStart( ((CommonToken)$s).getStartIndex() );
this.addBlockDescr( d ); this.addBlockDescr( d );
d.setEnd( ((CommonToken)$c).getStopIndex() ); d.setEnd( ((CommonToken)$c).getStopIndex() );
Expand Down
Expand Up @@ -5605,4 +5605,42 @@ public void testEventWithShortExpiration() throws InterruptedException {
ksession.fireAllRules(); ksession.fireAllRules();
assertEquals( 0, ksession.getObjects().size() ); assertEquals( 0, ksession.getObjects().size() );
} }

@Test
public void testDeleteExpiredEvent() throws Exception {
// BZ-1274696
String drl =
"import " + StockTick.class.getCanonicalName() + "\n" +
"declare StockTick\n" +
" @role( event )\n" +
"end\n" +
"\n" +
"rule \"TestEventReceived\"\n" +
"no-loop\n" +
"when\n" +
" $st1 : StockTick( company == \"ACME\" )\n" +
" not ( StockTick( this != $st1, this after[0s, 1s] $st1) )\n" +
"then\n" +
" delete($st1);\n" +
"end";

KieSessionConfiguration sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
sessionConfig.setOption( ClockTypeOption.get( ClockType.PSEUDO_CLOCK.getId() ) );

KieHelper helper = new KieHelper();
helper.addContent( drl, ResourceType.DRL );
KieBase kbase = helper.build( EventProcessingOption.STREAM );
KieSession ksession = kbase.newKieSession( sessionConfig, null );
PseudoClockScheduler clock = ksession.getSessionClock();

EventFactHandle handle1 = (EventFactHandle) ksession.insert( new StockTick( 1, "ACME", 50 ) );

ksession.fireAllRules();

clock.advanceTime( 2, TimeUnit.SECONDS );
ksession.fireAllRules();

assertTrue( handle1.isExpired() );
assertFalse( ksession.getFactHandles().contains( handle1 ) );
}
} }
Expand Up @@ -367,13 +367,7 @@ public void cancelMatch(Match act) {
} }


public InternalFactHandle getFactHandle(Object object) { public InternalFactHandle getFactHandle(Object object) {
InternalFactHandle handle = null; InternalFactHandle handle = getFactHandleFromWM( object );

if ( handle != null ) {
return handle;
}

handle = getFactHandleFromWM( object );


if ( handle == null ) { if ( handle == null ) {
if ( object instanceof CoreWrapper ) { if ( object instanceof CoreWrapper ) {
Expand All @@ -387,8 +381,8 @@ public InternalFactHandle getFactHandle(Object object) {
} }


public InternalFactHandle getFactHandle(InternalFactHandle handle) { public InternalFactHandle getFactHandle(InternalFactHandle handle) {
Object object = ((InternalFactHandle)handle).getObject(); Object object = handle.getObject();
handle = (InternalFactHandle) getFactHandleFromWM( object ); handle = getFactHandleFromWM( object );
if ( handle == null ) { if ( handle == null ) {
throw new RuntimeException( "Update error: handle not found for object: " + object + ". Is it in the working memory?" ); throw new RuntimeException( "Update error: handle not found for object: " + object + ". Is it in the working memory?" );
} }
Expand Down

0 comments on commit 3e455f3

Please sign in to comment.