diff options
author | robot-piglet <[email protected]> | 2025-04-16 18:40:26 +0300 |
---|---|---|
committer | robot-piglet <[email protected]> | 2025-04-16 18:52:23 +0300 |
commit | 0827896fdf780a434d0981d5fdb11e0d54441480 (patch) | |
tree | 2f1d0d19404bafeb3f900748ea0f1676f393d69e | |
parent | 0192d5ea8ae0e946f3c04fe10dde30601e65ec99 (diff) |
Intermediate changes
commit_hash:4c0f36394464576b71ac609ff5cce5758d2323bb
-rw-r--r-- | yql/essentials/public/langver/ut/ya.make | 10 | ||||
-rw-r--r-- | yql/essentials/public/langver/ut/yql_langver_ut.cpp | 56 | ||||
-rw-r--r-- | yql/essentials/public/langver/ya.make | 14 | ||||
-rw-r--r-- | yql/essentials/public/langver/yql_langver.cpp | 70 | ||||
-rw-r--r-- | yql/essentials/public/langver/yql_langver.h | 58 | ||||
-rw-r--r-- | yql/essentials/public/langver/yql_langver_list.inc | 2 | ||||
-rw-r--r-- | yql/essentials/public/ya.make | 1 | ||||
-rw-r--r-- | yql/essentials/tests/common/udf_test/test.py | 9 |
8 files changed, 217 insertions, 3 deletions
diff --git a/yql/essentials/public/langver/ut/ya.make b/yql/essentials/public/langver/ut/ya.make new file mode 100644 index 00000000000..ab179a9c34a --- /dev/null +++ b/yql/essentials/public/langver/ut/ya.make @@ -0,0 +1,10 @@ +UNITTEST_FOR(yql/essentials/public/langver) + +SRCS( + yql_langver_ut.cpp +) + +PEERDIR( +) + +END() diff --git a/yql/essentials/public/langver/ut/yql_langver_ut.cpp b/yql/essentials/public/langver/ut/yql_langver_ut.cpp new file mode 100644 index 00000000000..7467a7c5183 --- /dev/null +++ b/yql/essentials/public/langver/ut/yql_langver_ut.cpp @@ -0,0 +1,56 @@ +#include "yql_langver.h" + +#include <library/cpp/testing/unittest/registar.h> + +namespace NYql { + +Y_UNIT_TEST_SUITE(TLangVerTests) { + Y_UNIT_TEST(IsValidMin) { + UNIT_ASSERT(IsValidLangVersion(MinLangVersion)); + } + + Y_UNIT_TEST(Parse) { + TLangVersion v; + UNIT_ASSERT(!ParseLangVersion("",v)); + UNIT_ASSERT(!ParseLangVersion("2025.01X",v)); + UNIT_ASSERT(!ParseLangVersion("2025-01",v)); + UNIT_ASSERT(!ParseLangVersion("99999.99",v)); + UNIT_ASSERT(ParseLangVersion("2025.01",v)); + UNIT_ASSERT_VALUES_EQUAL(v, MakeLangVersion(2025,1)); + UNIT_ASSERT(ParseLangVersion("9999.99",v)); + UNIT_ASSERT_VALUES_EQUAL(v, MakeLangVersion(9999,99)); + } + + Y_UNIT_TEST(Format) { + TLangVersionBuffer b; + TStringBuf s; + UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(99999, 1), b, s)); + UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(999, 1), b, s)); + UNIT_ASSERT(FormatLangVersion(MakeLangVersion(2025, 1), b, s)); + UNIT_ASSERT_VALUES_EQUAL(s, "2025.01"); + UNIT_ASSERT_VALUES_EQUAL(b[s.Size()], 0); + UNIT_ASSERT(FormatLangVersion(MakeLangVersion(2025, 12), b, s)); + UNIT_ASSERT_VALUES_EQUAL(s, "2025.12"); + UNIT_ASSERT_VALUES_EQUAL(b[s.Size()], 0); + } + + Y_UNIT_TEST(Deprecated) { + UNIT_ASSERT(IsDeprecatedLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2027,1))); + UNIT_ASSERT(!IsDeprecatedLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2025,1))); + UNIT_ASSERT(!IsDeprecatedLangVersion(MakeLangVersion(2025,4),MakeLangVersion(2028,1))); + } + + Y_UNIT_TEST(Unsupported) { + UNIT_ASSERT(!IsUnsupportedLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2025,1))); + UNIT_ASSERT(!IsUnsupportedLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2027,1))); + UNIT_ASSERT(IsUnsupportedLangVersion(MakeLangVersion(2025,4),MakeLangVersion(2028,1))); + UNIT_ASSERT(IsUnsupportedLangVersion(MakeLangVersion(2025,5),MakeLangVersion(2029,1))); + } + + Y_UNIT_TEST(Available) { + UNIT_ASSERT(IsAvalableLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2025,2))); + UNIT_ASSERT(!IsAvalableLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2025,2))); + } +} + +} diff --git a/yql/essentials/public/langver/ya.make b/yql/essentials/public/langver/ya.make new file mode 100644 index 00000000000..ab1e88c5173 --- /dev/null +++ b/yql/essentials/public/langver/ya.make @@ -0,0 +1,14 @@ +LIBRARY() + +SRCS( + yql_langver.cpp +) + +PEERDIR( +) + +END() + +RECURSE_FOR_TESTS( + ut +) diff --git a/yql/essentials/public/langver/yql_langver.cpp b/yql/essentials/public/langver/yql_langver.cpp new file mode 100644 index 00000000000..02584e81b6a --- /dev/null +++ b/yql/essentials/public/langver/yql_langver.cpp @@ -0,0 +1,70 @@ +#include "yql_langver.h" + +#include <util/string/cast.h> + +#include <vector> +#include <utility> + +namespace NYql { + +namespace { + +const std::pair<ui32,ui32> Versions[] = { +#include "yql_langver_list.inc" +}; + +} + +bool IsValidLangVersion(TLangVersion ver) { + for (size_t i = 0; i < Y_ARRAY_SIZE(Versions); ++i) { + if (ver == MakeLangVersion(Versions[i].first, Versions[i].second)) { + return true; + } + } + + return false; +} + +bool ParseLangVersion(TStringBuf str, TLangVersion& result) { + result = UnknownLangVersion; + if (str.size() != 7 || str[4] != '.') { + return false; + } + + ui32 year, minor; + if (!TryFromString(str.SubString(0, 4), year)) { + return false; + } + + if (!TryFromString(str.SubString(5, 2), minor)) { + return false; + } + + result = MakeLangVersion(year, minor); + return true; +} + +bool FormatLangVersion(TLangVersion ver, TLangVersionBuffer& buffer, TStringBuf& result) { + ui32 year = GetYearFromLangVersion(ver); + if (year > 9999) { + return false; + } + + ui32 minor = GetMinorFromLangVersion(ver); + Y_ASSERT(minor < 100); + if (ToString(year, buffer.data() + 0, 4) != 4) { + return false; + } + + buffer[4] = '.'; + if (ToString(minor, buffer.data() + 5, 2) == 1) { + buffer[6] = buffer[5]; + buffer[5] = '0'; + } + + buffer[7] = 0; + result = TStringBuf(buffer.data(), buffer.size() - 1); + return true; +} + +} diff --git a/yql/essentials/public/langver/yql_langver.h b/yql/essentials/public/langver/yql_langver.h new file mode 100644 index 00000000000..e14d5c91b12 --- /dev/null +++ b/yql/essentials/public/langver/yql_langver.h @@ -0,0 +1,58 @@ +#pragma once +#include <util/generic/strbuf.h> +#include <util/system/types.h> + +#include <array> + +namespace NYql { + +using TLangVersion = ui32; + +constexpr TLangVersion UnknownLangVersion = 0; + +constexpr inline TLangVersion MakeLangVersion(ui32 year, ui32 minor) { + return year * 100u + minor; +} + +constexpr inline ui32 GetYearFromLangVersion(TLangVersion ver) { + return ver / 100u; +} + +constexpr inline ui32 GetMinorFromLangVersion(TLangVersion ver) { + return ver % 100u; +} + +constexpr inline bool IsAvalableLangVersion(TLangVersion ver, TLangVersion max) { + if (ver == UnknownLangVersion || max == UnknownLangVersion) { + return true; + } + + return ver <= max; +} + +constexpr inline bool IsDeprecatedLangVersion(TLangVersion ver, TLangVersion max) { + if (ver == UnknownLangVersion || max == UnknownLangVersion) { + return false; + } + + return GetYearFromLangVersion(ver) == GetYearFromLangVersion(max) - 2; +} + +constexpr inline bool IsUnsupportedLangVersion(TLangVersion ver, TLangVersion max) { + if (ver == UnknownLangVersion || max == UnknownLangVersion) { + return false; + } + + return GetYearFromLangVersion(ver) <= GetYearFromLangVersion(max) - 3; +} + +constexpr TLangVersion MinLangVersion = MakeLangVersion(2025, 1); + +constexpr ui32 LangVersionBufferSize = 4 + 1 + 2 + 1; // year.minor\0 +using TLangVersionBuffer = std::array<char, LangVersionBufferSize>; + +bool IsValidLangVersion(TLangVersion ver); +bool ParseLangVersion(TStringBuf str, TLangVersion& result); +bool FormatLangVersion(TLangVersion ver, TLangVersionBuffer& buffer, TStringBuf& result); + +} diff --git a/yql/essentials/public/langver/yql_langver_list.inc b/yql/essentials/public/langver/yql_langver_list.inc new file mode 100644 index 00000000000..c2ef4658128 --- /dev/null +++ b/yql/essentials/public/langver/yql_langver_list.inc @@ -0,0 +1,2 @@ +{2025,1}, +{2025,2}, diff --git a/yql/essentials/public/ya.make b/yql/essentials/public/ya.make index cc6bef29309..d53fabdd192 100644 --- a/yql/essentials/public/ya.make +++ b/yql/essentials/public/ya.make @@ -2,6 +2,7 @@ RECURSE( decimal fastcheck issue + langver purecalc result_format sql_format diff --git a/yql/essentials/tests/common/udf_test/test.py b/yql/essentials/tests/common/udf_test/test.py index 218b05b4bde..95b8cf1e18a 100644 --- a/yql/essentials/tests/common/udf_test/test.py +++ b/yql/essentials/tests/common/udf_test/test.py @@ -67,9 +67,12 @@ def test(case): in_tables = yql_utils.get_input_tables(None, cfg, DATA_PATH, def_attr=yql_utils.KSV_ATTR) - udfs_dir = yql_utils.get_udfs_path([ - yatest.common.build_path(os.path.join(yatest.common.context.project_path, "..")) - ]) + udfs_list = [yatest.common.build_path(os.path.join(yatest.common.context.project_path, ".."))] + env_udfs_list = yql_utils.get_param("EXTRA_UDF_DIRS") + if env_udfs_list: + for udf_path in env_udfs_list.strip().split(":"): + udfs_list.append(yatest.common.build_path(udf_path)) + udfs_dir = yql_utils.get_udfs_path(udfs_list) xfail = yql_utils.is_xfail(cfg) if yql_utils.get_param('TARGET_PLATFORM') and xfail: |