Skip to content

Commit

Permalink
Merge b881cc7 into fea1683
Browse files Browse the repository at this point in the history
  • Loading branch information
fedor-miron authored Jun 5, 2024
2 parents fea1683 + b881cc7 commit 34304be
Show file tree
Hide file tree
Showing 9 changed files with 145 additions and 14 deletions.
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
)

0 comments on commit 34304be

Please sign in to comment.