diff options
author | kniv <kniv@yandex-team.ru> | 2022-03-29 14:21:41 +0300 |
---|---|---|
committer | kniv <kniv@yandex-team.ru> | 2022-03-29 14:21:41 +0300 |
commit | 1f1ebe2439764b4ec8453b23adc4ce16b123f945 (patch) | |
tree | 65fc2165a12499e640b5744075fb8d26675f4311 | |
parent | 3606cd848d38e399770499f4dc0c27ecd14869cc (diff) | |
download | ydb-1f1ebe2439764b4ec8453b23adc4ce16b123f945.tar.gz |
YQL-14575: [Url UDF] Change GetTail() and GetPath() implementations
YQL-14575: [Url UDF] Change GetTail() and GetPath() implementations
ref:4bf711e44d72946b0efeeefa86a31fd3bf4d3cc6
-rw-r--r-- | ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h b/ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h index a7d9fedd437..e9f51fa76d9 100644 --- a/ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h +++ b/ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h @@ -95,33 +95,21 @@ namespace { SIMPLE_UDF(TGetTail, TOptional<char*>(TOptional<char*>)) { EMPTY_RESULT_ON_EMPTY_ARG(0); - const std::string_view url(args[0].AsStringRef()); - std::string_view cut(CutSchemePrefix(url)); - const auto s = cut.find('/'); - if (s == std::string_view::npos) { - return valueBuilder->NewString("/"); - } - - cut.remove_prefix(s); - return valueBuilder->SubString(args[0], std::distance(url.begin(), cut.begin()), cut.length()); + const TStringBuf url(args[0].AsStringRef()); + TStringBuf host, tail; + SplitUrlToHostAndPath(url, host, tail); + return tail.StartsWith('/') + ? valueBuilder->NewString(tail) + : valueBuilder->NewString(TString('/').append(tail)); } SIMPLE_UDF(TGetPath, TOptional<char*>(TOptional<char*>)) { EMPTY_RESULT_ON_EMPTY_ARG(0); - const std::string_view url(args[0].AsStringRef()); - std::string_view cut(CutSchemePrefix(url)); - const auto s = cut.find('/'); - if (s == std::string_view::npos) { - return valueBuilder->NewString("/"); - } - - cut.remove_prefix(s); - const auto end = cut.find_first_of("?#"); - if (std::string_view::npos != end) { - cut.remove_suffix(cut.size() - end); - } - - return valueBuilder->SubString(args[0], std::distance(url.begin(), cut.begin()), cut.length()); + const TStringBuf url(args[0].AsStringRef()); + TStringBuf path = GetPathAndQuery(url, true).Before('?'); + return path.StartsWith('/') + ? valueBuilder->NewString(path) + : valueBuilder->NewString(TString('/').append(path)); } SIMPLE_UDF(TGetFragment, TOptional<char*>(TOptional<char*>)) { |