blob: 369a261c100a6f77e3e21128ea998e1e4c4201fc [file] [log] [blame]
~~ Licensed to the Apache Software Foundation (ASF) under one or more
~~ contributor license agreements. See the NOTICE file distributed with
~~ this work for additional information regarding copyright ownership.
~~ The ASF licenses this file to You under the Apache License, Version 2.0
~~ (the "License"); you may not use this file except in compliance with
~~ the License. You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing, software
~~ distributed under the License is distributed on an "AS IS" BASIS,
~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~~ See the License for the specific language governing permissions and
~~ limitations under the License.
JSONiq Data Model Example
*Byte Array Break Down
Every JSONiq document in VXQuery is stored in memory as one continuous array of
bytes. Pointables are used to refer to these bytes in the memory.
This document covers VXQuery's representation of all the different types of
json-items of a JSONiq document. As a result, we use a lots of pointables
(same and different) through out the document.
Refer to the following link for details on the various pointables used:
{{{http://vxquery.apache.org/development_xml_node_details.html} XML Node Details }}.
**JSONiq Document
We use the following JSONiq document as an example to explain VXQuery's json-item
types. The different json-item types are Array Pointable (AP) and
Object Pointable (OP).
---
{
"book":{
"isbn":"0812416139",
"title":"XQuery Kick Start",
"year":2005,
"category":null,
"authors":["James McGovern", "James Linn"]
}
}
---
** {Bytes}
Following are the bytes for the JSONiq document above. Elements in VXQuery are
accessed using Tagged Value Pointables. Similarly, the JSONiq document is also
accessed using a Tagged Value Pointable. The first byte is represents the
value tag. It indicates the type of the bytes that follow.
*** <<<109, 0, 0, 0, 1, 0, 0, 0, -101, 0, 4, 98, 111, 111, 107, 109, 0, 0, 0, 5, 0, 0, 0, 19, 0, 0, 0, 46, 0, 0, 0, 61, 0, 0, 0, 72, 0, 0, 0, 124, 0, 4, 105, 115, 98, 110, 4, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 5, 116, 105, 116, 108, 101, 4, 0, 17, 88, 81, 117, 101, 114, 121, 32, 75, 105, 99, 107, 32, 83, 116, 97, 114, 116, 0, 4, 121, 101, 97, 114, 25, 0, 0, 0, 0, 0, 0, 7, -43, 0, 8, 99, 97, 116, 101, 103, 111, 114, 52, 0, 7, 97, 117, 116, 104, 111, 114, 115, 108, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 30, 4, 0, 14, 74, 97, 109, 101, 115, 32, 77, 99, 71, 111, 118, 101, 114, 110, 4, 0, 10, 74, 97, 109, 101, 115, 32, 76, 105, 110, 110>>>
=========================================================================
** {Object}
<<<109>>> The first byte as described above is the value tag for Object
Pointable.
The rest of the bytes represent an Object Pointable. Refer to this link
to view the {{Bytes}} for the Object Pointable(OP).
Following are the bytes and contents of the Object Pointable for this JSONiq
document.
<<< 0, 0, 0, 1 >>> These 4 bytes represent the
number of key-value pairs in the object which is <<1>>
<<< 0, 0, 0, -101 >>> These 4 bytes represent the
offset for the key-value pair in the object which is <<-101>>
Following is the key in the object followed by the value of the key. Each key is a StringPointable and the value of the key will be the respective Pointable starting with its Value Tag. The byte array break down is explained in details further ahead.
*** <<<0, 4, 98, 111, 111, 107, 109, 0, 0, 0, 5, 0, 0, 0, 19, 0, 0, 0, 46, 0, 0, 0, 61, 0, 0, 0, 72, 0, 0, 0, 124, 0, 4, 105, 115, 98, 110, 4, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 5, 116, 105, 116, 108, 101, 4, 0, 17, 88, 81, 117, 101, 114, 121, 32, 75, 105, 99, 107, 32, 83, 116, 97, 114, 116, 0, 4, 121, 101, 97, 114, 25, 0, 0, 0, 0, 0, 0, 7, -43, 0, 8, 99, 97, 116, 101, 103, 111, 114, 121, 52, 0, 7, 97, 117, 116, 104, 111, 114, 115, 108, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 30, 4, 0, 14, 74, 97, 109, 101, 115, 32, 77, 99, 71, 111, 118, 101, 114, 110, 4, 0, 10, 74, 97, 109, 101, 115, 32, 76, 105, 110, 110>>>
The size of the string is <<4>>. The string value is <<book>>. The value of the key is an Object.
Object in OP(value):
In this OP, the value is again an Object Pointable
(OP) ({{OP:0}}). <<109>> is the <Value Tag> for Object Pointable.
Following are the byte contents for the Object Pointable
({{OP:0}}). The byte array break down is explained further ahead.
*** <<<109, 0, 0, 0, 5, 0, 0, 0, 19, 0, 0, 0, 46, 0, 0, 0, 61, 0, 0, 0, 72, 0, 0, 0, 124, 0, 4, 105, 115, 98, 110, 4, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 5, 116, 105, 116, 108, 101, 4, 0, 17, 88, 81, 117, 101, 114, 121, 32, 75, 105, 99, 107, 32, 83, 116, 97, 114, 116, 0, 4, 121, 101, 97, 114, 25, 0, 0, 0, 0, 0, 0, 7, -43, 0, 8, 99, 97, 116, 101, 103, 111, 114, 121, 52, 0, 7, 97, 117, 116, 104, 111, 114, 115, 108, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 30, 4, 0, 14, 74, 97, 109, 101, 115, 32, 77, 99, 71, 111, 118, 101, 114, 110, 4, 0, 10, 74, 97, 109, 101, 115, 32, 76, 105, 110, 110>>>
=========================================================================
** Object ({OP:0})
This child is contained in the parent {{Object}}.
Byte Array for Object (OP:0)
*** <<<109, 0, 0, 0, 5, 0, 0, 0, 19, 0, 0, 0, 46, 0, 0, 0, 61, 0, 0, 0, 72, 0, 0, 0, 124, 0, 4, 105, 115, 98, 110, 4, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 5, 116, 105, 116, 108, 101, 4, 0, 17, 88, 81, 117, 101, 114, 121, 32, 75, 105, 99, 107, 32, 83, 116, 97, 114, 116, 0, 4, 121, 101, 97, 114, 25, 0, 0, 0, 0, 0, 0, 7, -43, 0, 8, 99, 97, 116, 101, 103, 111, 114, 121, 52, 0, 7, 97, 117, 116, 104, 111, 114, 115, 108, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 30, 4, 0, 14, 74, 97, 109, 101, 115, 32, 77, 99, 71, 111, 118, 101, 114, 110, 4, 0, 10, 74, 97, 109, 101, 115, 32, 76, 105, 110, 110>>>
<<<109>>> is the value tag for the Object Pointable.
Following are the bytes and contents of the Object Pointable.
<<< 0, 0, 0, 5 >>> These 4 bytes represent the
number of key-value pairs in the object which is <<5>>.
Following are the bytes that represent the offsets of the three key-value pairs.
<<< 0, 0, 0, 19 >>> The offset for the key <<isbn>>.
<<< 0, 0, 0, 46 >>> The offset for the key <<title>>.
<<< 0, 0, 0, 61 >>> The offset for the key <<year>>.
<<< 0, 0, 0, 72 >>> The offset for the key <<category>>.
<<< 0, 0, 0, 124 >>> The offset for the key <<authors>>.
As above, the following bytes represent the three key-value pairs inside the Object.
<<<0, 4, 105, 115, 98, 110, 4, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57>>>
The size of the string is <<4>>. The string value is <<isbn>>. The String Pointable is followed by a String Pointable.
The Value Tag of it is <<4>>. Its size is <<10>>. Its value is <<0812416139>>.
<<<0, 5, 116, 105, 116, 108, 101, 4, 0, 17, 88, 81, 117, 101, 114, 121, 32, 75, 105, 99, 107, 32, 83, 116, 97, 114, 116>>>
The size of the string is <<5>>. The string value is <<title>>. The String Pointable is followed by a String Pointable.
Its Value Tag is <<4>>. Its size is <<17>>. Its value is <<XQuery Kick Start>>.
<<<0, 4, 121, 101, 97, 114, 25, 0, 0, 0, 0, 0, 0, 7, -43>>>
The size of the string is <<4>>. The string value is <<year>>. The String Pointable is followed by a Long Pointalbe.
Its Value Tag is <<25>>. Its value is <<2005>>.
<<<0, 8, 99, 97, 116, 101, 103, 111, 114, 121, 52>>>
The size of the string is <<8>>. The string value is <<category>>. The String Pointable is followed by a NULL Pointable.
Its Value Tag is <<52>>. Its value is <<null>>.
<<<0, 7, 97, 117, 116, 104, 111, 114, 115, 108, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 30, 4, 0, 14, 74, 97, 109, 101, 115, 32, 77, 99, 71, 111, 118, 101, 114, 110, 4, 0, 10, 74, 97, 109, 101, 115, 32, 76, 105, 110, 110>>>
The size of the string is <<7>>. The string value is <<authors>>. The String Pointable is followed by an Array Pointable.
The byte array break down of the Array Pointable ({{AP}}) is explained further ahead.
================================================================
** Array ({AP})
This child is contained in the parent Object ({{OP:0}}).
Byte Array for Array AP
*** <<<108, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 30, 4, 0, 14, 74, 97, 109, 101, 115, 32, 77, 99, 71, 111, 118, 101, 114, 110, 4, 0, 10, 74, 97, 109, 101, 115, 32, 76, 105, 110, 110>>>
<<<108>>> is the value tag for Array Pointable.
Following are the bytes and contents of the Array Pointable.
<<<0, 0, 0, 2>>> The number of items in the array which is <<2>>.
<<<0, 0, 0, 17>>> The offset of the first item which is <<17>>.
<<<0, 0, 0, 30>>> The offset of the second item which is <<30>>.
Following are the byte contents for each of the two items of the array.
<<<4, 0, 14, 74, 97, 109, 101, 115, 32, 77, 99, 71, 111, 118, 101, 114, 110>>>.
The first item is a String Pointable with value tag <<4>>. The size of the string is <<14>>. The value of the string is <<James McGovern>>.
<<<4, 0, 10, 74, 97, 109, 101, 115, 32, 76, 105, 110, 110>>>.
The second item is a String Pointable with value tag <<4>>. The size of the string is <<10>>. The value of the string is <<James Linn>>.
================================================================