blob: 66117895443c414b37a1a6cdadf5058c9105c993 [file] [log] [blame]
ToineSiebelink98c07872021-04-20 17:33:09 +01001.. This work is licensed under a Creative Commons Attribution 4.0 International License.
2.. http://creativecommons.org/licenses/by/4.0
danielhanrahane05a59a2023-06-23 14:37:12 +01003.. Copyright (C) 2021-2023 Nordix Foundation
Rudrangi Anupriyac58a0f42023-04-25 13:13:16 +05304.. Modifications Copyright (C) 2023 TechMahindra Ltd
ToineSiebelink98c07872021-04-20 17:33:09 +01005
6.. DO NOT CHANGE THIS LABEL FOR RELEASE NOTES - EVEN THOUGH IT GIVES A WARNING
emacleeb176de22022-08-31 15:53:10 +01007.. _path:
ToineSiebelink98c07872021-04-20 17:33:09 +01008
9
10CPS Path
11########
12
13.. toctree::
14 :maxdepth: 1
15
16Introduction
17============
18
ToineSiebelinkf0527c52021-07-06 13:03:03 +010019Several CPS APIs use the CPS path (or cpsPath in Java API) parameter.
20The CPS path parameter is used for querying xpaths. CPS path is inspired by the `XML Path Language (XPath) 3.1. <https://www.w3.org/TR/2017/REC-xpath-31-20170321/>`_
ToineSiebelink98c07872021-04-20 17:33:09 +010021
22This section describes the functionality currently supported by CPS Path.
23
Lathishb3550f12022-03-15 12:03:53 +000024Sample Yang Model
25=================
ToineSiebelink98c07872021-04-20 17:33:09 +010026
Lathishb3550f12022-03-15 12:03:53 +000027.. code-block::
28
29 module stores {
30 yang-version 1.1;
31 namespace "org:onap:ccsdk:sample";
32
33 prefix book-store;
34
35 revision "2020-09-15" {
36 description
37 "Sample Model";
38 }
39 container shops {
40
41 container bookstore {
42
43 leaf bookstore-name {
44 type string;
45 }
46
47 leaf name {
48 type string;
49 }
50
51 list categories {
52
53 key "code";
54
55 leaf code {
56 type uint16;
57 }
58
59 leaf name {
60 type string;
61 }
62
63 leaf numberOfBooks {
64 type uint16;
65 }
66
67 container books {
68
69 list book {
70 key title;
71
72 leaf title {
73 type string;
74 }
75 leaf price {
76 type uint16;
77 }
78 leaf-list label {
79 type string;
80 }
81 leaf-list edition {
82 type string;
83 }
84 }
85 }
86 }
87 }
88 }
89 }
90
91**Note.** 'categories' is a Yang List and 'code' is its key leaf. All other data nodes are Yang Containers. 'label' and 'edition' are both leaf-lists.
92
93**Note.** CPS accepts only json data. The xml data presented here is for illustration purposes only.
94
95The json and xml below describes some basic data to be used to illustrate the CPS Path functionality.
96
97Sample Data in Json
98===================
99
100.. code-block:: json
101
102 {
103 "shops": {
104 "bookstore": {
105 "bookstore-name": "Chapters",
106 "name": "Chapters",
107 "categories": [
108 {
109 "code": 1,
110 "name": "SciFi",
111 "numberOfBooks": 2,
112 "books": {
113 "book": [
114 {
115 "title": "2001: A Space Odyssey",
116 "price": 5,
117 "label": ["sale", "classic"],
118 "edition": ["1968", "2018"]
119 },
120 {
121 "title": "Dune",
122 "price": 5,
123 "label": ["classic"],
124 "edition": ["1965"]
125 }
126 ]
127 }
128 },
129 {
130 "code": 2,
131 "name": "Kids",
132 "numberOfBooks": 1,
133 "books": {
134 "book": [
135 {
136 "title": "Matilda"
137 }
138 ]
139 }
140 }
141 ]
142 }
143 }
144 }
145
146Sample Data in XML
147==================
ToineSiebelink98c07872021-04-20 17:33:09 +0100148
149.. code-block:: xml
150
151 <shops>
152 <bookstore name="Chapters">
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100153 <bookstore-name>Chapters</bookstore-name>
Lathishb3550f12022-03-15 12:03:53 +0000154 <categories code=1 name="SciFi" numberOfBooks="2">
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100155 <books>
156 <book title="2001: A Space Odyssey" price="5">
157 <label>sale</label>
158 <label>classic</label>
159 <edition>1968</edition>
160 <edition>2018</edition>
161 </book>
162 <book title="Dune" price="5">
163 <label>classic</label>
164 <edition>1965</edition>
165 </book>
166 </books>
167 </categories>
Lathishb3550f12022-03-15 12:03:53 +0000168 <categories code=2 name="Kids" numberOfBooks="1">
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100169 <books>
170 <book title="Matilda" />
171 </books>
172 </categories>
ToineSiebelink98c07872021-04-20 17:33:09 +0100173 </bookstore>
174 </shops>
175
ToineSiebelink98c07872021-04-20 17:33:09 +0100176General Notes
177=============
178
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100179- String values must be wrapped in quotation marks ``"`` (U+0022) or apostrophes ``'`` (U+0027).
danielhanrahan74a47152023-06-28 12:55:20 +0100180- Quotations marks and apostrophes can be escaped by doubling them in their respective quotes, for example ``'CPS ''Path'' Query' -> CPS 'Path' Query``
ToineSiebelink98c07872021-04-20 17:33:09 +0100181- String comparisons are case sensitive.
182
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100183Query Syntax
184============
ToineSiebelink98c07872021-04-20 17:33:09 +0100185
Rudrangi Anupriya94b5c8a2023-04-27 12:04:52 +0530186``( <absolute-path> | <descendant-path> ) [ <leaf-conditions> ] [ <text()-condition> ] [ <contains()-condition> ] [ <ancestor-axis> ]``
ToineSiebelink98c07872021-04-20 17:33:09 +0100187
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100188Each CPS path expression need to start with an 'absolute' or 'descendant' xpath.
189
190absolute-path
191-------------
192
193**Syntax**: ``'/' <container-name> ( '[' <list-key> ']' )? ( '/' <containerName> ( '[' <list-key> ']' )? )*``
194
195 - ``container name``: Any yang container or list.
196 - ``list-key``: One or more key-value pairs, each preceded by the ``@`` symbol, combined using the ``and`` keyword.
197 - The above van repeated any number of times.
198
199**Examples**
200 - ``/shops/bookstore``
Lathishb3550f12022-03-15 12:03:53 +0000201 - ``/shops/bookstore/categories[@code='1']/books``
202 - ``/shops/bookstore/categories[@code='1']/books/book[@title='2001: A Space Odyssey']``
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100203
204**Limitations**
205 - Absolute paths must start with the top element (data node) as per the model tree.
206 - Each list reference must include a valid instance reference to the key for that list. Except when it is the last element.
207
208descendant-path
209---------------
210
211**Syntax**: ``'//' <container-name> ( '[' <list-key> ']' )? ( '/' <containerName> ( '[' <list-key> ']' )? )*``
212
213 - The syntax of a descendant path is identical to a absolute path except that it is preceded by a double slash ``//``.
214
215**Examples**
216 - ``//bookstore``
Lathishb3550f12022-03-15 12:03:53 +0000217 - ``//categories[@code='1']/books``
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100218 - ``//bookstore/categories``
219
220**Limitations**
221 - Each list reference must include a valid instance reference to the key for that list. Except when it is the last element.
222
223leaf-conditions
224---------------
225
Rudrangi Anupriyab622c582023-05-31 21:33:32 +0530226**Syntax**: ``<xpath> '[' @<leaf-name1> '(=|>|<|>=|<=)' <leaf-value1> ( ' <and|or> ' @<leaf-name> '(=|>|<|>=|<=)' <leaf-value> )* ']'``
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100227 - ``xpath``: Absolute or descendant or xpath to the (list) node which elements will be queried.
ToineSiebelink98c07872021-04-20 17:33:09 +0100228 - ``leaf-name``: The name of the leaf which value needs to be compared.
229 - ``leaf-value``: The required value of the leaf.
230
231**Examples**
232 - ``/shops/bookstore/categories[@numberOfBooks=1]``
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100233 - ``//categories[@name="Kids"]``
234 - ``//categories[@name='Kids']``
Lathishb3550f12022-03-15 12:03:53 +0000235 - ``//categories[@code='1']/books/book[@title='Dune' and @price=5]``
Rudrangi Anupriyac58a0f42023-04-25 13:13:16 +0530236 - ``//categories[@code='1']/books/book[@title='xyz' or @price=15]``
Rudrangi Anupriyab622c582023-05-31 21:33:32 +0530237 - ``//categories[@code='1']/books/book[@title='xyz' or @price>20]``
238 - ``//categories[@code='1']/books/book[@title='Dune' and @price<=5]``
Lathisha7dc9162022-04-28 16:37:00 +0100239 - ``//categories[@code=1]``
ToineSiebelink98c07872021-04-20 17:33:09 +0100240**Limitations**
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100241 - Only the last list or container can be queried leaf values. Any ancestor list will have to be referenced by its key name-value pair(s).
Rudrangi Anupriyac58a0f42023-04-25 13:13:16 +0530242 - When mixing ``and/or`` operators, ``and`` has precedence over ``or`` . So ``and`` operators get evaluated first.
243 - Bracketing is not supported.
244 - Leaf names are not validated so ``or`` operations with invalid leaf names will silently be ignored.
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100245 - Only leaves can be used, leaf-list are not supported.
246 - Only string and integer values are supported, boolean and float values are not supported.
Rudrangi Anupriyab622c582023-05-31 21:33:32 +0530247 - Using comparative operators with string values will lead to an error at runtime. This error can't be validated earlier as the datatype is unknown until the execution phase.
Lathisha7dc9162022-04-28 16:37:00 +0100248 - The key should be supplied with correct data type for it to be queried from DB. In the last example above the attribute code is of type
249 Integer so the cps query will not work if the value is passed as string.
250 eg: ``//categories[@code="1"]`` or ``//categories[@code='1']`` will not work because the key attribute code is treated a string.
ToineSiebelink98c07872021-04-20 17:33:09 +0100251
252**Notes**
puthuparambil.aditya05316072021-04-23 12:52:09 +0100253 - For performance reasons it does not make sense to query using key leaf as attribute. If the key value is known it is better to execute a get request with the complete xpath.
ToineSiebelink98c07872021-04-20 17:33:09 +0100254
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100255text()-condition
256----------------
ToineSiebelink98c07872021-04-20 17:33:09 +0100257
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100258The text()-condition can be added to any CPS path query.
259
260**Syntax**: ``<cps-path> ( '/' <leaf-name> '[text()=' <string-value> ']' )?``
261 - ``cps-path``: Any CPS path query.
262 - ``leaf-name``: The name of the leaf or leaf-list which value needs to be compared.
263 - ``string-value``: The required value of the leaf or leaf-list element as a string wrapped in quotation marks (U+0022) or apostrophes (U+0027). This wil still match integer values.
ToineSiebelink98c07872021-04-20 17:33:09 +0100264
265**Examples**
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100266 - ``//book/label[text()="classic"]``
267 - ``//book/edition[text()="1965"]``
ToineSiebelink98c07872021-04-20 17:33:09 +0100268
269**Limitations**
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100270 - Only the last list or container can be queried for leaf values with a text() condition. Any ancestor list will have to be referenced by its key name-value pair(s).
271 - Only one leaf or leaf-list can be tested.
272 - Only string and integer values are supported, boolean and float values are not supported.
273 - Since CPS cannot return individual leaves it will always return the container with all its leaves. Ancestor-axis can be used to specify a parent higher up the tree.
274 - When querying a leaf value (instead of leaf-list) it is better, more performant to use a text value condition use @<leaf-name> as described above.
puthuparambil.adityaff714622021-04-23 11:55:24 +0100275
Rudrangi Anupriya94b5c8a2023-04-27 12:04:52 +0530276contains()-condition
277--------------------
278
279**Syntax**: ``<cps-path> '[' 'contains' '(' '<leaf-name>','<string-value>' ')' ']'?``
280 - ``cps-path``: Any CPS path query.
281 - ``leaf-name``: The name of the leaf which value needs to be compared.
282 - ``string-value``: The required value of the leaf element as a string wrapped in quotation marks (U+0022) or apostrophes (U+0027). This will still match integer values.
283
284**Examples**
285 - ``//categories[contains(@name,'Sci')]``
286 - ``//books[contains(@title,'Space')]``
287
288**Limitations**
289 - Only leaves can be used, leaf-list are not supported.
290 - Leaf names are not validated so ``contains() condition`` with invalid leaf names will silently be ignored.
291
292**Notes**
293 - contains condition is case sensitive.
294
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100295ancestor-axis
niamhcore4395c1f2021-05-05 11:42:20 +0100296-------------
297
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100298The ancestor axis can be added to any CPS path query but has to be the last part.
niamhcore4395c1f2021-05-05 11:42:20 +0100299
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100300**Syntax**: ``<cps-path> ( '/ancestor::' <ancestor-path> )?``
niamhcore4395c1f2021-05-05 11:42:20 +0100301 - ``cps-path``: Any CPS path query.
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100302 - ``ancestor-path``: Partial path to ancestors of the target node. This can contain one or more ancestor nodes separated by a ``/``.
niamhcore4395c1f2021-05-05 11:42:20 +0100303
304**Examples**
305 - ``//book/ancestor::categories``
Lathishb3550f12022-03-15 12:03:53 +0000306 - ``//categories[@code='2']/books/ancestor::bookstore``
307 - ``//book/ancestor::categories[@code='1']/books``
308 - ``//book/label[text()="classic"]/ancestor::shops``
niamhcore4395c1f2021-05-05 11:42:20 +0100309
310**Limitations**
311 - Ancestor list elements can only be addressed using the list key leaf.
ToineSiebelinkf0527c52021-07-06 13:03:03 +0100312 - List elements with compound keys are not supported.