tuple: make update operation tokens consumable
There is a case: [1][2][3][4] = 100. It is not a problem when it is a single operation, not intersecting with anything. It is an isolated update then, and works ok. But the next patch allows several update operations have the same prefix, and the path [1][2][3][4] can become a tree of updated arrays. For example, a trivial tree like this: root: [ [1] ] | [ [1] [2] ] | [ [1] [2] [3] ] | [ [1] [2] [3] [4] ] =100 When the update is applied to root, the JSON path [1][2][3][4] is decoded one part by one. And the operation goes down the tree until reaches the leaf, where [4] = 100 is applied. Each time when the update goes one level down, somebody should update xrow_update_op.field_no so as on the first level it would be 1, then 2, 3, 4. Does it mean that each level of the update [1][2][3][4] should prepare field_no for the next child? No, because then they would need to check type of the child if it is an array or map, or whatever expects a valid field_no/key in xrow_update_op, and ensure that map-child gets a key, array-child gets a field_no. That would complicate the code to a totally unreadable state, and would break encapsulation between xrow_update_array/map/bar... . Each array update operation would check a child for all existing types to ensure that the next token matches it. The same would happen to map updates. This patch goes another way - let each level of update check if its field_no/key is already prepared by the caller. And if not, extract a next token from the operation path. So the map update will ensure that it has a valid key, an array update will ensure that it has a valid field no. Part of #1261
Loading
Please register or sign in to comment