Denis,

That's not what I was asking about.
Currently DML implementation allows for dymanic instantiation of keys,
in other words, user does not have to provide value for object-typed
_key column - instead, he may supply just field values based on which
_key will be dynamically instantiated/binary built. And that's the
whole point of this discussion as I see it: what to do when we've
binary built classless key that we build ourselves inside SQL engine
and don't know how to compute hash code for it?

- Alex

2016-09-28 19:48 GMT+03:00 Denis Magda <dma...@gridgain.com>:
> Alexander,
>
> As I guess if we have a key without a class then it will be constructed using 
> a BinaryBuilder instance and it’s user responsibility to set the has code at 
> the end with BinaryBuilder.hasCode method. Sure, all this cases must be 
> well-documented in both Java Doc API and Apache Ignite documentation.
>
> —
> Denis
>
>> On Sep 28, 2016, at 9:33 AM, Alexander Paschenko 
>> <alexander.a.pasche...@gmail.com> wrote:
>>
>> Dmitry, Denis,
>>
>> OK, but I think it's necessary to address also the cases when there's
>> no actual class for the key, and its fields are simply declared in
>> XML. In this case, there are no fields to be marked transient. What do
>> we do then? List transient fields in XML separately?
>>
>> - Alex
>>
>> 2016-09-28 4:15 GMT+03:00 Dmitriy Setrakyan <dsetrak...@apache.org>:
>>> Agree with Denis.
>>>
>>>   - by default, all non-transient key fields should participate in the
>>>   hashcode generation
>>>   - when working on DDL, then the primary key fields should participate in
>>>   the hashcode
>>>   - we should add a resolver to override the default behavior (please
>>>   propose the interface in Jira)
>>>   - we should print out a warning, only once per type, the the hashcode
>>>   has been automatically generated based on which fields and which formula
>>>
>>> D.
>>>
>>> On Tue, Sep 27, 2016 at 5:42 PM, Denis Magda <dma...@gridgain.com> wrote:
>>>
>>>> Hi Alexander,
>>>>
>>>> Vladimir’s proposal sounds reasonable to me. However we must keep in mind
>>>> one important thing. Binary objects were designed to address the following
>>>> disadvantages a regular serializer, like optimized marshaller, has:
>>>> necessity to deserialize an object on a server side every time it’s needed.
>>>> necessity to hold an object in both serialized and deserialized forms on
>>>> the server node.
>>>> necessity to restart the whole cluster each time an object version is
>>>> changed (new field is added or an old one is removed).
>>>> If it will be needed to perform step 3 for a default implementation of the
>>>> binary resolver just because the resolver has to consider new fields or
>>>> ignore old ones then such an implementation sucks. Overall, the default
>>>> implementation should use the reflection coming over all the fields a key
>>>> has ignoring the ones that are marked with “transient” keyword. If a user
>>>> wants to control the default resolver's logic then he can label all the
>>>> fields that mustn’t be of a final has code value with “transient”. This has
>>>> to be well-documented for sure.
>>>>
>>>> Makes sense?
>>>>
>>>> —
>>>> Denis
>>>>
>>>>> On Sep 26, 2016, at 12:40 PM, Alexander Paschenko <
>>>> alexander.a.pasche...@gmail.com> wrote:
>>>>>
>>>>> Hello Igniters,
>>>>>
>>>>> As DML support is near, it's critical that we agree on how we generate
>>>>> hash codes for new keys in presence of binary marshaller. Actually,
>>>>> this discussion isn't new - please see its beginning here:
>>>>>
>>>>> http://apache-ignite-developers.2346864.n4.nabble.
>>>> com/All-BinaryObjects-created-by-BinaryObjectBuilder-stored-
>>>> at-the-same-partition-by-default-td8042.html
>>>>>
>>>>> Still, I'm creating this new thread to make getting to the final
>>>>> solution as simple and fast as possible.
>>>>>
>>>>> I remind everyone that the approach that has got the least critics was
>>>>> the one proposed by Vladimir Ozerov:
>>>>>
>>>>> <quote>
>>>>> I think we can do the following:
>>>>> 1) Add "has hash code" flag as Denis suggested.
>>>>> 2) If object without a hash code is put to cache, throw an exception.
>>>>> 3) Add *BinaryEqualsHashCodeResolver *interface.
>>>>> 4) Add default implementation which will auto-generate hash code. *Print
>>>> a
>>>>> warning when auto-generation occurs*, so that user is aware that he is
>>>>> likely to have problems with normal GETs/PUTs.
>>>>> 5) Add another implementation which will use encoded string to calculate
>>>> a
>>>>> hash code. E.g. *new BinaryEqualsHashCodeResolver("{a} * 31 + {b}")*.
>>>>> Originally proposed by Yakov some time ago.
>>>>> </quote>
>>>>>
>>>>> After that, Sergi suggested that instead of a "formula" we keep just a
>>>>> list of the "fields" that participate in hash code evaluation, and
>>>>> with that list, we simply calculate hash code just like IDE does -
>>>>> with all its bit shifts and additions.
>>>>>
>>>>> I'm planning on settling down with this combined Vlad-Sergi approach.
>>>>> Any objections?
>>>>>
>>>>> And an extra question I have: Vlad, you suggest that we both throw an
>>>>> exception on cache code absence and that we might generate it as the
>>>>> last resort. Do I understand you correctly that you suggest generating
>>>>> random code only in context of SQL, but throw exception for keys
>>>>> without codes on ordinary put?
>>>>>
>>>>> And yes, built-in hash codes for JDK types are supported as well as
>>>>> items 1-2 from Vlad's list (there's already fixed issue of IGNITE-3633
>>>>> for the flag and its presence check).
>>>>>
>>>>> - Alex
>>>>
>>>>
>

Reply via email to