<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Apr 5, 2017 at 4:30 AM Sebastian Laskawiec &lt;<a href="mailto:slaskawi@redhat.com">slaskawi@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">I love the idea of starting with a simple interface, so +1000 from me. <div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I&#39;m also assuming that our new MultiMap will be accessible in both Embedded and Client/Server mode, am I correct? I also think CacheMultimap should extend Iterable. I suspect some of our users might want to use for-each loop with it. Finally, we also need to think about some integration bits (maybe not for the initial implementation but it might be beneficial to create JIRAs for them). With CDI and Spring support we can make them super easy to use (by injecting newly created instances to the users code: @Inject CacheMultimap myMap&lt;String, String&gt;). </div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I also put some more comments below. Nice proposal Katia!</div><div class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Tue, Apr 4, 2017 at 7:09 PM William Burns &lt;<a class="gmail_msg">mudokonman@gmail.com</a>&gt; wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Tue, Apr 4, 2017 at 11:45 AM Katia Aresti &lt;<a class="gmail_msg">karesti@redhat.com</a>&gt; wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Hi all,<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">As you probably know, Will and I are working on the vert-x infinispan integration [1], where the primary goal is to make infinispan the default cluster management of vert-x. (yeah!)</div><div class="gmail_msg">Vert-x needs support for an Async Multimap. Today&#39;s implementation is a wrapper on a normal Cache where only Cache Key&#39;s are used to implement the multi map [2].</div><div class="gmail_msg">This is not very efficient, so after trying some other alternative implementations [3] that don&#39;t fully work (injection not working), Will and I have come to the conclusion that it might be a good idea to start having our own native CacheMultimap. This first multimap won&#39;t support duplicate values on key&#39;s.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">As a quick start, the smallest multimap we need should implement the following interface :<br class="gmail_msg"></div></div></blockquote><div class="gmail_msg"> </div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">I agree that having a very slim API to start should be better since we know how much trouble we get into implementing a very large API like ConcurrentMap :) </div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg"></div><div class="gmail_msg"><pre style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg"><span style="color:rgb(0,0,128);font-weight:bold" class="gmail_msg">public interface </span>CacheMultimap&lt;<span style="color:rgb(32,153,157)" class="gmail_msg">K</span>, <span style="color:rgb(32,153,157)" class="gmail_msg">V</span>&gt; {<br class="gmail_msg">   <span style="color:rgb(32,153,157)" class="gmail_msg">V </span>put(<span style="color:rgb(32,153,157)" class="gmail_msg">K </span>key, <span style="color:rgb(32,153,157)" class="gmail_msg">V </span>value);<br class="gmail_msg"></pre></div></div></blockquote></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">This should probably return a boolean or Void. I am leaning towards the first, but I am open either way.</div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">Could you please tell me more why are you suggesting boolean or void? Returning previous value would make it more similar to a Map.</div></div></div></div></div></blockquote><div><br></div><div>The value of the MultiMap is a Collection&lt;V&gt; which in this version doesn&#39;t allow duplicates. By returning boolean we can say if the value was added (true) or it was already present (false).<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><pre style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">   Collection&lt;<span style="color:rgb(32,153,157)" class="gmail_msg">V</span>&gt; get(<span style="color:rgb(32,153,157)" class="gmail_msg">K </span>key);<br class="gmail_msg"><br class="gmail_msg">   <span style="color:rgb(0,0,128);font-weight:bold" class="gmail_msg">boolean </span>remove(<span style="color:rgb(32,153,157)" class="gmail_msg">K </span>key, <span style="color:rgb(32,153,157)" class="gmail_msg">V </span>value);<br class="gmail_msg"></pre></div></div></blockquote></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">We probably want a `boolean remove(K key)` method as well that removes all values mapped to the given key.</div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">+1<br class="gmail_msg"></div></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><pre style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">}</pre><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">CacheMultimapImpl</span> will be a wrapper on a normal Cache, similar to [3].</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">We could add a new method in <span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">EmbeddedCacheManager.java</span></div><div class="gmail_msg"><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg"><br class="gmail_msg"></span></div><div class="gmail_msg"><span style="background-color:rgb(255,255,255)" class="gmail_msg"><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">&lt;</span><span style="font-family:menlo;font-size:9pt;color:rgb(32,153,157)" class="gmail_msg">K</span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">, </span><span style="font-family:menlo;font-size:9pt;color:rgb(32,153,157)" class="gmail_msg">V</span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">&gt; </span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">CacheMultimap</span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">&lt;</span><span style="font-family:menlo;font-size:9pt;color:rgb(32,153,157)" class="gmail_msg">K</span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">, </span><span style="font-family:menlo;font-size:9pt;color:rgb(32,153,157)" class="gmail_msg">V</span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">&gt; </span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">getCacheMultimap</span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">(String cacheName, </span><span style="font-family:menlo;font-size:9pt;color:rgb(0,0,128);font-weight:bold" class="gmail_msg">boolean </span><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg">createIfAbsent);</span></span></div></div></blockquote></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">How about the other way around? Something like:</div><div class="gmail_msg">static &lt;K, V&gt; CacheMultimap&lt;K, V&gt; CacheMultimap.create(BasicCache&lt;K,V&gt; cache);<br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">This way we would avoid dependency from DefaultCacheManager to CacheMultimap. If we wanted to support both Embedded/Client Server mode we would probably need to use BasicCache as a parameter. The last argument for this solution is that creating producers in CDI/Spring would be trivial (we would just need to provide a generic producer method and with some luck that would be it).</div></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">I was thinking maybe this would exist in a separate module (outside of core)? or class that wraps (similar to DistributedExecutor) instead. My worry is about transactions, since the entry point to that is through Cache interface. The other option is we could add a `getCache` method on the `CacheMultiMap`.</div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">If we want to support both Embedded/Client Server mode, it should go to commons. Otherwise I would vote for core.</div></div></div></div></div></blockquote><div><br></div><div>Commons should work. Only problem is the functional commands don&#39;t really work efficiently over Hot Rod (does get/replace in a loop). We would need to add some more handling in the protocol to allow for only partial replication of values and only 1 remote call.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><span style="background-color:rgb(255,255,255)" class="gmail_msg"><br class="gmail_msg"></span></div><div class="gmail_msg"><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg"><br class="gmail_msg"></span></div>Implementation will create a cache as always and return a new CacheMultimapImpl(cache). <div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">What do you think ? Please fell free to suggest any other alternative or idea.<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Cheers</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Katia<br class="gmail_msg"><br class="gmail_msg">[1] <a class="gmail_msg">https://github.com/vert-x3/vertx-infinispan</a><br class="gmail_msg"><br class="gmail_msg">[2] <a class="gmail_msg">https://github.com/vert-x3/vertx-infinispan/blob/master/src/main/java/io/vertx/ext/cluster/infinispan/impl/InfinispanAsyncMultiMap.java</a><br class="gmail_msg"><br class="gmail_msg">[3] <a class="gmail_msg">https://gist.github.com/karesti/194bb998856d4a2828d83754130ed79c</a><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><span style="color:rgb(0,0,0);font-family:menlo;font-size:9pt" class="gmail_msg"></span> </div></div></div></div></div></div>
_______________________________________________<br class="gmail_msg">
infinispan-dev mailing list<br class="gmail_msg">
<a class="gmail_msg">infinispan-dev@lists.jboss.org</a><br class="gmail_msg">
<a rel="noreferrer" class="gmail_msg">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a></blockquote></div></div>
_______________________________________________<br class="gmail_msg">
infinispan-dev mailing list<br class="gmail_msg">
<a class="gmail_msg">infinispan-dev@lists.jboss.org</a><br class="gmail_msg">
<a rel="noreferrer" class="gmail_msg">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a></blockquote></div></div></div></div><div dir="ltr" class="gmail_msg">-- <br class="gmail_msg"></div><div data-smartmail="gmail_signature" class="gmail_msg"><div dir="ltr" class="gmail_msg"><p class="m_8922973089791203126inbox-inbox-fullname-container gmail_msg" style="box-sizing:border-box;color:rgb(0,0,0);font-family:overpass,sans-serif;font-weight:bold;margin:0px;padding:0px;font-size:14px;text-transform:uppercase"><span class="m_8922973089791203126inbox-inbox-firstname-container gmail_msg" style="box-sizing:border-box">SEBASTIAN</span><span class="m_8922973089791203126inbox-inbox-Apple-converted-space gmail_msg"> </span><span class="m_8922973089791203126inbox-inbox-lastname-container gmail_msg" style="box-sizing:border-box">ŁASKAWIEC</span></p><p class="m_8922973089791203126inbox-inbox-position-container gmail_msg" style="box-sizing:border-box;color:rgb(0,0,0);font-family:overpass,sans-serif;font-size:10px;margin:0px 0px 4px;text-transform:uppercase"><span class="m_8922973089791203126inbox-inbox-position gmail_msg" style="box-sizing:border-box">INFINISPAN DEVELOPER</span></p><p class="m_8922973089791203126inbox-inbox-legal-container gmail_msg" style="box-sizing:border-box;font-family:overpass,sans-serif;margin:0px;font-size:10px;color:rgb(153,153,153)"><a class="m_8922973089791203126inbox-inbox-redhat-anchor gmail_msg" style="box-sizing:border-box;color:rgb(0,136,206);margin:0px;text-decoration:none">Red Hat<span class="m_8922973089791203126inbox-inbox-Apple-converted-space gmail_msg"> </span><span style="box-sizing:border-box" class="gmail_msg">EMEA</span></a></p><table style="box-sizing:border-box;color:rgb(0,0,0);font-family:overpass,sans-serif;font-size:medium" class="gmail_msg" border="0"><tbody style="box-sizing:border-box" class="gmail_msg"><tr style="box-sizing:border-box" class="gmail_msg"><td style="box-sizing:border-box" class="gmail_msg" width="100px"><a style="box-sizing:border-box" class="gmail_msg"><img style="box-sizing:border-box" class="gmail_msg" width="90" height="auto"></a></td></tr></tbody></table></div></div>
_______________________________________________<br class="gmail_msg">
infinispan-dev mailing list<br class="gmail_msg">
<a class="gmail_msg">infinispan-dev@lists.jboss.org</a><br class="gmail_msg">
<a rel="noreferrer" class="gmail_msg">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a></blockquote></div></div>