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()) {
case MODIFY:
case UPDATE:
case RETRACT:
case DELETE:
rewriteDescr(context,
originalCode,
mvel,
Expand Down Expand Up @@ -583,8 +583,8 @@ private static boolean rewriteDescr(final RuleBuildContext context,
case UPDATE:
rewriteUpdateDescr(context, d, consequence, declr, obj);
break;
case RETRACT:
rewriteRetractDescr( context, d, consequence, declr, obj );
case DELETE:
rewriteDeleteDescr( context, d, consequence, declr, obj );
break;
}

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

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

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

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

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();
Expand Down
@@ -1,39 +1,31 @@
/*
* 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
// $ANTLR 3.5 src/main/resources/org/drools/compiler/semantics/java/parser/Java.g 2015-10-27 17:56:25

package org.drools.compiler.rule.builder.dialect.java.parser;
import java.util.Iterator;
import java.util.Queue;
import java.util.LinkedList;
import java.util.Stack;

import org.drools.compiler.rule.builder.dialect.java.parser.JavaLocalDeclarationDescr;
import org.drools.compiler.rule.builder.dialect.java.parser.JavaRootBlockDescr;
import org.drools.compiler.rule.builder.dialect.java.parser.JavaContainerBlockDescr;
import org.drools.compiler.rule.builder.dialect.java.parser.JavaBlockDescr;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import org.antlr.runtime.BaseRecognizer;
import org.antlr.runtime.BitSet;
import org.antlr.runtime.CommonToken;
import org.antlr.runtime.DFA;
import org.antlr.runtime.EarlyExitException;
import org.antlr.runtime.FailedPredicateException;
import org.antlr.runtime.IntStream;
import org.antlr.runtime.MismatchedNotSetException;
import org.antlr.runtime.MismatchedSetException;
import org.antlr.runtime.MismatchedTokenException;
import org.antlr.runtime.MismatchedTreeNodeException;
import org.antlr.runtime.NoViableAltException;
import org.antlr.runtime.Parser;
import org.antlr.runtime.ParserRuleReturnScope;
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.Map;
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
*
Expand Down Expand Up @@ -7624,7 +7616,7 @@ public final void retractStatement() throws RecognitionException {
if (state.failed) return;
c=(Token)match(input,32,FOLLOW_32_in_retractStatement4115); if (state.failed) return;
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() );
this.addBlockDescr( d );
d.setEnd( ((CommonToken)c).getStopIndex() );
Expand Down
Expand Up @@ -952,7 +952,7 @@ retractStatement
expression
c = ')'
{
JavaStatementBlockDescr d = new JavaStatementBlockDescr( $expression.text, JavaBlockDescr.BlockType.RETRACT );
JavaStatementBlockDescr d = new JavaStatementBlockDescr( $expression.text, JavaBlockDescr.BlockType.DELETE );
d.setStart( ((CommonToken)$s).getStartIndex() );
this.addBlockDescr( d );
d.setEnd( ((CommonToken)$c).getStopIndex() );
Expand Down
Expand Up @@ -5605,4 +5605,42 @@ public void testEventWithShortExpiration() throws InterruptedException {
ksession.fireAllRules();
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) {
InternalFactHandle handle = null;

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

handle = getFactHandleFromWM( object );
InternalFactHandle handle = getFactHandleFromWM( object );

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

public InternalFactHandle getFactHandle(InternalFactHandle handle) {
Object object = ((InternalFactHandle)handle).getObject();
handle = (InternalFactHandle) getFactHandleFromWM( object );
Object object = handle.getObject();
handle = getFactHandleFromWM( object );
if ( handle == null ) {
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.