Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 28 additions & 12 deletions ydb/library/yql/minikql/mkql_type_builder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ class TCallableTypeBuilder: public NUdf::ICallableTypeBuilder
, ReturnType_(nullptr)
, OptionalArgs_(0)
{
ArgsTypes_.reserve(argsCount);
Args_.reserve(argsCount);
}

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

NUdf::ICallableTypeBuilder& Arg(NUdf::TDataTypeId typeId) override {
auto type = NMiniKQL::TDataType::Create(typeId, Env_);
ArgsTypes_.push_back(type);
Args_.emplace_back().Type_ = type;
return *this;
}

NUdf::ICallableTypeBuilder& Arg(const NUdf::TType* type) override {
auto mkqlType = const_cast<NMiniKQL::TType*>(static_cast<const NMiniKQL::TType*>(type));
ArgsTypes_.push_back(mkqlType);
Args_.emplace_back().Type_ = mkqlType;
return *this;
}

NUdf::ICallableTypeBuilder& Arg(
const NUdf::ITypeBuilder& typeBuilder) override
{
auto type = static_cast<NMiniKQL::TType*>(typeBuilder.Build());
ArgsTypes_.push_back(type);
Args_.emplace_back().Type_ = type;
return *this;
}

NUdf::ICallableTypeBuilder& Name(const NUdf::TStringRef& name) override {
Args_.back().Name_ = Env_.InternName(name);
return *this;
}

NUdf::ICallableTypeBuilder& Flags(ui64 flags) override {
Args_.back().Flags_ = flags;
return *this;
}

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

NMiniKQL::TNode* payload = nullptr;
NMiniKQL::TCallableTypeBuilder builder(Env_, UdfName, ReturnType_);
for (const auto& arg : Args_) {
builder.Add(arg.Type_);
if (!arg.Name_.Str().empty()) {
builder.SetArgumentName(arg.Name_.Str());
}

if (arg.Flags_ != 0) {
builder.SetArgumentFlags(arg.Flags_);
}
}
builder.SetOptionalArgs(OptionalArgs_);

auto callableType = NMiniKQL::TCallableType::Create(
UdfName, ReturnType_,
ArgsTypes_.size(), const_cast<NMiniKQL::TType**>(ArgsTypes_.data()),
payload, Env_);
callableType->SetOptionalArgumentsCount(OptionalArgs_);
return callableType;
return builder.Build();
}

private:
const NMiniKQL::TTypeEnvironment& Env_;
NMiniKQL::TType* ReturnType_;
TVector<NMiniKQL::TType*> ArgsTypes_;
TVector<NMiniKQL::TArgInfo> Args_;
ui32 OptionalArgs_;
};

Expand Down
8 changes: 8 additions & 0 deletions ydb/library/yql/public/udf/udf_type_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,14 @@ class ICallableTypeBuilder: public ITypeBuilder
virtual ICallableTypeBuilder& Arg(const ITypeBuilder& typeBuilder) = 0;

virtual ICallableTypeBuilder& OptionalArgs(ui32 optionalArgs) = 0;

#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 38)
// sets name for the last added argument
virtual ICallableTypeBuilder& Name(const TStringRef& name) = 0;

// sets flags for the last added argument, see ICallablePayload::TArgumentFlags
virtual ICallableTypeBuilder& Flags(ui64 flags) = 0;
#endif
};

UDF_ASSERT_TYPE_SIZE(ICallableTypeBuilder, 8);
Expand Down
2 changes: 1 addition & 1 deletion ydb/library/yql/public/udf/udf_version.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace NYql {
namespace NUdf {

#define CURRENT_UDF_ABI_VERSION_MAJOR 2
#define CURRENT_UDF_ABI_VERSION_MINOR 37
#define CURRENT_UDF_ABI_VERSION_MINOR 38
#define CURRENT_UDF_ABI_VERSION_PATCH 0

#ifdef USE_CURRENT_UDF_ABI_VERSION
Expand Down
58 changes: 58 additions & 0 deletions ydb/library/yql/udfs/examples/callables/callables_udf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,52 @@ class TMul: public TBoxedValue
}
};

extern const char A[] = "a";
using TNamedA = TNamedArg<i32, A>;

//////////////////////////////////////////////////////////////////////////////
// TNamedArgUdf
//////////////////////////////////////////////////////////////////////////////

class TNamedArgUdf: public TBoxedValue {
public:
static TStringRef Name() {
static auto name = TStringRef::Of("NamedArgUdf");
return name;
}

private:
TUnboxedValue Run(
const IValueBuilder* valueBuilder,
const TUnboxedValuePod* args) const override
{
Y_UNUSED(valueBuilder);
auto res = args[0] ? args[0].Get<i32>() : 123;
return TUnboxedValuePod(res + 1);
}
};

//////////////////////////////////////////////////////////////////////////////
// TReturnNamedArgCallable
//////////////////////////////////////////////////////////////////////////////

class TReturnNamedArgCallable: public TBoxedValue {
public:
static TStringRef Name() {
static auto name = TStringRef::Of("ReturnNamedArgCallable");
return name;
}

TUnboxedValue Run(
const IValueBuilder* valueBuilder,
const TUnboxedValuePod* args) const override
{
Y_UNUSED(valueBuilder);
Y_UNUSED(args);
return TUnboxedValuePod(new TNamedArgUdf());
}
};

//////////////////////////////////////////////////////////////////////////////
// TCallablesModule
//////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -154,6 +200,18 @@ class TCallablesModule: public IUdfModule
if (!typesOnly) {
builder.Implementation(new TMul);
}
} else if (TNamedArgUdf::Name() == name) {
builder.SimpleSignature<int(TNamedA)>();

if (!typesOnly) {
builder.Implementation(new TNamedArgUdf());
}
} else if (TReturnNamedArgCallable::Name() == name) {
builder.Returns(builder.Callable()->Returns<int>().Arg<int>().Name(A));

if (!typesOnly) {
builder.Implementation(new TReturnNamedArgCallable());
}
}
} catch (const std::exception& e) {
builder.SetError(CurrentExceptionMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"test.test[TestReturnNamedArgCallable]": [
{
"uri": "file://test.test_TestReturnNamedArgCallable_/results.txt"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
[
{
"Write" = [
{
"Type" = [
"ListType";
[
"StructType";
[
[
"column0";
[
"DataType";
"Int32"
]
]
]
]
];
"Data" = [
[
"2"
]
]
}
]
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
$returnNamedArg = Callables::ReturnNamedArgCallable();

select $returnNamedArg(1 AS a);
7 changes: 7 additions & 0 deletions ydb/library/yql/udfs/examples/callables/test/ya.make
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
YQL_UDF_YDB_TEST()

DEPENDS(ydb/library/yql/udfs/examples/callables)

SIZE(MEDIUM)

END()
6 changes: 5 additions & 1 deletion ydb/library/yql/udfs/examples/callables/ya.make
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
YQL_UDF_YDB(callables_udf)
YQL_ABI_VERSION(2 9 0)
YQL_ABI_VERSION(2 38 0)

SRCS(
callables_udf.cpp
)

END()

RECURSE_FOR_TESTS(
test
)