diff options
author | Maxim Yurchuk <maxim-yurchuk@ydb.tech> | 2024-11-20 17:37:57 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-20 17:37:57 +0000 |
commit | f76323e9b295c15751e51e3443aa47a36bee8023 (patch) | |
tree | 4113c8cad473a33e0f746966e0cf087252fa1d7a /yql/essentials/tests/s-expressions/suites/MultiIO | |
parent | 753ecb8d410a4cb459c26f3a0082fb2d1724fe63 (diff) | |
parent | a7b9a6afea2a9d7a7bfac4c5eb4c1a8e60adb9e6 (diff) | |
download | ydb-f76323e9b295c15751e51e3443aa47a36bee8023.tar.gz |
Merge pull request #11788 from ydb-platform/mergelibs-241120-1113
Library import 241120-1113
Diffstat (limited to 'yql/essentials/tests/s-expressions/suites/MultiIO')
17 files changed, 560 insertions, 0 deletions
diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/LMapWithMultiIn.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/LMapWithMultiIn.yql new file mode 100644 index 0000000000..261a85c931 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/LMapWithMultiIn.yql @@ -0,0 +1,42 @@ +( +#comment +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data1 (Right! x)) + +(let x (Read! world mr_source (Key '('table (String 'Input2))) (Void) '())) +(let world (Left! x)) +(let data2 (Right! x)) + +(let data (Mux '(data1 data2))) + +(let data (LMap data (lambda '(stream) (block '( + (return (FlatMap stream (lambda '(item) (block '( + (let res (Visit item + '0 (lambda '(item) (block '( + (let s (Struct)) + (let s (AddMember s 'key (Member item 'key))) + (let s (AddMember s 'subkey (String '0))) + (let s (AddMember s 'value (Member item 'value))) + (return s) + ))) + '1 (lambda '(item) (block '( + (let s (Struct)) + (let s (AddMember s 'key (Member item 'key))) + (let s (AddMember s 'subkey (String '1))) + (let s (AddMember s 'value (Member item 'value))) + (return s) + ))) + )) + (return (Just res)) + ))))) +))))) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) data '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/LMapWithMultiOut.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/LMapWithMultiOut.yql new file mode 100644 index 0000000000..aeefafd75f --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/LMapWithMultiOut.yql @@ -0,0 +1,43 @@ +( +#comment +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let varTuple (VariantType (TupleType + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) +))) + +(let data (LMap data (lambda '(stream) (block '( + (return (FlatMap stream (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let res + (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false)) + (Variant item '0 varTuple) + (Variant item '1 varTuple) + ) + ) + (return (Just res)) + ))))) +))))) + +(let dataTuple (Demux data)) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) (Nth dataTuple '0) '('('mode 'renew)))) +(let world (Write! world mr_sink (Key '('table (String 'Output2))) (Nth dataTuple '1) '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/MapOverDemux.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/MapOverDemux.yql new file mode 100644 index 0000000000..4697cb40ba --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/MapOverDemux.yql @@ -0,0 +1,45 @@ +( +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let varTuple (VariantType (TupleType + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) +))) + +(let data (Map data (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let res + (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false)) + (Variant item '0 varTuple) + (Variant item '1 varTuple) + ) + ) + (return res) +))))) + +(let dataTuple (Demux data)) + +(let data1 (Nth dataTuple '0)) +(let data2 (Nth dataTuple '1)) + +(let data1 (Filter data1 (lambda '(item) (Less (Member item 'key) (String '200))))) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) data1 '('('mode 'renew)))) +(let world (Write! world mr_sink (Key '('table (String 'Output2))) data2 '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverMap.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverMap.yql new file mode 100644 index 0000000000..bbceddd5da --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverMap.yql @@ -0,0 +1,35 @@ +( +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let data1 (Filter data (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let res (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false))) + (return res) +))))) + +(let data2 (Filter data (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let res (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '1)) (Bool 'false))) + (return res) +))))) + +(let data (Mux '(data1 data2))) + +(let data (Map data (lambda '(item) (block '( + (let res (Visit item + '0 (lambda '(x) x) + '1 (lambda '(x) x) + )) + (return res) +))))) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) data '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverMixed.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverMixed.yql new file mode 100644 index 0000000000..77f51cfd2b --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverMixed.yql @@ -0,0 +1,35 @@ +( +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let data1 (Filter data (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let res (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false))) + (return res) +))))) + +(let data2 (AsList + (AsStruct '('key (String 'k1)) '('subkey (String 's1)) '('value (String 'v1))) + (AsStruct '('key (String 'k2)) '('subkey (String 's2)) '('value (String 'v2))) + (AsStruct '('key (String 'k3)) '('subkey (String 's3)) '('value (String 'v3))) +)) + +(let data (Mux '(data1 data2))) + +(let data (Map data (lambda '(item) (block '( + (let res (Visit item + '0 (lambda '(x) x) + '1 (lambda '(x) x) + )) + (return res) +))))) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) data '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverRead.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverRead.yql new file mode 100644 index 0000000000..08c7c997bc --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverRead.yql @@ -0,0 +1,27 @@ +( +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data1 (Right! x)) + +(let x (Read! world mr_source (Key '('table (String 'Input2))) (Void) '())) +(let world (Left! x)) +(let data2 (Right! x)) + +(let data (Mux '(data1 data2))) + +(let data (Map data (lambda '(item) (block '( + (let res (Visit item + '0 (lambda '(x) x) + '1 (lambda '(x) x) + )) + (return res) +))))) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) data '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/OrderedPartitionByKeyWithMultiOut.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/OrderedPartitionByKeyWithMultiOut.yql new file mode 100644 index 0000000000..56ef61571a --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/OrderedPartitionByKeyWithMultiOut.yql @@ -0,0 +1,56 @@ +( +#comment +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let varTuple (VariantType (TupleType + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) +))) + +(let keySelector (lambda '(x) (Member x 'key))) +(let listHandler (lambda '(groups) (block '( + (return (Map groups (lambda '(group) (block '( + (let key (Nth group '0)) + (let stream (Nth group '1)) + + (let s (Struct)) + (let s (AddMember s 'key key)) + (let s (AddMember s 'subkey (String '.))) + (let s (AddMember s 'value (ToString (Length (ForwardList stream))))) + + (let intValue (FromString key 'Int32)) + (let res + (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false)) + (Variant s '0 varTuple) + (Variant s '1 varTuple) + ) + ) + (return res) + ))))) +)))) +(let data (PartitionByKey data keySelector (Void) (Void) listHandler)) + +(let dataTuple (Demux data)) + +(let data1 (Nth dataTuple '0)) +(let data2 (Nth dataTuple '1)) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) data1 '('('mode 'renew)))) +(let world (Write! world mr_sink (Key '('table (String 'Output2))) data2 '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/PartitionByKeyWithMultiOut.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/PartitionByKeyWithMultiOut.yql new file mode 100644 index 0000000000..bcb27c7be3 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/PartitionByKeyWithMultiOut.yql @@ -0,0 +1,56 @@ +( +#comment +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input2))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let varTuple (VariantType (TupleType + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) +))) + +(let keySelector (lambda '(x) (Member x 'key))) +(let listHandler (lambda '(groups) (block '( + (return (Map groups (lambda '(group) (block '( + (let key (Nth group '0)) + (let stream (Nth group '1)) + + (let s (Struct)) + (let s (AddMember s 'key key)) + (let s (AddMember s 'subkey (String '.))) + (let s (AddMember s 'value (ToString (Length (ForwardList stream))))) + + (let intValue (FromString key 'Int32)) + (let res + (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false)) + (Variant s '0 varTuple) + (Variant s '1 varTuple) + ) + ) + (return res) + ))))) +)))) +(let data (PartitionByKey data keySelector (Void) (Void) listHandler)) + +(let dataTuple (Demux data)) + +(let data1 (Nth dataTuple '0)) +(let data2 (Nth dataTuple '1)) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) data1 '('('mode 'renew)))) +(let world (Write! world mr_sink (Key '('table (String 'Output2))) data2 '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts1.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts1.yql new file mode 100644 index 0000000000..30fefdd2f4 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts1.yql @@ -0,0 +1,39 @@ +( +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let varTuple (VariantType (TupleType + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) +))) + +(let data (Map data (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let res + (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false)) + (Variant item '0 varTuple) + (Variant item '1 varTuple) + ) + ) + (return res) +))))) + +(let dataTuple (Demux data)) + +(let world (Write! world mr_sink (Key '('table (String 'Output2))) (Nth dataTuple '1) '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts2.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts2.yql new file mode 100644 index 0000000000..5d0c493a3d --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts2.yql @@ -0,0 +1,39 @@ +( +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let structType (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) +)) + +(let varTuple (VariantType (TupleType structType structType structType))) + +(let data (Map data (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let mod (Coalesce (% intValue (Int32 '3)) (Int32 '0))) + (let res + (If (Equal mod (Int32 '0)) + (Variant item '0 varTuple) + (If (Equal mod (Int32 '1)) + (Variant item '1 varTuple) + (Variant item '2 varTuple) + ) + ) + ) + (return res) +))))) + +(let dataTuple (Demux data)) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) (Nth dataTuple '0) '('('mode 'renew)))) +(let world (Write! world mr_sink (Key '('table (String 'Output2))) (Nth dataTuple '2) '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts3.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts3.yql new file mode 100644 index 0000000000..683fca64b4 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts3.yql @@ -0,0 +1,43 @@ +( +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let structType (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) +)) + +(let varTuple (VariantType (TupleType structType structType structType))) + +(let data (Map data (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let res + (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false)) + (Variant item '0 varTuple) + (Variant item '1 varTuple) + ) + ) + (let res + (If (Coalesce (Equal (% intValue (Int32 '3)) (Int32 '0)) (Bool 'false)) + (Variant item '2 varTuple) + res + ) + ) + (return res) +))))) + +(let dataTuple (Demux data)) + +(let res (UnionAll (Nth dataTuple '0) (Nth dataTuple '1))) + + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) res '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/WriteOverDemux.yql b/yql/essentials/tests/s-expressions/suites/MultiIO/WriteOverDemux.yql new file mode 100644 index 0000000000..ddf986949c --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/WriteOverDemux.yql @@ -0,0 +1,40 @@ +( +(let mr_source (DataSource 'yt 'plato)) +(let mr_sink (DataSink 'yt 'plato)) + +(let x (Read! world mr_source (Key '('table (String 'Input1))) (Void) '())) +(let world (Left! x)) +(let data (Right! x)) + +(let varTuple (VariantType (TupleType + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) + (StructType + '('key (DataType 'String)) + '('subkey (DataType 'String)) + '('value (DataType 'String)) + ) +))) + +(let data (Map data (lambda '(item) (block '( + (let intValue (FromString (Member item 'key) 'Int32)) + (let res + (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false)) + (Variant item '0 varTuple) + (Variant item '1 varTuple) + ) + ) + (return res) +))))) + +(let dataTuple (Demux data)) + +(let world (Write! world mr_sink (Key '('table (String 'Output1))) (Nth dataTuple '0) '('('mode 'renew)))) +(let world (Write! world mr_sink (Key '('table (String 'Output2))) (Nth dataTuple '1) '('('mode 'renew)))) + +(let world (Commit! world mr_sink)) +(return world) +) diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/default.cfg b/yql/essentials/tests/s-expressions/suites/MultiIO/default.cfg new file mode 100644 index 0000000000..d01d69e755 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/default.cfg @@ -0,0 +1,5 @@ +in Input1 input1.txt +in Input2 input2.txt +out Output1 output1.txt +out Output2 output2.txt +res result.txt diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/input1.txt b/yql/essentials/tests/s-expressions/suites/MultiIO/input1.txt new file mode 100644 index 0000000000..b214aab0d9 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/input1.txt @@ -0,0 +1,10 @@ +{"key"="023";"subkey"="3";"value"="aaa"}; +{"key"="037";"subkey"="5";"value"="ddd"}; +{"key"="075";"subkey"="1";"value"="abc"}; +{"key"="150";"subkey"="1";"value"="aaa"}; +{"key"="150";"subkey"="3";"value"="iii"}; +{"key"="150";"subkey"="8";"value"="zzz"}; +{"key"="200";"subkey"="7";"value"="qqq"}; +{"key"="527";"subkey"="4";"value"="bbb"}; +{"key"="761";"subkey"="6";"value"="ccc"}; +{"key"="911";"subkey"="2";"value"="kkk"}; diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/input1.txt.attr b/yql/essentials/tests/s-expressions/suites/MultiIO/input1.txt.attr new file mode 100644 index 0000000000..ed13e20223 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/input1.txt.attr @@ -0,0 +1,11 @@ +{"_yql_row_spec"={ + "Type"=["StructType";[ + ["key";["DataType";"String"]]; + ["subkey";["DataType";"String"]]; + ["value";["DataType";"String"]] + ]]; + "SortDirections"=[1;1;]; + "SortedBy"=["key";"subkey";]; + "SortedByTypes"=[["DataType";"String";];["DataType";"String";];]; + "SortMembers"=["key";"subkey";]; +}} diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/input2.txt b/yql/essentials/tests/s-expressions/suites/MultiIO/input2.txt new file mode 100644 index 0000000000..07af3b4647 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/input2.txt @@ -0,0 +1,4 @@ +{"key"="075";"subkey"="2";"value"="abc"}; +{"key"="800";"subkey"="2";"value"="ddd"}; +{"key"="020";"subkey"="2";"value"="q"}; +{"key"="150";"subkey"="2";"value"="qzz"}; diff --git a/yql/essentials/tests/s-expressions/suites/MultiIO/input2.txt.attr b/yql/essentials/tests/s-expressions/suites/MultiIO/input2.txt.attr new file mode 100644 index 0000000000..b6100e5fd0 --- /dev/null +++ b/yql/essentials/tests/s-expressions/suites/MultiIO/input2.txt.attr @@ -0,0 +1,30 @@ +{ + "_yql_row_spec" = { + "Type" = [ + "StructType"; + [ + [ + "key"; + [ + "DataType"; + "String" + ] + ]; + [ + "subkey"; + [ + "DataType"; + "String" + ] + ]; + [ + "value"; + [ + "DataType"; + "String" + ] + ] + ] + ] + } +}
\ No newline at end of file |