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

Andrey Belyaev updated IGNITE-16186:
------------------------------------
    Description: 
When creating ignite cache, you can set parameter _CacheKeyConfiguration_ in 
_CacheConfiguration_ and specify there binary type and affinity field which 
will be used for placing data through partitions.
But there is a problem with such configuring. The information about affinity is 
out of binary context, i.e. affinity field is missing for specified key type.
This situation can be partly corrected by setting same config in 
{_}IgniteConfiguration#setCacheKeyConfiguration(){_}. Then binary type to 
affinity field binding information explictly places in binary context map at 
grid startup. Unfortunately, this method doesn't help for runtime created 
caches.
This problem with binary context can produce issue if you first put in cache 
binary object (via _cache#put_ api) and then do sql insert.
Code example:

 

{{try (Ignite ignite = Ignition.start(new IgniteConfiguration())) \{

    LinkedHashMap<String, String> fields = new LinkedHashMap<>();
    fields.put("A", "java.lang.String");
    fields.put("B", "java.lang.String");
    fields.put("C", "java.lang.String");

    Set<String> keyFields = new LinkedHashSet<>();
    keyFields.add("A");
    keyFields.add("B");

    CacheConfiguration<Object, Object> cacheConfiguration = new 
CacheConfiguration<>()
            .setName("JOINDATACACHE")
            .setKeyConfiguration(new CacheKeyConfiguration()
                    .setTypeName("BinaryPojoKey")
                    .setAffinityKeyFieldName("B"))
            .setQueryEntities(Collections.singleton(new QueryEntity()
                    .setTableName("JOINDATACACHE")
                    .setKeyType("BinaryPojoKey")
                    .setValueType("BinaryPojoValue")
                    .setFields(fields)
                    .setKeyFields(keyFields)));

    IgniteCache<Object, Object> cache = 
ignite.getOrCreateCache(cacheConfiguration);

    // putBinary
    BinaryObjectBuilder keyBuilder = ignite.binary().builder("BinaryPojoKey");
    keyBuilder.setField("B", "B_VAL", String.class);
    keyBuilder.setField("A", "A_VAL", String.class);

    BinaryObjectBuilder valueBuilder = 
ignite.binary().builder("BinaryPojoValue");
    valueBuilder.setField("C", "C_VAL", String.class);

    cache.withKeepBinary().put(keyBuilder.build(), valueBuilder.build());

    // putSql
    cache.query(new SqlFieldsQuery("INSERT INTO JOINDATACACHE (A, B, C) VALUES 
('A_VAL_1', 'B_VAL_1', 'C_VAL_1')"));
}}}

Code in 37 with sql insertion line produce exception:

 

  was:
Problem: when binary object key placed in cache, ignite cant declare affinity 
key.

TODO: At first cache put of binary object key needed to call of 
org.apache.ignite.internal.processors.cache.GridCacheContex#prepareAffinityField


> Possibility of declaring affinity key fields for binary object cache key
> ------------------------------------------------------------------------
>
>                 Key: IGNITE-16186
>                 URL: https://issues.apache.org/jira/browse/IGNITE-16186
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Andrey Belyaev
>            Assignee: Andrey Belyaev
>            Priority: Major
>
> When creating ignite cache, you can set parameter _CacheKeyConfiguration_ in 
> _CacheConfiguration_ and specify there binary type and affinity field which 
> will be used for placing data through partitions.
> But there is a problem with such configuring. The information about affinity 
> is out of binary context, i.e. affinity field is missing for specified key 
> type.
> This situation can be partly corrected by setting same config in 
> {_}IgniteConfiguration#setCacheKeyConfiguration(){_}. Then binary type to 
> affinity field binding information explictly places in binary context map at 
> grid startup. Unfortunately, this method doesn't help for runtime created 
> caches.
> This problem with binary context can produce issue if you first put in cache 
> binary object (via _cache#put_ api) and then do sql insert.
> Code example:
>  
> {{try (Ignite ignite = Ignition.start(new IgniteConfiguration())) \{
>     LinkedHashMap<String, String> fields = new LinkedHashMap<>();
>     fields.put("A", "java.lang.String");
>     fields.put("B", "java.lang.String");
>     fields.put("C", "java.lang.String");
>     Set<String> keyFields = new LinkedHashSet<>();
>     keyFields.add("A");
>     keyFields.add("B");
>     CacheConfiguration<Object, Object> cacheConfiguration = new 
> CacheConfiguration<>()
>             .setName("JOINDATACACHE")
>             .setKeyConfiguration(new CacheKeyConfiguration()
>                     .setTypeName("BinaryPojoKey")
>                     .setAffinityKeyFieldName("B"))
>             .setQueryEntities(Collections.singleton(new QueryEntity()
>                     .setTableName("JOINDATACACHE")
>                     .setKeyType("BinaryPojoKey")
>                     .setValueType("BinaryPojoValue")
>                     .setFields(fields)
>                     .setKeyFields(keyFields)));
>     IgniteCache<Object, Object> cache = 
> ignite.getOrCreateCache(cacheConfiguration);
>     // putBinary
>     BinaryObjectBuilder keyBuilder = ignite.binary().builder("BinaryPojoKey");
>     keyBuilder.setField("B", "B_VAL", String.class);
>     keyBuilder.setField("A", "A_VAL", String.class);
>     BinaryObjectBuilder valueBuilder = 
> ignite.binary().builder("BinaryPojoValue");
>     valueBuilder.setField("C", "C_VAL", String.class);
>     cache.withKeepBinary().put(keyBuilder.build(), valueBuilder.build());
>     // putSql
>     cache.query(new SqlFieldsQuery("INSERT INTO JOINDATACACHE (A, B, C) 
> VALUES ('A_VAL_1', 'B_VAL_1', 'C_VAL_1')"));
> }}}
> Code in 37 with sql insertion line produce exception:
>  



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to