Skip to content

Commit de3584a

Browse files
committed
YQL-18053: Implement type annotation phase for BlockAsStruct
1 parent 5d2d74b commit de3584a

File tree

4 files changed

+39
-1
lines changed

4 files changed

+39
-1
lines changed

ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5570,7 +5570,7 @@ bool CollectBlockRewrites(const TMultiExprType* multiInputType, bool keepInputCo
55705570
std::string_view arrowFunctionName;
55715571
const bool rewriteAsIs = node->IsCallable({"AssumeStrict", "AssumeNonStrict", "Likely"});
55725572
if (node->IsList() || rewriteAsIs ||
5573-
node->IsCallable({"And", "Or", "Xor", "Not", "Coalesce", "Exists", "If", "Just", "Member", "Nth", "ToPg", "FromPg", "PgResolvedCall", "PgResolvedOp"}))
5573+
node->IsCallable({"And", "Or", "Xor", "Not", "Coalesce", "Exists", "If", "Just", "AsStruct", "Member", "Nth", "ToPg", "FromPg", "PgResolvedCall", "PgResolvedOp"}))
55745574
{
55755575
if (node->IsCallable() && !IsSupportedAsBlockType(node->Pos(), *node->GetTypeAnn(), ctx, types)) {
55765576
return true;

ydb/library/yql/core/type_ann/type_ann_blocks.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,42 @@ IGraphTransformer::TStatus BlockJustWrapper(const TExprNode::TPtr& input, TExprN
400400
return IGraphTransformer::TStatus::Ok;
401401
}
402402

403+
IGraphTransformer::TStatus BlockAsStructWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) {
404+
Y_UNUSED(output);
405+
if (!EnsureMinArgsCount(*input, 1, ctx.Expr)) {
406+
return IGraphTransformer::TStatus::Error;
407+
}
408+
409+
TVector<const TItemExprType*> members;
410+
bool onlyScalars = true;
411+
for (auto& child : input->Children()) {
412+
auto nameNode = child->Child(0);
413+
if (!EnsureAtom(*nameNode, ctx.Expr)) {
414+
return IGraphTransformer::TStatus::Error;
415+
}
416+
auto valueNode = child->Child(1);
417+
if (!EnsureBlockOrScalarType(*valueNode, ctx.Expr)) {
418+
return IGraphTransformer::TStatus::Error;
419+
}
420+
421+
bool isScalar;
422+
const TTypeAnnotationNode* blockItemType = GetBlockItemType(*valueNode->GetTypeAnn(), isScalar);
423+
424+
onlyScalars = onlyScalars && isScalar;
425+
members.push_back(ctx.Expr.MakeType<TItemExprType>(nameNode->Content(), blockItemType));
426+
}
427+
428+
const TTypeAnnotationNode* resultType = ctx.Expr.MakeType<TStructExprType>(members);
429+
430+
if (onlyScalars) {
431+
resultType = ctx.Expr.MakeType<TScalarExprType>(resultType);
432+
} else {
433+
resultType = ctx.Expr.MakeType<TBlockExprType>(resultType);
434+
}
435+
input->SetTypeAnn(resultType);
436+
return IGraphTransformer::TStatus::Ok;
437+
}
438+
403439
IGraphTransformer::TStatus BlockAsTupleWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) {
404440
Y_UNUSED(output);
405441
if (!EnsureMinArgsCount(*input, 1, ctx.Expr)) {

ydb/library/yql/core/type_ann/type_ann_blocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace NTypeAnnImpl {
1818
IGraphTransformer::TStatus BlockLogicalWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
1919
IGraphTransformer::TStatus BlockIfWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
2020
IGraphTransformer::TStatus BlockJustWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
21+
IGraphTransformer::TStatus BlockAsStructWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
2122
IGraphTransformer::TStatus BlockAsTupleWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
2223
IGraphTransformer::TStatus BlockNthWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
2324
IGraphTransformer::TStatus BlockMemberWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);

ydb/library/yql/core/type_ann/type_ann_core.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12286,6 +12286,7 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
1228612286
Functions["BlockNot"] = &BlockLogicalWrapper;
1228712287
Functions["BlockIf"] = &BlockIfWrapper;
1228812288
Functions["BlockJust"] = &BlockJustWrapper;
12289+
Functions["BlockAsStruct"] = &BlockAsStructWrapper;
1228912290
Functions["BlockAsTuple"] = &BlockAsTupleWrapper;
1229012291
Functions["BlockMember"] = &BlockMemberWrapper;
1229112292
Functions["BlockNth"] = &BlockNthWrapper;

0 commit comments

Comments
 (0)