[ 
https://issues.apache.org/jira/browse/IGNITE-640?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dmitriy Setrakyan updated IGNITE-640:
-------------------------------------
    Description: 
We need to add {{IgniteMultimap}} data structure in addition to other data 
structures provided by Ignite. {{IgniteMultiMap}} should have similar API to 
{{java.util.Map}} class in JDK, but support the semantics of multiple values 
per key, similar to [Guava 
Multimap|http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html].
 

However, unlike in Guava, our multi-map should work with Lists, not 
Collections. Lists should make it possible to support the following methods:
{code}
// Gets value at a certain index for a key.
V get(K, index);

// Gets values for specified indexes for a key.
Iterable<V> get(K, Iterable<Integer> indexes);

// Gets values for specified range of indexes, between min and max.
Iterable<V> get(K, int min, int max);

// Gets all values for a specific key.
List<V> get(K);
{code}

Multimap should also support colocated and non-colocated modes, similar to 
[IgniteQueue|https://github.com/apache/incubator-ignite/blob/master/modules/core/src/main/java/org/apache/ignite/IgniteQueue.java]
 and its implementation, 
[GridAtomicCacheQueueImpl|https://github.com/apache/incubator-ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridAtomicCacheQueueImpl.java].

h2. Design Details
The most natural way to implement such map, would be to store every value under 
a separate key in an Ignite cache. For example, let's say that we have a key 
{{K}} with multiple values: {{V0, V1, V2, ...}}. Then the cache should end up 
with the following values {{K0, V0}}, {{K1, V1}}, {{K2, V2}}, etc. This means 
that we need to wrap user key into our own, internal key, which will also have 
{{index}} field.

Look ups of values at specific indexes becomes very simple. Just attach a 
specific index to a key and do a cache lookup. Look ups for all values for a 
key should work as following:
{code}
Object key;
V v = null;
int index = 0;

List<V> res = new ArrayList<>();

do {
    v = cache.get(Key(K, index));

    if (v != null)
        res.add(v);
}
while (v != null);

return res;
{code}

  was:
We need to add {{IgniteMultimap}} data structure in addition to other data 
structures provided by Ignite. {{IgniteMultiMap}} should have similar API to 
{{java.util.Map}} class in JDK, but support the semantics of multiple values 
per key, similar to [Guava 
Multimap|http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html].
 

However, unlike in Guava, our multi-map should work with Lists, not 
Collections. Lists should make it possible to support the following methods:
{code}
// Gets value at a certain index for a key.
V get(K, index);

// Gets values for specified indexes for a key.
Iterable<V> get(K, Iterable<Integer> indexes);

// Gets values for specified range of indexes, between min and max.
Iterable<V> get(K, int min, int max);
{code}

Multimap should also support colocated and non-colocated modes, similar to 
[IgniteQueue|https://github.com/apache/incubator-ignite/blob/master/modules/core/src/main/java/org/apache/ignite/IgniteQueue.java]
 and its implementation, 
[GridAtomicCacheQueueImpl|https://github.com/apache/incubator-ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridAtomicCacheQueueImpl.java].

h2. Design Details
The most natural way to implement such map, would be to store every value under 
a separate key in an Ignite cache. For example, let's say that we have a key 
{{K}} with multiple values: {{V0, V1, V2, ...}}. Then the cache should end up 
with the following values {{K.0, V0}}



> Implement IgniteMultimap data structures
> ----------------------------------------
>
>                 Key: IGNITE-640
>                 URL: https://issues.apache.org/jira/browse/IGNITE-640
>             Project: Ignite
>          Issue Type: Sub-task
>          Components: data structures
>            Reporter: Dmitriy Setrakyan
>            Assignee: Vladisav Jelisavcic
>
> We need to add {{IgniteMultimap}} data structure in addition to other data 
> structures provided by Ignite. {{IgniteMultiMap}} should have similar API to 
> {{java.util.Map}} class in JDK, but support the semantics of multiple values 
> per key, similar to [Guava 
> Multimap|http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html].
>  
> However, unlike in Guava, our multi-map should work with Lists, not 
> Collections. Lists should make it possible to support the following methods:
> {code}
> // Gets value at a certain index for a key.
> V get(K, index);
> // Gets values for specified indexes for a key.
> Iterable<V> get(K, Iterable<Integer> indexes);
> // Gets values for specified range of indexes, between min and max.
> Iterable<V> get(K, int min, int max);
> // Gets all values for a specific key.
> List<V> get(K);
> {code}
> Multimap should also support colocated and non-colocated modes, similar to 
> [IgniteQueue|https://github.com/apache/incubator-ignite/blob/master/modules/core/src/main/java/org/apache/ignite/IgniteQueue.java]
>  and its implementation, 
> [GridAtomicCacheQueueImpl|https://github.com/apache/incubator-ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridAtomicCacheQueueImpl.java].
> h2. Design Details
> The most natural way to implement such map, would be to store every value 
> under a separate key in an Ignite cache. For example, let's say that we have 
> a key {{K}} with multiple values: {{V0, V1, V2, ...}}. Then the cache should 
> end up with the following values {{K0, V0}}, {{K1, V1}}, {{K2, V2}}, etc. 
> This means that we need to wrap user key into our own, internal key, which 
> will also have {{index}} field.
> Look ups of values at specific indexes becomes very simple. Just attach a 
> specific index to a key and do a cache lookup. Look ups for all values for a 
> key should work as following:
> {code}
> Object key;
> V v = null;
> int index = 0;
> List<V> res = new ArrayList<>();
> do {
>     v = cache.get(Key(K, index));
>     if (v != null)
>         res.add(v);
> }
> while (v != null);
> return res;
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to