Skip to content

Commit 3d0d37a

Browse files
authored
Add support for named args in ICallableTypeBuilder (#5192)
1 parent 378e332 commit 3d0d37a

File tree

9 files changed

+145
-14
lines changed

9 files changed

+145
-14
lines changed

ydb/library/yql/minikql/mkql_type_builder.cpp

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ class TCallableTypeBuilder: public NUdf::ICallableTypeBuilder
476476
, ReturnType_(nullptr)
477477
, OptionalArgs_(0)
478478
{
479-
ArgsTypes_.reserve(argsCount);
479+
Args_.reserve(argsCount);
480480
}
481481

482482
NUdf::ICallableTypeBuilder& Returns(
@@ -503,21 +503,31 @@ class TCallableTypeBuilder: public NUdf::ICallableTypeBuilder
503503

504504
NUdf::ICallableTypeBuilder& Arg(NUdf::TDataTypeId typeId) override {
505505
auto type = NMiniKQL::TDataType::Create(typeId, Env_);
506-
ArgsTypes_.push_back(type);
506+
Args_.emplace_back().Type_ = type;
507507
return *this;
508508
}
509509

510510
NUdf::ICallableTypeBuilder& Arg(const NUdf::TType* type) override {
511511
auto mkqlType = const_cast<NMiniKQL::TType*>(static_cast<const NMiniKQL::TType*>(type));
512-
ArgsTypes_.push_back(mkqlType);
512+
Args_.emplace_back().Type_ = mkqlType;
513513
return *this;
514514
}
515515

516516
NUdf::ICallableTypeBuilder& Arg(
517517
const NUdf::ITypeBuilder& typeBuilder) override
518518
{
519519
auto type = static_cast<NMiniKQL::TType*>(typeBuilder.Build());
520-
ArgsTypes_.push_back(type);
520+
Args_.emplace_back().Type_ = type;
521+
return *this;
522+
}
523+
524+
NUdf::ICallableTypeBuilder& Name(const NUdf::TStringRef& name) override {
525+
Args_.back().Name_ = Env_.InternName(name);
526+
return *this;
527+
}
528+
529+
NUdf::ICallableTypeBuilder& Flags(ui64 flags) override {
530+
Args_.back().Flags_ = flags;
521531
return *this;
522532
}
523533

@@ -529,20 +539,26 @@ class TCallableTypeBuilder: public NUdf::ICallableTypeBuilder
529539
NUdf::TType* Build() const override {
530540
Y_ABORT_UNLESS(ReturnType_, "callable returns type is not configured");
531541

532-
NMiniKQL::TNode* payload = nullptr;
542+
NMiniKQL::TCallableTypeBuilder builder(Env_, UdfName, ReturnType_);
543+
for (const auto& arg : Args_) {
544+
builder.Add(arg.Type_);
545+
if (!arg.Name_.Str().empty()) {
546+
builder.SetArgumentName(arg.Name_.Str());
547+
}
548+
549+
if (arg.Flags_ != 0) {
550+
builder.SetArgumentFlags(arg.Flags_);
551+
}
552+
}
553+
builder.SetOptionalArgs(OptionalArgs_);
533554

534-
auto callableType = NMiniKQL::TCallableType::Create(
535-
UdfName, ReturnType_,
536-
ArgsTypes_.size(), const_cast<NMiniKQL::TType**>(ArgsTypes_.data()),
537-
payload, Env_);
538-
callableType->SetOptionalArgumentsCount(OptionalArgs_);
539-
return callableType;
555+
return builder.Build();
540556
}
541557

542558
private:
543559
const NMiniKQL::TTypeEnvironment& Env_;
544560
NMiniKQL::TType* ReturnType_;
545-
TVector<NMiniKQL::TType*> ArgsTypes_;
561+
TVector<NMiniKQL::TArgInfo> Args_;
546562
ui32 OptionalArgs_;
547563
};
548564

ydb/library/yql/public/udf/udf_type_builder.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,14 @@ class ICallableTypeBuilder: public ITypeBuilder
311311
virtual ICallableTypeBuilder& Arg(const ITypeBuilder& typeBuilder) = 0;
312312

313313
virtual ICallableTypeBuilder& OptionalArgs(ui32 optionalArgs) = 0;
314+
315+
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 38)
316+
// sets name for the last added argument
317+
virtual ICallableTypeBuilder& Name(const TStringRef& name) = 0;
318+
319+
// sets flags for the last added argument, see ICallablePayload::TArgumentFlags
320+
virtual ICallableTypeBuilder& Flags(ui64 flags) = 0;
321+
#endif
314322
};
315323

