You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Andrey Gura (JIRA)" <ji...@apache.org> on 2018/04/18 12:44:00 UTC

[jira] [Updated] (IGNITE-6500) POJO fields of java wrapper type are not retaining null values from Cassandra persistent store, while using ignite's CassandraCacheStoreFactory

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

Andrey Gura updated IGNITE-6500:
--------------------------------
    Fix Version/s:     (was: 2.5)
                   2.6

> POJO fields of java wrapper type are not retaining null values from Cassandra persistent store, while using ignite's CassandraCacheStoreFactory
> -----------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-6500
>                 URL: https://issues.apache.org/jira/browse/IGNITE-6500
>             Project: Ignite
>          Issue Type: Bug
>          Components: cassandra
>    Affects Versions: 2.1
>            Reporter: Yashasvi Kotamraju
>            Assignee: Yashasvi Kotamraju
>            Priority: Minor
>              Labels: patch
>             Fix For: 2.6
>
>
> While using  ignite's CassandraCacheStoreFactory(part of ignite-cassandra-store.jar) as cacheStoreFactory for a cache, if a POJO field is of wrapper class type, and the column value mapped in Cassandra persistent store is null then the POJO field is getting set to default primitive type instead of null.
> For Example: Assume a table 'person' in a Cassandra persistent store with the following structure and data.
> *table person:*
> *column*    person_no(int)    phno(text)         address(text)      age(int)      name(text)   
> *data*         1                         12353               null                      null            yash 
> person_no is the PRIMARY_KEY.
> This table is mapped to person POJO  for ignite cache.
> public class person{
> 	private int person_no;
> 	private String name;
> 	private Integer age=null;
> 	private String phno;
> 	private String address;
>         .....getters and setters etc......
> }
> Now we load the row from Cassandra into ignite cache using cache.get(1) or cache.load(..) And we are using ignite's CassandraCacheStoreFactory for this cache.
> Let person p1 = cache.get(1);
> now p1.getName returns "yash", p1.getAddress returns null.
> But  p1.getAge returns 0 instead of null. It is expected null value since the value is null in Cassandra persistent store.
> Hence if the value is 0 for the age field there is no way differentiate if it was null or it was actually 0. The similar problem exists for other wrapper types -> Long, Float, Double, Boolean.
> This problem cause is as follows. 
> In org.apache.ignite.cache.store.cassandra.persistence.PojoField.setValueFromRow(..) method first the Cassandra field value is obtained by using the method PropertyMappingHelper.getCassandraColumnValue(..). This method calls DataStax Driver methods Row.getInt() or Row.getFloat() or Row.getDouble() etc.. depending upon the column. This value obtained from this method is then set to the respective POJO field. But According to Datastax documentation getInt returns 0 if column value is null and similarly getLong returns 0L , getDouble return 0.0 etc. Hence PropertyMappingHelper. getCassandraColumnValue returns 0 or 0L or 0.0 or false even if the value is null. And then this value is set to the wrapper type POJO fields. The problem only persists with the primitive data types in Cassandra mapped to wrapper type fields in POJO. For other types like String , Date etc.. the null values are retained in the POJO fields. 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)