Skip to content

Commit f9f813f

Browse files
rvu1024Kamil Khamitov
authored andcommitted
Fix StablePickle constraints for complex types
commit_hash:3d15defe18fb19d2185bd1798b181d6f30277d68
1 parent b716c4a commit f9f813f

File tree

4 files changed

+102
-1
lines changed

4 files changed

+102
-1
lines changed

yql/essentials/core/ut/yql_expr_constraint_ut.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3316,6 +3316,52 @@ Y_UNIT_TEST_SUITE(TYqlExprConstraints) {
33163316
CheckConstraint<TDistinctConstraintNode>(exprRoot, "PartitionsByKeys", "Distinct((data,group0))");
33173317
CheckConstraint<TUniqueConstraintNode>(exprRoot, "PartitionsByKeys", "Unique((data,group0))");
33183318
}
3319+
3320+
Y_UNIT_TEST(StablePickleOfComplexUnique) {
3321+
const TStringBuf s = R"(
3322+
(
3323+
(let config (DataSource 'config))
3324+
(let res_sink (DataSink 'result))
3325+
3326+
(let list (AsList
3327+
(AsStruct '('key (Uint32 '1)) '('value (Uint32 '2)))
3328+
(AsStruct '('key (Uint32 '2)) '('value (Uint32 '3)))
3329+
))
3330+
3331+
(let res (Aggregate list '('key 'value) '() '()))
3332+
(let res (Map res (lambda '(item)
3333+
(AsStruct
3334+
'('composite (AsStruct
3335+
'('k (Member item 'key))
3336+
'('v (Member item 'value))
3337+
))
3338+
'('key (Member item 'key))
3339+
'('value (Member item 'value))
3340+
)
3341+
)))
3342+
(let res (FlatMap res (lambda '(item)
3343+
(Just (AsStruct
3344+
'('packed (StablePickle (Member item 'composite)))
3345+
'('composite (Member item 'composite))
3346+
'('key (Member item 'key))
3347+
'('value (Member item 'value))
3348+
))
3349+
)))
3350+
(let world (Write! world res_sink (Key) res '('('type))))
3351+
(let world (Commit! world res_sink))
3352+
(return world)
3353+
)
3354+
)";
3355+
3356+
TExprContext exprCtx;
3357+
const auto exprRoot = ParseAndAnnotate(s, exprCtx);
3358+
CheckConstraint<TDistinctConstraintNode>(exprRoot, "StablePickle", "");
3359+
CheckConstraint<TUniqueConstraintNode>(exprRoot, "StablePickle", "");
3360+
CheckConstraint<TDistinctConstraintNode>(exprRoot, "Map", "Distinct(({composite/k,key},{composite/v,value}))");
3361+
CheckConstraint<TUniqueConstraintNode>(exprRoot, "Map", "Unique(({composite/k,key},{composite/v,value}))");
3362+
CheckConstraint<TDistinctConstraintNode>(exprRoot, "FlatMap", "Distinct(({composite/k,key},{composite/v,value}))");
3363+
CheckConstraint<TUniqueConstraintNode>(exprRoot, "FlatMap", "Unique(({composite/k,key},{composite/v,value}))");
3364+
}
33193365
}
33203366

33213367
} // namespace NYql

yql/essentials/core/yql_expr_constraint.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class TCallableConstraintTransformer : public TCallableTransformerBase<TCallable
248248
Functions["BlockMergeFinalizeHashed"] = &TCallableConstraintTransformer::AggregateWrap<true>;
249249
Functions["BlockMergeManyFinalizeHashed"] = &TCallableConstraintTransformer::AggregateWrap<true>;
250250
Functions["MultiHoppingCore"] = &TCallableConstraintTransformer::MultiHoppingCoreWrap;
251-
Functions["StablePickle"] = &TCallableConstraintTransformer::FromFirst<TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfChoppedConstraintNode, TVarIndexConstraintNode>;
251+
Functions["StablePickle"] = &TCallableConstraintTransformer::PickleWrap;
252252
Functions["Unpickle"] = &TCallableConstraintTransformer::FromSecond<TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfChoppedConstraintNode, TVarIndexConstraintNode>;
253253
}
254254

@@ -404,6 +404,14 @@ class TCallableConstraintTransformer : public TCallableTransformerBase<TCallable
404404
return FromFirst<TEmptyConstraintNode, TUniqueConstraintNode, TDistinctConstraintNode, TVarIndexConstraintNode>(input, output, ctx);
405405
}
406406

407+
TStatus PickleWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const {
408+
if (IsDataOrOptionalOfDataOrPg(input->Head().GetTypeAnn())) {
409+
TApplyConstraintFromInput<0, TPartOfChoppedConstraintNode, TPartOfUniqueConstraintNode, TPartOfDistinctConstraintNode>::Do(input);
410+
}
411+
412+
return FromFirst<TUniqueConstraintNode, TDistinctConstraintNode, TVarIndexConstraintNode>(input, output, ctx);
413+
}
414+
407415
TStatus AssumeConstraintsWrap(const TExprNode::TPtr& input, TExprNode::TPtr& /*output*/, TExprContext& ctx) const {
408416
TConstraintSet set;
409417
try {

yql/essentials/tests/s-expressions/minirun/part9/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,20 @@
321321
"uri": "https://{canondata_backend}/1937367/e77ba21bdee3073d5ac816e83de0c7af4a7daf05/resource.tar.gz#test.test_Lib-Agg_List_Compare_By_Opts-default.txt-Results_/results.txt"
322322
}
323323
],
324+
"test.test[Optimizers-EmptyOverListWithComplexUniq-default.txt-Debug]": [
325+
{
326+
"checksum": "fc513f9ab77aa25c63bb1a43467fe29c",
327+
"size": 396,
328+
"uri": "https://{canondata_backend}/995452/07ee5aca68bd02fba1bfa8356eaea86f0e5a7870/resource.tar.gz#test.test_Optimizers-EmptyOverListWithComplexUniq-default.txt-Debug_/opt.yql"
329+
}
330+
],
331+
"test.test[Optimizers-EmptyOverListWithComplexUniq-default.txt-Results]": [
332+
{
333+
"checksum": "8a557f375bf97e6adf4e8c1e40cd18c0",
334+
"size": 2123,
335+
"uri": "https://{canondata_backend}/995452/07ee5aca68bd02fba1bfa8356eaea86f0e5a7870/resource.tar.gz#test.test_Optimizers-EmptyOverListWithComplexUniq-default.txt-Results_/results.txt"
336+
}
337+
],
324338
"test.test[Optimizers-Fold1OneItemTuple-default.txt-Debug]": [
325339
{
326340
"checksum": "d92be86870a01fdf575d08165de8f8a0",
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
(
2+
(let config (DataSource 'config))
3+
(let res_sink (DataSink 'result))
4+
5+
(let list (AsList
6+
(AsStruct '('key (Uint32 '1)) '('value (Uint32 '2)))
7+
(AsStruct '('key (Uint32 '2)) '('value (Uint32 '3)))
8+
))
9+
10+
(let res (Aggregate list '('key 'value) '() '()))
11+
(let res (Map res (lambda '(item)
12+
(AsStruct
13+
'('composite (AsStruct
14+
'('k (Member item 'key))
15+
'('v (Member item 'value))
16+
))
17+
'('key (Member item 'key))
18+
'('value (Member item 'value))
19+
)
20+
)))
21+
(let res (Take res (Uint64 '0)))
22+
(let res (FlatMap res (lambda '(item)
23+
(Just (AsStruct
24+
'('packed (StablePickle (Member item 'composite)))
25+
'('composite (Member item 'composite))
26+
'('key (Member item 'key))
27+
'('value (Member item 'value))
28+
))
29+
)))
30+
(let world (Write! world res_sink (Key) res '('('type))))
31+
(let world (Commit! world res_sink))
32+
(return world)
33+
)

0 commit comments

Comments
 (0)