Skip to content

Updating nested maps raises TypeError [JIRA: CLIENTS-349] #401

@nrvnrvn

Description

@nrvnrvn
In [8]: from riak import RiakClient
In [9]: c = RiakClient()
In [14]: b = c.bucket_type('maps').bucket('wow')                                                        
In [15]: m = b.get('key')
In [16]: m.maps['such'].counters['very'].increment(0)
In [17]: m.to_op()
Out[17]: [('update', ('such', 'map'), None)]
In [18]: m.update()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-4208fc8f76fe> in <module>()
----> 1 m.update()

/lib/python3.4/site-packages/riak/datatypes/datatype.py in update(self, **params)
    143 
    144         params.setdefault('return_body', True)
--> 145         self.bucket._client.update_datatype(self, **params)
    146         self.clear()
    147 

/lib/python3.4/site-packages/riak/client/operations.py in update_datatype(self, datatype, w, dw, pw, return_body, timeout, include_context)
    999                                              return_body=return_body,
   1000                                              timeout=timeout,
-> 1001                                              include_context=include_context)
   1002 
   1003     @retryable

/lib/python3.4/site-packages/riak/transports/pbc/transport.py in update_datatype(self, datatype, **options)
    687         self._encode_dt_options(req, options)
    688 
--> 689         self._encode_dt_op(type_name, req, op)
    690 
    691         msg_code, resp = self._request(MSG_CODE_DT_UPDATE_REQ, req,

/lib/python3.4/site-packages/riak/transports/pbc/codec.py in _encode_dt_op(self, dtype, req, op)
    578             self._encode_set_op(req.op, op)
    579         elif dtype == 'map':
--> 580             self._encode_map_op(req.op.map_op, op)
    581         else:
    582             raise TypeError("Cannot send operation on datatype {!r}".

/lib/python3.4/site-packages/riak/transports/pbc/codec.py in _encode_map_op(self, msg, ops)
    605                 update.field.name = str_to_bytes(name)
    606                 update.field.type = ftype
--> 607                 self._encode_map_update(dtype, update, op[2])
    608 
    609     def _encode_map_update(self, dtype, msg, op):

/lib/python3.4/site-packages/riak/transports/pbc/codec.py in _encode_map_update(self, dtype, msg, op)
    614             self._encode_set_op(msg, op)
    615         elif dtype == 'map':
--> 616             self._encode_map_op(msg.map_op, op)
    617         elif dtype == 'register':
    618             # ('assign', some_str)

/lib/python3.4/site-packages/riak/transports/pbc/codec.py in _encode_map_op(self, msg, ops)
    590 
    591     def _encode_map_op(self, msg, ops):
--> 592         for op in ops:
    593             name, dtype = op[1]
    594             ftype = MAP_FIELD_TYPES[dtype]

TypeError: 'NoneType' object is not iterable

In [19]: m.modified
Out[19]: True

modified and to_op() must be None.

Furthermore, just triggering empty m.maps['blabla'].counters['blablabla'].value changes state of m to modified. It is a get operation and get operations are idempotent and must not change the state of the underlying object.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions