directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Emmanuel Lécharny <elecha...@gmail.com>
Subject Re: [Mavinot] Value handling and multiple values
Date Tue, 08 Oct 2013 04:33:59 GMT
Le 10/6/13 4:42 PM, Kiran Ayyagari a écrit :
> On Sat, Oct 5, 2013 at 1:48 AM, Emmanuel Lécharny <elecharny@gmail.com>wrote:
>
>> Hi,
>>
>> I'm currently implementing the ValueHodler for the managed btrees, and
>> I'm coming with some nice solution for the duplicate values. The idea is
>> to make the ValueHolder class Iterable, so that we can get any of the
>> stored values in it (even if we have none or only one).
>>
>> This is what it will looks like :
>>
>> public class ValueHolder<K, V> implements Iterable<V>
>> {
>>     /** The deserialized value */
>>     V[] valueArray;
>>
>>     /** The BTree storing multiple value, if we have moe than a
>> threashold values */
>>     BTree<V, V> valueBtree;
>>
>>     /** The serialized value */
>>     ByteBuffer raw;
>>
>>     /** A flag set to true if the values are stored in a BTree */
>>     boolean isBtree = false;
>>
>>     private class ValueArrayIterator implements Iterator<V>
>>     {
>>         /** Store the current position in the array or in the BTree */
>>
>>         private int currentPos;
>>
>>
>>         private ValueArrayIterator()
>>         {
>>             // Start at -1 to be positionned before the first element
>>             currentPos = -1;
>>         }
>>
>>
>>         @Override
>>         public boolean hasNext()
>>         {
>>             if ( valueArray == null )
>>             {
>>                 // Load the array from the raw data
>>                 return false;
>>             }
>>             else
>>             {
>>                 return ( valueArray != null ) && ( currentPos <
>> valueArray.length );
>>             }
>>         }
>>
>>
>>         public V next()
>>         {
>>             if ( valueArray == null )
>>             {
>>                 // Deserialize the array
>>                 return null;
>>             }
>>             else
>>             {
>>                 currentPos++;
>>
>>                 if ( currentPos == valueArray.length )
>>                 {
>>                     // We have reached the end of the array
>>                     return null;
>>                 }
>>                 else
>>                 {
>>                     return valueArray[currentPos];
>>                 }
>>             }
>>         }
>>
>>
>>         public void remove()
>>         {
>>             // Nothing to do, we don't allow any mutation on this class
>>         }
>>     }
>>
>>     private class ValueBtreeIterator implements Iterator<V>
>>     {
>>         /** Store the current position in the array or in the BTree */
>>
>>         private int currentPos;
>>
>>
>>         private ValueBtreeIterator()
>>         {
>>             // Start at -1 to be positionned before the first element
>>             currentPos = -1;
>>         }
>>
>>
>>         @Override
>>         public boolean hasNext()
>>         {
>>             if ( valueBtree == null )
>>             {
>>                 return true;
>>             }
>>             else
>>             {
>>                 return true;
>>             }
>>         }
>>
>>
>>         public V next()
>>         {
>>             return null;
>>         }
>>
>>
>>         public void remove()
>>         {
>>             // Nothing to do, we don't allow any mutation on this class
>>         }
>>     }
>>
>>
>>     /**
>>      * {@inheritDoc}
>>      */
>>     @Override
>>     public Iterator<V> iterator()
>>     {
>>         if ( isBtree )
>>         {
>>             return new ValueBtreeIterator();
>>         }
>>         else
>>         {
>>             return new ValueArrayIterator();
>>         }
>>     }
>> }
>>
>> As youc an see, we store either an array of Value, or a Btree. If we
>> have one single value, we use an array with one single element in it.
>>
>> In any case, we define two different iterators which will be used
>> internally, but the caller will just have to use it as is.
>>
>> It seems convenient, at least for a very first version, and it can be
>> used by the in-memory btree too, eliminating the need of many tests in
>> the implementation (things like : if ( btree.isAllowDuplicates() ).
>>
>> wdyt ?
>>
>> I prefer a cursor

I'll ue a Cursor then :-)

Seriously, it makes sense to use a Cursor, as we already have such an
interface existing. Although I had to transform it a bit, to create a
consistant hierarchy (the cursor we have deals with Tuple, and we don't
need tuples when we browe values).

So, work in progress...


-- 
Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com 


Mime
View raw message