From: <jbo...@li...> - 2006-04-20 01:25:15
|
Author: mar...@jb... Date: 2006-04-19 21:25:02 -0400 (Wed, 19 Apr 2006) New Revision: 3817 Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SynchronizedWorkingMemory.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/WorkingMemoryImpl.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java Log: JBRULES-225 QueryResults for handling the results of querries Added: 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-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -0,0 +1,45 @@ +package org.drools; + +import java.util.Map; + +import org.drools.rule.Declaration; +import org.drools.spi.Tuple; + +public class QueryResult { + + private Tuple tuple; + private WorkingMemory workingMemory; + private QueryResults queryResults; + + public QueryResult( Tuple tuple, + WorkingMemory workingMemory, + QueryResults queryResults) { + this.tuple = tuple; + this.workingMemory = workingMemory; + this.queryResults = queryResults; + } + + public Map getDeclarations() { + return this.queryResults.getDeclarations(); + } + + public Object get(int i) { + return this.workingMemory.getObject( tuple.get( i ) ); + } + + public Object get(String declaration) { + return get( ( Declaration ) this.queryResults.getDeclarations().get( declaration ) ); + } + + public Object get(Declaration declaration) { + return declaration.getValue( this.workingMemory.getObject( this.tuple.get( declaration ) ) ); + } + + public FactHandle[] getFactHandles() { + return this.tuple.getFactHandles(); + } + + public int size() { + return tuple.getFactHandles().length; + } +} Added: 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-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResults.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -0,0 +1,79 @@ +package org.drools; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; + +import org.drools.rule.Declaration; +import org.drools.rule.Query; +import org.drools.spi.Tuple; + +public class QueryResults { + private Query query; + + private Map declarations; + + private List results; + private WorkingMemory workingMemory; + + public QueryResults(List results, + Query query, + WorkingMemory workingMemory) { + this.results = results; + this.query = query; + this.workingMemory = workingMemory; + } + + public QueryResult get(int i) { + if ( i > this.results.size() ) { + throw new NoSuchElementException(); + } + return new QueryResult( (Tuple) this.results.get( i ), + workingMemory, + this ); + } + + public Iterator iterator() { + return new QueryResultsIterator( this.results.iterator() ); + } + + public Map getDeclarations() { + + Declaration[] declarations = this.query.getDeclarations(); + Map map = new HashMap( declarations.length ); + for ( int i = 0, length = declarations.length; i < length; i++ ) { + map.put( declarations[i].getIdentifier(), + declarations ); + } + this.declarations = map; + + return this.declarations; + } + + public int size() { + return this.results.size(); + } + + 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 QueryResult( ( Tuple ) this.iterator.next(), QueryResults.this.workingMemory, QueryResults.this ); + } + + public void remove() { + this.iterator.remove(); + } + + } +} Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SynchronizedWorkingMemory.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SynchronizedWorkingMemory.java 2006-04-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/SynchronizedWorkingMemory.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -152,7 +152,7 @@ return this.workingMemory.getGlobals(); } - public List getQueryResults(String query) { + public QueryResults getQueryResults(String query) { return this.workingMemory.getQueryResults( query ); } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java 2006-04-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -219,7 +219,7 @@ */ FactHandle assertObject(Object object) throws FactException; - public List getQueryResults(String query); + public QueryResults getQueryResults(String query); /** * Assert a fact registering JavaBean <code>PropertyChangeListeners</code> Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java 2006-04-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -20,6 +20,7 @@ import org.drools.FactException; import org.drools.FactHandle; +import org.drools.QueryResults; import org.drools.WorkingMemory; import org.drools.common.InternalWorkingMemoryActions; import org.drools.rule.Declaration; @@ -121,7 +122,7 @@ return this.activation; } - public List getQueryResults(String query) { + public QueryResults getQueryResults(String query) { return this.workingMemory.getQueryResults( query ); } 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-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/WorkingMemoryImpl.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -32,6 +32,7 @@ import org.drools.FactException; import org.drools.FactHandle; +import org.drools.QueryResults; import org.drools.WorkingMemory; import org.drools.common.AbstractWorkingMemory; import org.drools.common.Agenda; @@ -42,6 +43,7 @@ import org.drools.common.ScheduledAgendaItem; import org.drools.leaps.conflict.DefaultConflictResolver; import org.drools.leaps.util.TableIterator; +import org.drools.rule.Query; import org.drools.rule.Rule; import org.drools.spi.Activation; import org.drools.spi.AgendaFilter; @@ -870,8 +872,16 @@ ((RuleBaseImpl) this.ruleBase).disposeWorkingMemory( this ); } - public List getQueryResults(String query) { - return (List) this.queryResults.remove( query ); + public QueryResults getQueryResults(String query) { + List list = ( List ) this.queryResults.remove( query ); + if ( list == null ) { + return null; + } + + // @todo we need to pass the Query itself + return new QueryResults( list, + ( Query ) null, + this); } void addToQueryResults(String query, Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/WorkingMemoryImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/WorkingMemoryImpl.java 2006-04-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/WorkingMemoryImpl.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -33,6 +33,7 @@ import org.drools.FactHandle; import org.drools.NoSuchFactHandleException; import org.drools.NoSuchFactObjectException; +import org.drools.QueryResults; import org.drools.RuleBase; import org.drools.WorkingMemory; import org.drools.base.DroolsQuery; @@ -45,6 +46,7 @@ import org.drools.event.AgendaEventSupport; import org.drools.event.WorkingMemoryEventListener; import org.drools.event.WorkingMemoryEventSupport; +import org.drools.rule.Query; import org.drools.rule.Rule; import org.drools.spi.Activation; import org.drools.spi.AgendaFilter; @@ -333,15 +335,21 @@ return matching; } - public List getQueryResults(String query) { + public QueryResults getQueryResults(String query) { FactHandle handle = assertObject( new DroolsQuery( query ) ); QueryTerminalNode node = (QueryTerminalNode) this.queryResults.remove( query ); - List list = null; - if ( node != null ) { - list = (List) this.nodeMemories.remove( node.getId() ); + if ( node == null ) { + retractObject( handle ); + return null; } + + List list = (List) this.nodeMemories.remove( node.getId() ); + retractObject( handle ); - return list; + if ( list == null ) { + list = Collections.EMPTY_LIST; + } + return new QueryResults( list, ( Query ) node.getRule(), this); } void setQueryResults(String query, Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java 2006-04-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -53,39 +53,41 @@ // } // } - if ( child instanceof GroupElement && ( child instanceof And || child instanceof Or ) ) { - GroupElement group = ( GroupElement ) child; - - // Removal single branch group elements - // If the child is a GroupElement iterate down until we either - // find a GroupElement that has more than one children, or its not a GroupElement - if ( group.getChildren().size() == 1 ) { - child = group.getChildren().get( 0 ); - } - } +// if ( child instanceof GroupElement && ( child instanceof And || child instanceof Or ) ) { +// GroupElement group = ( GroupElement ) child; +// +// // Removal single branch group elements +// // If the child is a GroupElement iterate down until we either +// // find a GroupElement that has more than one children, or its not a GroupElement +// if ( group.getChildren().size() == 1 ) { +// child = group.getChildren().get( 0 ); +// } +// } +// +// if ( child instanceof GroupElement && ( child instanceof And || child instanceof Or ) ) { +// GroupElement group = ( GroupElement ) child; +// +// // Remove nested Ands/Ors +// if ( group.getClass() == this.getClass() ) { +// +// GroupElement newGroup = null; +// if ( group instanceof And) { +// newGroup = new And(); +// } else { +// newGroup = new Or(); +// } +// +// for ( Iterator it = group.getChildren().iterator(); it.hasNext(); ) { +// this.children.add( it.next() ); +// } +// } else { +// this.children.add( child ); +// } +// } else { +// this.children.add( child ); +// } - if ( child instanceof GroupElement && ( child instanceof And || child instanceof Or ) ) { - GroupElement group = ( GroupElement ) child; - - // Remove nested Ands/Ors - if ( group.getClass() == this.getClass() ) { - - GroupElement newGroup = null; - if ( group instanceof And) { - newGroup = new And(); - } else { - newGroup = new Or(); - } - - for ( Iterator it = group.getChildren().iterator(); it.hasNext(); ) { - this.children.add( it.next() ); - } - } else { - this.children.add( child ); - } - } else { - this.children.add( child ); - } + this.children.add( child ); } public List getChildren() { Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java 2006-04-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -130,7 +130,15 @@ ands = new And[or.getChildren().size()]; int i = 0; for ( Iterator it = or.getChildren().iterator(); it.hasNext(); ) { - ands[i] = (And) it.next(); + Object object = it.next(); + if ( object.getClass() == And.class ) { + ands[i] = (And) object; + } else { + And newAnd = new And(); + newAnd.addChild( and ); + ands[i] = newAnd; + } + i++; } @@ -223,10 +231,6 @@ parent.getChildren().addAll( newChildren ); } - void checkForAndRemoveSingleBranch(GroupElement parent) { - - } - GroupElement applyOrTransformation(GroupElement parent, GroupElement child) throws InvalidPatternException { Transformation transformation = null; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java 2006-04-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -23,6 +23,7 @@ import org.drools.FactException; import org.drools.FactHandle; +import org.drools.QueryResults; import org.drools.WorkingMemory; import org.drools.rule.Declaration; import org.drools.rule.Rule; @@ -103,7 +104,7 @@ */ List getObjects(Class objectClass); - List getQueryResults(String query); + QueryResults getQueryResults(String query); /** * Clears the agenda causing all existing Activations to fire Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java 2006-04-20 01:12:46 UTC (rev 3816) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java 2006-04-20 01:25:02 UTC (rev 3817) @@ -17,11 +17,14 @@ +import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.drools.FactHandle; +import org.drools.QueryResult; +import org.drools.QueryResults; import org.drools.WorkingMemory; import org.drools.base.ClassFieldExtractor; import org.drools.base.ClassObjectType; @@ -98,48 +101,70 @@ queryNode.attach(); WorkingMemory workingMemory = ruleBase.newWorkingMemory(); - List list = workingMemory.getQueryResults( "query-1" ); + QueryResults results = workingMemory.getQueryResults( "query-1" ); - assertNull( list ); + assertNull( results ); - Cheese stilton = new Cheese( "stilton", + Cheese stilton1 = new Cheese( "stilton", 100 ); - FactHandle handle1 = workingMemory.assertObject( stilton ); + FactHandle handle1 = workingMemory.assertObject( stilton1 ); - list = workingMemory.getQueryResults( "query-1" ); + results = workingMemory.getQueryResults( "query-1" ); assertEquals( 1, - list.size() ); + results.size() ); Cheese cheddar = new Cheese( "cheddar", 55 ); workingMemory.assertObject( cheddar ); - list = workingMemory.getQueryResults( "query-1" ); + results = workingMemory.getQueryResults( "query-1" ); assertEquals( 1, - list.size() ); + results.size() ); - stilton = new Cheese( "stilton", + Cheese stilton2 = new Cheese( "stilton", 5 ); - FactHandle handle2 = workingMemory.assertObject( stilton ); + FactHandle handle2 = workingMemory.assertObject( stilton2 ); - list = workingMemory.getQueryResults( "query-1" ); + results = workingMemory.getQueryResults( "query-1" ); assertEquals( 2, - list.size() ); + results.size() ); + + QueryResult result = results.get( 0 ); + assertTrue( result.get( 0 ) instanceof DroolsQuery ); + assertSame( stilton1, result.get( 1 ) ); + result = results.get( 1 ); + assertTrue( result.get( 0 ) instanceof DroolsQuery ); + assertSame( stilton2, result.get( 1 ) ); + + int i = 0; + for ( Iterator it = results.iterator(); it.hasNext(); ) { + result = ( QueryResult ) it.next(); + assertTrue( result.get( 0 ) instanceof DroolsQuery ); + if ( i == 0 ) { + assertSame( stilton1, result.get( 1 ) ); + } else { + assertSame( stilton2, result.get( 1 ) ); + } + i++; + } + + workingMemory.retractObject( handle1 ); - list = workingMemory.getQueryResults( "query-1" ); + results = workingMemory.getQueryResults( "query-1" ); + assertEquals( 1, - list.size() ); + results.size() ); workingMemory.retractObject( handle2 ); - list = workingMemory.getQueryResults( "query-1" ); + results = workingMemory.getQueryResults( "query-1" ); - assertNull( list ); + assertNull( results ); } @@ -161,6 +186,10 @@ public String getType() { return type; } + + public String toString() { + return "[Cheese type='" + this.type + "' price='" + this.price + "']"; + } } } \ No newline at end of file |