316324
UDF_ASSERT_TYPE_SIZE(ICallableTypeBuilder, 8);

ydb/library/yql/public/udf/udf_version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace NYql {
77
namespace NUdf {
88

99
#define CURRENT_UDF_ABI_VERSION_MAJOR 2
10-
#define CURRENT_UDF_ABI_VERSION_MINOR 37
10+
#define CURRENT_UDF_ABI_VERSION_MINOR 38
1111
#define CURRENT_UDF_ABI_VERSION_PATCH 0
1212

1313
#ifdef USE_CURRENT_UDF_ABI_VERSION

ydb/library/yql/udfs/examples/callables/callables_udf.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,52 @@ class TMul: public TBoxedValue
9090
}
9191
};
9292

93+
extern const char A[] = "a";
94+
using TNamedA = TNamedArg<i32, A>;
95+
96+
//////////////////////////////////////////////////////////////////////////////
97+
// TNamedArgUdf
98+
//////////////////////////////////////////////////////////////////////////////
99+
100+
class TNamedArgUdf: public TBoxedValue {
101+
public:
102+
static TStringRef Name() {
103+
static auto name = TStringRef::Of("NamedArgUdf");
104+
return name;
105+
}
106+
107+
private:
108+
TUnboxedValue Run(
109+
const IValueBuilder* valueBuilder,
110+
const TUnboxedValuePod* args) const override
111+
{
112+
Y_UNUSED(valueBuilder);
113+
auto res = args[0] ? args[0].Get<i32>() : 123;
114+
return TUnboxedValuePod(res + 1);
115+
}
116+
};
117+
118+
//////////////////////////////////////////////////////////////////////////////
119+
// TReturnNamedArgCallable
120+
//////////////////////////////////////////////////////////////////////////////
121+
122+
class TReturnNamedArgCallable: public TBoxedValue {
123+
public:
124+
static TStringRef Name() {
125+
static auto name = TStringRef::Of("ReturnNamedArgCallable");
126+
return name;
127+
}
128+
129+
TUnboxedValue Run(
130+
const IValueBuilder* valueBuilder,
131+
const TUnboxedValuePod* args) const override
132+
{
133+
Y_UNUSED(valueBuilder);
134+
Y_UNUSED(args);
135+
return TUnboxedValuePod(new TNamedArgUdf());
136+
}
137+
};
138+
93139
//////////////////////////////////////////////////////////////////////////////
94140
// TCallablesModule
95141
//////////////////////////////////////////////////////////////////////////////
@@ -154,6 +200,18 @@ class TCallablesModule: public IUdfModule
154200
if (!typesOnly) {
155201
builder.Implementation(new TMul);
156202
}
203+
} else if (TNamedArgUdf::Name() == name) {
204+
builder.SimpleSignature<int(TNamedA)>();
205+
206+
if (!typesOnly) {
207+
builder.Implementation(new TNamedArgUdf());
208+
}
209+
} else if (TReturnNamedArgCallable::Name() == name) {
210+
builder.Returns(builder.Callable()->Returns<int>().Arg<int>().Name(A));
211+
212+
if (!typesOnly) {
213+
builder.Implementation(new TReturnNamedArgCallable());
214+
}
157215
}
158216
} catch (const std::exception& e) {
159217
builder.SetError(CurrentExceptionMessage());
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"test.test[TestReturnNamedArgCallable]": [
3+
{
4+
"uri": "file://test.test_TestReturnNamedArgCallable_/results.txt"
5+
}
6+
]
7+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
[
2+
{
3+
"Write" = [
4+
{
5+
"Type" = [
6+
"ListType";
7+
[
8+
"StructType";
9+
[
10+
[
11+
"column0";
12+
[
13+
"DataType";
14+
"Int32"
15+
]
16+
]
17+
]
18+
]
19+
];
20+
"Data" = [
21+
[
22+
"2"
23+
]
24+
]
25+
}
26+
]
27+
}
28+
]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
$returnNamedArg = Callables::ReturnNamedArgCallable();
2+
3+
select $returnNamedArg(1 AS a);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
YQL_UDF_YDB_TEST()
2+
3+
DEPENDS(ydb/library/yql/udfs/examples/callables)
4+
5+
SIZE(MEDIUM)
6+
7+
END()
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
YQL_UDF_YDB(callables_udf)
2-
YQL_ABI_VERSION(2 9 0)
2+
YQL_ABI_VERSION(2 38 0)
33

44
SRCS(
55
callables_udf.cpp
66
)
77

88
END()
9+
10+
RECURSE_FOR_TESTS(
11+
test
12+
)

0 commit comments

Comments
 (0)