diff options
| author | imunkin <[email protected]> | 2024-11-08 10:00:23 +0300 |
|---|---|---|
| committer | imunkin <[email protected]> | 2024-11-08 10:12:13 +0300 |
| commit | a784a2f943d6e15caa6241e2e96d80aac6dbf375 (patch) | |
| tree | 05f1e5366c916b988a8afb75bdab8ddeee0f6e6d /yql/essentials/udfs/common/url_base/lib/url_parse.cpp | |
| parent | d70137a7b530ccaa52834274913bbb5a3d1ca06e (diff) | |
Move yql/udfs/common/ to /yql/essentials YQL-19206
Except the following directories:
* clickhouse/client
* datetime
* knn
* roaring
commit_hash:c7da95636144d28db109d6b17ddc762e9bacb59f
Diffstat (limited to 'yql/essentials/udfs/common/url_base/lib/url_parse.cpp')
| -rw-r--r-- | yql/essentials/udfs/common/url_base/lib/url_parse.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/yql/essentials/udfs/common/url_base/lib/url_parse.cpp b/yql/essentials/udfs/common/url_base/lib/url_parse.cpp new file mode 100644 index 00000000000..63015dadc67 --- /dev/null +++ b/yql/essentials/udfs/common/url_base/lib/url_parse.cpp @@ -0,0 +1,53 @@ +#include "url_parse.h" + +#define FIELD_ADD(name) structBuilder->AddField(#name, optionalStringType, &urlParseIndexes.name); +#define FIELD_FILL(name) \ + if (value.FldIsSet(TUri::Field##name)) { \ + fields[UrlParseIndexes.name] = valueBuilder->NewString(value.GetField(TUri::Field##name)); \ + } + +namespace NUrlUdf { + using namespace NUri; + using namespace NKikimr; + using namespace NUdf; + + TUnboxedValue TParse::Run( + const IValueBuilder* valueBuilder, + const TUnboxedValuePod* args) const { + TUri value; + const auto ParseError = value.ParseAbs(args[0].AsStringRef(), ParseFlags); + TUnboxedValue* fields = nullptr; + const auto result = valueBuilder->NewArray(FieldsCount, fields); + if (ParseError == TUri::ParsedOK) { + FIELD_MAP(FIELD_FILL) + } else { + fields[UrlParseIndexes.ParseError] = valueBuilder->NewString(TStringBuilder() << ParseError); + } + return result; + } + + bool TParse::DeclareSignature( + const TStringRef& name, + TType* userType, + IFunctionTypeInfoBuilder& builder, + bool typesOnly) { + Y_UNUSED(userType); + if (Name() == name) { + TUrlParseIndexes urlParseIndexes; + + builder.Args(1)->Add<TAutoMap<char*>>(); + const auto optionalStringType = builder.Optional()->Item<char*>().Build(); + const auto structBuilder = builder.Struct(FieldsCount); + structBuilder->AddField("ParseError", optionalStringType, &urlParseIndexes.ParseError); + FIELD_MAP(FIELD_ADD) + builder.Returns(structBuilder->Build()); + + if (!typesOnly) { + builder.Implementation(new TParse(urlParseIndexes)); + } + return true; + } else { + return false; + } + } +} |
