Author: bagerman Date: 2006-04-23 12:25:31 -0400 (Sun, 23 Apr 2006) New Revision: 3926 Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsQueryResult.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsQueryResults.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TokenStack.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryResultsTest.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/util/TokenStackTest.java Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Builder.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ColumnConstraints.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ConflictResolver.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactHandleImpl.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactHandleTupleAssembly.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactTable.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Handle.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/HandleFactory.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsAgenda.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsRule.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsTuple.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/NoMatchesFoundException.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleBaseImpl.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleHandle.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleTable.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Token.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/TokenEvaluator.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/BaseTableIterator.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/ConstrainedFactTableIterator.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/Table.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TableIterator.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TableRecord.java Log: JBRULES-225 for leaps based algorithm Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -8,7 +8,7 @@ public class QueryResult { - private Tuple tuple; + protected Tuple tuple; private WorkingMemory workingMemory; private QueryResults queryResults; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,8 +15,8 @@ private Map declarations; - private List results; - private WorkingMemory workingMemory; + protected List results; + protected WorkingMemory workingMemory; public QueryResults(List results, Query query, Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Builder.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Builder.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Builder.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.util.ArrayList; import java.util.Iterator; import java.util.List; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ColumnConstraints.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ColumnConstraints.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ColumnConstraints.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.util.List; import org.drools.FactHandle; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ConflictResolver.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ConflictResolver.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ConflictResolver.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,9 +15,6 @@ * limitations under the License. */ - - - import java.util.Comparator; /** Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactHandleImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactHandleImpl.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactHandleImpl.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactHandleTupleAssembly.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactHandleTupleAssembly.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactHandleTupleAssembly.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - /** * To store all references needed to retract a fact * Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactTable.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactTable.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FactTable.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -110,12 +106,13 @@ // let's only add facts below waterline - added before rule is added // rest would be added to stack automatically - Handle factHandle = new FactHandleImpl( workingMemory.getIdLastFireAllAt(), + Handle startFactHandle = new FactHandleImpl( workingMemory.getIdLastFireAllAt(), null ); - for ( Iterator it = this.tailIterator( factHandle, - factHandle ); it.hasNext(); ) { - workingMemory.pushTokenOnStack( new Token( workingMemory, - (FactHandleImpl) it.next(), + for ( Iterator it = this.tailIterator( startFactHandle, + startFactHandle ); it.hasNext(); ) { + FactHandleImpl handle = (FactHandleImpl) it.next(); + workingMemory.pushTokenOnStack( handle, new Token( workingMemory, + handle, context ) ); } } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Handle.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Handle.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Handle.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.io.Serializable; import org.drools.FactHandle; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/HandleFactory.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/HandleFactory.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/HandleFactory.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import org.drools.FactHandle; import org.drools.spi.FactHandleFactory; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsAgenda.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsAgenda.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsAgenda.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -1,4 +1,5 @@ package org.drools.leaps; + /* * Copyright 2005 JBoss Inc * @@ -15,16 +16,13 @@ * limitations under the License. */ - - - - import org.drools.common.Agenda; import org.drools.rule.Query; import org.drools.spi.Activation; import org.drools.spi.ConsequenceException; /** + * * @author Alexander Bagerman * */ Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsQueryResult.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsQueryResult.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsQueryResult.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -0,0 +1,54 @@ +package org.drools.leaps; +/* + * Copyright 2005 JBoss Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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. + */ + +import org.drools.FactHandle; +import org.drools.QueryResult; +import org.drools.QueryResults; +import org.drools.WorkingMemory; +import org.drools.spi.Tuple; + +/** + * + * @author Alexander Bagerman + * + */ + +public class LeapsQueryResult extends QueryResult { + public LeapsQueryResult(Tuple tuple, WorkingMemory workingMemory, + QueryResults queryResults) { + super( tuple, workingMemory, queryResults ); + } + + public Object get( int i ) { + // adjust for the DroolsQuery object + return super.get(i - 1); + } + + public FactHandle[] getFactHandles() { + // Strip the DroolsQuery fact + FactHandle[] src = super.tuple.getFactHandles( ); + FactHandle[] dst = new FactHandle[src.length - 1]; + System.arraycopy( src, 0, dst, 0, dst.length ); + return dst; + } + + public int size() { + // Adjust for the DroolsQuery object + return super.size() + 1; + } + +} Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsQueryResults.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsQueryResults.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsQueryResults.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -0,0 +1,72 @@ +package org.drools.leaps; +/* + * Copyright 2005 JBoss Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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. + */ + +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +import org.drools.QueryResult; +import org.drools.QueryResults; +import org.drools.WorkingMemory; +import org.drools.rule.Query; +import org.drools.spi.Tuple; + +/** + * + * @author Alexander Bagerman + * + */ + +public class LeapsQueryResults extends QueryResults { + + public LeapsQueryResults(List results, Query query, WorkingMemory workingMemory) { + super( results, query, workingMemory ); + } + + public QueryResult get( int i ) { + if (i > this.results.size( )) { + throw new NoSuchElementException( ); + } + return new LeapsQueryResult( (Tuple) this.results.get( i ), workingMemory, this ); + } + + public Iterator iterator() { + return new QueryResultsIterator( this.results.iterator() ); + } + + class QueryResultsIterator implements Iterator { + private Iterator iterator; + + public QueryResultsIterator(Iterator iterator) { + this.iterator = iterator; + } + + public boolean hasNext() { + return this.iterator.hasNext( ); + } + + public Object next() { + return new LeapsQueryResult( (Tuple) this.iterator.next( ), + LeapsQueryResults.this.workingMemory, LeapsQueryResults.this ); + } + + public void remove() { + this.iterator.remove( ); + } + + } +} Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsRule.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsRule.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsRule.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.util.ArrayList; import org.drools.common.AgendaGroupImpl; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsTuple.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsTuple.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsTuple.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -1,4 +1,5 @@ package org.drools.leaps; + /* * Copyright 2005 JBoss Inc * @@ -15,10 +16,6 @@ * limitations under the License. */ - - - - import java.io.Serializable; import java.util.HashSet; import java.util.Iterator; @@ -222,6 +219,9 @@ this.blockingNotFactHandles[index] = factHandle; } + boolean isBlockingNotFactHandle(int index ) { + return this.blockingNotFactHandles[index] != null; + } void removeBlockingNotFactHandle(int index) { this.blockingNotFactHandles[index] = null; this.setReadyForActivation(); @@ -233,6 +233,10 @@ this.setReadyForActivation(); } + boolean isExistsFactHandle(int index) { + return this.existsFactHandles[index] != null; + } + void removeExistsFactHandle(int index) { this.existsFactHandles[index] = null; this.setReadyForActivation(); Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/NoMatchesFoundException.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/NoMatchesFoundException.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/NoMatchesFoundException.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,17 +15,12 @@ * limitations under the License. */ - - - - /** * Exception to facilitate <code>seek</code> process in working memory * * @author Alexander Bagerman * */ - class NoMatchesFoundException extends Exception { /** Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleBaseImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleBaseImpl.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleBaseImpl.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.io.IOException; import java.io.ObjectInputStream; import java.util.HashMap; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleHandle.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleHandle.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleHandle.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - /** * class container for rules used in the system. Handle is created for each * leaps rule, dominant position (column/ce position), dominant position type Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleTable.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleTable.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/RuleTable.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.util.Comparator; import org.drools.leaps.util.Table; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Token.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Token.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Token.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -1,4 +1,5 @@ package org.drools.leaps; + /* * Copyright 2005 JBoss Inc * @@ -15,10 +16,6 @@ * limitations under the License. */ - - - - import java.io.Serializable; import java.util.Iterator; @@ -37,7 +34,7 @@ * @author Alexander Bagerman * */ -class Token +public class Token implements Tuple, Serializable { @@ -61,19 +58,20 @@ /** * */ - public Token(WorkingMemoryImpl workingMemory, - FactHandleImpl factHandle, - PropagationContextImpl propagationContext) { + public Token(WorkingMemoryImpl workingMemory, FactHandleImpl factHandle, + PropagationContextImpl propagationContext) { this.workingMemory = workingMemory; this.dominantFactHandle = factHandle; this.propagationContext = propagationContext; } private Iterator rulesIterator() { - if ( this.rules == null ) { - if ( this.dominantFactHandle != null ) { - this.rules = this.workingMemory.getFactTable( this.dominantFactHandle.getObject().getClass() ).getRulesIterator(); - } else { + if (this.rules == null) { + if (this.dominantFactHandle != null) { + this.rules = this.workingMemory.getFactTable( + this.dominantFactHandle.getObject().getClass()).getRulesIterator(); + } + else { this.rules = this.workingMemory.getNoRequiredColumnsLeapsRules(); } } @@ -94,44 +92,49 @@ public boolean hasNextRuleHandle() { boolean ret = false; - if ( this.rulesIterator() != null ) { + if (this.rulesIterator() != null) { // 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 == null || this.dominantFactHandle.getId() >= levelId ) { + if (this.dominantFactHandle == null + || this.dominantFactHandle.getId() >= levelId) { ret = this.rules.hasNext(); - } else { + } + else { // then we need to skip rules that have id lower than // workingMemory.idLastFireAllAt boolean done = false; - while ( !done ) { - if ( this.rules.hasNext() ) { - if ( ((RuleHandle) ((TableIterator) this.rules).peekNext()).getId() > levelId ) { + while (!done) { + if (this.rules.hasNext()) { + if (((RuleHandle) ((TableIterator) this.rules).peekNext()).getId() > levelId) { ret = true; done = true; - } else { + } + else { this.rules.next(); } - } else { + } + else { ret = false; done = true; } } } } + return ret; } public int hashCode() { - if ( this.dominantFactHandle != null ) { + if (this.dominantFactHandle != null) { return this.dominantFactHandle.hashCode(); - } else { + } + else { return 0; } } - public void set(int idx, - FactHandleImpl factHandle) { + public void set(int idx, FactHandleImpl factHandle) { this.currentFactHandles[idx] = factHandle; } @@ -214,9 +217,8 @@ * @return LeapsTuple */ LeapsTuple getTuple() { - return new LeapsTuple( this.currentFactHandles, - this.currentRuleHandle.getLeapsRule(), - this.propagationContext ); + return new LeapsTuple(this.currentFactHandles, this.currentRuleHandle + .getLeapsRule(), this.propagationContext); } /** Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/TokenEvaluator.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/TokenEvaluator.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/TokenEvaluator.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import org.drools.leaps.util.Table; import org.drools.leaps.util.TableIterator; import org.drools.rule.EvalCondition; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -1,4 +1,5 @@ package org.drools.leaps; + /* * Copyright 2005 JBoss Inc * @@ -15,10 +16,6 @@ * limitations under the License. */ - - - - import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Enumeration; @@ -28,7 +25,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Stack; import org.drools.FactException; import org.drools.FactHandle; @@ -43,6 +39,7 @@ import org.drools.common.ScheduledAgendaItem; import org.drools.leaps.conflict.DefaultConflictResolver; import org.drools.leaps.util.TableIterator; +import org.drools.leaps.util.TokenStack; import org.drools.rule.Query; import org.drools.rule.Rule; import org.drools.spi.Activation; @@ -295,40 +292,42 @@ ColumnConstraints[] not = tuple.getLeapsRule().getNotColumnConstraints(); for ( int i = 0, length = not.length; i < length; i++ ) { ColumnConstraints constraint = not[i]; - if ( constraint.isAllowed( handle, - tuple, - this ) ) { - tuple.setBlockingNotFactHandle( handle, - i ); - handle.addNotTuple( tuple, - i ); + if (!tuple.isBlockingNotFactHandle(i) + && constraint.getClassType().isAssignableFrom( objectClass ) + && constraint.isAllowed(handle, tuple, this)) { + tuple.setBlockingNotFactHandle(handle, i); + handle.addNotTuple(tuple, i); } } // check and see if we need de-activate if ( !tuple.isReadyForActivation() ) { - // time to pull from agenda - this.invalidateActivation( tuple ); + if ( tuple.getLeapsRule().getRule() instanceof Query ) { + // put query results to the working memory location + removeFromQueryResults( tuple.getLeapsRule().getRule().getName(), + tuple ); + } else { + // time to pull from agenda + invalidateActivation( tuple ); + } } - } else { + } + else { // check exists constraints and activate constraints - ColumnConstraints[] exists = tuple.getLeapsRule().getExistsColumnConstraints(); - for ( int i = 0, length = exists.length; i < length; i++ ) { + ColumnConstraints[] exists = tuple.getLeapsRule() + .getExistsColumnConstraints(); + for (int i = 0, length = exists.length; i < length; i++) { ColumnConstraints constraint = exists[i]; - if ( constraint.getClassType().isAssignableFrom( objectClass ) ) { - if ( constraint.isAllowed( handle, - tuple, - this ) ) { - tuple.setExistsFactHandle( handle, - i ); - handle.addExistsTuple( tuple, - i ); - } + if (!tuple.isExistsFactHandle(i) + && constraint.getClassType().isAssignableFrom(objectClass) + && constraint.isAllowed(handle, tuple, this)) { + tuple.setExistsFactHandle(handle, i); + handle.addExistsTuple(tuple, i); } } // check and see if we need activate - if ( tuple.isReadyForActivation() ) { + if (tuple.isReadyForActivation()) { // ready to activate - this.assertTuple( tuple ); + this.assertTuple(tuple); } } } @@ -340,7 +339,7 @@ rule, activation ); - this.pushTokenOnStack( new Token( this, + this.pushTokenOnStack( handle, new Token( this, handle, context ) ); @@ -399,7 +398,15 @@ // 0. remove activated tuples Iterator tuples = ((FactHandleImpl) handle).getActivatedTuples(); for ( ; tuples != null && tuples.hasNext(); ) { - this.invalidateActivation( (LeapsTuple) tuples.next() ); + LeapsTuple tuple = (LeapsTuple) tuples.next(); + if ( tuple.getLeapsRule().getRule() instanceof Query ) { + // put query results to the working memory location + removeFromQueryResults( tuple.getLeapsRule().getRule().getName(), + tuple ); + } else { + // time to pull from agenda + invalidateActivation( tuple ); + } } // 1. remove fact for nots and exists tuples @@ -411,12 +418,10 @@ for ( ; it.hasNext(); ) { assembly = (FactHandleTupleAssembly) it.next(); tuple = assembly.getTuple(); - tuple.removeBlockingNotFactHandle( assembly.getIndex() ); - TokenEvaluator.evaluateNotCondition( new FactHandleImpl( ((FactHandleImpl) handle).getId() + 1, - null ), - assembly.getIndex(), - tuple, - this ); + tuple.removeBlockingNotFactHandle(assembly.getIndex()); + TokenEvaluator.evaluateNotCondition(new FactHandleImpl( + ((FactHandleImpl) handle).getId() + 1, null), assembly.getIndex(), + tuple, this); } } it = ((FactHandleImpl) handle).getExistsTupleAssemblies(); @@ -424,12 +429,10 @@ for ( ; it.hasNext(); ) { assembly = (FactHandleTupleAssembly) it.next(); tuple = assembly.getTuple(); - tuple.removeExistsFactHandle( assembly.getIndex() ); - TokenEvaluator.evaluateExistsCondition( new FactHandleImpl( ((FactHandleImpl) handle).getId() + 1, - null ), - assembly.getIndex(), - tuple, - this ); + tuple.removeExistsFactHandle(assembly.getIndex()); + TokenEvaluator.evaluateExistsCondition(new FactHandleImpl( + ((FactHandleImpl) handle).getId() + 1, null), assembly.getIndex(), + tuple, this); } } // 2. assert all tuples that are ready for activation or cancel ones @@ -449,15 +452,19 @@ // ready to activate this.assertTuple( tuple ); } else { - // time to pull from agenda - this.invalidateActivation( tuple ); + if ( tuple.getLeapsRule().getRule() instanceof Query ) { + // put query results to the working memory location + removeFromQueryResults( tuple.getLeapsRule().getRule().getName(), + tuple ); + } else { + // time to pull from agenda + invalidateActivation( tuple ); + } } } // remove it from stack - this.stack.remove( new Token( this, - (FactHandleImpl) handle, - null ) ); + this.removeTokenFromStack( (FactHandleImpl) handle ); // // end leaps specific actions @@ -547,7 +554,8 @@ /** * algorithm stack. */ - private Stack stack = new Stack(); + private TokenStack mainStack = new TokenStack(); +// private Stack stack = new Stack(); /** * to store facts to cursor over it @@ -581,13 +589,31 @@ /** * adds new leaps token on main stack * + * @param fact handle * @param token */ - protected void pushTokenOnStack(Token token) { - this.stack.push( token ); + protected void pushTokenOnStack(FactHandleImpl factHandle, Token token) { + this.mainStack.push( token ); } /** + * removes leaps token on main stack + * + * @param fact handle + */ + protected void removeTokenFromStack(FactHandleImpl factHandle) { + this.mainStack.remove( factHandle.getId() ); + } + + /** + * gets leaps token from top of stack + * + * @param fact handle + */ + protected Token peekTokenOnTop(){ + return (Token)this.mainStack.peek(); + } + /** * get leaps fact table of specific type (class) * * @param type @@ -705,8 +731,8 @@ try { this.firing = true; // normal rules with required columns - while ( !this.stack.isEmpty() ) { - Token token = (Token) this.stack.peek(); + while ( !this.mainStack.empty() ) { + Token token = (Token) this.peekTokenOnTop(); boolean done = false; while ( !done ) { if ( !token.isResume() ) { @@ -717,7 +743,7 @@ // asserted // and placed on hte top of the stack during // firing - this.stack.remove( token ); + this.removeTokenFromStack( token.getDominantFactHandle() ); done = true; } } @@ -778,9 +804,9 @@ ret = ret + ((FactTable) this.factTables.get( key )).toString(); } ret = ret + "\n" + "Stack:"; - for ( Iterator it = this.stack.iterator(); it.hasNext(); ) { - ret = ret + "\n" + "\t" + it.next(); - } +// for ( Iterator it = this.mainStack.entrySet().iterator(); it.hasNext(); ) { +// ret = ret + "\n" + "\t" + it.next(); +// } return ret; } @@ -871,29 +897,43 @@ public void dispose() { ((RuleBaseImpl) this.ruleBase).disposeWorkingMemory( this ); } + + public QueryResults getQueryResults(String queryName) { + IdentityMap map = ( IdentityMap ) this.queryResults.get( queryName ); + if ( map == null ) { + return null; + } - public QueryResults getQueryResults(String query) { - List list = ( List ) this.queryResults.remove( query ); - if ( list == null ) { + LinkedList list = new LinkedList(); + for(Iterator it = map.keySet().iterator(); it.hasNext();) { + list.add(it.next()); + } + if(!list.isEmpty()) { + Query queryRule = (Query)((LeapsTuple) list.get(0)).getLeapsRule().getRule(); + return new LeapsQueryResults( list, queryRule, this ); + } + else { return null; } - // @todo we need to pass the Query itself - return new QueryResults( list, - ( Query ) null, - this); + // } - void addToQueryResults(String query, - Tuple tuple) { - LinkedList list = (LinkedList) this.queryResults.get( query ); - if ( list == null ) { - list = new LinkedList(); - this.queryResults.put( query, - list ); + void addToQueryResults(String query, Tuple tuple) { + IdentityMap map = (IdentityMap) this.queryResults.get( query ); + if (map == null) { + map = new IdentityMap( ); + this.queryResults.put( query, map ); } - list.add( tuple ); + map.put( tuple, tuple ); } + + void removeFromQueryResults(String query, Tuple tuple) { + IdentityMap map = (IdentityMap) this.queryResults.get( query ); + if (map != null) { + map.remove(tuple); + } + } protected TableIterator getNoRequiredColumnsLeapsRules() { return noRequiredColumnsLeapsRules.iterator(); Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/BaseTableIterator.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/BaseTableIterator.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/BaseTableIterator.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,12 +15,8 @@ * limitations under the License. */ - - import java.util.NoSuchElementException; - - /** * Leaps specific iterator for leaps tables. relies on leaps table double link * list structure for navigation Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/ConstrainedFactTableIterator.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/ConstrainedFactTableIterator.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/ConstrainedFactTableIterator.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.util.NoSuchElementException; import org.drools.FactHandle; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/Table.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/Table.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/Table.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -1,4 +1,5 @@ package org.drools.leaps.util; + /* * Copyright 2005 JBoss Inc * @@ -15,13 +16,10 @@ * limitations under the License. */ - - - - import java.io.Serializable; import java.util.Comparator; import java.util.Iterator; +import java.util.NoSuchElementException; import java.util.SortedMap; import java.util.TreeMap; @@ -70,7 +68,13 @@ this.empty = false; } else { SortedMap bufMap = this.map.headMap( object ); - if ( !bufMap.isEmpty() ) { + try { + // check on first key should work faster than check on empty + // but logically we check on empty + // if map empty it will throw exception + bufMap.firstKey(); + +// if ( !bufMap.isEmpty() ) { TableRecord bufRec = (TableRecord) this.map.get( bufMap.lastKey() ); if ( bufRec.right != null ) { bufRec.right.left = newRecord; @@ -79,7 +83,9 @@ bufRec.right = newRecord; newRecord.left = bufRec; - } else { + } //else { + catch (NoSuchElementException nsee) { + // means map is empty this.headRecord.left = newRecord; newRecord.right = this.headRecord; this.headRecord = newRecord; @@ -132,6 +138,8 @@ record.left.right = record.right; record.right.left = record.left; } + record.left = null; + record.right = null; } this.count--; // @@ -229,12 +237,16 @@ TableRecord lastRecord = this.tailRecord; if ( !this.empty ) { // validate - // if (!this.map.isEmpty()) { // validate if ( this.map.comparator().compare( objectAtStart, this.tailRecord.object ) <= 0 ) { // let's check if we need iterator over the whole table SortedMap bufMap = this.map.tailMap( objectAtStart ); - if ( !bufMap.isEmpty() ) { + try { + // check on first key should work faster than check on empty + // but logically we check on empty + // if map empty it will throw exception + bufMap.firstKey(); +// if ( !bufMap.isEmpty() ) { startRecord = (TableRecord) bufMap.get( bufMap.firstKey() ); if ( this.map.comparator().compare( objectAtStart, objectAtPosition ) == 0 ) { @@ -243,9 +255,15 @@ // rewind to position bufMap = bufMap.tailMap( objectAtPosition ); - if ( !bufMap.isEmpty() ) { + try { + // check on first key should work faster than check on empty + // but logically we check on empty + // if map empty it will throw exception + bufMap.firstKey(); +// if ( !bufMap.isEmpty() ) { currentRecord = ((TableRecord) bufMap.get( bufMap.firstKey() )); - } else { + } // else { + catch (NoSuchElementException nsee) { currentRecord = startRecord; } } @@ -253,6 +271,8 @@ ret.current = currentRecord; ret.last = lastRecord; } + catch (NoSuchElementException nsee) {} + } } @@ -279,7 +299,12 @@ objectAtEnd ) <= 0 ) { // let's check if we need iterator over the whole table SortedMap bufMap = this.map.headMap( objectAtEnd ); - if ( !bufMap.isEmpty() ) { + try { + // check on first key should work faster than check on empty + // but logically we check on empty + // if map empty it will throw exception + bufMap.firstKey(); +// if ( !bufMap.isEmpty() ) { lastRecord = (TableRecord) bufMap.get( bufMap.lastKey() ); // check if the next one is what we need if ( lastRecord.right != null && this.map.comparator().compare( lastRecord.right.object, @@ -289,7 +314,8 @@ iterator = new BaseTableIterator( startRecord, currentRecord, lastRecord ); - } else { + } //else { + catch (NoSuchElementException nsee) { // empty iterator iterator = new BaseTableIterator( null, null, Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TableIterator.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TableIterator.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TableIterator.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,10 +15,6 @@ * limitations under the License. */ - - - - import java.util.Iterator; /** Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TableRecord.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TableRecord.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TableRecord.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -15,12 +15,8 @@ * limitations under the License. */ - - import java.io.Serializable; - - /** * * @author Alexander Bagerman Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TokenStack.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TokenStack.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/util/TokenStack.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -0,0 +1,110 @@ +package org.drools.leaps.util; + +/* + * Copyright 2005 JBoss Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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. + */ + +import java.util.EmptyStackException; + +import org.drools.leaps.Token; +import org.drools.util.PrimitiveLongMap; + +/** + * This class follows java.util.Stack interface but accounts + * for remove( object ) functionallity needed by leaps + * + * @author Alexander Bagerman + * + */ + +public class TokenStack { + + protected TableRecord tailRecord = null; + + private PrimitiveLongMap map = new PrimitiveLongMap(); + + public TokenStack() { + + } + + public boolean empty() { + return this.tailRecord == null; + } + + public Object peek() { + if(this.tailRecord != null){ + return this.tailRecord.object; + } + else { + throw new EmptyStackException(); + } + } + + public Object pop() { + if(this.tailRecord != null){ + Object ret = this.tailRecord.object; + TableRecord buf = this.tailRecord; + this.tailRecord = buf.left; + if (buf.left != null) { + this.tailRecord.right = null; + } + buf.left = null; + + map.remove(((Token) ret).getDominantFactHandle().getId()); + return ret; + } + else { + throw new EmptyStackException(); + } + } + + + /** + * Removes object from the table + * + * @param object + * to remove from the table + */ + public void remove(long factId) { + if (this.tailRecord != null) { + TableRecord record = (TableRecord) this.map.remove(factId); + + if (record != null) { + if (record == this.tailRecord) { + this.tailRecord = record.left; + } + if (record.left != null) { + record.left.right = record.right; + } + if (record.right != null) { + record.right.left = record.left; + } + record.left = null; + record.right = null; + } + } + } + public Object push(Object item) { + TableRecord record = new TableRecord(item); + if (this.tailRecord != null) { + this.tailRecord.right = record; + record.left = this.tailRecord; + } + this.tailRecord = record; + + this.map.put(((Token)item).getDominantFactHandle().getId(), record); + return item; + } +} Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryResultsTest.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryResultsTest.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryResultsTest.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -0,0 +1,183 @@ +package org.drools.leaps; + +/* + * Copyright 2005 JBoss Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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. + */ + +import java.util.Iterator; + +import junit.framework.TestCase; + +import org.drools.FactHandle; +import org.drools.PackageIntegrationException; +import org.drools.WorkingMemory; +import org.drools.base.ClassFieldExtractor; +import org.drools.base.ClassObjectType; +import org.drools.base.EvaluatorFactory; +import org.drools.rule.Column; +import org.drools.rule.LiteralConstraint; +import org.drools.rule.Query; +import org.drools.spi.Evaluator; +import org.drools.spi.FieldConstraint; +import org.drools.spi.FieldExtractor; +import org.drools.spi.FieldValue; +import org.drools.spi.MockField; + +/** + * + * @author Alexander Bagerman + * + */ +public class QueryResultsTest extends TestCase { + public void testQueryTerminalNode() throws PackageIntegrationException { + RuleBaseImpl ruleBase = new RuleBaseImpl( ); + + ClassObjectType cheeseObjectType = new ClassObjectType( Cheese.class ); + Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.STRING_TYPE, + Evaluator.EQUAL ); + // fires on context.state == integer(1) + Query query = new Query( "query-1" ); + + Column cheeseColumn = new Column( 0, cheeseObjectType, "cheese" ); + cheeseColumn.addConstraint( getLiteralConstraint( cheeseColumn, "type", "stilton", + evaluator ) ); + query.addPattern( cheeseColumn ); + + ruleBase.addRule( query ); + + WorkingMemory workingMemory = ruleBase.newWorkingMemory( ); + + workingMemory.fireAllRules( ); + + LeapsQueryResults results = (LeapsQueryResults) workingMemory + .getQueryResults( "query-1" ); + + assertNull( results ); + + Cheese stilton1 = new Cheese( "stilton", 100 ); + + FactHandle handle1 = workingMemory.assertObject( stilton1 ); + + workingMemory.fireAllRules( ); + + results = (LeapsQueryResults) workingMemory.getQueryResults( "query-1" ); + + assertEquals( 1, results.size( ) ); + + Cheese cheddar = new Cheese( "cheddar", 55 ); + workingMemory.assertObject( cheddar ); + + workingMemory.fireAllRules( ); + + results = (LeapsQueryResults) workingMemory.getQueryResults( "query-1" ); + + assertEquals( 1, results.size( ) ); + + Cheese stilton2 = new Cheese( "stilton", 5 ); + + FactHandle handle2 = workingMemory.assertObject( stilton2 ); + + workingMemory.fireAllRules( ); + + results = (LeapsQueryResults) workingMemory.getQueryResults( "query-1" ); + + assertEquals( 2, results.size( ) ); + + LeapsQueryResult result = (LeapsQueryResult) results.get( 0 ); + + assertEquals( 1, result.size( ) ); + + boolean wasStilton1 = ( stilton1 == result.get( 0 ) ); + + // assertSame( stilton1, result.get( 0 ) ); + + result = (LeapsQueryResult) results.get( 1 ); + + boolean wasStilton2 = ( stilton2 == result.get( 0 ) ); + + assertEquals( 1, result.size( ) ); + + // assertSame( stilton2, result.get( 0 ) ); + assertTrue( ( wasStilton1 && wasStilton2 ) || ( !wasStilton1 && !wasStilton2 ) ); + Object result1 = null, result2 = null; + int i = 0; + for (Iterator it = results.iterator( ); it.hasNext( );) { + result = (LeapsQueryResult) it.next( ); + assertEquals( 1, result.size( ) ); + if (i == 0) { + result1 = result.get( 0 ); + } + else { + result2 = result.get( 0 ); + } + i++; + } + wasStilton1 = ( stilton1 == result1 ); + wasStilton2 = ( stilton2 == result2 ); + assertTrue( ( wasStilton1 && wasStilton2 ) || ( !wasStilton1 && !wasStilton2 ) ); + + workingMemory.retractObject( handle1 ); + + workingMemory.fireAllRules( ); + + results = (LeapsQueryResults) workingMemory.getQueryResults( "query-1" ); + + assertEquals( 1, results.size( ) ); + + workingMemory.retractObject( handle2 ); + + workingMemory.fireAllRules( ); + + results = (LeapsQueryResults) workingMemory.getQueryResults( "query-1" ); + + assertNull( results ); + } + + public class Cheese { + private String type; + + private int price; + + public Cheese(String type, int price) { + super( ); + this.type = type; + this.price = price; + } + + public int getPrice() { + return price; + } + + public String getType() { + return type; + } + + public String toString() { + return "[Cheese type='" + this.type + "' price='" + this.price + "']"; + } + + } + + private FieldConstraint getLiteralConstraint( Column column, String fieldName, + Object fieldValue, Evaluator evaluator ) { + Class clazz = ( (ClassObjectType) column.getObjectType( ) ).getClassType( ); + + FieldExtractor extractor = new ClassFieldExtractor( clazz, fieldName ); + + FieldValue field = new MockField( fieldValue ); + + return new LiteralConstraint( field, extractor, evaluator ); + } +} Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/util/TokenStackTest.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/util/TokenStackTest.java 2006-04-23 14:18:59 UTC (rev 3925) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/util/TokenStackTest.java 2006-04-23 16:25:31 UTC (rev 3926) @@ -0,0 +1,180 @@ +package org.drools.leaps.util; + +import junit.framework.TestCase; +import org.drools.leaps.*; +public class TokenStackTest extends TestCase { + + /* + * Test method for 'org.drools.leaps.util.TokenStack.empty()' + */ + public void testEmpty() { + TokenStack stack = new TokenStack(); + assertTrue(stack.empty()); + Token token = new Token(null, new FactHandleImpl(3, null), null); + stack.push(token); + assertFalse(stack.empty()); + } + + /* + * Test method for 'org.drools.leaps.util.TokenStack.peek()' + */ + public void testPeek() { + TokenStack stack = new TokenStack(); + assertTrue(stack.empty()); + Token token1 = new Token(null, new FactHandleImpl(1, null), null); + stack.push(token1); + Token token2 = new Token(null, new FactHandleImpl(2, null), null); + stack.push(token2); + Token token10 = new Token(null, new FactHandleImpl(10, null), null); + stack.push(token10); + Token token8 = new Token(null, new FactHandleImpl(8, null), null); + stack.push(token8); + Token token6 = new Token(null, new FactHandleImpl(6, null), null); + stack.push(token6); + Token token3 = new Token(null, new FactHandleImpl(3, null), null); + stack.push(token3); + Token token4 = new Token(null, new FactHandleImpl(4, null), null); + stack.push(token4); + + assertEquals(token4, stack.peek()); + stack.pop(); + assertEquals(token3, stack.peek()); + } + + /* + * Test method for 'org.drools.leaps.util.TokenStack.pop()' + */ + public void testPop() { + TokenStack stack = new TokenStack(); + assertTrue(stack.empty()); + Token token1 = new Token(null, new FactHandleImpl(1, null), null); + stack.push(token1); + Token token2 = new Token(null, new FactHandleImpl(2, null), null); + stack.push(token2); + Token token10 = new Token(null, new FactHandleImpl(10, null), null); + stack.push(token10); + Token token8 = new Token(null, new FactHandleImpl(8, null), null); + stack.push(token8); + Token token6 = new Token(null, new FactHandleImpl(6, null), null); + stack.push(token6); + Token token3 = new Token(null, new FactHandleImpl(3, null), null); + stack.push(token3); + Token token4 = new Token(null, new FactHandleImpl(4, null), null); + stack.push(token4); + + assertEquals(token4, stack.peek()); + stack.pop(); + assertEquals(token3, stack.peek()); + stack.pop(); + stack.pop(); + stack.pop(); + stack.pop(); + stack.pop(); + assertEquals(token1, stack.peek()); + stack.pop(); + + assertTrue(stack.empty()); + } + + /* + * Test method for 'org.drools.leaps.util.TokenStack.remove(long)' + */ + public void testRemoveBottom() { + TokenStack stack = new TokenStack(); + assertTrue(stack.empty()); + Token token1 = new Token(null, new FactHandleImpl(1, null), null); + stack.push(token1); + Token token2 = new Token(null, new FactHandleImpl(2, null), null); + stack.push(token2); + Token token10 = new Token(null, new FactHandleImpl(10, null), null); + stack.push(token10); + Token token8 = new Token(null, new FactHandleImpl(8, null), null); + stack.push(token8); + Token token6 = new Token(null, new FactHandleImpl(6, null), null); + stack.push(token6); + Token token3 = new Token(null, new FactHandleImpl(3, null), null); + stack.push(token3); + Token token4 = new Token(null, new FactHandleImpl(4, null), null); + stack.push(token4); + + stack.remove(1); + assertEquals(token4, stack.peek()); + stack.pop(); + assertEquals(token3, stack.peek()); + stack.pop(); + stack.pop(); + stack.pop(); + stack.pop(); + stack.pop(); + + assertTrue(stack.empty()); + } + + + /* + * Test method for 'org.drools.leaps.util.TokenStack.remove(long)' + */ + public void testRemoveTop() { +... [truncated message content] |