From: <jbo...@li...> - 2006-03-22 06:28:25
|
Author: bagerman Date: 2006-03-22 01:28:10 -0500 (Wed, 22 Mar 2006) New Revision: 3134 Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/Builder.java trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/LeapsRule.java trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/LeapsTuple.java trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/Token.java trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/TokenEvaluator.java trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java Log: changes to fix problems uncovered during leaps integration tests Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/Builder.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/Builder.java 2006-03-22 05:48:55 UTC (rev 3133) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/Builder.java 2006-03-22 06:28:10 UTC (rev 3134) @@ -23,6 +23,9 @@ import org.drools.common.BetaNodeBinder; import org.drools.rule.And; import org.drools.rule.Column; +import org.drools.rule.ConditionalElement; +import org.drools.rule.Declaration; +import org.drools.rule.EvalCondition; import org.drools.rule.GroupElement; import org.drools.rule.Exists; import org.drools.rule.InvalidPatternException; @@ -69,33 +72,74 @@ ArrayList cols = new ArrayList(); ArrayList notCols = new ArrayList(); ArrayList existsCols = new ArrayList(); + ArrayList evalConditions = new ArrayList(); for (Iterator it = and.getChildren().iterator(); it.hasNext();) { Object object = it.next(); - if (object instanceof Column) { - constraints = Builder.processColumn((Column)object); - // create column constraints - } else { - // NOTS and EXISTS - GroupElement ce = (GroupElement) object; - while (!(ce.getChildren().get(0) instanceof Column)) { - ce = (GroupElement) ce.getChildren().get(0); + if ( object instanceof EvalCondition ) { + EvalCondition eval = (EvalCondition) object; + evalConditions.add(eval); + } + else { + if (object instanceof Column) { + constraints = Builder.processColumn((Column) object); + // create column constraints + } else { + // NOTS and EXISTS + GroupElement ce = (GroupElement) object; + while (!(ce.getChildren().get(0) instanceof Column)) { + ce = (GroupElement) ce.getChildren().get(0); + } + constraints = Builder.processColumn((Column) ce + .getChildren().get(0)); } - constraints = Builder.processColumn((Column) ce.getChildren().get( 0 )); + if (object instanceof Not) { + notCols.add(constraints); + } else if (object instanceof Exists) { + existsCols.add(constraints); + } else { + cols.add(constraints); + } } - if (object instanceof Not) { - notCols.add(constraints); - } else if (object instanceof Exists) { - existsCols.add(constraints); - } else { - cols.add(constraints); - } } - leapsRules.add(new LeapsRule(rule, cols, notCols, existsCols)); + // check eval for presence of required declarations + checkEvalUnboundDeclarations(rule, evalConditions); + // + leapsRules.add(new LeapsRule(rule, cols, notCols, existsCols, evalConditions)); return leapsRules; } + /** + * Make sure the required declarations are previously bound + * + * @param declarations + * @throws InvalidPatternException + */ + static void checkEvalUnboundDeclarations(Rule rule, ArrayList evals) throws InvalidPatternException { + List list = new ArrayList(); + for (Iterator it = evals.iterator(); it.hasNext();) { + EvalCondition ec = (EvalCondition) it.next(); + Declaration[] declarations = ec.getRequiredDeclarations(); + for (int i = 0, length = declarations.length; i < length; i++) { + if (rule.getDeclaration(declarations[i].getIdentifier()) == null) { + list.add(declarations[i].getIdentifier()); + } + } + } + + // Make sure the required declarations + if ( list.size() != 0 ) { + StringBuffer buffer = new StringBuffer(); + buffer.append( list.get( 0 ) ); + for ( int i = 1, size = list.size(); i < size; i++ ) { + buffer.append( ", " + list.get( i ) ); + } + + throw new InvalidPatternException("Required Declarations not bound: '" + buffer ); + } + } + /** * extracts column specific constraints and packages it into * <code>ColumnConstraints</code> Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/LeapsRule.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/LeapsRule.java 2006-03-22 05:48:55 UTC (rev 3133) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/LeapsRule.java 2006-03-22 06:28:10 UTC (rev 3134) @@ -19,6 +19,8 @@ import java.util.ArrayList; import org.drools.base.ClassObjectType; +import org.drools.rule.ConditionalElement; +import org.drools.rule.EvalCondition; import org.drools.rule.Rule; /** @@ -37,18 +39,24 @@ final ColumnConstraints[] existsColumns; + final EvalCondition[] evalConditions; + boolean notColumnsPresent; boolean existsColumnsPresent; + + boolean evalCoditionsPresent; public LeapsRule(Rule rule, ArrayList columns, ArrayList notColumns, - ArrayList existsColumns) { + ArrayList existsColumns, ArrayList evalConditions) { this.rule = rule; this.columns = (ColumnConstraints[]) columns.toArray(new ColumnConstraints[0]); this.notColumns = (ColumnConstraints[]) notColumns.toArray(new ColumnConstraints[0]); this.existsColumns = (ColumnConstraints[]) existsColumns.toArray(new ColumnConstraints[0]); this.notColumnsPresent = (notColumns.size() != 0); this.existsColumnsPresent = (existsColumns.size() != 0); + this.evalConditions = (EvalCondition[]) evalConditions.toArray(new EvalCondition[0]); + this.evalCoditionsPresent = (evalConditions.size() != 0); } Rule getRule() { @@ -67,6 +75,10 @@ return this.existsColumns.length; } + int getNumberOfEvalConditions() { + return this.evalConditions.length; + } + ClassObjectType getColumnClassObjectTypeAtPosition(int idx) { return (ClassObjectType) this.columns[idx].getColumn().getObjectType(); } @@ -83,6 +95,10 @@ return this.existsColumns; } + EvalCondition[] getEvalConditions() { + return this.evalConditions; + } + boolean containsNotColumns() { return this.notColumnsPresent; } @@ -90,4 +106,8 @@ boolean containsExistsColumns() { return this.existsColumnsPresent; } + + boolean containsEvalConditions() { + return this.evalCoditionsPresent; + } } Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/LeapsTuple.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/LeapsTuple.java 2006-03-22 05:48:55 UTC (rev 3133) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/LeapsTuple.java 2006-03-22 06:28:10 UTC (rev 3134) @@ -64,7 +64,6 @@ ColumnConstraints[] notConstraints, ColumnConstraints[] existsConstraints , PropagationContext context) { - this.readyForActivation = true; this.factHandles = factHandles; this.notConstraints = notConstraints; if (this.notConstraints != null && this.notConstraints.length > 0) { @@ -84,6 +83,7 @@ } this.context = context; + this.readyForActivation = !this.existsConstraintsPresent; } /** @@ -262,16 +262,20 @@ private void setReadyForActivation(){ this.readyForActivation = true; - for (int i = 0, length = this.notFactHandles.length; this.notConstraintsPresent - && i < length && this.readyForActivation; i++) { - if (this.notFactHandles[i].size() > 0) { - this.readyForActivation = false; + if (this.notFactHandles != null) { + for (int i = 0, length = this.notFactHandles.length; this.notConstraintsPresent + && i < length && this.readyForActivation; i++) { + if (this.notFactHandles[i].size() > 0) { + this.readyForActivation = false; + } } } - for (int i = 0, length = this.existsFactHandles.length; this.existsConstraintsPresent - && i < length && this.readyForActivation; i++) { - if (this.notFactHandles[i].size() == 0) { - this.readyForActivation = false; + if (this.existsFactHandles != null) { + for (int i = 0, length = this.existsFactHandles.length; this.existsConstraintsPresent + && i < length && this.readyForActivation; i++) { + if (this.existsFactHandles[i].size() == 0) { + this.readyForActivation = false; + } } } } @@ -287,7 +291,7 @@ boolean isNotConstraintsPresent() { return this.notConstraintsPresent; } - + void addLogicalDependency(FactHandle handle) { if(this.logicalDependencies == null){ this.logicalDependencies = new HashSet(); Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/Token.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/Token.java 2006-03-22 05:48:55 UTC (rev 3133) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/Token.java 2006-03-22 06:28:10 UTC (rev 3134) @@ -60,9 +60,14 @@ private Iterator rulesIterator() { if (this.rules == null) { - this.rules = this.workingMemory.getFactTable( - this.dominantFactHandle.getObject().getClass()) - .getRulesIterator(); + if (this.dominantFactHandle != null) { + this.rules = this.workingMemory.getFactTable( + this.dominantFactHandle.getObject().getClass()) + .getRulesIterator(); + } else { + this.rules = this.workingMemory + .getNoRequiredColumnsLeapsRules(); + } } return this.rules; } @@ -86,7 +91,8 @@ // starting with calling rulesIterator() to make sure that we picks // rules because fact can be asserted before rules added long levelId = this.workingMemory.getIdLastFireAllAt(); - if (this.dominantFactHandle.getId() >= levelId) { + if (this.dominantFactHandle == null + || this.dominantFactHandle.getId() >= levelId) { ret = this.rules.hasNext(); } else { // then we need to skip rules that have id lower than @@ -112,7 +118,11 @@ } public int hashCode() { - return (int) this.dominantFactHandle.getId(); + if (this.dominantFactHandle != null) { + return (int) this.dominantFactHandle.getId(); + } else { + return 0; + } } public void set(int idx, FactHandleImpl factHandle) { @@ -145,8 +155,13 @@ return true; if (!(that instanceof Token)) return false; + if(this.dominantFactHandle != null){ return this.dominantFactHandle.getId() == ((Token) that).dominantFactHandle .getId(); + } + else { + return ((Token) that).dominantFactHandle == null; + } } /** Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/TokenEvaluator.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/TokenEvaluator.java 2006-03-22 05:48:55 UTC (rev 3133) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/TokenEvaluator.java 2006-03-22 06:28:10 UTC (rev 3134) @@ -20,6 +20,7 @@ import org.drools.common.PropagationContextImpl; import org.drools.leaps.util.Table; import org.drools.leaps.util.TableIterator; +import org.drools.rule.EvalCondition; import org.drools.rule.InvalidRuleException; import org.drools.spi.Activation; import org.drools.spi.PropagationContext; @@ -43,13 +44,13 @@ */ final static protected void evaluate(Token token) throws NoMatchesFoundException, Exception, InvalidRuleException { - boolean found = false; - WorkingMemoryImpl workingMemory = (WorkingMemoryImpl) token .getWorkingMemory(); - int dominantFactPosition = token.getCurrentRuleHandle() - .getDominantPosition(); LeapsRule leapsRule = token.getCurrentRuleHandle().getLeapsRule(); + // sometimes there is not normal conditions, only not and exists + if(leapsRule.getNumberOfColumns() > 0){ + int dominantFactPosition = token.getCurrentRuleHandle() + .getDominantPosition(); if (leapsRule.getColumnConstraintsAtPosition(dominantFactPosition) .isAllowedAlpha(token.getDominantFactHandle(), token, workingMemory)) { @@ -159,30 +160,10 @@ // consequence if (jj == (numberOfColumns - 1)) { if (!skip) { - LeapsTuple tuple = token - .getTuple(new PropagationContextImpl( - workingMemory - .increamentPropagationIdCounter(), - PropagationContext.ASSERTION, - leapsRule.getRule(), - (Activation) null)); - if (tuple.isExistsConstraintsPresent()) { - TokenEvaluator.evaluateExistsConditions( - tuple, workingMemory); + if (processAfterAllPositiveConstraintOk(token, + leapsRule, workingMemory)) { + return; } - if (tuple.isNotConstraintsPresent()) { - TokenEvaluator.evaluateNotConditions(tuple, - workingMemory); - } - // check for negative conditions - if (tuple.isReadyForActivation()) { - // let agenda to do its work - workingMemory.assertTuple(tuple, leapsRule - .getRule()); - - done = true; - found = true; - } } else { skip = false; } @@ -197,12 +178,57 @@ } } } - if (!found) { - throw new NoMatchesFoundException(); - // "iteration did not find anything"); } + else { + if (processAfterAllPositiveConstraintOk(token, + leapsRule, workingMemory)) { + return; + } + } + // nothing was found. inform caller about it + throw new NoMatchesFoundException(); } + final static boolean processAfterAllPositiveConstraintOk(Token token, + LeapsRule leapsRule, WorkingMemoryImpl workingMemory) + throws Exception { + LeapsTuple tuple = token.getTuple(new PropagationContextImpl( + workingMemory.increamentPropagationIdCounter(), + PropagationContext.ASSERTION, leapsRule.getRule(), + (Activation) null)); + if(leapsRule.containsEvalConditions()) { + if(!TokenEvaluator.evaluateEvalConditions(leapsRule, tuple, workingMemory)) { + return false; + } + } + if (tuple.isExistsConstraintsPresent()) { + TokenEvaluator.evaluateExistsConditions(tuple, workingMemory, (leapsRule.getNumberOfColumns()==0)); + } + if (tuple.isNotConstraintsPresent()) { + TokenEvaluator.evaluateNotConditions(tuple, workingMemory, (leapsRule.getNumberOfColumns()==0)); + } + // check for negative conditions + if (tuple.isReadyForActivation()) { + // let agenda to do its work + workingMemory.assertTuple(tuple, leapsRule.getRule()); + return true; + // done = true; + // found = true; + } else { + return false; + } + + } + + final static boolean evaluateEvalConditions(LeapsRule leapsRule, LeapsTuple tuple, WorkingMemoryImpl workingMemory) throws Exception { + EvalCondition [] evals = leapsRule.getEvalConditions(); + for(int i = 0; i < evals.length; i++) { + if(!evals[i].isAllowed(tuple, workingMemory)){ + return false; + } + } + return true; + } /** * Check if any of the negative conditions are satisfied success when none * found @@ -213,7 +239,7 @@ * @throws Exception */ final static void evaluateNotConditions(LeapsTuple tuple, - WorkingMemoryImpl workingMemory) throws Exception { + WorkingMemoryImpl workingMemory, boolean noColumnsToken) throws Exception { FactHandleImpl factHandle; FactTable factTable; TableIterator tableIterator; @@ -225,15 +251,29 @@ factTable = workingMemory .getFactTable(((ClassObjectType) constraint.getColumn() .getObjectType()).getClassType()); - tableIterator = factTable.iterator(); + if (noColumnsToken) { + Handle marker = new Handle(workingMemory.getIdLastFireAllAt(), + null); + tableIterator = factTable.headIterator(marker); +// tableIterator = factTable.tailIterator(marker, marker); + } else { + tableIterator = factTable.iterator(); + } // fails if exists while (tableIterator.hasNext()) { factHandle = (FactHandleImpl) tableIterator.next(); // check alphas if (constraint.isAllowed(factHandle, tuple, workingMemory)) { tuple.addNotFactHandle(factHandle, i); - factTable.addTuple(tuple); - factHandle.addNotTuple(tuple, i); + if (tuple.getFactHandles().length > 0) { + factTable.addTuple(tuple); + factHandle.addNotTuple(tuple, i); + } else { + // no required columns so we exit fast + // we add not fact handle to trigger + // NO firing + return; + } } } } @@ -247,7 +287,7 @@ * @throws Exception */ final static void evaluateExistsConditions(LeapsTuple tuple, - WorkingMemoryImpl workingMemory) throws Exception { + WorkingMemoryImpl workingMemory, boolean noColumnsToken) throws Exception { FactHandleImpl factHandle; FactTable factTable; TableIterator tableIterator; @@ -259,15 +299,29 @@ factTable = workingMemory .getFactTable(((ClassObjectType) constraint.getColumn() .getObjectType()).getClassType()); - tableIterator = factTable.iterator(); + if (noColumnsToken) { + Handle marker = new Handle(workingMemory.getIdLastFireAllAt(), + null); + tableIterator = factTable.headIterator(marker); +// tableIterator = factTable.tailIterator(marker, marker); + } else { + tableIterator = factTable.iterator(); + } // fails if exists while (tableIterator.hasNext()) { factHandle = (FactHandleImpl) tableIterator.next(); // check alphas if (constraint.isAllowed(factHandle, tuple, workingMemory)) { tuple.addExistsFactHandle(factHandle, i); - factTable.addTuple(tuple); - factHandle.addExistsTuple(tuple, i); + if (tuple.getFactHandles().length > 0) { + factTable.addTuple(tuple); + factHandle.addExistsTuple(tuple, i); + } else { + // no required columns so we exit fast + // we add exists fact handle to trigger + // firing + return; + } } } } Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java 2006-03-22 05:48:55 UTC (rev 3133) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java 2006-03-22 06:28:10 UTC (rev 3134) @@ -42,6 +42,7 @@ import org.drools.common.PropagationContextImpl; import org.drools.common.ScheduledAgendaItem; import org.drools.leaps.conflict.DefaultConflictResolver; +import org.drools.leaps.util.TableIterator; import org.drools.rule.Rule; import org.drools.spi.Activation; import org.drools.spi.AgendaFilter; @@ -66,10 +67,15 @@ class WorkingMemoryImpl extends AbstractWorkingMemory implements EventSupport, PropertyChangeListener { private static final long serialVersionUID = -2524904474925421759L; - + protected final Agenda agenda; - + private final Map queryResults; + + // rules consisting only of not and exists + private final RuleTable noRequiredColumnsLeapsRules = new RuleTable( + DefaultConflictResolver.getInstance().getRuleConflictResolver()); + /** * Construct. * @@ -112,10 +118,10 @@ } } - public void clearAgenda() { - this.agenda.clearAgenda(); - } - + public void clearAgenda() { + this.agenda.clearAgenda(); + } + /** * Returns the fact Object for the given <code>FactHandle</code>. It * actually returns the value from the handle, before retrieving it from @@ -240,9 +246,9 @@ this.equalsMap.put(object, handle); } - + // adding logical dependency - LeapsTuple tuple = (LeapsTuple)activation.getTuple(); + LeapsTuple tuple = (LeapsTuple) activation.getTuple(); tuple.addLogicalDependency(handle); handle.addLogicalDependency(tuple); } @@ -258,8 +264,9 @@ // determine what classes it belongs to put it into the "table" on // class name key Class objectClass = object.getClass(); - for (Iterator tables = this.getFactTablesList(objectClass).iterator(); tables.hasNext();) { - FactTable factTable = (FactTable) tables.next(); + for (Iterator tables = this.getFactTablesList(objectClass).iterator(); tables + .hasNext();) { + FactTable factTable = (FactTable) tables.next(); // adding fact to container factTable.add(handle); // inspect all tuples for exists and not conditions and activate / deactivate @@ -275,8 +282,10 @@ constraints = tuple.getNotConstraints(); for (int i = 0, length = constraints.length; i < length; i++) { constraint = constraints[i]; - if (objectClass.isAssignableFrom(((ClassObjectType) constraint.getColumn() - .getObjectType()).getClassType()) + if (objectClass + .isAssignableFrom(((ClassObjectType) constraint + .getColumn().getObjectType()) + .getClassType()) && constraint.isAllowed(handle, tuple, this)) { tuple.addNotFactHandle(handle, i); handle.addNotTuple(tuple, i); @@ -295,7 +304,7 @@ // ready to activate this.assertTuple(tuple, rule); // and need to remove tuple from fact table but iterator fail fast - if(assertedTuples == null) { + if (assertedTuples == null) { assertedTuples = new HashSet(); } assertedTuples.add(tuple); @@ -354,12 +363,8 @@ public void retractObject(FactHandle handle, boolean removeLogical, boolean updateEqualsMap, Rule rule, Activation activation) throws FactException { + // removePropertyChangeListener(handle); - PropagationContextImpl context = new PropagationContextImpl( - ++this.propagationIdCounter, PropagationContext.RETRACTION, - rule, activation); - // this.ruleBase.retractObject( handle, propagationContext, this ); - /* * leaps specific actions */ @@ -371,11 +376,11 @@ } // 0. remove activated tuples - Iterator tuples = ((FactHandleImpl)handle).getActivatedTuples(); - for(; tuples != null && tuples.hasNext();){ - this.invalidateActivation((LeapsTuple)tuples.next()); + Iterator tuples = ((FactHandleImpl) handle).getActivatedTuples(); + for (; tuples != null && tuples.hasNext();) { + this.invalidateActivation((LeapsTuple) tuples.next()); } - + // 1. remove fact for nots and exists tuples FactHandleTupleAssembly assembly; Iterator it; @@ -411,8 +416,8 @@ tuple = ((FactHandleTupleAssembly) chain.next()).getTuple(); if (tuple.isReadyForActivation() && tuple.isActivationNull()) { // ready to activate - this.assertTuple(tuple, rule); - } else { + this.assertTuple(tuple, tuple.getContext().getRuleOrigin()); + } else { // time to pull from agenda this.invalidateActivation(tuple); } @@ -437,6 +442,9 @@ // not applicable to leaps implementation // this.factHandlePool.push( ((FactHandleImpl) handle).getId() ); + PropagationContextImpl context = new PropagationContextImpl( + ++this.propagationIdCounter, PropagationContext.RETRACTION, + rule, activation); this.workingMemoryEventSupport.fireObjectRetracted(context, handle, oldObject); @@ -564,24 +572,37 @@ RuleHandle ruleHandle; for (Iterator it = rules.iterator(); it.hasNext();) { rule = (LeapsRule) it.next(); - for (int i = 0; i < rule.getNumberOfColumns(); i++) { + // some times rules do not have "normal" constraints and only + // not and exists + if (rule.getNumberOfColumns() > 0) { + for (int i = 0; i < rule.getNumberOfColumns(); i++) { + ruleHandle = new RuleHandle( + ((HandleFactory) this.handleFactory) + .getNextId(), rule, i); + + this.getFactTable( + ((ClassObjectType) (rule + .getColumnConstraintsAtPosition(i)) + .getColumn().getObjectType()) + .getClassType()).addRule(this, + ruleHandle); + } + } else { ruleHandle = new RuleHandle( - ((HandleFactory) this.handleFactory).getNextId(), - rule, i); - - this.getFactTable( - ((ClassObjectType) (rule - .getColumnConstraintsAtPosition(i)) - .getColumn().getObjectType()) - .getClassType()).addRule(this, ruleHandle); + ((HandleFactory) this.handleFactory) + .getNextId(), rule, -1); + this.noRequiredColumnsLeapsRules.add(ruleHandle); } } } } - protected void removeRule(List rules){ - + protected void removeRule(List rules) { + for (Iterator it = rules.iterator(); it.hasNext();) { + this.noRequiredColumnsLeapsRules.remove(it.next()); + } } + /** * main loop * @@ -595,7 +616,9 @@ if (!this.firing) { try { this.firing = true; - + // to pick up rules that do not require columns, only not and exists + this.pushTokenOnStack(new Token(this, null)); + // normal rules with required columns while (!this.stack.isEmpty()) { Token token = (Token) this.stack.peek(); boolean done = false; @@ -621,8 +644,10 @@ TokenEvaluator.evaluate(token); // something was found so set marks for // resume processing - token.setResume(true); - done = true; + if (token.getDominantFactHandle() != null) { + token.setResume(true); + done = true; + } } catch (NoMatchesFoundException ex) { token.setResume(false); } catch (Exception e) { @@ -651,7 +676,6 @@ } } } - protected long getIdLastFireAllAt() { return this.idLastFireAllAt; } @@ -695,8 +719,9 @@ Activation agendaItem; if (dur != null && dur.getDuration(tuple) > 0) { - agendaItem = new ScheduledAgendaItem(context - .getPropagationNumber(), tuple, this.agenda, context, rule); + agendaItem = new ScheduledAgendaItem( + context.getPropagationNumber(), tuple, this.agenda, + context, rule); this.agenda.scheduleItem((ScheduledAgendaItem) agendaItem); tuple.setActivation(agendaItem); agendaItem.setActivated(true); @@ -735,8 +760,8 @@ ActivationQueue queue = agendaGroup.getActivationQueue(rule .getSalience()); - agendaItem = new AgendaItem(context - .getPropagationNumber(), tuple, context, rule, queue); + agendaItem = new AgendaItem(context.getPropagationNumber(), tuple, + context, rule, queue); queue.add(agendaItem); @@ -748,8 +773,9 @@ agendaItem.setActivated(true); this.getAgendaEventSupport().fireActivationCreated(agendaItem); // retract support - FactHandleImpl [] factHandles = (FactHandleImpl[])tuple.getFactHandles(); - for(int i = 0; i < factHandles.length; i++){ + FactHandleImpl[] factHandles = (FactHandleImpl[]) tuple + .getFactHandles(); + for (int i = 0; i < factHandles.length; i++) { factHandles[i].addActivatedTuple(tuple); } } @@ -773,18 +799,21 @@ return this.agenda; } - - public List getQueryResults( String query ) { - return (List)this.queryResults.remove( query ); - } - - void addToQueryResults( String query, Tuple tuple) { - LinkedList list = (LinkedList) this.queryResults.get(query); - if (list == null){ - list = new LinkedList(); - this.queryResults.put(query, list); - } - list.add(tuple); - } + public List getQueryResults(String query) { + return (List) this.queryResults.remove(query); + } + void addToQueryResults(String query, Tuple tuple) { + LinkedList list = (LinkedList) this.queryResults.get(query); + if (list == null) { + list = new LinkedList(); + this.queryResults.put(query, list); + } + list.add(tuple); + } + + protected TableIterator getNoRequiredColumnsLeapsRules() { + return noRequiredColumnsLeapsRules.iterator(); + } + } |