Issues & Decisions
# | Issue | Notes | Decision |
---|---|---|---|
1 | Add or Delete leaves (optional leaves) handle as UPDATE or ADD/DELETE ? | The delta report proposed follows the Json Patch format of representing the differences between 2 json. Going by the general convention, referring RFC-6902:
| Add/Delete as per notes on the left |
2 | How to handle multiple changes at different levels? | Example:
There could be Many more complex scenarios.... Replied below | |
3 | More scenarios need to be explored and documented in detail. Such as handling arrays within a json, handling child/grandchild changes. |
CPS Delta feature Exceptions
Where ever possible the Delta Feature will throw the same exceptions as defined in CPS core. If any new exception for the delta feature are required the following will be updated here.
HTTP response codes for Delta between 2 Anchors API
The proposed API will be part of the CPS Data Interface. The following response codes will be returned by the API:
# | Sub Interface | Method | Scenario | HTTP Response codes to be implemented | Notes |
---|---|---|---|---|---|
1 | Data | Proposed API: GET-/v2/dataspaces/{dataspace-name}/anchors/{anchor-name}/delta?anchor2={anchor-name}?xpath={xpath}&descendants={descendants} Proposed method name: getDeltaByDataspaceAndAnchors() | Generate a delta report between 2 anchors in a given dataspace. |
| AnchorNotFoundException should provide the name of missing anchor from the given two anchor names. |
Request parameters:
Parameter name | In | Required | Description |
---|---|---|---|
dataspace-name | Path | Yes | Dataspace name |
anchor1 | Path | Yes | First Anchor Name/Reference Anchor |
anchor2 | Query | Yes | Second Anchor Name/Comparand Anchor |
xpath | Query | Yes | xpath of the node |
descendants | Query | No | Level of descendants for delta comparison. |
Response Body/Delta Report Format
Mechanism for Delta generation between Anchors
Additional Details
Format/Conventions to be used for Delta Report (not finalized)
There are several ways of representing the differences between JSON but here we discuss the JSON Patch format of representing these differences because the proposed Delta report closely represents JSON patch with a few differences. This approach focuses in producing another JSON document that represents the differences between the two JSON's that have been compared.
JSON Patch
JSON Patch defines a JSON document structure for expressing a sequence of operations to apply to a JavaScript Object Notation(JSON) document; it is suitable for use with the HTTP PATCH method. The "application/json-patch+json" media type is used to identify such patch documents.
But in it can also be used to get the differences between two JSON as the JSON patch document represents an array of objects. where each object represents a single operation(op), path and value.
Here the notation of operation is used as the same JSON Patch document can be used to perform HTTP Patch operations. But The operations field can be used as a reference to decide how the "action" field should function in the implementation of Delta report.
The operation "op
" field in a JSON patch document can have following values:
Operation | Description | Delta report equivalent |
---|---|---|
add | Adds the value at the target location; if the value exists in the given location, it’s replaced | if the value is not present in the source json, but was found in the comparand json, then it should be considered an "add" action |
remove | Removes the value at the target location | if a value was present at the source json, but was not found in the comparand json, then it should be considered as "delete" action |
replace | Replaces the value at the target location | if a value is present in the source json, but an updated value is present in the comparand json, then it will be considered as "update" action |
move | Removes the value at a specified location and adds it to the target location | N/A |
copy | Copies the value at a specified location to the target location | N/A |
test | Tests that a value at the target location is equal to a specified value | N/A |
Handling of Delta at multiple levels
Let's assume we have a data node having some leaf data, and this particular node happens to have multiple child nodes as well.
Now we have two basic scenarios here:
- Add/Delete/Update of leaves
- Add/Delete/Update of child nodes
Add/Delete/Update of leaves
if the leaves of a particular data node, having a unique xpath, are added/deleted/updated then it will be considered as an Update of the particular Data Node.
Add/Delete/Update of child/grandchild nodes
Now in this scenario we assume that a child/grandchild data node, having its unique xpath, has been added/deleted/updated. Then this operation should be considered as an addition/deletion/update of the particular child/grandchild data node at its particular level, rather than an update of parent node,
The reason for this being that the particular child/grandchild is in itself a unique data node and can be queried with its own xpath and hence any operation on the particular child/grandchild should be treated as an operation on the particular node rather than an operation on its parent.
Proposed Algorithm
The JSON data stored in CPS can be retrieved as Maps, And using this we can find the delta between two anchors retrieved as two separate Maps. The result can be stored in an JSON array with appropriate notations for action, xpath and payload. The following algorithm can be used to find the difference between the two maps and also recursively finds the difference between the child data nodes. The response is in form of a JSON Array which closely represents the JSON Patch format as described above.
Algorithm:
- Create an empty JSON Array, to store the result
- The JSON array will contain the following: action, xpath, payload as individual JSON objects each object representing a singular operation.
- Fetch the data from two anchors and store in two separate Maps
- Iterate over the entries of first map
- For each entry of first map, check if the key is present in second map.
- If the key is not found in second map, it means that the key-value pair has been removed from the second map. Create a JSON Object with DELETE action, the xpath to deleted node and payload. Add the Object to the JSON Array.
- If the key is present in the second map, compare the values associated with the keys in both maps.
- If the values are instance of Map, recursively call the comparision algorithm to compare all nested maps. Add all the necessary fields into a JSON object and put the object into the JSON Array
- If the values are not equal, it means the key-value pair was updated. Create a JSON Object with UPDATE action, the xpath to updated nodes and payload. Add the Object to the JSON Array.
- Iterate over the keys of second map and find the keys not present in first map. These keys were added as new entries. Create a JSON Object with ADD action, the xpath to added node and payload. Add the Object to the JSON Array.
- Return the JSON Array and the updates to Kafka events