I think it should be registerInterestAll(Iterable<T>keys) to mirror Collection.addAll.
I could easily see a user creating their own Tuple class or using one that happens to also implement Iterable as their key. We're not doing a very good job of discouraging people to use iterable objects as their key if they work everywhere else and then break with this one API. -Dan On Thu, Nov 30, 2017 at 2:45 PM, John Blum <jb...@pivotal.io> wrote: > No, no... good question. > > I just think it would be wiser if users created a single, CompositeKey > class type, with properly implements equals and hashCode methods, as I > pointed out. > > I don't see any advantage in using a java.util.Collection as a key over > implementing a CompositeKey type. > > As such, anything we can do to discourage users from using Collection types > as a key, I think is a good thing. > > > On Thu, Nov 30, 2017 at 2:35 PM, Jason Huynh <jhu...@pivotal.io> wrote: > > > Yeah I am not sure if anyone does it,and I don't think it would be a good > > idea to use a collection as a key but just thought I'd ask the > question... > > > > On Thu, Nov 30, 2017 at 2:33 PM John Blum <jb...@pivotal.io> wrote: > > > > > For instance, this came up recently... > > > > > > > > > https://stackoverflow.com/questions/46551278/gemfire- > > composite-key-pojo-as-gemfire-key > > > > > > I have seen other similar posts too! > > > > > > > > > > > > On Thu, Nov 30, 2017 at 2:30 PM, John Blum <jb...@pivotal.io> wrote: > > > > > > > Does anyone actually do this in practice? If so, yikes! > > > > > > > > Even if the List is immutable, the elements may not be, so using a > List > > > as > > > > a key starts to open 1 up to a lot of problems. > > > > > > > > As others have pointed out in SO and other channels, information > should > > > > not be kept in the key. > > > > > > > > It is perfect fine to have a "Composite" Key, but then define a > > > > CompositeKey class type with properly implemented equals(:Object) and > > > > hashCode():int methods. > > > > > > > > For the most part, Keys should really only ever be simple Scalar > values > > > > (e.g. Long, String, etc). > > > > > > > > -j > > > > > > > > > > > > > > > > > > > > On Thu, Nov 30, 2017 at 2:25 PM, Jason Huynh <jhu...@pivotal.io> > > wrote: > > > > > > > >> I started work on the following plan: > > > >> - deprecate current "ALL_KEYS" and List passing behavior in > > > >> registerInterest > > > >> () > > > >> - add registerInterestForAllKeys(); > > > >> - add registerInterest(T... keys) > > > >> - add registerInterest(Iterable<T>keys) > > > >> > > > >> I might be missing something here but: > > > >> With the addition of registerInterest(Iterable<T> keys), I think we > > > would > > > >> not be able to register interest a List as the key itself. A list > > would > > > >> be > > > >> iterated over due to the addition of registerInterest(Iterable<T> > > keys). > > > >> A > > > >> list in a list would be passed into registerInterest and again be > > > iterated > > > >> over. I could change the newly created registerInterest call and > > > >> explicitly name it something else or are we ok with Iterables not > > being > > > >> able to be registered as individual keys. > > > >> > > > >> > > > >> > > > >> > > > >> > > > >> On Mon, Nov 20, 2017 at 9:05 AM Kirk Lund <kl...@apache.org> wrote: > > > >> > > > >> > John's approach looks best for when you need to specify keys. > > > >> > > > > >> > For ALL_KEYS, what about an API that doesn't require a token or > all > > > >> keys: > > > >> > > > > >> > public void registerInterestForAllKeys(); > > > >> > > > > >> > On Fri, Nov 17, 2017 at 1:24 PM, Jason Huynh <jhu...@pivotal.io> > > > wrote: > > > >> > > > > >> > > Thanks John for the clarification! > > > >> > > > > > >> > > On Fri, Nov 17, 2017 at 1:12 PM John Blum <jb...@pivotal.io> > > wrote: > > > >> > > > > > >> > > > This... > > > >> > > > > > > >> > > > > The Iterable version would handle any collection type by > > having > > > >> the > > > >> > > user > > > >> > > > pass > > > >> > > > in the iterator for the collection. > > > >> > > > > > > >> > > > Is not correct. > > > >> > > > > > > >> > > > The Collection<E> interface itself "extends" the > > > >> java.lang.Iterable<E> > > > >> > > > interface (see here... > > > >> > > > > > > https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html > > > >> > > under > > > >> > > > "*All > > > >> > > > Superinterfaces*"). > > > >> > > > > > > >> > > > Therefore a user can simply to this... > > > >> > > > > > > >> > > > *List*<KeyType> keys = ... > > > >> > > > > > > >> > > > region.registerInterest(keys); *// calls the > > > >> > > > Region.registerInterest(:Iterable<T>) method.* > > > >> > > > > > > >> > > > Alternatively, this would also be allowed... > > > >> > > > > > > >> > > > *Set*<KeyType> keys = ... > > > >> > > > > > > >> > > > region.registerInterest(keys); > > > >> > > > > > > >> > > > > > > >> > > > On Fri, Nov 17, 2017 at 11:44 AM, Jason Huynh < > > jhu...@pivotal.io> > > > >> > wrote: > > > >> > > > > > > >> > > > > Current idea is to: > > > >> > > > > - deprecate current "ALL_KEYS" and List passing behavior in > > > >> > > > > registerInterest() > > > >> > > > > - add registerInterestAllKeys(); > > > >> > > > > - add registerInterest(T... keys) and > > > registerInterest(Iterable<T> > > > >> > > keys) > > > >> > > > > and > > > >> > > > > not have one specifically for List or specific collections. > > > >> > > > > > > > >> > > > > The Iterable version would handle any collection type by > > having > > > >> the > > > >> > > user > > > >> > > > > pass in the iterator for the collection. > > > >> > > > > > > > >> > > > > On Fri, Nov 17, 2017 at 11:32 AM Jacob Barrett < > > > >> jbarr...@pivotal.io> > > > >> > > > > wrote: > > > >> > > > > > > > >> > > > > > I am failing to see where registerInterest(List<T> keys) > is > > an > > > >> > issue > > > >> > > > for > > > >> > > > > > the key type in the region. If our region is > Region<String> > > > >> then I > > > >> > > > would > > > >> > > > > > expect registerInterest(List<String>). If the keys are > > unknown > > > >> or a > > > >> > > mix > > > >> > > > > > then you should have Region<Object> and thus > > > >> > > > > registerInterest(List<Object). > > > >> > > > > > > > > >> > > > > > I echo John's statements on VarArgs and type erasure as > well > > > as > > > >> his > > > >> > > > > > argument for Iterable<T>. > > > >> > > > > > > > > >> > > > > > Also, List<T> does not restrict you from List indexes. The > > > >> region > > > >> > > would > > > >> > > > > be > > > >> > > > > > Region<List<String>> with registerInterest<List<List<Str > > > >> ing>>(). > > > >> > > > > > > > > >> > > > > > -Jake > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > On Fri, Nov 17, 2017 at 10:04 AM John Blum < > > jb...@pivotal.io> > > > >> > wrote: > > > >> > > > > > > > > >> > > > > > > Personally, I prefer the var args method > > > >> (registerInterest(T... > > > >> > > > keys)) > > > >> > > > > > > myself. It is way more convenient if I only have a few > > keys > > > >> when > > > >> > > > > calling > > > >> > > > > > > this method then to have to add the keys to a List, > > > especially > > > >> > for > > > >> > > > > > testing > > > >> > > > > > > purposes. > > > >> > > > > > > > > > >> > > > > > > But, I typically like to pair that with a > > > >> > > > registerInterest(Iterable<T> > > > >> > > > > > > keys) method > > > >> > > > > > > as well. By having a overloaded Iterable variant, then > I > > > can > > > >> > pass > > > >> > > in > > > >> > > > > any > > > >> > > > > > > Collection type I want (which shouldn't be restricted to > > > just > > > >> > > List). > > > >> > > > > It > > > >> > > > > > > also is a simple matter to convert any *Collection* > (i.e. > > > >> *List*, > > > >> > > > > *Set*, > > > >> > > > > > > etc) to an array, which can be passed to the var args > > > >> method. By > > > >> > > > using > > > >> > > > > > > List, > > > >> > > > > > > you are implying that "order matters" since a List is a > > > order > > > >> > > > > collection > > > >> > > > > > of > > > >> > > > > > > elements. > > > >> > > > > > > > > > >> > > > > > > This ("*It might even cause problems of pushing in > > > **multiple > > > >> > > > different > > > >> > > > > > > types.*"), regarding var args, does not even make sense. > > > >> > > Technically, > > > >> > > > > > > List<T> is no different. Java's type erasure > essentially > > > >> equates > > > >> > > var > > > >> > > > > > args > > > >> > > > > > > too "Object..." (or Object[]) and the List<T> to List > (or > > a > > > >> List > > > >> > of > > > >> > > > > > > Objects, > > > >> > > > > > > essentially like if you just did this... List<Object>) > So, > > > >> while > > > >> > > the > > > >> > > > > > > compiler ensures compile-time type-safety of generics, > > there > > > >> is > > > >> > no > > > >> > > > > > generics > > > >> > > > > > > type-safety guarantees at runtime. > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > On Fri, Nov 17, 2017 at 9:22 AM, Jason Huynh < > > > >> jhu...@pivotal.io> > > > >> > > > > wrote: > > > >> > > > > > > > > > >> > > > > > > > Hi Mike, > > > >> > > > > > > > > > > >> > > > > > > > The current support for List leads to compilation > issues > > > if > > > >> the > > > >> > > > > region > > > >> > > > > > is > > > >> > > > > > > > type constrained. However I think you are suggesting > > > >> instead > > > >> > of > > > >> > > a > > > >> > > > > var > > > >> > > > > > > args > > > >> > > > > > > > method, instead provide a registerInterest(List keys) > > > >> method? > > > >> > > > > > > > > > > >> > > > > > > > So far what I am hearing requested is: > > > >> > > > > > > > deprecate current "ALL_KEYS" and List passing behavior > > > >> > > > > > > > registerInterestAllKeys(); > > > >> > > > > > > > registerInterest(List<T> keys) instead of a > > > >> > registerInterest(T... > > > >> > > > > keys) > > > >> > > > > > > > > > > >> > > > > > > > Will anyone ever actually have a List as the key > itself? > > > The > > > >> > > > current > > > >> > > > > > and > > > >> > > > > > > > suggested changes would not allow it registering for a > > > >> specific > > > >> > > > List > > > >> > > > > > > > object. > > > >> > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > On Thu, Nov 16, 2017 at 6:50 PM Jacob Barrett < > > > >> > > jbarr...@pivotal.io > > > >> > > > > > > > >> > > > > > > wrote: > > > >> > > > > > > > > > > >> > > > > > > > > Geode Native C++ and .NET have: > > > >> > > > > > > > > > > > >> > > > > > > > > virtual void registerKeys(const > > > >> > > > > > > > > std::vector<std::shared_ptr<CacheableKey>> & keys, > > > >> > > > > > > > > bool isDurable = false, > > > >> > > > > > > > > bool getInitialValues = > > > false, > > > >> > > > > > > > > bool receiveValues = > > true) = > > > >> 0; > > > >> > > > > > > > > > > > >> > > > > > > > > virtual void unregisterKeys(const > > > >> > > > > > > > > std::vector<std::shared_ptr<CacheableKey>> & keys) > = > > 0; > > > >> > > > > > > > > > > > >> > > > > > > > > virtual void *registerAllKeys*(bool isDurable = > > false, > > > >> > > > > > > > > bool > getInitialValues = > > > >> false, > > > >> > > > > > > > > bool receiveValues = > > > true) > > > >> = > > > >> > 0; > > > >> > > > > > > > > > > > >> > > > > > > > > virtual void unregisterAllKeys() = 0; > > > >> > > > > > > > > > > > >> > > > > > > > > virtual void registerRegex(const std::string& > regex, > > > >> > > > > > > > > bool isDurable = false, > > > >> > > > > > > > > bool getInitialValues = > > > >> false, > > > >> > > > > > > > > bool receiveValues = > > true) > > > = > > > >> 0; > > > >> > > > > > > > > > > > >> > > > > > > > > virtual void unregisterRegex(const char* regex) = > 0; > > > >> > > > > > > > > > > > >> > > > > > > > > I dislike special values like this so yes please > make > > it > > > >> go > > > >> > > away! > > > >> > > > > > > > > > > > >> > > > > > > > > -Jake > > > >> > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > On Thu, Nov 16, 2017 at 5:20 PM Dan Smith < > > > >> dsm...@pivotal.io > > > >> > > > > > >> > > > > wrote: > > > >> > > > > > > > > > > > >> > > > > > > > > > I don't really like the regex option - it implies > > that > > > >> your > > > >> > > > keys > > > >> > > > > > are > > > >> > > > > > > > all > > > >> > > > > > > > > > strings. Will any other regular expressions work > on > > > non > > > >> > > string > > > >> > > > > > > objects? > > > >> > > > > > > > > > registerInterestAllKeys() seems like a better > > option. > > > >> > > > > > > > > > > > > >> > > > > > > > > > -Dan > > > >> > > > > > > > > > > > > >> > > > > > > > > > On Thu, Nov 16, 2017 at 4:34 PM, Michael Stolz < > > > >> > > > > mst...@pivotal.io> > > > >> > > > > > > > > wrote: > > > >> > > > > > > > > > > > > >> > > > > > > > > > > I don't like the vararg option. > > > >> > > > > > > > > > > If i'm maintaining a list of keys i'm interested > > > in, I > > > >> > want > > > >> > > > to > > > >> > > > > be > > > >> > > > > > > > able > > > >> > > > > > > > > to > > > >> > > > > > > > > > > pass that List in. > > > >> > > > > > > > > > > Varargs is a poor substitute. It might even > cause > > > >> > problems > > > >> > > of > > > >> > > > > > > pushing > > > >> > > > > > > > > in > > > >> > > > > > > > > > > multiple different types. Keys must all be of > one > > > type > > > >> > for > > > >> > > a > > > >> > > > > > given > > > >> > > > > > > > > > Region. > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > I'm very much in favor of deprecating the > ALL_KEYS > > > >> string > > > >> > > in > > > >> > > > > > favor > > > >> > > > > > > of > > > >> > > > > > > > > > > something that is typed specially if you refer > to > > > >> > ALL_KEYS. > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > If that works, then we don't necessarily need > the > > > >> > > additional > > > >> > > > > API > > > >> > > > > > > > > > > registerInterestAllKeys(). But if ALL_KEYS can't > > be > > > a > > > >> > > special > > > >> > > > > > type > > > >> > > > > > > to > > > >> > > > > > > > > get > > > >> > > > > > > > > > > over the compilation issues then we should go > with > > > the > > > >> > new > > > >> > > > API. > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > -- > > > >> > > > > > > > > > > Mike Stolz > > > >> > > > > > > > > > > Principal Engineer, GemFire Product Lead > > > >> > > > > > > > > > > Mobile: +1-631-835-4771 <(631)%20835-4771> > > > <(631)%20835-4771> > > > >> > <(631)%20835-4771> > > > >> > > > <(631)%20835-4771> <(631)%20835-4771> > > > >> > > > > > <(631)%20835-4771> > > > >> > > > > > > <(631)%20835-4771> > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > On Thu, Nov 16, 2017 at 7:02 PM, Anilkumar > > Gingade < > > > >> > > > > > > > > aging...@pivotal.io> > > > >> > > > > > > > > > > wrote: > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > +1 Deprecating ALL_KEYS option; I believe this > > is > > > >> added > > > >> > > > > before > > > >> > > > > > we > > > >> > > > > > > > > > > supported > > > >> > > > > > > > > > > > regex support. > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > Doesn't seems like a new API is needed. The > > regex > > > >> java > > > >> > > doc > > > >> > > > > > > clearly > > > >> > > > > > > > > > > > specifies the effect of ".*". > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > +1 for deprecating list argument; and > replacing > > > with > > > >> > new > > > >> > > > API. > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > -Anil. > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > On Thu, Nov 16, 2017 at 3:36 PM, Jason Huynh < > > > >> > > > > > jhu...@pivotal.io> > > > >> > > > > > > > > > wrote: > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > For GEODE-3813 < > > > >> > > > > > > https://issues.apache.org/jira/browse/GEODE-3813 > > > >> > > > > > > > >: > > > >> > > > > > > > > > > > Region > > > >> > > > > > > > > > > > > registerInterest API usage of type > parameters > > is > > > >> > broken > > > >> > > > > > > > > > > > > < > > > https://issues.apache.org/jira/browse/GEODE-3813 > > > >> > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > The current API to registerInterest allows a > > > >> special > > > >> > > > string > > > >> > > > > > > token > > > >> > > > > > > > > > > > > “ALL_KEYS” to be passed in as the parameter > to > > > >> > > > > > > registerInterest(T > > > >> > > > > > > > > > key). > > > >> > > > > > > > > > > > > This special token causes the > registerInterest > > > to > > > >> > > behave > > > >> > > > > > > similar > > > >> > > > > > > > to > > > >> > > > > > > > > > > > > registerInterestRegex(“.*”). As the ticket > > > >> states, > > > >> > if > > > >> > > > the > > > >> > > > > > > region > > > >> > > > > > > > > has > > > >> > > > > > > > > > > > been > > > >> > > > > > > > > > > > > typed to anything other than Object or > String, > > > the > > > >> > > usage > > > >> > > > of > > > >> > > > > > > > > > “ALL_KEYS” > > > >> > > > > > > > > > > > as a > > > >> > > > > > > > > > > > > parameter results in a compilation error. > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Proposals: > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > I would like to deprecate the special string > > > >> > “ALL_KEYS” > > > >> > > > and > > > >> > > > > > > > > document > > > >> > > > > > > > > > a > > > >> > > > > > > > > > > > > workaround of using > > registerInterestRegex(“.*”) > > > >> or we > > > >> > > can > > > >> > > > > > add a > > > >> > > > > > > > new > > > >> > > > > > > > > > API > > > >> > > > > > > > > > > > > called registerInterestAllKeys() > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > I think we should also deprecate passing a > > List > > > >> > Object > > > >> > > of > > > >> > > > > > keys > > > >> > > > > > > > into > > > >> > > > > > > > > > > > > registerInterest. It has the same > compilation > > > >> > > > restrictions > > > >> > > > > > as > > > >> > > > > > > > > > > “ALL_KEYS” > > > >> > > > > > > > > > > > > when the region is key constrained/typed. > The > > > >> reason > > > >> > > why > > > >> > > > > > List > > > >> > > > > > > > > would > > > >> > > > > > > > > > be > > > >> > > > > > > > > > > > > used is to allow registering multiple keys > at > > > >> once. > > > >> > > > > Instead, > > > >> > > > > > > we > > > >> > > > > > > > > can > > > >> > > > > > > > > > > add > > > >> > > > > > > > > > > > a > > > >> > > > > > > > > > > > > new var arg API like registerInterest(T… > > keys). > > > >> This > > > >> > > > > problem > > > >> > > > > > > and > > > >> > > > > > > > > > > > solution > > > >> > > > > > > > > > > > > was also documented in the ticket by the > > ticket > > > >> > creator > > > >> > > > > (Kirk > > > >> > > > > > > > Lund) > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Thanks, > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > -Jason > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > -- > > > >> > > > > > > -John > > > >> > > > > > > john.blum10101 (skype) > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > -- > > > >> > > > -John > > > >> > > > john.blum10101 (skype) > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > > > > > > > > > > > -- > > > > -John > > > > john.blum10101 (skype) > > > > > > > > > > > > > > > > -- > > > -John > > > john.blum10101 (skype) > > > > > > > > > -- > -John > john.blum10101 (skype) >