[rules-users] does WorkingMemory.iterator support remove()?
Mark Proctor
mproctor at codehaus.org
Fri Oct 5 12:21:24 EDT 2007
Anstis, Michael (M.) wrote:
> Wouldn't the best approach be to get the FactHandles iterator and retact
> them from working memory rather than removing them through the iterator?
>
> Iterator itr = wm.iterateFactHandles();
> While(itr.next()) {
> FactHandle h = itr.next();
> wm.retract(h);
> }
>
> This would ensure truth maintenance is preserved.
>
Actually I'm not sure that would be safe.... the objects and the handles
are in the same hashtable. Those internal data structures where built
for performance and lightweightness, not thread safeness and mutability.
If you actually look we have an internal, fast, iterator which we simple
adapt to a slower java.util.Iterator. At the moment none of our
iterators are thread safe, but I do see a valid use case here, we will
have to think on it for the next major release - cleam implementation
patch welcome with unit tests :) I'm less concerned about the iterator
adapter performance, but I cannot compromise on the performance of our
internal iterators.
public static class HashTableIterator
implements
Iterator {
private static final long serialVersionUID = 400L;
private AbstractHashTable hashTable;
private Entry[] table;
private int row;
private int length;
private Entry entry;
public HashTableIterator(final AbstractHashTable hashTable) {
this.hashTable = hashTable;
}
/* (non-Javadoc)
* @see org.drools.util.Iterator#next()
*/
public Object next() {
if ( this.entry == null ) {
// keep skipping rows until we come to the end, or find
one that is populated
while ( this.entry == null ) {
this.row++;
if ( this.row == this.length ) {
return null;
}
this.entry = this.table[this.row];
}
} else {
this.entry = this.entry.getNext();
if ( this.entry == null ) {
this.entry = (Entry) next();
}
}
return this.entry;
}
/* (non-Javadoc)
* @see org.drools.util.Iterator#reset()
*/
public void reset() {
this.table = this.hashTable.getTable();
this.length = this.table.length;
this.row = -1;
this.entry = null;
}
}
> -----Original Message-----
> From: rules-users-bounces at lists.jboss.org
> [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Godmar Back
> Sent: 05 October 2007 16:40
> To: Rules Users List
> Subject: Re: [rules-users] does WorkingMemory.iterator support remove()?
>
> Thanks - consider supporting it for efficiency. (Otherwise, removing a
> set of facts from working memory requires a temporary container to
> hold the facts to be removed.)
>
> - Godmar
>
> On 10/5/07, Mark Proctor <mproctor at codehaus.org> wrote:
>
>> Godmar Back wrote:
>>
>>> Does the iterator returned by WorkingMemory.iterator support remove()?
>>>
>>> I checked the javadoc and the Drools manual, but may have missed it.
>>>
>>>
>> If you try it you'll get an exception thrown
>>
> "UnsupportedOperationException"
>
> http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-core/src/main/jav
> a/org/drools/util/JavaIteratorAdapter.java
>
>>> Please answer and augment documentation.
>>>
>>> - Godmar
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20071005/8ac8dbdc/attachment.html
More information about the rules-users
mailing list