aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/tests/s-expressions/suites/MultiIO
diff options
context:
space:
mode:
authorMaxim Yurchuk <maxim-yurchuk@ydb.tech>2024-11-20 17:37:57 +0000
committerGitHub <noreply@github.com>2024-11-20 17:37:57 +0000
commitf76323e9b295c15751e51e3443aa47a36bee8023 (patch)
tree4113c8cad473a33e0f746966e0cf087252fa1d7a /yql/essentials/tests/s-expressions/suites/MultiIO
parent753ecb8d410a4cb459c26f3a0082fb2d1724fe63 (diff)
parenta7b9a6afea2a9d7a7bfac4c5eb4c1a8e60adb9e6 (diff)
downloadydb-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')
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/LMapWithMultiIn.yql42
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/LMapWithMultiOut.yql43
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/MapOverDemux.yql45
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverMap.yql35
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverMixed.yql35
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/MuxOverRead.yql27
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/OrderedPartitionByKeyWithMultiOut.yql56
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/PartitionByKeyWithMultiOut.yql56
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts1.yql39
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts2.yql39
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/SuppressOuts3.yql43
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/WriteOverDemux.yql40
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/default.cfg5
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/input1.txt10
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/input1.txt.attr11
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/input2.txt4
-rw-r--r--yql/essentials/tests/s-expressions/suites/MultiIO/input2.txt.attr30
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