Class MVMap<K,​V>

  • Type Parameters:
    K - the key class
    V - the value class
    All Implemented Interfaces:
    ConcurrentMap<K,​V>, Map<K,​V>

    public class MVMap<K,​V>
    extends AbstractMap<K,​V>
    implements ConcurrentMap<K,​V>
    A stored map.

    All read and write operations can happen concurrently with all other operations, without risk of corruption.

    • Field Detail

      • store

        public final MVStore store
        The store.
    • Method Detail

      • put

        public V put​(K key,
                     V value)
        Add or replace a key-value pair.
        Specified by:
        put in interface Map<K,​V>
        Overrides:
        put in class AbstractMap<K,​V>
        Parameters:
        key - the key (may not be null)
        value - the value (may not be null)
        Returns:
        the old value if the key existed, or null otherwise
      • firstKey

        public final K firstKey()
        Get the first key, or null if the map is empty.
        Returns:
        the first key, or null
      • firstKey

        public final K firstKey​(Page p)
        Get the first key of this page.
        Parameters:
        p - the page
        Returns:
        the key, or null
      • lastKey

        public final K lastKey()
        Get the last key, or null if the map is empty.
        Returns:
        the last key, or null
      • lastKey

        public final K lastKey​(Page p)
        Get the last key of this page.
        Parameters:
        p - the page
        Returns:
        the key, or null
      • getKey

        public final K getKey​(long index)
        Get the key at the given index.

        This is a O(log(size)) operation.

        Parameters:
        index - the index
        Returns:
        the key
      • keyList

        public final List<K> keyList()
        Get the key list. The list is a read-only representation of all keys.

        The get and indexOf methods are O(log(size)) operations. The result of indexOf is cast to an int.

        Returns:
        the key list
      • getKeyIndex

        public final long getKeyIndex​(K key)
        Get the index of the given key in the map.

        This is a O(log(size)) operation.

        If the key was found, the returned value is the index in the key array. If not found, the returned value is negative, where -1 means the provided key is smaller than any keys. See also Arrays.binarySearch.

        Parameters:
        key - the key
        Returns:
        the index
      • higherKey

        public final K higherKey​(K key)
        Get the smallest key that is larger than the given key, or null if no such key exists.
        Parameters:
        key - the key
        Returns:
        the result
      • higherKey

        public final K higherKey​(Page p,
                                 K key)
        Get the smallest key that is larger than the given key, for the given root page, or null if no such key exists.
        Parameters:
        p - the root page
        key - the key
        Returns:
        the result
      • ceilingKey

        public final K ceilingKey​(K key)
        Get the smallest key that is larger or equal to this key.
        Parameters:
        key - the key
        Returns:
        the result
      • ceilingKey

        public final K ceilingKey​(Page p,
                                  K key)
        Get the smallest key that is larger or equal to this key, for the given root page.
        Parameters:
        p - the root page
        key - the key
        Returns:
        the result
      • floorKey

        public final K floorKey​(K key)
        Get the largest key that is smaller or equal to this key.
        Parameters:
        key - the key
        Returns:
        the result
      • floorKey

        public final K floorKey​(Page p,
                                K key)
        Get the largest key that is smaller or equal to this key, for the given root page.
        Parameters:
        p - the root page
        key - the key
        Returns:
        the result
      • lowerKey

        public final K lowerKey​(K key)
        Get the largest key that is smaller than the given key, or null if no such key exists.
        Parameters:
        key - the key
        Returns:
        the result
      • lowerKey

        public final K lowerKey​(Page p,
                                K key)
        Get the largest key that is smaller than the given key, for the given root page, or null if no such key exists.
        Parameters:
        p - the root page
        key - the key
        Returns:
        the result
      • get

        public final V get​(Object key)
        Get the value for the given key, or null if not found.
        Specified by:
        get in interface Map<K,​V>
        Overrides:
        get in class AbstractMap<K,​V>
        Parameters:
        key - the key
        Returns:
        the value, or null if not found
        Throws:
        ClassCastException - if type of the specified key is not compatible with this map
      • get

        public V get​(Page p,
                     Object key)
        Get the value for the given key from a snapshot, or null if not found.
        Parameters:
        p - the root of a snapshot
        key - the key
        Returns:
        the value, or null if not found
        Throws:
        ClassCastException - if type of the specified key is not compatible with this map
      • clear

        public void clear()
        Remove all entries.
        Specified by:
        clear in interface Map<K,​V>
        Overrides:
        clear in class AbstractMap<K,​V>
      • isClosed

        public final boolean isClosed()
      • remove

        public V remove​(Object key)
        Remove a key-value pair, if the key exists.
        Specified by:
        remove in interface Map<K,​V>
        Overrides:
        remove in class AbstractMap<K,​V>
        Parameters:
        key - the key (may not be null)
        Returns:
        the old value if the key existed, or null otherwise
        Throws:
        ClassCastException - if type of the specified key is not compatible with this map
      • putIfAbsent

        public final V putIfAbsent​(K key,
                                   V value)
        Add a key-value pair if it does not yet exist.
        Specified by:
        putIfAbsent in interface ConcurrentMap<K,​V>
        Specified by:
        putIfAbsent in interface Map<K,​V>
        Parameters:
        key - the key (may not be null)
        value - the new value
        Returns:
        the old value if the key existed, or null otherwise
      • remove

        public boolean remove​(Object key,
                              Object value)
        Remove a key-value pair if the value matches the stored one.
        Specified by:
        remove in interface ConcurrentMap<K,​V>
        Specified by:
        remove in interface Map<K,​V>
        Parameters:
        key - the key (may not be null)
        value - the expected value
        Returns:
        true if the item was removed
      • replace

        public final boolean replace​(K key,
                                     V oldValue,
                                     V newValue)
        Replace a value for an existing key, if the value matches.
        Specified by:
        replace in interface ConcurrentMap<K,​V>
        Specified by:
        replace in interface Map<K,​V>
        Parameters:
        key - the key (may not be null)
        oldValue - the expected value
        newValue - the new value
        Returns:
        true if the value was replaced
      • replace

        public final V replace​(K key,
                               V value)
        Replace a value for an existing key.
        Specified by:
        replace in interface ConcurrentMap<K,​V>
        Specified by:
        replace in interface Map<K,​V>
        Parameters:
        key - the key (may not be null)
        value - the new value
        Returns:
        the old value, if the value was replaced, or null
      • getKeyType

        public final DataType getKeyType()
        Get the key type.
        Returns:
        the key type
      • getValueType

        public final DataType getValueType()
        Get the value type.
        Returns:
        the value type
      • keyIterator

        public final Iterator<K> keyIterator​(K from)
        Iterate over a number of keys.
        Parameters:
        from - the first key to return
        Returns:
        the iterator
      • cursor

        public final Cursor<K,​V> cursor​(K from)
        Get a cursor to iterate over a number of keys and values.
        Parameters:
        from - the first key to return
        Returns:
        the cursor
      • getName

        public final String getName()
        Get the map name.
        Returns:
        the name
      • getStore

        public final MVStore getStore()
      • getId

        public final int getId()
        Get the map id. Please note the map id may be different after compacting a store.
        Returns:
        the map id
      • getRootPage

        public final Page getRootPage()
        The current root page (may not be null).
        Returns:
        the root page
      • flushAndGetRoot

        public RootReference flushAndGetRoot()
        Get the root reference, flushing any current append buffer.
        Returns:
        current root reference
      • isReadOnly

        public final boolean isReadOnly()
      • setVolatile

        public final void setVolatile​(boolean isVolatile)
        Set the volatile flag of the map.
        Parameters:
        isVolatile - the volatile flag
      • isVolatile

        public final boolean isVolatile()
        Whether this is volatile map, meaning that changes are not persisted. By default (even if the store is not persisted), maps are not volatile.
        Returns:
        whether this map is volatile
      • size

        public final int size()
        Get the number of entries, as a integer. Integer.MAX_VALUE is returned if there are more than this entries.
        Specified by:
        size in interface Map<K,​V>
        Overrides:
        size in class AbstractMap<K,​V>
        Returns:
        the number of entries, as an integer
        See Also:
        sizeAsLong()
      • sizeAsLong

        public final long sizeAsLong()
        Get the number of entries, as a long.
        Returns:
        the number of entries
      • getCreateVersion

        public final long getCreateVersion()
      • openVersion

        public final MVMap<K,​V> openVersion​(long version)
        Open an old version for the given map. It will restore map at last known state of the version specified. (at the point right before the commit() call, which advanced map to the next version) Map is opened in read-only mode.
        Parameters:
        version - the version
        Returns:
        the map
      • getVersion

        public final long getVersion()
        Get version of the map, which is the version of the store, at the moment when map was modified last time.
        Returns:
        version
      • getType

        public String getType()
        Get the map type. When opening an existing map, the map type must match.
        Returns:
        the map type
      • append

        public void append​(K key,
                           V value)
        Appends entry to this map. this method is NOT thread safe and can not be used neither concurrently, nor in combination with any method that updates this map. Non-updating method may be used concurrently, but latest appended values are not guaranteed to be visible.
        Parameters:
        key - should be higher in map's order than any existing key
        value - to be appended
      • trimLast

        public void trimLast()
        Removes last entry from this map. this method is NOT thread safe and can not be used neither concurrently, nor in combination with any method that updates this map. Non-updating method may be used concurrently, but latest removal may not be visible.
      • operate

        public V operate​(K key,
                         V value,
                         MVMap.DecisionMaker<? super V> decisionMaker)
        Add, replace or remove a key-value pair.
        Parameters:
        key - the key (may not be null)
        value - new value, it may be null when removal is intended
        decisionMaker - command object to make choices during transaction.
        Returns:
        previous value, if mapping for that key existed, or null otherwise