How about we add a property - auto-generate hashCode() in binary configuration. If set, then we auto-generate the hashCode() every time a binary object is built.
Thoughts? On Fri, Aug 5, 2016 at 5:29 AM, Alexander Paschenko < alexander.a.pasche...@gmail.com> wrote: > Denis, > > Thank you very much for your proposed solution, I will reflect it in > issue's comments and implement this check in code. Most likely this > has to be an issue by itself. > > However, it all does not answer the main question of this thread - how > do we automatically supply hash codes for newly built binary objects? > This is very important for convenient use of SQL inserts. Please, all, > share your thoughts. > > - Alex > > 2016-08-03 3:23 GMT+03:00 Dmitriy Setrakyan <dsetrak...@apache.org>: > > On Tue, Aug 2, 2016 at 7:36 AM, Denis Magda <dma...@gridgain.com> wrote: > > > >> Vova, > >> > >> By default hasCode field will be initialized this way in > >> BinaryObjectBuilderImpl > >> > >> /** */ > >> private static Integer DFLT_HASH_CODE_MAGIC = 0; > >> > >> /** */ > >> private Integer hashCode = DFLT_HASH_CODE_MAGIC; > >> > >> Also we will introduce the following flag in BinaryUtils > >> > >> /** Flag indicating whether as hashCode was explicitly set or not. **/ > >> public static final short EMPTY_HASH_CODE_FLAG = 0x0032; > >> > >> At the BinaryObjectBuilder.build() time we will perform the check below > >> and write hashCodeFlag. > >> > >> > >> short hashCodeFlag = hashCode == DFLT_HASH_CODE_MAGIC ? > >> BinaryUtils.EMPTY_HASH_CODE_FLAG : 0; > >> > >> // Write hashCode flag as well. > >> writer.postWrite(true, registeredType, hashCode, hashCodeFlag); > >> > >> Later when a BinaryObject is used as a key we can check the value of > >> BinaryUtils.EMPTY_HASH_CODE_FLAG > >> and throw an exception if it’s not empty. > >> > >> Makes sense? > >> > > > > It does to me. If there are no objections, then we should list this in > the > > ticket and implement the proposed suggestion of throwing exception if a > > binary object without hashcode is used as a key. > > > > > >> > >> — > >> Denis > >> > >> > On Aug 2, 2016, at 7:09 AM, Vladimir Ozerov <voze...@gridgain.com> > >> wrote: > >> > > >> > Denis, > >> > > >> > I hardly can imagine how it could work in our binary protocol. Can you > >> > please elaborate? > >> > > >> > On Tue, Aug 2, 2016 at 5:06 PM, Denis Magda <dma...@gridgain.com> > wrote: > >> > > >> >> There is a technique we already use to see if a field is initialized > by > >> >> application code. By default a field has to be a reference to a > >> predefined > >> >> object and the reference comparison (not equals) is used to check if > the > >> >> field is initialized by the user. > >> >> > >> >> Refer to IgniteConfiguration.failureDetectionTimeout and > >> >> IgniteSpiAdapter.initializeFailureDetectionTimeout for more details. > >> >> > >> >> — > >> >> Denis > >> >> > >> >>> On Aug 2, 2016, at 12:14 AM, Alexander Paschenko < > >> >> alexander.a.pasche...@gmail.com> wrote: > >> >>> > >> >>> Dmitriy, > >> >>> > >> >>> Good point, however, currently there's no way to distinguish hash > code > >> >>> of zero which is a valid case from missing hash code. We probably > >> >>> should enhance binary builder for it to handle this case. > >> >>> > >> >>> - Alex > >> >>> > >> >>> 2016-08-02 9:47 GMT+03:00 Dmitriy Setrakyan <dsetrak...@apache.org > >: > >> >>>> On Mon, Aug 1, 2016 at 11:38 PM, Vladimir Ozerov < > >> voze...@gridgain.com> > >> >>>> wrote: > >> >>>> > >> >>>>> Andrey, > >> >>>>> > >> >>>>> The question is when to print this warning. I doubt we can print a > >> >> warning > >> >>>>> when calling *BinaryObjectBuilder.build() *method, because an > object > >> >>>>> without a hash code is normal situation. > >> >>>>> > >> >>>>> > >> >>>> I would not only print warning, but throw exception, if an object > >> >> without a > >> >>>> hashCode ends up on a put or read operation in cache. > >> >>>> > >> >>>> > >> >>>>> On Tue, Aug 2, 2016 at 9:00 AM, Andrey Gura <ag...@gridgain.com> > >> >> wrote: > >> >>>>> > >> >>>>>> I think we also should print some warning in case when hashCode() > >> >> wasn't > >> >>>>>> called on BinaryObject explicitly. > >> >>>>>> > >> >>>>>> On Tue, Aug 2, 2016 at 2:20 AM, Dmitriy Setrakyan < > >> >> dsetrak...@apache.org > >> >>>>>> > >> >>>>>> wrote: > >> >>>>>> > >> >>>>>>> On Mon, Aug 1, 2016 at 10:01 AM, Alexey Goncharuk < > >> >>>>>>> alexey.goncha...@gmail.com> wrote: > >> >>>>>>> > >> >>>>>>>> Dmitriy, > >> >>>>>>>> > >> >>>>>>>> The question is how do you calculate the value of the > hashCode? Do > >> >>>>> you > >> >>>>>>> want > >> >>>>>>>> it to be specified explicitly in INSERT statement? > >> >>>>>>>> > >> >>>>>>> > >> >>>>>>> I think optionally we should allow to specify hashCode as part > of > >> the > >> >>>>>>> INSERT statement. However, if it is not specified, we should > >> >> calculate > >> >>>>> it > >> >>>>>>> automatically based in the key fields defined in the > schema/type. > >> >>>>> Agree? > >> >>>>>>> > >> >>>>>>> > >> >>>>>>>> > >> >>>>>>>> 2016-08-01 19:47 GMT+03:00 Dmitriy Setrakyan < > >> dsetrak...@apache.org > >> >>>>>> : > >> >>>>>>>> > >> >>>>>>>>> Alex, > >> >>>>>>>>> > >> >>>>>>>>> In your case, why not just explicitly set hashcode every time > you > >> >>>>>>> create > >> >>>>>>>> an > >> >>>>>>>>> object? There is BinaryObjectBuilder.hashCode(...) method. > >> >>>>>>>>> > >> >>>>>>>>> D. > >> >>>>>>>>> > >> >>>>>>>>> On Mon, Aug 1, 2016 at 7:42 AM, al.psc < > >> >>>>>>> alexander.a.pasche...@gmail.com> > >> >>>>>>>>> wrote: > >> >>>>>>>>> > >> >>>>>>>>>> Guys, > >> >>>>>>>>>> > >> >>>>>>>>>> It seems like this problem has become an important one once > >> >>>>> again. > >> >>>>>>>>>> In the course of working on > >> >>>>>>>>>> https://issues.apache.org/jira/browse/IGNITE-2294 (DML > support) > >> >>>>>>>> there's > >> >>>>>>>>>> need > >> >>>>>>>>>> to support binary marshaller. And, although we can build just > >> >>>>>>>>> BinaryObject > >> >>>>>>>>>> and put it to cache, without adequate hash code it won't be > >> >>>>> stored > >> >>>>>>>>>> properly. > >> >>>>>>>>>> Currently SQL MERGE works simply by deserializing newly built > >> >>>>>> object, > >> >>>>>>>> but > >> >>>>>>>>>> it's obviously wrong and is just a workaround rather a > solution. > >> >>>>>>>>>> Has anyone come with possible design proposals for this > >> problem's > >> >>>>>>>>> solution? > >> >>>>>>>>>> > >> >>>>>>>>>> Thanks. > >> >>>>>>>>>> > >> >>>>>>>>>> - Alex > >> >>>>>>>>>> > >> >>>>>>>>>> > >> >>>>>>>>>> > >> >>>>>>>>>> -- > >> >>>>>>>>>> View this message in context: > >> >>>>>>>>>> > >> >>>>>>>>> > >> >>>>>>>> > >> >>>>>>> > >> >>>>>> > >> >>>>> > >> >> > >> http://apache-ignite-developers.2346864.n4.nabble. > com/All-BinaryObjects-created-by-BinaryObjectBuilder-stored- > at-the-same-partition-by-default-tp8042p10304.html > >> >>>>>>>>>> Sent from the Apache Ignite Developers mailing list archive > at > >> >>>>>>>>> Nabble.com. > >> >>>>>>>>>> > >> >>>>>>>>> > >> >>>>>>>> > >> >>>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> -- > >> >>>>>> Andrey Gura > >> >>>>>> GridGain Systems, Inc. > >> >>>>>> www.gridgain.com > >> >>>>>> > >> >>>>> > >> >> > >> >> > >> > >> >