summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <[email protected]>2025-10-08 11:41:14 +0300
committervvvv <[email protected]>2025-10-08 12:20:42 +0300
commitd73f13cfdb331365ddad0da51ec36e0a3e4cf187 (patch)
tree88cab10170ce9aa3389be7f1a09247386dcf5ebd
parentf377d8ad9e0741cd904c1d4934afdf24af517d93 (diff)
YQL-20086 public
commit_hash:68b0c2e9c2960587af7d57ecedcb38f4d05890b7
-rw-r--r--yql/essentials/public/decimal/ut/ya.make2
-rw-r--r--yql/essentials/public/decimal/ut/yql_decimal_ut.cpp582
-rw-r--r--yql/essentials/public/decimal/ut/yql_wide_int_ut.cpp778
-rw-r--r--yql/essentials/public/decimal/ya.make2
-rw-r--r--yql/essentials/public/decimal/yql_decimal.cpp188
-rw-r--r--yql/essentials/public/decimal/yql_decimal.h99
-rw-r--r--yql/essentials/public/decimal/yql_decimal_serialize.cpp28
-rw-r--r--yql/essentials/public/decimal/yql_decimal_serialize.h4
-rw-r--r--yql/essentials/public/decimal/yql_wide_int.h301
-rw-r--r--yql/essentials/public/fastcheck/check_runner.cpp4
-rw-r--r--yql/essentials/public/fastcheck/check_runner.h6
-rw-r--r--yql/essentials/public/fastcheck/fastcheck.cpp9
-rw-r--r--yql/essentials/public/fastcheck/fastcheck.h18
-rw-r--r--yql/essentials/public/fastcheck/fastcheck_ut.cpp286
-rw-r--r--yql/essentials/public/fastcheck/format.cpp27
-rw-r--r--yql/essentials/public/fastcheck/lexer.cpp22
-rw-r--r--yql/essentials/public/fastcheck/linter.cpp10
-rw-r--r--yql/essentials/public/fastcheck/linter.h4
-rw-r--r--yql/essentials/public/fastcheck/linter_ut.cpp1173
-rw-r--r--yql/essentials/public/fastcheck/parser.cpp34
-rw-r--r--yql/essentials/public/fastcheck/settings.cpp24
-rw-r--r--yql/essentials/public/fastcheck/settings.h2
-rw-r--r--yql/essentials/public/fastcheck/translator.cpp89
-rw-r--r--yql/essentials/public/fastcheck/ut/ya.make2
-rw-r--r--yql/essentials/public/fastcheck/ya.make2
-rw-r--r--yql/essentials/public/issue/ut/ya.make2
-rw-r--r--yql/essentials/public/issue/ya.make2
-rw-r--r--yql/essentials/public/issue/yql_issue.cpp48
-rw-r--r--yql/essentials/public/issue/yql_issue.h33
-rw-r--r--yql/essentials/public/issue/yql_issue_id.h36
-rw-r--r--yql/essentials/public/issue/yql_issue_manager.cpp18
-rw-r--r--yql/essentials/public/issue/yql_issue_manager.h5
-rw-r--r--yql/essentials/public/issue/yql_issue_manager_ut.cpp306
-rw-r--r--yql/essentials/public/issue/yql_issue_message.cpp16
-rw-r--r--yql/essentials/public/issue/yql_issue_message.h16
-rw-r--r--yql/essentials/public/issue/yql_issue_message_impl.h22
-rw-r--r--yql/essentials/public/issue/yql_issue_ut.cpp188
-rw-r--r--yql/essentials/public/issue/yql_issue_utils.cpp6
-rw-r--r--yql/essentials/public/issue/yql_issue_utils.h15
-rw-r--r--yql/essentials/public/issue/yql_issue_utils_ut.cpp271
-rw-r--r--yql/essentials/public/issue/yql_warning.cpp9
-rw-r--r--yql/essentials/public/issue/yql_warning.h25
-rw-r--r--yql/essentials/public/issue/yql_warning_ut.cpp122
-rw-r--r--yql/essentials/public/langver/ut/ya.make2
-rw-r--r--yql/essentials/public/langver/ut/yql_langver_ut.cpp240
-rw-r--r--yql/essentials/public/langver/ya.make2
-rw-r--r--yql/essentials/public/langver/yql_langver.cpp20
-rw-r--r--yql/essentials/public/langver/yql_langver.h4
-rw-r--r--yql/essentials/public/purecalc/common/compile_mkql.cpp8
-rw-r--r--yql/essentials/public/purecalc/common/compile_mkql.h15
-rw-r--r--yql/essentials/public/purecalc/common/fwd.h62
-rw-r--r--yql/essentials/public/purecalc/common/inspect_input.cpp44
-rw-r--r--yql/essentials/public/purecalc/common/inspect_input.h4
-rw-r--r--yql/essentials/public/purecalc/common/interface.h2295
-rw-r--r--yql/essentials/public/purecalc/common/logger_init.cpp34
-rw-r--r--yql/essentials/public/purecalc/common/logger_init.h10
-rw-r--r--yql/essentials/public/purecalc/common/names.cpp20
-rw-r--r--yql/essentials/public/purecalc/common/names.h20
-rw-r--r--yql/essentials/public/purecalc/common/processor_mode.h16
-rw-r--r--yql/essentials/public/purecalc/common/program_factory.cpp32
-rw-r--r--yql/essentials/public/purecalc/common/program_factory.h61
-rw-r--r--yql/essentials/public/purecalc/common/transformations/align_output_schema.cpp184
-rw-r--r--yql/essentials/public/purecalc/common/transformations/align_output_schema.h37
-rw-r--r--yql/essentials/public/purecalc/common/transformations/extract_used_columns.cpp132
-rw-r--r--yql/essentials/public/purecalc/common/transformations/extract_used_columns.h35
-rw-r--r--yql/essentials/public/purecalc/common/transformations/output_columns_filter.cpp166
-rw-r--r--yql/essentials/public/purecalc/common/transformations/output_columns_filter.h20
-rw-r--r--yql/essentials/public/purecalc/common/transformations/replace_table_reads.cpp360
-rw-r--r--yql/essentials/public/purecalc/common/transformations/replace_table_reads.h43
-rw-r--r--yql/essentials/public/purecalc/common/transformations/root_to_blocks.cpp3
-rw-r--r--yql/essentials/public/purecalc/common/transformations/root_to_blocks.h29
-rw-r--r--yql/essentials/public/purecalc/common/transformations/type_annotation.cpp370
-rw-r--r--yql/essentials/public/purecalc/common/transformations/type_annotation.h41
-rw-r--r--yql/essentials/public/purecalc/common/transformations/utils.cpp41
-rw-r--r--yql/essentials/public/purecalc/common/transformations/utils.h143
-rw-r--r--yql/essentials/public/purecalc/common/type_from_schema.cpp366
-rw-r--r--yql/essentials/public/purecalc/common/type_from_schema.h58
-rw-r--r--yql/essentials/public/purecalc/common/worker.cpp124
-rw-r--r--yql/essentials/public/purecalc/common/worker.h330
-rw-r--r--yql/essentials/public/purecalc/common/worker_factory.cpp143
-rw-r--r--yql/essentials/public/purecalc/common/worker_factory.h328
-rw-r--r--yql/essentials/public/purecalc/common/wrappers.h102
-rw-r--r--yql/essentials/public/purecalc/common/ya.make.inc2
-rw-r--r--yql/essentials/public/purecalc/examples/protobuf/main.cpp8
-rw-r--r--yql/essentials/public/purecalc/examples/protobuf/ya.make2
-rw-r--r--yql/essentials/public/purecalc/examples/protobuf_pull_list/main.cpp3
-rw-r--r--yql/essentials/public/purecalc/examples/protobuf_pull_list/ya.make2
-rw-r--r--yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.cpp338
-rw-r--r--yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.h101
-rw-r--r--yql/essentials/public/purecalc/helpers/protobuf/ya.make2
-rw-r--r--yql/essentials/public/purecalc/helpers/stream/stream_from_vector.h60
-rw-r--r--yql/essentials/public/purecalc/helpers/stream/ya.make2
-rw-r--r--yql/essentials/public/purecalc/io_specs/arrow/spec.cpp108
-rw-r--r--yql/essentials/public/purecalc/io_specs/arrow/spec.h24
-rw-r--r--yql/essentials/public/purecalc/io_specs/arrow/ut/test_spec.cpp445
-rw-r--r--yql/essentials/public/purecalc/io_specs/arrow/ut/ya.make2
-rw-r--r--yql/essentials/public/purecalc/io_specs/arrow/ya.make.inc2
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf/proto_variant.h136
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf/spec.h278
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf/ut/test_spec.cpp1287
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf/ut/ya.make2
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf/ya.make2
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf_raw/proto_holder.h34
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.cpp1359
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.h491
-rw-r--r--yql/essentials/public/purecalc/io_specs/protobuf_raw/ya.make2
-rw-r--r--yql/essentials/public/purecalc/no_llvm/purecalc.h1
-rw-r--r--yql/essentials/public/purecalc/no_llvm/ya.make2
-rw-r--r--yql/essentials/public/purecalc/ut/empty_stream.h26
-rw-r--r--yql/essentials/public/purecalc/ut/fake_spec.cpp128
-rw-r--r--yql/essentials/public/purecalc/ut/fake_spec.h98
-rw-r--r--yql/essentials/public/purecalc/ut/lib/helpers.cpp80
-rw-r--r--yql/essentials/public/purecalc/ut/lib/helpers.h18
-rw-r--r--yql/essentials/public/purecalc/ut/lib/ya.make2
-rw-r--r--yql/essentials/public/purecalc/ut/test_eval.cpp97
-rw-r--r--yql/essentials/public/purecalc/ut/test_fatal_err.cpp29
-rw-r--r--yql/essentials/public/purecalc/ut/test_langver.cpp24
-rw-r--r--yql/essentials/public/purecalc/ut/test_mixed_allocators.cpp189
-rw-r--r--yql/essentials/public/purecalc/ut/test_pg.cpp80
-rw-r--r--yql/essentials/public/purecalc/ut/test_pool.cpp281
-rw-r--r--yql/essentials/public/purecalc/ut/test_sexpr.cpp56
-rw-r--r--yql/essentials/public/purecalc/ut/test_sql.cpp250
-rw-r--r--yql/essentials/public/purecalc/ut/test_udf.cpp181
-rw-r--r--yql/essentials/public/purecalc/ut/test_user_data.cpp72
-rw-r--r--yql/essentials/public/purecalc/ut/ya.make2
-rw-r--r--yql/essentials/public/purecalc/ya.make2
-rw-r--r--yql/essentials/public/result_format/ut/ya.make2
-rw-r--r--yql/essentials/public/result_format/ut/yql_restricted_yson_ut.cpp105
-rw-r--r--yql/essentials/public/result_format/ut/yql_result_format_data_ut.cpp612
-rw-r--r--yql/essentials/public/result_format/ut/yql_result_format_response_ut.cpp352
-rw-r--r--yql/essentials/public/result_format/ut/yql_result_format_type_ut.cpp602
-rw-r--r--yql/essentials/public/result_format/ya.make2
-rw-r--r--yql/essentials/public/result_format/yql_codec_results.cpp4
-rw-r--r--yql/essentials/public/result_format/yql_codec_results.h4
-rw-r--r--yql/essentials/public/result_format/yql_restricted_yson.cpp85
-rw-r--r--yql/essentials/public/result_format/yql_restricted_yson.h8
-rw-r--r--yql/essentials/public/result_format/yql_result_format_common.h4
-rw-r--r--yql/essentials/public/result_format/yql_result_format_data.cpp61
-rw-r--r--yql/essentials/public/result_format/yql_result_format_data.h10
-rw-r--r--yql/essentials/public/result_format/yql_result_format_impl.h2
-rw-r--r--yql/essentials/public/result_format/yql_result_format_response.cpp2
-rw-r--r--yql/essentials/public/result_format/yql_result_format_response.h2
-rw-r--r--yql/essentials/public/result_format/yql_result_format_type.cpp14
-rw-r--r--yql/essentials/public/result_format/yql_result_format_type.h10
-rw-r--r--yql/essentials/public/sql_format/sql_format.cpp2
-rw-r--r--yql/essentials/public/sql_format/sql_format.h2
-rw-r--r--yql/essentials/public/sql_format/ya.make2
-rw-r--r--yql/essentials/public/udf/arrow/args_dechunker.cpp5
-rw-r--r--yql/essentials/public/udf/arrow/args_dechunker.h4
-rw-r--r--yql/essentials/public/udf/arrow/bit_util.cpp2
-rw-r--r--yql/essentials/public/udf/arrow/bit_util.h6
-rw-r--r--yql/essentials/public/udf/arrow/block_builder.cpp2
-rw-r--r--yql/essentials/public/udf/arrow/block_builder.h105
-rw-r--r--yql/essentials/public/udf/arrow/block_io_buffer.h9
-rw-r--r--yql/essentials/public/udf/arrow/block_item.cpp2
-rw-r--r--yql/essentials/public/udf/arrow/block_item.h81
-rw-r--r--yql/essentials/public/udf/arrow/block_item_comparator.h28
-rw-r--r--yql/essentials/public/udf/arrow/block_item_hasher.h26
-rw-r--r--yql/essentials/public/udf/arrow/block_reader.cpp2
-rw-r--r--yql/essentials/public/udf/arrow/block_reader.h74
-rw-r--r--yql/essentials/public/udf/arrow/block_type_helper.cpp3
-rw-r--r--yql/essentials/public/udf/arrow/block_type_helper.h19
-rw-r--r--yql/essentials/public/udf/arrow/defs.h41
-rw-r--r--yql/essentials/public/udf/arrow/dispatch_traits.h126
-rw-r--r--yql/essentials/public/udf/arrow/memory_pool.cpp6
-rw-r--r--yql/essentials/public/udf/arrow/memory_pool.h4
-rw-r--r--yql/essentials/public/udf/arrow/udf_arrow_helpers.cpp2
-rw-r--r--yql/essentials/public/udf/arrow/udf_arrow_helpers.h147
-rw-r--r--yql/essentials/public/udf/arrow/ut/array_builder_ut.cpp577
-rw-r--r--yql/essentials/public/udf/arrow/ut/bit_util_ut.cpp42
-rw-r--r--yql/essentials/public/udf/arrow/ut/block_reader_ut.cpp120
-rw-r--r--yql/essentials/public/udf/arrow/ut/ya.make2
-rw-r--r--yql/essentials/public/udf/arrow/util.cpp4
-rw-r--r--yql/essentials/public/udf/arrow/util.h23
-rw-r--r--yql/essentials/public/udf/arrow/ya.make2
-rw-r--r--yql/essentials/public/udf/sanitizer_utils.h8
-rw-r--r--yql/essentials/public/udf/service/exception_policy/udf_service.cpp4
-rw-r--r--yql/essentials/public/udf/service/exception_policy/ya.make2
-rw-r--r--yql/essentials/public/udf/service/stub/udf_service.cpp40
-rw-r--r--yql/essentials/public/udf/service/stub/ya.make2
-rw-r--r--yql/essentials/public/udf/service/terminate_policy/udf_service.cpp10
-rw-r--r--yql/essentials/public/udf/service/terminate_policy/ya.make2
-rw-r--r--yql/essentials/public/udf/support/udf_support.cpp22
-rw-r--r--yql/essentials/public/udf/support/ya.make2
-rw-r--r--yql/essentials/public/udf/udf_allocator.h30
-rw-r--r--yql/essentials/public/udf/udf_counter.h12
-rw-r--r--yql/essentials/public/udf/udf_counter_ut.cpp80
-rw-r--r--yql/essentials/public/udf/udf_data_type.cpp94
-rw-r--r--yql/essentials/public/udf/udf_data_type.h191
-rw-r--r--yql/essentials/public/udf/udf_data_type_ut.cpp12
-rw-r--r--yql/essentials/public/udf/udf_helpers.cpp9
-rw-r--r--yql/essentials/public/udf/udf_helpers.h383
-rw-r--r--yql/essentials/public/udf/udf_log.cpp37
-rw-r--r--yql/essentials/public/udf/udf_log.h50
-rw-r--r--yql/essentials/public/udf/udf_pg_type_description.h4
-rw-r--r--yql/essentials/public/udf/udf_ptr.h60
-rw-r--r--yql/essentials/public/udf/udf_registrator.h112
-rw-r--r--yql/essentials/public/udf/udf_static_registry.cpp4
-rw-r--r--yql/essentials/public/udf/udf_static_registry.h4
-rw-r--r--yql/essentials/public/udf/udf_string.h105
-rw-r--r--yql/essentials/public/udf/udf_string_ref.h84
-rw-r--r--yql/essentials/public/udf/udf_terminator.h6
-rw-r--r--yql/essentials/public/udf/udf_type_builder.cpp3
-rw-r--r--yql/essentials/public/udf/udf_type_builder.h242
-rw-r--r--yql/essentials/public/udf/udf_type_inspection.cpp4
-rw-r--r--yql/essentials/public/udf/udf_type_inspection.h361
-rw-r--r--yql/essentials/public/udf/udf_type_ops.h9
-rw-r--r--yql/essentials/public/udf/udf_type_printer.cpp121
-rw-r--r--yql/essentials/public/udf/udf_type_printer.h12
-rw-r--r--yql/essentials/public/udf/udf_type_printer_ut.cpp38
-rw-r--r--yql/essentials/public/udf/udf_type_size_check.h9
-rw-r--r--yql/essentials/public/udf/udf_types.cpp10
-rw-r--r--yql/essentials/public/udf/udf_types.h270
-rw-r--r--yql/essentials/public/udf/udf_ut_helpers.h21
-rw-r--r--yql/essentials/public/udf/udf_validate.cpp14
-rw-r--r--yql/essentials/public/udf/udf_validate.h20
-rw-r--r--yql/essentials/public/udf/udf_value.cpp7
-rw-r--r--yql/essentials/public/udf/udf_value.h834
-rw-r--r--yql/essentials/public/udf/udf_value_builder.cpp9
-rw-r--r--yql/essentials/public/udf/udf_value_builder.h60
-rw-r--r--yql/essentials/public/udf/udf_value_builder_ut.cpp52
-rw-r--r--yql/essentials/public/udf/udf_value_inl.h417
-rw-r--r--yql/essentials/public/udf/udf_value_ut.cpp296
-rw-r--r--yql/essentials/public/udf/udf_version.cpp1
-rw-r--r--yql/essentials/public/udf/udf_version.h31
-rw-r--r--yql/essentials/public/udf/ut/ya.make2
-rw-r--r--yql/essentials/public/udf/ya.make2
227 files changed, 12484 insertions, 12171 deletions
diff --git a/yql/essentials/public/decimal/ut/ya.make b/yql/essentials/public/decimal/ut/ya.make
index aad0eb010ba..1197400f3f4 100644
--- a/yql/essentials/public/decimal/ut/ya.make
+++ b/yql/essentials/public/decimal/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST_FOR(yql/essentials/public/decimal)
+ENABLE(YQL_STYLE_CPP)
+
SRCS(yql_decimal_ut.cpp yql_wide_int_ut.cpp)
END()
diff --git a/yql/essentials/public/decimal/ut/yql_decimal_ut.cpp b/yql/essentials/public/decimal/ut/yql_decimal_ut.cpp
index c93993190fe..8d9fea6551e 100644
--- a/yql/essentials/public/decimal/ut/yql_decimal_ut.cpp
+++ b/yql/essentials/public/decimal/ut/yql_decimal_ut.cpp
@@ -6,346 +6,346 @@
namespace NYql {
namespace NDecimal {
Y_UNIT_TEST_SUITE(TYqlDecimalTest) {
- void SimplePositiveTest(TInt128 v, ui8 precision, ui8 scale, const TString& expected) {
- TString result = ToString(v, precision, scale);
- UNIT_ASSERT_VALUES_EQUAL(result, expected);
- TInt128 parsed = FromString(result, precision, scale);
- UNIT_ASSERT(parsed == v);
- }
+void SimplePositiveTest(TInt128 v, ui8 precision, ui8 scale, const TString& expected) {
+ TString result = ToString(v, precision, scale);
+ UNIT_ASSERT_VALUES_EQUAL(result, expected);
+ TInt128 parsed = FromString(result, precision, scale);
+ UNIT_ASSERT(parsed == v);
+}
- void SimpleNegativeFormatTest(TInt128 v, ui8 precision, ui8 scale) {
- TString result = ToString(v, precision, scale);
- UNIT_ASSERT_VALUES_EQUAL(result, "");
- }
+void SimpleNegativeFormatTest(TInt128 v, ui8 precision, ui8 scale) {
+ TString result = ToString(v, precision, scale);
+ UNIT_ASSERT_VALUES_EQUAL(result, "");
+}
- void SimpleSerializeAndDeserialize(TInt128 v, size_t expectedSize) {
- char buff[sizeof(TInt128)];
- const auto s = Serialize(v, buff);
- UNIT_ASSERT_VALUES_EQUAL(s, expectedSize);
- const auto& des = Deserialize(buff, expectedSize);
- UNIT_ASSERT_VALUES_EQUAL(des.second, expectedSize);
- UNIT_ASSERT(des.first == v);
- const auto& e = Deserialize(buff, expectedSize - 1);
- UNIT_ASSERT(e.first == Err());
- }
+void SimpleSerializeAndDeserialize(TInt128 v, size_t expectedSize) {
+ char buff[sizeof(TInt128)];
+ const auto s = Serialize(v, buff);
+ UNIT_ASSERT_VALUES_EQUAL(s, expectedSize);
+ const auto& des = Deserialize(buff, expectedSize);
+ UNIT_ASSERT_VALUES_EQUAL(des.second, expectedSize);
+ UNIT_ASSERT(des.first == v);
+ const auto& e = Deserialize(buff, expectedSize - 1);
+ UNIT_ASSERT(e.first == Err());
+}
- template<ui8 Precision, ui8 Scale>
- void CheckMulAndRescale(const TStringBuf& lhs, const TStringBuf& rhs, const TStringBuf& expected) {
- const auto l = FromString(lhs, Precision, Scale);
- const auto r = FromString(rhs, Precision, Scale);
- const auto m = MulAndDivNormalDivider(l, r, GetDivider<Scale>());
- const auto result = ToString(m, Precision, Scale);
- UNIT_ASSERT_VALUES_EQUAL(result, expected);
- }
+template <ui8 Precision, ui8 Scale>
+void CheckMulAndRescale(const TStringBuf& lhs, const TStringBuf& rhs, const TStringBuf& expected) {
+ const auto l = FromString(lhs, Precision, Scale);
+ const auto r = FromString(rhs, Precision, Scale);
+ const auto m = MulAndDivNormalDivider(l, r, GetDivider<Scale>());
+ const auto result = ToString(m, Precision, Scale);
+ UNIT_ASSERT_VALUES_EQUAL(result, expected);
+}
- template<ui8 Precision, ui8 Scale>
- void CheckDivAndRescale(const TStringBuf& lhs, const TStringBuf& rhs, const TStringBuf& expected) {
- const auto l = FromString(lhs, Precision, Scale);
- const auto r = FromString(rhs, Precision, Scale);
- const auto m = MulAndDivNormalMultiplier(l, GetDivider<Scale>(), r);
- const auto result = ToString(m, Precision, Scale);
- UNIT_ASSERT_VALUES_EQUAL(result, expected);
- }
+template <ui8 Precision, ui8 Scale>
+void CheckDivAndRescale(const TStringBuf& lhs, const TStringBuf& rhs, const TStringBuf& expected) {
+ const auto l = FromString(lhs, Precision, Scale);
+ const auto r = FromString(rhs, Precision, Scale);
+ const auto m = MulAndDivNormalMultiplier(l, GetDivider<Scale>(), r);
+ const auto result = ToString(m, Precision, Scale);
+ UNIT_ASSERT_VALUES_EQUAL(result, expected);
+}
- template<ui8 Precision, ui8 Scale = 0>
- void CheckMul(const TStringBuf& lhs, const TStringBuf& rhs, const TStringBuf& expected) {
- const auto l = FromString(lhs, Precision, Scale);
- const auto r = FromString(rhs, Precision, Scale);
- const auto m = Mul(l, r);
- const auto result = ToString(m, Precision, Scale);
- UNIT_ASSERT_VALUES_EQUAL(result, expected);
- }
+template <ui8 Precision, ui8 Scale = 0>
+void CheckMul(const TStringBuf& lhs, const TStringBuf& rhs, const TStringBuf& expected) {
+ const auto l = FromString(lhs, Precision, Scale);
+ const auto r = FromString(rhs, Precision, Scale);
+ const auto m = Mul(l, r);
+ const auto result = ToString(m, Precision, Scale);
+ UNIT_ASSERT_VALUES_EQUAL(result, expected);
+}
- Y_UNIT_TEST(TestZeroFormat) {
- UNIT_ASSERT_VALUES_EQUAL(ToString(0, 1, 0), "0");
- UNIT_ASSERT_VALUES_EQUAL(ToString(0, 15, 6), "0");
- UNIT_ASSERT_VALUES_EQUAL(ToString(0, 15, 0), "0");
- }
+Y_UNIT_TEST(TestZeroFormat) {
+ UNIT_ASSERT_VALUES_EQUAL(ToString(0, 1, 0), "0");
+ UNIT_ASSERT_VALUES_EQUAL(ToString(0, 15, 6), "0");
+ UNIT_ASSERT_VALUES_EQUAL(ToString(0, 15, 0), "0");
+}
- Y_UNIT_TEST(TestZeroScale) {
- SimplePositiveTest(1, 5, 0, "1");
- SimplePositiveTest(10, 5, 0, "10");
- SimplePositiveTest(100, 5, 0, "100");
- SimplePositiveTest(1000, 5, 0, "1000");
- SimplePositiveTest(10000, 5, 0, "10000");
- SimpleNegativeFormatTest(100000, 5, 0);
- SimpleNegativeFormatTest(1000000, 5, 0);
-
- // negative numbers
- SimplePositiveTest(-1, 5, 0, "-1");
- SimplePositiveTest(-10, 5, 0, "-10");
- SimplePositiveTest(-100, 5, 0, "-100");
- SimplePositiveTest(-1000, 5, 0, "-1000");
- SimplePositiveTest(-10000, 5, 0, "-10000");
- SimpleNegativeFormatTest(-100000, 5, 0);
- }
+Y_UNIT_TEST(TestZeroScale) {
+ SimplePositiveTest(1, 5, 0, "1");
+ SimplePositiveTest(10, 5, 0, "10");
+ SimplePositiveTest(100, 5, 0, "100");
+ SimplePositiveTest(1000, 5, 0, "1000");
+ SimplePositiveTest(10000, 5, 0, "10000");
+ SimpleNegativeFormatTest(100000, 5, 0);
+ SimpleNegativeFormatTest(1000000, 5, 0);
+
+ // negative numbers
+ SimplePositiveTest(-1, 5, 0, "-1");
+ SimplePositiveTest(-10, 5, 0, "-10");
+ SimplePositiveTest(-100, 5, 0, "-100");
+ SimplePositiveTest(-1000, 5, 0, "-1000");
+ SimplePositiveTest(-10000, 5, 0, "-10000");
+ SimpleNegativeFormatTest(-100000, 5, 0);
+}
- Y_UNIT_TEST(TestFormats) {
- // we have no trailing zeros
- SimplePositiveTest(1, 15, 6, "0.000001");
- SimplePositiveTest(10, 15, 6, "0.00001");
- SimplePositiveTest(100, 15, 6, "0.0001");
- SimplePositiveTest(1000, 15, 6, "0.001");
- SimplePositiveTest(10000, 15, 6, "0.01");
- SimplePositiveTest(100000, 15, 6, "0.1");
- SimplePositiveTest(1000000, 15, 6, "1");
- SimplePositiveTest(10000000, 15, 6, "10");
- SimplePositiveTest(100000000, 15, 6, "100");
-
- SimplePositiveTest(2020000, 15, 6, "2.02");
- SimplePositiveTest(3003000, 15, 6, "3.003");
-
- // negative numbers
- SimplePositiveTest(-1, 15, 6, "-0.000001");
- SimplePositiveTest(-10, 15, 6, "-0.00001");
- SimplePositiveTest(-100, 15, 6, "-0.0001");
- SimplePositiveTest(-1000, 15, 6, "-0.001");
- SimplePositiveTest(-10000, 15, 6, "-0.01");
- SimplePositiveTest(-100000, 15, 6, "-0.1");
- SimplePositiveTest(-1000000, 15, 6, "-1");
- SimplePositiveTest(-10000000, 15, 6, "-10");
- SimplePositiveTest(-100000000, 15, 6, "-100");
-
- SimplePositiveTest(-2020000, 15, 6, "-2.02");
- SimplePositiveTest(-3003000, 15, 6, "-3.003");
-
- SimplePositiveTest(1, 15, 6, "0.000001");
- SimplePositiveTest(12, 15, 6, "0.000012");
- SimplePositiveTest(123, 15, 6, "0.000123");
- SimplePositiveTest(1234, 15, 6, "0.001234");
- SimplePositiveTest(12345, 15, 6, "0.012345");
- SimplePositiveTest(123456, 15, 6, "0.123456");
- SimplePositiveTest(1234567, 15, 6, "1.234567");
- SimplePositiveTest(12345678, 15, 6, "12.345678");
- SimplePositiveTest(123456789, 15, 6, "123.456789");
- SimplePositiveTest(1234567898, 15, 6, "1234.567898");
- SimplePositiveTest(12345678987ll, 15, 6, "12345.678987");
- SimplePositiveTest(123456789876ll, 15, 6, "123456.789876");
- }
+Y_UNIT_TEST(TestFormats) {
+ // we have no trailing zeros
+ SimplePositiveTest(1, 15, 6, "0.000001");
+ SimplePositiveTest(10, 15, 6, "0.00001");
+ SimplePositiveTest(100, 15, 6, "0.0001");
+ SimplePositiveTest(1000, 15, 6, "0.001");
+ SimplePositiveTest(10000, 15, 6, "0.01");
+ SimplePositiveTest(100000, 15, 6, "0.1");
+ SimplePositiveTest(1000000, 15, 6, "1");
+ SimplePositiveTest(10000000, 15, 6, "10");
+ SimplePositiveTest(100000000, 15, 6, "100");
+
+ SimplePositiveTest(2020000, 15, 6, "2.02");
+ SimplePositiveTest(3003000, 15, 6, "3.003");
+
+ // negative numbers
+ SimplePositiveTest(-1, 15, 6, "-0.000001");
+ SimplePositiveTest(-10, 15, 6, "-0.00001");
+ SimplePositiveTest(-100, 15, 6, "-0.0001");
+ SimplePositiveTest(-1000, 15, 6, "-0.001");
+ SimplePositiveTest(-10000, 15, 6, "-0.01");
+ SimplePositiveTest(-100000, 15, 6, "-0.1");
+ SimplePositiveTest(-1000000, 15, 6, "-1");
+ SimplePositiveTest(-10000000, 15, 6, "-10");
+ SimplePositiveTest(-100000000, 15, 6, "-100");
+
+ SimplePositiveTest(-2020000, 15, 6, "-2.02");
+ SimplePositiveTest(-3003000, 15, 6, "-3.003");
+
+ SimplePositiveTest(1, 15, 6, "0.000001");
+ SimplePositiveTest(12, 15, 6, "0.000012");
+ SimplePositiveTest(123, 15, 6, "0.000123");
+ SimplePositiveTest(1234, 15, 6, "0.001234");
+ SimplePositiveTest(12345, 15, 6, "0.012345");
+ SimplePositiveTest(123456, 15, 6, "0.123456");
+ SimplePositiveTest(1234567, 15, 6, "1.234567");
+ SimplePositiveTest(12345678, 15, 6, "12.345678");
+ SimplePositiveTest(123456789, 15, 6, "123.456789");
+ SimplePositiveTest(1234567898, 15, 6, "1234.567898");
+ SimplePositiveTest(12345678987ll, 15, 6, "12345.678987");
+ SimplePositiveTest(123456789876ll, 15, 6, "123456.789876");
+}
- Y_UNIT_TEST(TestHugeNumberFormat) {
- TInt128 max120 = Inf() - 1;
- const char max120String[] = "99999999999999999999999999999999999"; // 35 digits
- static_assert(sizeof(max120String) == 36, "sizeof(max120String) == 36");
- SimplePositiveTest(max120, MaxPrecision, 0, max120String);
- SimplePositiveTest(max120 + 1, MaxPrecision, 0, "inf");
-
- TInt128 min120 = -Inf() + 1;
- const char min120String[] = "-99999999999999999999999999999999999";
- static_assert(sizeof(min120String) == 37, "sizeof(min120String) == 37");
- SimplePositiveTest(min120, MaxPrecision, 0, min120String);
- SimplePositiveTest(min120 - 1, MaxPrecision, 0, "-inf");
-
- // take spot for sign and zero before dot
- const char min120StringAfterDot[] = "-0.99999999999999999999999999999999999"; // 35 by nine + leading zero
- static_assert(sizeof(min120StringAfterDot) == 39, "sizeof(min120StringAfterDot) == 39");
- SimplePositiveTest(min120, MaxPrecision, MaxPrecision, min120StringAfterDot);
-
- SimpleNegativeFormatTest(1, MaxPrecision + 1, MaxPrecision + 1);
- SimpleNegativeFormatTest(1, MaxPrecision + 1, 0);
- SimpleNegativeFormatTest(1, 2, 3);
- }
+Y_UNIT_TEST(TestHugeNumberFormat) {
+ TInt128 max120 = Inf() - 1;
+ const char max120String[] = "99999999999999999999999999999999999"; // 35 digits
+ static_assert(sizeof(max120String) == 36, "sizeof(max120String) == 36");
+ SimplePositiveTest(max120, MaxPrecision, 0, max120String);
+ SimplePositiveTest(max120 + 1, MaxPrecision, 0, "inf");
+
+ TInt128 min120 = -Inf() + 1;
+ const char min120String[] = "-99999999999999999999999999999999999";
+ static_assert(sizeof(min120String) == 37, "sizeof(min120String) == 37");
+ SimplePositiveTest(min120, MaxPrecision, 0, min120String);
+ SimplePositiveTest(min120 - 1, MaxPrecision, 0, "-inf");
+
+ // take spot for sign and zero before dot
+ const char min120StringAfterDot[] = "-0.99999999999999999999999999999999999"; // 35 by nine + leading zero
+ static_assert(sizeof(min120StringAfterDot) == 39, "sizeof(min120StringAfterDot) == 39");
+ SimplePositiveTest(min120, MaxPrecision, MaxPrecision, min120StringAfterDot);
+
+ SimpleNegativeFormatTest(1, MaxPrecision + 1, MaxPrecision + 1);
+ SimpleNegativeFormatTest(1, MaxPrecision + 1, 0);
+ SimpleNegativeFormatTest(1, 2, 3);
+}
- Y_UNIT_TEST(TestFormStringRoundToEven) {
- UNIT_ASSERT(FromString(".51", 1, 0) == 1);
- UNIT_ASSERT(FromString("-0.51", 1, 0) == -1);
+Y_UNIT_TEST(TestFormStringRoundToEven) {
+ UNIT_ASSERT(FromString(".51", 1, 0) == 1);
+ UNIT_ASSERT(FromString("-0.51", 1, 0) == -1);
- UNIT_ASSERT(FromString("+00000008.5", 1, 0) == 8);
- UNIT_ASSERT(FromString("-8.5000000000000000000000000000000", 1, 0) == -8);
+ UNIT_ASSERT(FromString("+00000008.5", 1, 0) == 8);
+ UNIT_ASSERT(FromString("-8.5000000000000000000000000000000", 1, 0) == -8);
- UNIT_ASSERT(FromString("00008.51", 1, 0) == 9);
- UNIT_ASSERT(FromString("-8.5000000000000000000000000000001", 1, 0) == -9);
+ UNIT_ASSERT(FromString("00008.51", 1, 0) == 9);
+ UNIT_ASSERT(FromString("-8.5000000000000000000000000000001", 1, 0) == -9);
- UNIT_ASSERT(FromString("09.499999999999999999999999999999999999999999999999999999999", 1, 0) == 9);
- UNIT_ASSERT(FromString("-9.499999999999999999999999999999999999999999999999999999999", 1, 0) == -9);
+ UNIT_ASSERT(FromString("09.499999999999999999999999999999999999999999999999999999999", 1, 0) == 9);
+ UNIT_ASSERT(FromString("-9.499999999999999999999999999999999999999999999999999999999", 1, 0) == -9);
- UNIT_ASSERT(FromString("9.50", 2, 0) == 10);
- UNIT_ASSERT(FromString("-9.5", 2, 0) == -10);
+ UNIT_ASSERT(FromString("9.50", 2, 0) == 10);
+ UNIT_ASSERT(FromString("-9.5", 2, 0) == -10);
- UNIT_ASSERT(FromString("+0.9949", 2, 2) == 99);
- UNIT_ASSERT(FromString("-0.9949", 2, 2) == -99);
- }
+ UNIT_ASSERT(FromString("+0.9949", 2, 2) == 99);
+ UNIT_ASSERT(FromString("-0.9949", 2, 2) == -99);
+}
- Y_UNIT_TEST(TestInfinityValues) {
- UNIT_ASSERT(FromString("+1", 1, 1) == Inf());
- UNIT_ASSERT(FromString("-1", 1, 1) == -Inf());
+Y_UNIT_TEST(TestInfinityValues) {
+ UNIT_ASSERT(FromString("+1", 1, 1) == Inf());
+ UNIT_ASSERT(FromString("-1", 1, 1) == -Inf());
- UNIT_ASSERT(FromString("10.000", 1, 0) == Inf());
- UNIT_ASSERT(FromString("-10.000", 1, 0) == -Inf());
+ UNIT_ASSERT(FromString("10.000", 1, 0) == Inf());
+ UNIT_ASSERT(FromString("-10.000", 1, 0) == -Inf());
- UNIT_ASSERT(FromString("9.500", 1, 0) == Inf());
- UNIT_ASSERT(FromString("-9.500", 1, 0) == -Inf());
+ UNIT_ASSERT(FromString("9.500", 1, 0) == Inf());
+ UNIT_ASSERT(FromString("-9.500", 1, 0) == -Inf());
- UNIT_ASSERT(FromString("+0.950", 1, 1) == Inf());
- UNIT_ASSERT(FromString("-0.950", 1, 1) == -Inf());
+ UNIT_ASSERT(FromString("+0.950", 1, 1) == Inf());
+ UNIT_ASSERT(FromString("-0.950", 1, 1) == -Inf());
- UNIT_ASSERT(FromString("+0.9950", 2, 2) == Inf());
- UNIT_ASSERT(FromString("-0.9950", 2, 2) == -Inf());
+ UNIT_ASSERT(FromString("+0.9950", 2, 2) == Inf());
+ UNIT_ASSERT(FromString("-0.9950", 2, 2) == -Inf());
- UNIT_ASSERT(FromString("9999999999999999999999999999999999999.5", 35, 0) == Inf());
- UNIT_ASSERT(FromString("-9999999999999999999999999999999999999.5", 35, 0) == -Inf());
- }
+ UNIT_ASSERT(FromString("9999999999999999999999999999999999999.5", 35, 0) == Inf());
+ UNIT_ASSERT(FromString("-9999999999999999999999999999999999999.5", 35, 0) == -Inf());
+}
- Y_UNIT_TEST(TestInvalidValues) {
- UNIT_ASSERT(IsValid("+999999999999999991234567890.039493804903849038490312345678909999999999999999990"));
+Y_UNIT_TEST(TestInvalidValues) {
+ UNIT_ASSERT(IsValid("+999999999999999991234567890.039493804903849038490312345678909999999999999999990"));
- UNIT_ASSERT(!IsValid("")); // empty
- UNIT_ASSERT(!IsValid("12.2.3")); // double dot
- UNIT_ASSERT(!IsValid("+-12")); // extra sign
- UNIT_ASSERT(!IsValid("463786378O74674")); // letter inside
+ UNIT_ASSERT(!IsValid("")); // empty
+ UNIT_ASSERT(!IsValid("12.2.3")); // double dot
+ UNIT_ASSERT(!IsValid("+-12")); // extra sign
+ UNIT_ASSERT(!IsValid("463786378O74674")); // letter inside
- UNIT_ASSERT(IsError(FromString("", 35, 15))); // empty
- UNIT_ASSERT(IsError(FromString("12.2.3", 35, 15))); // double dot
- UNIT_ASSERT(IsError(FromString("+-12", 35, 15))); // extra sign
- UNIT_ASSERT(IsError(FromString("463786378O74674", 35, 15))); // letter inside
- UNIT_ASSERT(IsError(FromString("+7.039493804E1", 35, 5))); // letter in tail after scale
- }
+ UNIT_ASSERT(IsError(FromString("", 35, 15))); // empty
+ UNIT_ASSERT(IsError(FromString("12.2.3", 35, 15))); // double dot
+ UNIT_ASSERT(IsError(FromString("+-12", 35, 15))); // extra sign
+ UNIT_ASSERT(IsError(FromString("463786378O74674", 35, 15))); // letter inside
+ UNIT_ASSERT(IsError(FromString("+7.039493804E1", 35, 5))); // letter in tail after scale
+}
- Y_UNIT_TEST(TestFormStringEx) {
- UNIT_ASSERT(FromStringEx("NAN", 13, 1) == Nan());
- UNIT_ASSERT(FromStringEx("+inf", 11, 7) == Inf());
- UNIT_ASSERT(FromStringEx("-inf", 7, 7) == -Inf());
-
- UNIT_ASSERT(FromStringEx("0.1E3", 10, 1) == 1000);
- UNIT_ASSERT(FromStringEx("0.51e-3", 10, 3) == 1);
-
- UNIT_ASSERT(FromStringEx("1E30", 10, 0) == Inf());
- UNIT_ASSERT(FromStringEx("1e-30", 10, 0) == 0);
- UNIT_ASSERT(FromStringEx("-1E+99", 10, 2) == -Inf());
- UNIT_ASSERT(FromStringEx("-1e-99", 10, 2) == 0);
- UNIT_ASSERT(FromStringEx("-510e-3", 1, 0) == -1);
- UNIT_ASSERT(FromStringEx("+99E3", 5, 0) == 99000);
- UNIT_ASSERT(FromStringEx("2.1E-130", 35, 2) == 0);
- UNIT_ASSERT(FromStringEx("2.1E0", 35, 2) == 210);
- }
+Y_UNIT_TEST(TestFormStringEx) {
+ UNIT_ASSERT(FromStringEx("NAN", 13, 1) == Nan());
+ UNIT_ASSERT(FromStringEx("+inf", 11, 7) == Inf());
+ UNIT_ASSERT(FromStringEx("-inf", 7, 7) == -Inf());
+
+ UNIT_ASSERT(FromStringEx("0.1E3", 10, 1) == 1000);
+ UNIT_ASSERT(FromStringEx("0.51e-3", 10, 3) == 1);
+
+ UNIT_ASSERT(FromStringEx("1E30", 10, 0) == Inf());
+ UNIT_ASSERT(FromStringEx("1e-30", 10, 0) == 0);
+ UNIT_ASSERT(FromStringEx("-1E+99", 10, 2) == -Inf());
+ UNIT_ASSERT(FromStringEx("-1e-99", 10, 2) == 0);
+ UNIT_ASSERT(FromStringEx("-510e-3", 1, 0) == -1);
+ UNIT_ASSERT(FromStringEx("+99E3", 5, 0) == 99000);
+ UNIT_ASSERT(FromStringEx("2.1E-130", 35, 2) == 0);
+ UNIT_ASSERT(FromStringEx("2.1E0", 35, 2) == 210);
+}
- Y_UNIT_TEST(TestFormStringExInvalidValues) {
- UNIT_ASSERT(IsError(FromStringEx("", 35, 15))); // empty
- UNIT_ASSERT(IsError(FromStringEx("12.2.3", 35, 15))); // double dot
- UNIT_ASSERT(IsError(FromStringEx("+-12", 35, 15))); // extra sign
- UNIT_ASSERT(IsError(FromStringEx("463786378O74674", 35, 15))); // letter inside
-
- UNIT_ASSERT(IsError(FromStringEx("E2", 35, 15))); // empty
- UNIT_ASSERT(IsError(FromStringEx("E2E4", 35, 15))); // empty
- UNIT_ASSERT(IsError(FromStringEx("NANE5", 35, 15))); // nan with exp
- UNIT_ASSERT(IsError(FromStringEx("infE5", 35, 15))); // inf with exp
- UNIT_ASSERT(IsError(FromStringEx("-infe-5", 35, 15))); // inf with exp
- UNIT_ASSERT(IsError(FromStringEx("2.1E0X", 35, 2))); // not fully parsed exp
- UNIT_ASSERT(IsError(FromStringEx("2.1E+-1", 35, 2))); // two signs
- UNIT_ASSERT(IsError(FromStringEx("ae30", 10, 0))); // bad mantissa
- }
+Y_UNIT_TEST(TestFormStringExInvalidValues) {
+ UNIT_ASSERT(IsError(FromStringEx("", 35, 15))); // empty
+ UNIT_ASSERT(IsError(FromStringEx("12.2.3", 35, 15))); // double dot
+ UNIT_ASSERT(IsError(FromStringEx("+-12", 35, 15))); // extra sign
+ UNIT_ASSERT(IsError(FromStringEx("463786378O74674", 35, 15))); // letter inside
+
+ UNIT_ASSERT(IsError(FromStringEx("E2", 35, 15))); // empty
+ UNIT_ASSERT(IsError(FromStringEx("E2E4", 35, 15))); // empty
+ UNIT_ASSERT(IsError(FromStringEx("NANE5", 35, 15))); // nan with exp
+ UNIT_ASSERT(IsError(FromStringEx("infE5", 35, 15))); // inf with exp
+ UNIT_ASSERT(IsError(FromStringEx("-infe-5", 35, 15))); // inf with exp
+ UNIT_ASSERT(IsError(FromStringEx("2.1E0X", 35, 2))); // not fully parsed exp
+ UNIT_ASSERT(IsError(FromStringEx("2.1E+-1", 35, 2))); // two signs
+ UNIT_ASSERT(IsError(FromStringEx("ae30", 10, 0))); // bad mantissa
+}
- Y_UNIT_TEST(TestSpecialAsString) {
- UNIT_ASSERT(IsValid("Nan"));
- UNIT_ASSERT(IsValid("INF"));
- UNIT_ASSERT(IsValid("-inf"));
+Y_UNIT_TEST(TestSpecialAsString) {
+ UNIT_ASSERT(IsValid("Nan"));
+ UNIT_ASSERT(IsValid("INF"));
+ UNIT_ASSERT(IsValid("-inf"));
- UNIT_ASSERT_VALUES_EQUAL(ToString(Nan(), 10, 2), "nan");
+ UNIT_ASSERT_VALUES_EQUAL(ToString(Nan(), 10, 2), "nan");
- UNIT_ASSERT_VALUES_EQUAL(ToString(+Inf(), 10, 2), "inf");
- UNIT_ASSERT_VALUES_EQUAL(ToString(-Inf(), 10, 2), "-inf");
+ UNIT_ASSERT_VALUES_EQUAL(ToString(+Inf(), 10, 2), "inf");
+ UNIT_ASSERT_VALUES_EQUAL(ToString(-Inf(), 10, 2), "-inf");
+
+ UNIT_ASSERT(IsNan(FromString("nan", 10, 2)));
+ UNIT_ASSERT(IsInf(FromString("+INf", MaxPrecision, 6)));
+ UNIT_ASSERT(IsInf(FromString("-inF", 4, 2)));
+}
- UNIT_ASSERT(IsNan(FromString("nan", 10, 2)));
- UNIT_ASSERT(IsInf(FromString("+INf", MaxPrecision, 6)));
- UNIT_ASSERT(IsInf(FromString("-inF", 4, 2)));
+Y_UNIT_TEST(TestToStringOfNonNormal) {
+ // above Inf
+ for (TInt128 i = Inf() + 2, end = Inf() + 100; i < end; i++) {
+ UNIT_ASSERT(!IsNormal(i));
+ UNIT_ASSERT(ToString(i, MaxPrecision, 0) == nullptr);
}
- Y_UNIT_TEST(TestToStringOfNonNormal) {
- // above Inf
- for (TInt128 i = Inf() + 2, end = Inf() + 100; i < end; i++) {
- UNIT_ASSERT(!IsNormal(i));
- UNIT_ASSERT(ToString(i, MaxPrecision, 0) == nullptr);
- }
-
- // below -Inf
- for (TInt128 i = -Inf() - 2, end = -Inf() - 100; i < end; i--) {
- UNIT_ASSERT(!IsNormal(i));
- UNIT_ASSERT(ToString(i, MaxPrecision, 0) == nullptr);
- }
+ // below -Inf
+ for (TInt128 i = -Inf() - 2, end = -Inf() - 100; i < end; i--) {
+ UNIT_ASSERT(!IsNormal(i));
+ UNIT_ASSERT(ToString(i, MaxPrecision, 0) == nullptr);
}
+}
- Y_UNIT_TEST(TestSerializeAndDeserialize) {
- SimpleSerializeAndDeserialize(-Nan(), 1U);
- SimpleSerializeAndDeserialize(-Inf(), 1U);
+Y_UNIT_TEST(TestSerializeAndDeserialize) {
+ SimpleSerializeAndDeserialize(-Nan(), 1U);
+ SimpleSerializeAndDeserialize(-Inf(), 1U);
- SimpleSerializeAndDeserialize(-Inf() + 1, 16U);
- SimpleSerializeAndDeserialize(-Inf() + 2, 16U);
+ SimpleSerializeAndDeserialize(-Inf() + 1, 16U);
+ SimpleSerializeAndDeserialize(-Inf() + 2, 16U);
- SimpleSerializeAndDeserialize(-65537, 4U);
- SimpleSerializeAndDeserialize(-65536, 3U);
+ SimpleSerializeAndDeserialize(-65537, 4U);
+ SimpleSerializeAndDeserialize(-65536, 3U);
- SimpleSerializeAndDeserialize(-257, 3U);
- SimpleSerializeAndDeserialize(-256, 2U);
+ SimpleSerializeAndDeserialize(-257, 3U);
+ SimpleSerializeAndDeserialize(-256, 2U);
- SimpleSerializeAndDeserialize(-3, 2U);
- SimpleSerializeAndDeserialize(-2, 2U);
+ SimpleSerializeAndDeserialize(-3, 2U);
+ SimpleSerializeAndDeserialize(-2, 2U);
- SimpleSerializeAndDeserialize(-1, 1U);
- SimpleSerializeAndDeserialize(0, 1U);
+ SimpleSerializeAndDeserialize(-1, 1U);
+ SimpleSerializeAndDeserialize(0, 1U);
- SimpleSerializeAndDeserialize(+1, 2U);
- SimpleSerializeAndDeserialize(+2, 2U);
+ SimpleSerializeAndDeserialize(+1, 2U);
+ SimpleSerializeAndDeserialize(+2, 2U);
- SimpleSerializeAndDeserialize(+255, 2U);
- SimpleSerializeAndDeserialize(+256, 3U);
+ SimpleSerializeAndDeserialize(+255, 2U);
+ SimpleSerializeAndDeserialize(+256, 3U);
- SimpleSerializeAndDeserialize(+65535, 3U);
- SimpleSerializeAndDeserialize(+65536, 4U);
+ SimpleSerializeAndDeserialize(+65535, 3U);
+ SimpleSerializeAndDeserialize(+65536, 4U);
- SimpleSerializeAndDeserialize(+Inf() - 2, 16U);
- SimpleSerializeAndDeserialize(+Inf() - 1, 16U);
+ SimpleSerializeAndDeserialize(+Inf() - 2, 16U);
+ SimpleSerializeAndDeserialize(+Inf() - 1, 16U);
- SimpleSerializeAndDeserialize(+Inf(), 1U);
- SimpleSerializeAndDeserialize(+Nan(), 1U);
- }
+ SimpleSerializeAndDeserialize(+Inf(), 1U);
+ SimpleSerializeAndDeserialize(+Nan(), 1U);
+}
- Y_UNIT_TEST(TestMulAndRescale) {
- CheckMulAndRescale<35,35>("0.99999999999999999999999999999999999", "-0.99999999999999999999999999999999999", "-0.99999999999999999999999999999999998");
- CheckMulAndRescale<35,35>("-0.99999999999999999999999999999999999", "0.33333333333333333333333333333333333", "-0.33333333333333333333333333333333333");
- CheckMulAndRescale<35,35>("0.33333333333333333333333333333333333", "0.33333333333333333333333333333333333", "0.11111111111111111111111111111111111");
- CheckMulAndRescale<35,35>("0.99999999999999999999999999999999999", "0.000000000000001", "0.000000000000001");
- CheckMulAndRescale<35,35>("0.99999999999999999999999999999999999", "0.00000000000000101010101", "0.00000000000000101010101");
- CheckMulAndRescale<35,35>("0.12345678901234567890123456789012345", "0.12345678901234567890123456789012345", "0.01524157875323883675049535156256668");
-
- CheckMulAndRescale<35,34>("9.9999999999999999999999999999999999", "-1.9999999999999999999999999999999999", "-inf");
- CheckMulAndRescale<35,34>("3.3333333333333333333333333333333333", "3.3333333333333333333333333333333333", "inf");
- CheckMulAndRescale<35,34>("3.3333333333333333333333333333333333", "1.3333333333333333333333333333333333", "4.4444444444444444444444444444444443");
- CheckMulAndRescale<35,34>("-1.3333333333333333333333333333333333", "1.3333333333333333333333333333333333", "-1.7777777777777777777777777777777777");
-
- CheckMulAndRescale<35,34>("-7", "0", "0");
- CheckMulAndRescale<35,34>("inf", "nan", "nan");
- CheckMulAndRescale<35,34>("inf", "0", "nan");
- CheckMulAndRescale<35,34>("-inf", "-inf", "inf");
- }
+Y_UNIT_TEST(TestMulAndRescale) {
+ CheckMulAndRescale<35, 35>("0.99999999999999999999999999999999999", "-0.99999999999999999999999999999999999", "-0.99999999999999999999999999999999998");
+ CheckMulAndRescale<35, 35>("-0.99999999999999999999999999999999999", "0.33333333333333333333333333333333333", "-0.33333333333333333333333333333333333");
+ CheckMulAndRescale<35, 35>("0.33333333333333333333333333333333333", "0.33333333333333333333333333333333333", "0.11111111111111111111111111111111111");
+ CheckMulAndRescale<35, 35>("0.99999999999999999999999999999999999", "0.000000000000001", "0.000000000000001");
+ CheckMulAndRescale<35, 35>("0.99999999999999999999999999999999999", "0.00000000000000101010101", "0.00000000000000101010101");
+ CheckMulAndRescale<35, 35>("0.12345678901234567890123456789012345", "0.12345678901234567890123456789012345", "0.01524157875323883675049535156256668");
+
+ CheckMulAndRescale<35, 34>("9.9999999999999999999999999999999999", "-1.9999999999999999999999999999999999", "-inf");
+ CheckMulAndRescale<35, 34>("3.3333333333333333333333333333333333", "3.3333333333333333333333333333333333", "inf");
+ CheckMulAndRescale<35, 34>("3.3333333333333333333333333333333333", "1.3333333333333333333333333333333333", "4.4444444444444444444444444444444443");
+ CheckMulAndRescale<35, 34>("-1.3333333333333333333333333333333333", "1.3333333333333333333333333333333333", "-1.7777777777777777777777777777777777");
+
+ CheckMulAndRescale<35, 34>("-7", "0", "0");
+ CheckMulAndRescale<35, 34>("inf", "nan", "nan");
+ CheckMulAndRescale<35, 34>("inf", "0", "nan");
+ CheckMulAndRescale<35, 34>("-inf", "-inf", "inf");
+}
- Y_UNIT_TEST(TestDivAndRescale) {
- CheckDivAndRescale<35,35>("-0.99999999999999999999999999999999999", "0.33333333333333333333333333333333333", "-inf");
- CheckDivAndRescale<35,35>("0.33333333333333333333333333333333333", "-0.33333333333333333333333333333333333", "-inf");
- CheckDivAndRescale<35,35>("0.12345678901234567890123456789012345", "0.12345678901234567890123456789012345", "inf");
+Y_UNIT_TEST(TestDivAndRescale) {
+ CheckDivAndRescale<35, 35>("-0.99999999999999999999999999999999999", "0.33333333333333333333333333333333333", "-inf");
+ CheckDivAndRescale<35, 35>("0.33333333333333333333333333333333333", "-0.33333333333333333333333333333333333", "-inf");
+ CheckDivAndRescale<35, 35>("0.12345678901234567890123456789012345", "0.12345678901234567890123456789012345", "inf");
- CheckDivAndRescale<35,34>("9.9999999999999999999999999999999999", "-1.9999999999999999999999999999999999", "-5.0000000000000000000000000000000002");
- CheckDivAndRescale<35,34>("3.3333333333333333333333333333333333", "3.3333333333333333333333333333333333", "1");
- CheckDivAndRescale<35,34>("3.3333333333333333333333333333333333", "1.3333333333333333333333333333333333", "2.5");
- CheckDivAndRescale<35,34>("-1.7777777777777777777777777777777777", "1.3333333333333333333333333333333333", "-1.3333333333333333333333333333333333");
+ CheckDivAndRescale<35, 34>("9.9999999999999999999999999999999999", "-1.9999999999999999999999999999999999", "-5.0000000000000000000000000000000002");
+ CheckDivAndRescale<35, 34>("3.3333333333333333333333333333333333", "3.3333333333333333333333333333333333", "1");
+ CheckDivAndRescale<35, 34>("3.3333333333333333333333333333333333", "1.3333333333333333333333333333333333", "2.5");
+ CheckDivAndRescale<35, 34>("-1.7777777777777777777777777777777777", "1.3333333333333333333333333333333333", "-1.3333333333333333333333333333333333");
- CheckDivAndRescale<35,34>("-7", "0", "-inf");
- CheckDivAndRescale<35,34>("inf", "0", "inf");
- CheckDivAndRescale<35,34>("inf", "0", "inf");
- CheckDivAndRescale<35,34>("-inf", "inf", "nan");
- }
+ CheckDivAndRescale<35, 34>("-7", "0", "-inf");
+ CheckDivAndRescale<35, 34>("inf", "0", "inf");
+ CheckDivAndRescale<35, 34>("inf", "0", "inf");
+ CheckDivAndRescale<35, 34>("-inf", "inf", "nan");
+}
- Y_UNIT_TEST(TestWideMul) {
- CheckMul<35>("999999999999999", "99999999999999999999", "99999999999999899999000000000000001");
- CheckMul<35>("9999999999999999", "99999999999999999999", "inf");
- CheckMul<35>("-99999999999999999999999999999999999", "10000000000000000000000000000000000", "-inf");
- CheckMul<35>("-99999999999999999999999999999999999", "-1", "99999999999999999999999999999999999");
- CheckMul<35>("-99999999999999999999999999999999999", "-2", "inf");
+Y_UNIT_TEST(TestWideMul) {
+ CheckMul<35>("999999999999999", "99999999999999999999", "99999999999999899999000000000000001");
+ CheckMul<35>("9999999999999999", "99999999999999999999", "inf");
+ CheckMul<35>("-99999999999999999999999999999999999", "10000000000000000000000000000000000", "-inf");
+ CheckMul<35>("-99999999999999999999999999999999999", "-1", "99999999999999999999999999999999999");
+ CheckMul<35>("-99999999999999999999999999999999999", "-2", "inf");
- CheckMul<35>("nan", "0", "nan");
- CheckMul<35>("inf", "-inf", "-inf");
- CheckMul<35>("inf", "nan", "nan");
- }
+ CheckMul<35>("nan", "0", "nan");
+ CheckMul<35>("inf", "-inf", "-inf");
+ CheckMul<35>("inf", "nan", "nan");
}
+} // Y_UNIT_TEST_SUITE(TYqlDecimalTest)
-}
-}
+} // namespace NDecimal
+} // namespace NYql
diff --git a/yql/essentials/public/decimal/ut/yql_wide_int_ut.cpp b/yql/essentials/public/decimal/ut/yql_wide_int_ut.cpp
index 5238249da17..16b5ad68c77 100644
--- a/yql/essentials/public/decimal/ut/yql_wide_int_ut.cpp
+++ b/yql/essentials/public/decimal/ut/yql_wide_int_ut.cpp
@@ -3,463 +3,455 @@
namespace NYql {
Y_UNIT_TEST_SUITE(TYqlWideIntTest) {
- template<typename T>
- void TestUnary(const T aa) {
- using Test = TWide<typename THalfOf<T>::Type>;
- const Test at(aa);
- static_assert(sizeof(at) == sizeof(aa), "Bad wide int size!");
-
- UNIT_ASSERT_VALUES_EQUAL(static_cast<i8>(aa), static_cast<i8>(at));
- UNIT_ASSERT_VALUES_EQUAL(static_cast<ui8>(aa), static_cast<ui8>(at));
- UNIT_ASSERT_VALUES_EQUAL(static_cast<i16>(aa), static_cast<i16>(at));
- UNIT_ASSERT_VALUES_EQUAL(static_cast<ui16>(aa), static_cast<ui16>(at));
- UNIT_ASSERT_VALUES_EQUAL(static_cast<i32>(aa), static_cast<i32>(at));
- UNIT_ASSERT_VALUES_EQUAL(static_cast<ui32>(aa), static_cast<ui32>(at));
- UNIT_ASSERT_VALUES_EQUAL(static_cast<i64>(aa), static_cast<i64>(at));
- UNIT_ASSERT_VALUES_EQUAL(static_cast<ui64>(aa), static_cast<ui64>(at));
+template <typename T>
+void TestUnary(const T aa) {
+ using Test = TWide<typename THalfOf<T>::Type>;
+ const Test at(aa);
+ static_assert(sizeof(at) == sizeof(aa), "Bad wide int size!");
+
+ UNIT_ASSERT_VALUES_EQUAL(static_cast<i8>(aa), static_cast<i8>(at));
+ UNIT_ASSERT_VALUES_EQUAL(static_cast<ui8>(aa), static_cast<ui8>(at));
+ UNIT_ASSERT_VALUES_EQUAL(static_cast<i16>(aa), static_cast<i16>(at));
+ UNIT_ASSERT_VALUES_EQUAL(static_cast<ui16>(aa), static_cast<ui16>(at));
+ UNIT_ASSERT_VALUES_EQUAL(static_cast<i32>(aa), static_cast<i32>(at));
+ UNIT_ASSERT_VALUES_EQUAL(static_cast<ui32>(aa), static_cast<ui32>(at));
+ UNIT_ASSERT_VALUES_EQUAL(static_cast<i64>(aa), static_cast<i64>(at));
+ UNIT_ASSERT_VALUES_EQUAL(static_cast<ui64>(aa), static_cast<ui64>(at));
#ifndef _win_
- UNIT_ASSERT(static_cast<i128_t>(aa) == static_cast<i128_t>(at));
- UNIT_ASSERT(static_cast<ui128_t>(aa) == static_cast<ui128_t>(at));
+ UNIT_ASSERT(static_cast<i128_t>(aa) == static_cast<i128_t>(at));
+ UNIT_ASSERT(static_cast<ui128_t>(aa) == static_cast<ui128_t>(at));
#endif
- {
- const auto exp = ~aa;
- const auto tst = ~at;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- const auto exp = +aa;
- const auto tst = +at;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- const auto exp = -aa;
- const auto tst = -at;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- auto exp = aa;
- auto tst = at;
- ++exp;
- ++tst;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- auto exp = aa;
- auto tst = at;
- --exp;
- --tst;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- auto exp = aa;
- auto tst = at;
- exp++;
- tst++;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- auto exp = aa;
- auto tst = at;
- exp--;
- tst--;
- UNIT_ASSERT(T(tst) == T(exp));
- }
+ {
+ const auto exp = ~aa;
+ const auto tst = ~at;
+ UNIT_ASSERT(T(tst) == T(exp));
}
- template<typename T>
- void TestBinary(const T ll, const T rr) {
- using Test = TWide<typename THalfOf<T>::Type>;
- const Test lt(ll), rt(rr);
-
- {
- const auto exp = ll & rr;
- const auto tst = lt & rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- const auto exp = ll | rr;
- const auto tst = lt | rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- const auto exp = ll ^ rr;
- const auto tst = lt ^ rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- const auto exp = ll + rr;
- const auto tst = lt + rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- const auto exp = ll - rr;
- const auto tst = lt - rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- if (rr > 0 && rr < T(sizeof(T) << 3U))
- {
- const auto exp = ll >> rr;
- const auto tst = lt >> rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- if (rr > 0 && rr < T(sizeof(T) << 3U))
- {
- const auto exp = ll << rr;
- const auto tst = lt << rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- const auto exp = ll * rr;
- const auto tst = lt * rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- if (rr)
- {
- const auto exp = ll / rr;
- const auto tst = lt / rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- if (rr)
- {
- const auto exp = ll % rr;
- const auto tst = lt % rt;
- UNIT_ASSERT(T(tst) == T(exp));
- }
-
- {
- const auto exp = ll == rr;
- const auto tst = lt == rt;
- UNIT_ASSERT_VALUES_EQUAL(tst, exp);
- }
-
- {
- const auto exp = ll != rr;
- const auto tst = lt != rt;
- UNIT_ASSERT_VALUES_EQUAL(tst, exp);
- }
-
- {
- const auto exp = ll > rr;
- const auto tst = lt > rt;
- UNIT_ASSERT_VALUES_EQUAL(tst, exp);
- }
-
- {
- const auto exp = ll < rr;
- const auto tst = lt < rt;
- UNIT_ASSERT_VALUES_EQUAL(tst, exp);
- }
-
- {
- const auto exp = ll >= rr;
- const auto tst = lt >= rt;
- UNIT_ASSERT_VALUES_EQUAL(tst, exp);
- }
-
- {
- const auto exp = ll <= rr;
- const auto tst = lt <= rt;
- UNIT_ASSERT_VALUES_EQUAL(tst, exp);
- }
+ {
+ const auto exp = +aa;
+ const auto tst = +at;
+ UNIT_ASSERT(T(tst) == T(exp));
}
- template<typename T>
- void TestsForUnsignedType() {
- static_assert(std::is_unsigned<T>::value, "Tests for unsigned type.");
- TestUnary<T>(2U);
- TestUnary<T>(4U);
- TestUnary<T>(17U);
- TestUnary<T>(42U);
- TestUnary<T>(127U);
- TestUnary<T>(128U);
- TestUnary<T>(129U);
- TestUnary<T>(200U);
- TestUnary<T>(255U);
- TestUnary<T>(256U);
- TestUnary<T>(257U);
-
- TestUnary<T>(std::numeric_limits<T>::min());
- TestUnary<T>(std::numeric_limits<T>::max());
- TestUnary<T>(std::numeric_limits<T>::max() - 1U);
- TestUnary<T>(std::numeric_limits<T>::max() >> 1U);
- TestUnary<T>(std::numeric_limits<T>::max() >> 3U);
- TestUnary<T>(std::numeric_limits<T>::max() >> 7U);
-
-
- TestUnary<T>(std::numeric_limits<T>::min() + 1U);
- TestUnary<T>(std::numeric_limits<T>::max() - 1U);
-
- TestUnary<T>(std::numeric_limits<T>::min() + 3U);
- TestUnary<T>(std::numeric_limits<T>::max() - 3U);
-
- TestUnary<T>(std::numeric_limits<T>::min() + 7U);
- TestUnary<T>(std::numeric_limits<T>::max() - 7U);
-
-
- TestBinary<T>(1U, 1U);
- TestBinary<T>(7U, 31U);
- TestBinary<T>(30000U, 13U);
- TestBinary<T>(127U, 13U);
- TestBinary<T>(128U, 19U);
- TestBinary<T>(129U, 17U);
-
-
- TestBinary<T>(std::numeric_limits<T>::min(), 7U);
- TestBinary<T>(std::numeric_limits<T>::max(), 7U);
-
- TestBinary<T>(std::numeric_limits<T>::min(), 8U);
- TestBinary<T>(std::numeric_limits<T>::max(), 8U);
-
- TestBinary<T>(std::numeric_limits<T>::min(), 9U);
- TestBinary<T>(std::numeric_limits<T>::max(), 9U);
-
- TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min() + 1U);
-
-
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::max());
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::min(), std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
-
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() + 1U);
- TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min() + 1U);
-
- TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::min() + 1U, std::numeric_limits<T>::min());
-
- TestBinary<T>(std::numeric_limits<T>::max(), 1U);
- TestBinary<T>(std::numeric_limits<T>::min(), 1U);
- TestBinary<T>(std::numeric_limits<T>::max() - 1U, 1U);
- TestBinary<T>(std::numeric_limits<T>::min() + 1U, 1U);
-
- TestBinary<T>(std::numeric_limits<T>::max(), 7U);
- TestBinary<T>(std::numeric_limits<T>::min(), 7U);
- TestBinary<T>(std::numeric_limits<T>::max() - 1U, 7U);
- TestBinary<T>(std::numeric_limits<T>::min() + 1U, 7U);
-
- TestBinary<T>(std::numeric_limits<T>::max() >> 1U, std::numeric_limits<T>::min() >> 1U);
- TestBinary<T>(std::numeric_limits<T>::max() >> 1U, std::numeric_limits<T>::min() + 1U);
- TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min() >> 1U);
- TestBinary<T>(std::numeric_limits<T>::max() >> 1U, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 1U);
-
- TestBinary<T>(std::numeric_limits<T>::max() >> 3U, std::numeric_limits<T>::min() >> 3U);
- TestBinary<T>(std::numeric_limits<T>::max() >> 3U, std::numeric_limits<T>::min() + 3U);
- TestBinary<T>(std::numeric_limits<T>::max() - 3U, std::numeric_limits<T>::min() >> 3U);
- TestBinary<T>(std::numeric_limits<T>::max() >> 3U, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 3U);
+ {
+ const auto exp = -aa;
+ const auto tst = -at;
+ UNIT_ASSERT(T(tst) == T(exp));
}
- template<typename T>
- void TestsForSignedType() {
- static_assert(std::is_signed<T>::value, "Tests for signed type.");
- TestUnary<T>(0);
+ {
+ auto exp = aa;
+ auto tst = at;
+ ++exp;
+ ++tst;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(1);
- TestUnary<T>(-1);
+ {
+ auto exp = aa;
+ auto tst = at;
+ --exp;
+ --tst;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(2);
- TestUnary<T>(-2);
+ {
+ auto exp = aa;
+ auto tst = at;
+ exp++;
+ tst++;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(3);
- TestUnary<T>(-3);
+ {
+ auto exp = aa;
+ auto tst = at;
+ exp--;
+ tst--;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
+}
- TestUnary<T>(4);
- TestUnary<T>(-4);
+template <typename T>
+void TestBinary(const T ll, const T rr) {
+ using Test = TWide<typename THalfOf<T>::Type>;
+ const Test lt(ll), rt(rr);
- TestUnary<T>(17);
- TestUnary<T>(-17);
+ {
+ const auto exp = ll & rr;
+ const auto tst = lt & rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(42);
- TestUnary<T>(-42);
+ {
+ const auto exp = ll | rr;
+ const auto tst = lt | rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(127);
- TestUnary<T>(-127);
+ {
+ const auto exp = ll ^ rr;
+ const auto tst = lt ^ rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(128);
- TestUnary<T>(-128);
+ {
+ const auto exp = ll + rr;
+ const auto tst = lt + rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(129);
- TestUnary<T>(-129);
+ {
+ const auto exp = ll - rr;
+ const auto tst = lt - rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(200);
- TestUnary<T>(-200);
+ if (rr > 0 && rr < T(sizeof(T) << 3U))
+ {
+ const auto exp = ll >> rr;
+ const auto tst = lt >> rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(255);
- TestUnary<T>(-255);
+ if (rr > 0 && rr < T(sizeof(T) << 3U))
+ {
+ const auto exp = ll << rr;
+ const auto tst = lt << rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(256);
- TestUnary<T>(-256);
+ {
+ const auto exp = ll * rr;
+ const auto tst = lt * rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(257);
- TestUnary<T>(-257);
+ if (rr)
+ {
+ const auto exp = ll / rr;
+ const auto tst = lt / rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(258);
- TestUnary<T>(-258);
+ if (rr)
+ {
+ const auto exp = ll % rr;
+ const auto tst = lt % rt;
+ UNIT_ASSERT(T(tst) == T(exp));
+ }
- TestUnary<T>(std::numeric_limits<T>::min());
- TestUnary<T>(std::numeric_limits<T>::max());
+ {
+ const auto exp = ll == rr;
+ const auto tst = lt == rt;
+ UNIT_ASSERT_VALUES_EQUAL(tst, exp);
+ }
- TestUnary<T>(std::numeric_limits<T>::min() + 1);
- TestUnary<T>(std::numeric_limits<T>::max() - 1);
+ {
+ const auto exp = ll != rr;
+ const auto tst = lt != rt;
+ UNIT_ASSERT_VALUES_EQUAL(tst, exp);
+ }
- TestUnary<T>(std::numeric_limits<T>::min() + 2);
- TestUnary<T>(std::numeric_limits<T>::max() - 2);
+ {
+ const auto exp = ll > rr;
+ const auto tst = lt > rt;
+ UNIT_ASSERT_VALUES_EQUAL(tst, exp);
+ }
- TestUnary<T>(std::numeric_limits<T>::min() + 3);
- TestUnary<T>(std::numeric_limits<T>::max() - 3);
+ {
+ const auto exp = ll < rr;
+ const auto tst = lt < rt;
+ UNIT_ASSERT_VALUES_EQUAL(tst, exp);
+ }
- TestUnary<T>(std::numeric_limits<T>::min() + 7);
- TestUnary<T>(std::numeric_limits<T>::max() - 7);
+ {
+ const auto exp = ll >= rr;
+ const auto tst = lt >= rt;
+ UNIT_ASSERT_VALUES_EQUAL(tst, exp);
+ }
- TestUnary<T>(std::numeric_limits<T>::min() >> 1);
- TestUnary<T>(std::numeric_limits<T>::max() >> 1);
+ {
+ const auto exp = ll <= rr;
+ const auto tst = lt <= rt;
+ UNIT_ASSERT_VALUES_EQUAL(tst, exp);
+ }
+}
- TestUnary<T>(std::numeric_limits<T>::min() >> 3);
- TestUnary<T>(std::numeric_limits<T>::max() >> 3);
+template <typename T>
+void TestsForUnsignedType() {
+ static_assert(std::is_unsigned<T>::value, "Tests for unsigned type.");
+ TestUnary<T>(2U);
+ TestUnary<T>(4U);
+ TestUnary<T>(17U);
+ TestUnary<T>(42U);
+ TestUnary<T>(127U);
+ TestUnary<T>(128U);
+ TestUnary<T>(129U);
+ TestUnary<T>(200U);
+ TestUnary<T>(255U);
+ TestUnary<T>(256U);
+ TestUnary<T>(257U);
+
+ TestUnary<T>(std::numeric_limits<T>::min());
+ TestUnary<T>(std::numeric_limits<T>::max());
+ TestUnary<T>(std::numeric_limits<T>::max() - 1U);
+ TestUnary<T>(std::numeric_limits<T>::max() >> 1U);
+ TestUnary<T>(std::numeric_limits<T>::max() >> 3U);
+ TestUnary<T>(std::numeric_limits<T>::max() >> 7U);
+
+ TestUnary<T>(std::numeric_limits<T>::min() + 1U);
+ TestUnary<T>(std::numeric_limits<T>::max() - 1U);
+
+ TestUnary<T>(std::numeric_limits<T>::min() + 3U);
+ TestUnary<T>(std::numeric_limits<T>::max() - 3U);
+
+ TestUnary<T>(std::numeric_limits<T>::min() + 7U);
+ TestUnary<T>(std::numeric_limits<T>::max() - 7U);
+
+ TestBinary<T>(1U, 1U);
+ TestBinary<T>(7U, 31U);
+ TestBinary<T>(30000U, 13U);
+ TestBinary<T>(127U, 13U);
+ TestBinary<T>(128U, 19U);
+ TestBinary<T>(129U, 17U);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), 7U);
+ TestBinary<T>(std::numeric_limits<T>::max(), 7U);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), 8U);
+ TestBinary<T>(std::numeric_limits<T>::max(), 8U);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), 9U);
+ TestBinary<T>(std::numeric_limits<T>::max(), 9U);
+
+ TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min() + 1U);
+
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::max());
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::min(), std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
+
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() + 1U);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min() + 1U);
+
+ TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::min() + 1U, std::numeric_limits<T>::min());
+
+ TestBinary<T>(std::numeric_limits<T>::max(), 1U);
+ TestBinary<T>(std::numeric_limits<T>::min(), 1U);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1U, 1U);
+ TestBinary<T>(std::numeric_limits<T>::min() + 1U, 1U);
+
+ TestBinary<T>(std::numeric_limits<T>::max(), 7U);
+ TestBinary<T>(std::numeric_limits<T>::min(), 7U);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1U, 7U);
+ TestBinary<T>(std::numeric_limits<T>::min() + 1U, 7U);
+
+ TestBinary<T>(std::numeric_limits<T>::max() >> 1U, std::numeric_limits<T>::min() >> 1U);
+ TestBinary<T>(std::numeric_limits<T>::max() >> 1U, std::numeric_limits<T>::min() + 1U);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1U, std::numeric_limits<T>::min() >> 1U);
+ TestBinary<T>(std::numeric_limits<T>::max() >> 1U, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 1U);
+
+ TestBinary<T>(std::numeric_limits<T>::max() >> 3U, std::numeric_limits<T>::min() >> 3U);
+ TestBinary<T>(std::numeric_limits<T>::max() >> 3U, std::numeric_limits<T>::min() + 3U);
+ TestBinary<T>(std::numeric_limits<T>::max() - 3U, std::numeric_limits<T>::min() >> 3U);
+ TestBinary<T>(std::numeric_limits<T>::max() >> 3U, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 3U);
+}
- TestUnary<T>(std::numeric_limits<T>::min() >> 7);
- TestUnary<T>(std::numeric_limits<T>::max() >> 7);
+template <typename T>
+void TestsForSignedType() {
+ static_assert(std::is_signed<T>::value, "Tests for signed type.");
+ TestUnary<T>(0);
+ TestUnary<T>(1);
+ TestUnary<T>(-1);
- TestUnary<T>(std::numeric_limits<T>::min() + 1);
- TestUnary<T>(std::numeric_limits<T>::max() - 1);
+ TestUnary<T>(2);
+ TestUnary<T>(-2);
- TestUnary<T>(std::numeric_limits<T>::min() + 3);
- TestUnary<T>(std::numeric_limits<T>::max() - 3);
+ TestUnary<T>(3);
+ TestUnary<T>(-3);
- TestUnary<T>(std::numeric_limits<T>::min() + 7);
- TestUnary<T>(std::numeric_limits<T>::max() - 7);
+ TestUnary<T>(4);
+ TestUnary<T>(-4);
+ TestUnary<T>(17);
+ TestUnary<T>(-17);
- TestBinary<T>(0, 0);
- TestBinary<T>(1, 0);
- TestBinary<T>(0, -1);
+ TestUnary<T>(42);
+ TestUnary<T>(-42);
- TestBinary<T>(1, 1);
- TestBinary<T>(1, -1);
- TestBinary<T>(-1, 1);
- TestBinary<T>(-1, -1);
+ TestUnary<T>(127);
+ TestUnary<T>(-127);
- TestBinary<T>(7, 42);
- TestBinary<T>(-7, 42);
+ TestUnary<T>(128);
+ TestUnary<T>(-128);
- TestBinary<T>(0, -43);
+ TestUnary<T>(129);
+ TestUnary<T>(-129);
- TestBinary<T>(-30000, 64);
- TestBinary<T>(30000, -64);
- TestBinary<T>(30000, 64);
+ TestUnary<T>(200);
+ TestUnary<T>(-200);
- TestBinary<T>(21, 0);
- TestBinary<T>(13, -127);
- TestBinary<T>(-19, 128);
- TestBinary<T>(-77, -129);
- TestBinary<T>(13, 127);
- TestBinary<T>(19, 128);
- TestBinary<T>(77, 129);
+ TestUnary<T>(255);
+ TestUnary<T>(-255);
- TestBinary<T>(std::numeric_limits<T>::max(), -1);
+ TestUnary<T>(256);
+ TestUnary<T>(-256);
- TestBinary<T>(std::numeric_limits<T>::min(), -7);
- TestBinary<T>(std::numeric_limits<T>::max(), -7);
+ TestUnary<T>(257);
+ TestUnary<T>(-257);
- TestBinary<T>(std::numeric_limits<T>::min(), -8);
- TestBinary<T>(std::numeric_limits<T>::max(), -8);
+ TestUnary<T>(258);
+ TestUnary<T>(-258);
- TestBinary<T>(std::numeric_limits<T>::min(), -9);
- TestBinary<T>(std::numeric_limits<T>::max(), -9);
+ TestUnary<T>(std::numeric_limits<T>::min());
+ TestUnary<T>(std::numeric_limits<T>::max());
- TestBinary<T>(std::numeric_limits<T>::min(), std::numeric_limits<T>::min() >> 5);
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 5);
+ TestUnary<T>(std::numeric_limits<T>::min() + 1);
+ TestUnary<T>(std::numeric_limits<T>::max() - 1);
+ TestUnary<T>(std::numeric_limits<T>::min() + 2);
+ TestUnary<T>(std::numeric_limits<T>::max() - 2);
- TestBinary<T>(std::numeric_limits<T>::min(), 7);
- TestBinary<T>(std::numeric_limits<T>::max(), 7);
+ TestUnary<T>(std::numeric_limits<T>::min() + 3);
+ TestUnary<T>(std::numeric_limits<T>::max() - 3);
- TestBinary<T>(std::numeric_limits<T>::min(), 8);
- TestBinary<T>(std::numeric_limits<T>::max(), 8);
+ TestUnary<T>(std::numeric_limits<T>::min() + 7);
+ TestUnary<T>(std::numeric_limits<T>::max() - 7);
- TestBinary<T>(std::numeric_limits<T>::min(), 9);
- TestBinary<T>(std::numeric_limits<T>::max(), 9);
+ TestUnary<T>(std::numeric_limits<T>::min() >> 1);
+ TestUnary<T>(std::numeric_limits<T>::max() >> 1);
- TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min() + 1);
+ TestUnary<T>(std::numeric_limits<T>::min() >> 3);
+ TestUnary<T>(std::numeric_limits<T>::max() >> 3);
+ TestUnary<T>(std::numeric_limits<T>::min() >> 7);
+ TestUnary<T>(std::numeric_limits<T>::max() >> 7);
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::max());
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::min(), std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
+ TestUnary<T>(std::numeric_limits<T>::min() + 1);
+ TestUnary<T>(std::numeric_limits<T>::max() - 1);
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() + 1);
- TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min() + 1);
+ TestUnary<T>(std::numeric_limits<T>::min() + 3);
+ TestUnary<T>(std::numeric_limits<T>::max() - 3);
- TestBinary<T>(std::numeric_limits<T>::max(), 0);
- TestBinary<T>(std::numeric_limits<T>::min(), 0);
- TestBinary<T>(std::numeric_limits<T>::max() - 1, 0);
- TestBinary<T>(std::numeric_limits<T>::min() + 1, 0);
+ TestUnary<T>(std::numeric_limits<T>::min() + 7);
+ TestUnary<T>(std::numeric_limits<T>::max() - 7);
- TestBinary<T>(std::numeric_limits<T>::max(), 1);
- TestBinary<T>(std::numeric_limits<T>::min(), 1);
- TestBinary<T>(std::numeric_limits<T>::max() - 1, 1);
- TestBinary<T>(std::numeric_limits<T>::min() + 1, 1);
+ TestBinary<T>(0, 0);
+ TestBinary<T>(1, 0);
+ TestBinary<T>(0, -1);
- TestBinary<T>(std::numeric_limits<T>::max(), 7);
- TestBinary<T>(std::numeric_limits<T>::min(), 7);
- TestBinary<T>(std::numeric_limits<T>::max() - 1, 7);
- TestBinary<T>(std::numeric_limits<T>::min() + 1, 7);
+ TestBinary<T>(1, 1);
+ TestBinary<T>(1, -1);
+ TestBinary<T>(-1, 1);
+ TestBinary<T>(-1, -1);
- TestBinary<T>(std::numeric_limits<T>::max() >> 1, std::numeric_limits<T>::min() >> 1);
- TestBinary<T>(std::numeric_limits<T>::max() >> 1, std::numeric_limits<T>::min() + 1);
- TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min() >> 1);
- TestBinary<T>(std::numeric_limits<T>::max() >> 1, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 1);
+ TestBinary<T>(7, 42);
+ TestBinary<T>(-7, 42);
- TestBinary<T>(std::numeric_limits<T>::max() >> 3, std::numeric_limits<T>::min() >> 3);
- TestBinary<T>(std::numeric_limits<T>::max() >> 3, std::numeric_limits<T>::min() + 3);
- TestBinary<T>(std::numeric_limits<T>::max() - 3, std::numeric_limits<T>::min() >> 3);
- TestBinary<T>(std::numeric_limits<T>::max() >> 3, std::numeric_limits<T>::min());
- TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 3);
- }
+ TestBinary<T>(0, -43);
- Y_UNIT_TEST(CheckUnsignedByCompilerIntegrals) {
- TestsForUnsignedType<ui32>();
- TestsForUnsignedType<ui64>();
-#ifndef _win_
- TestsForUnsignedType<ui128_t>();
-#endif
- }
+ TestBinary<T>(-30000, 64);
+ TestBinary<T>(30000, -64);
+ TestBinary<T>(30000, 64);
-#ifndef _ubsan_enabled_
-#ifndef _msan_enabled_
- Y_UNIT_TEST(CheckSignedByCompilerIntegrals) {
- TestsForSignedType<i32>();
- TestsForSignedType<i64>();
+ TestBinary<T>(21, 0);
+ TestBinary<T>(13, -127);
+ TestBinary<T>(-19, 128);
+ TestBinary<T>(-77, -129);
+ TestBinary<T>(13, 127);
+ TestBinary<T>(19, 128);
+ TestBinary<T>(77, 129);
+
+ TestBinary<T>(std::numeric_limits<T>::max(), -1);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), -7);
+ TestBinary<T>(std::numeric_limits<T>::max(), -7);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), -8);
+ TestBinary<T>(std::numeric_limits<T>::max(), -8);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), -9);
+ TestBinary<T>(std::numeric_limits<T>::max(), -9);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), std::numeric_limits<T>::min() >> 5);
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 5);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), 7);
+ TestBinary<T>(std::numeric_limits<T>::max(), 7);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), 8);
+ TestBinary<T>(std::numeric_limits<T>::max(), 8);
+
+ TestBinary<T>(std::numeric_limits<T>::min(), 9);
+ TestBinary<T>(std::numeric_limits<T>::max(), 9);
+
+ TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min() + 1);
+
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::max());
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::min(), std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
+
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() + 1);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min() + 1);
+
+ TestBinary<T>(std::numeric_limits<T>::max(), 0);
+ TestBinary<T>(std::numeric_limits<T>::min(), 0);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1, 0);
+ TestBinary<T>(std::numeric_limits<T>::min() + 1, 0);
+
+ TestBinary<T>(std::numeric_limits<T>::max(), 1);
+ TestBinary<T>(std::numeric_limits<T>::min(), 1);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1, 1);
+ TestBinary<T>(std::numeric_limits<T>::min() + 1, 1);
+
+ TestBinary<T>(std::numeric_limits<T>::max(), 7);
+ TestBinary<T>(std::numeric_limits<T>::min(), 7);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1, 7);
+ TestBinary<T>(std::numeric_limits<T>::min() + 1, 7);
+
+ TestBinary<T>(std::numeric_limits<T>::max() >> 1, std::numeric_limits<T>::min() >> 1);
+ TestBinary<T>(std::numeric_limits<T>::max() >> 1, std::numeric_limits<T>::min() + 1);
+ TestBinary<T>(std::numeric_limits<T>::max() - 1, std::numeric_limits<T>::min() >> 1);
+ TestBinary<T>(std::numeric_limits<T>::max() >> 1, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 1);
+
+ TestBinary<T>(std::numeric_limits<T>::max() >> 3, std::numeric_limits<T>::min() >> 3);
+ TestBinary<T>(std::numeric_limits<T>::max() >> 3, std::numeric_limits<T>::min() + 3);
+ TestBinary<T>(std::numeric_limits<T>::max() - 3, std::numeric_limits<T>::min() >> 3);
+ TestBinary<T>(std::numeric_limits<T>::max() >> 3, std::numeric_limits<T>::min());
+ TestBinary<T>(std::numeric_limits<T>::max(), std::numeric_limits<T>::min() >> 3);
+}
+
+Y_UNIT_TEST(CheckUnsignedByCompilerIntegrals) {
+ TestsForUnsignedType<ui32>();
+ TestsForUnsignedType<ui64>();
#ifndef _win_
- TestsForSignedType<i128_t>();
-#endif
- }
-#endif
+ TestsForUnsignedType<ui128_t>();
#endif
}
+#ifndef _ubsan_enabled_
+ #ifndef _msan_enabled_
+Y_UNIT_TEST(CheckSignedByCompilerIntegrals) {
+ TestsForSignedType<i32>();
+ TestsForSignedType<i64>();
+ #ifndef _win_
+ TestsForSignedType<i128_t>();
+ #endif
}
+ #endif
+#endif
+} // Y_UNIT_TEST_SUITE(TYqlWideIntTest)
+
+} // namespace NYql
diff --git a/yql/essentials/public/decimal/ya.make b/yql/essentials/public/decimal/ya.make
index a9c23995b33..a014a579fb4 100644
--- a/yql/essentials/public/decimal/ya.make
+++ b/yql/essentials/public/decimal/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
yql_decimal.h
yql_decimal.cpp
diff --git a/yql/essentials/public/decimal/yql_decimal.cpp b/yql/essentials/public/decimal/yql_decimal.cpp
index 91564a1a5f1..9c62939686f 100644
--- a/yql/essentials/public/decimal/yql_decimal.cpp
+++ b/yql/essentials/public/decimal/yql_decimal.cpp
@@ -16,8 +16,9 @@ TUint128 GetDivider(ui8 scale) {
}
TUint128 d(1U);
- while (scale--)
+ while (scale--) {
d *= Ten;
+ }
return d;
}
@@ -46,12 +47,15 @@ const char* ToString(TInt128 val, ui8 precision, ui8 scale) {
return nullptr;
}
- if (val == Inf())
+ if (val == Inf()) {
return "inf";
- if (val == -Inf())
+ }
+ if (val == -Inf()) {
return "-inf";
- if (val == Nan())
+ }
+ if (val == Nan()) {
return "nan";
+ }
if (!IsNormal(val)) {
return nullptr;
@@ -77,7 +81,6 @@ const char* ToString(TInt128 val, ui8 precision, ui8 scale) {
return nullptr;
}
-
const auto digit = ui8(v % Ten);
if (digit || !scale || s != end) {
*--s = "0123456789"[digit];
@@ -112,25 +115,26 @@ const char* ToString(TInt128 val, ui8 precision, ui8 scale) {
}
namespace {
- bool IsNan(const char* s) {
- return (s[0] == 'N' || s[0] == 'n') && (s[1] == 'A' || s[1] == 'a') && (s[2] == 'N' || s[2] == 'n');
- }
-
- bool IsInf(const char* s) {
- return (s[0] == 'I' || s[0] == 'i') && (s[1] == 'N' || s[1] == 'n') && (s[2] == 'F' || s[2] == 'f');
- }
+bool IsNan(const char* s) {
+ return (s[0] == 'N' || s[0] == 'n') && (s[1] == 'A' || s[1] == 'a') && (s[2] == 'N' || s[2] == 'n');
}
+bool IsInf(const char* s) {
+ return (s[0] == 'I' || s[0] == 'i') && (s[1] == 'N' || s[1] == 'n') && (s[2] == 'F' || s[2] == 'f');
+}
+} // namespace
TInt128 FromString(const TStringBuf& str, ui8 precision, ui8 scale) {
- if (scale > precision)
+ if (scale > precision) {
return Err();
+ }
auto s = str.data();
auto l = str.size();
- if (!s || !l)
+ if (!s || !l) {
return Err();
+ }
const bool neg = '-' == *s;
if (neg || '+' == *s) {
@@ -139,10 +143,12 @@ TInt128 FromString(const TStringBuf& str, ui8 precision, ui8 scale) {
}
if (3U == l) {
- if (IsInf(s))
+ if (IsInf(s)) {
return neg ? -Inf() : Inf();
- if (IsNan(s))
+ }
+ if (IsNan(s)) {
return Nan();
+ }
}
TUint128 v = 0U;
@@ -150,8 +156,9 @@ TInt128 FromString(const TStringBuf& str, ui8 precision, ui8 scale) {
for (bool dot = false; l; --l) {
if (*s == '.') {
- if (dot)
+ if (dot) {
return Err();
+ }
++s;
dot = true;
@@ -159,15 +166,17 @@ TInt128 FromString(const TStringBuf& str, ui8 precision, ui8 scale) {
}
if (dot) {
- if (scale)
+ if (scale) {
--scale;
- else
+ } else {
break;
+ }
}
const char c = *s++;
- if (!std::isdigit(c))
+ if (!std::isdigit(c)) {
return Err();
+ }
v *= Ten;
v += c - '0';
@@ -179,64 +188,73 @@ TInt128 FromString(const TStringBuf& str, ui8 precision, ui8 scale) {
if (l--) {
const char c = *s++;
- if (!std::isdigit(c))
+ if (!std::isdigit(c)) {
return Err();
+ }
bool plus = c > '5';
if (!plus && c == '5') {
for (plus = v & 1; !plus && l; --l) {
const char c = *s++;
- if (!std::isdigit(c))
+ if (!std::isdigit(c)) {
return Err();
+ }
plus = c != '0';
}
}
- while (l--)
- if (!std::isdigit(*s++))
+ while (l--) {
+ if (!std::isdigit(*s++)) {
return Err();
+ }
+ }
- if (plus)
- if (++v >= GetDivider(precision))
+ if (plus) {
+ if (++v >= GetDivider(precision)) {
v = Inf();
+ }
+ }
}
- while (scale--)
+ while (scale--) {
v *= Ten;
+ }
return neg ? -v : v;
}
TInt128 FromStringEx(const TStringBuf& str, ui8 precision, ui8 scale) {
- if (scale > precision)
+ if (scale > precision) {
return Err();
+ }
const auto s = str.data();
for (auto ptr = s + str.size() - 1U; ptr > s; --ptr) {
if (*ptr == 'E' || *ptr == 'e') {
const auto len = ptr - s;
- if (!len)
+ if (!len) {
return Err();
+ }
++ptr;
if (ptr != s + str.size() && *ptr == '+') {
++ptr;
- if (ptr != s + str.size() && *ptr == '-')
+ if (ptr != s + str.size() && *ptr == '-') {
return Err();
+ }
}
int exp;
auto [finish, ec] = std::from_chars(ptr, s + str.size(), exp);
- if (ec != std::errc() || finish != s + str.size())
+ if (ec != std::errc() || finish != s + str.size()) {
return Err();
+ }
const int p = precision, s = int(scale) + exp;
- const auto r = exp > 0 ?
- FromString(str.Head(len), precision, std::min(s, p)):
- FromString(str.Head(len), std::min(p - exp, int(MaxPrecision)), std::max(s, 0));
+ const auto r = exp > 0 ? FromString(str.Head(len), precision, std::min(s, p)) : FromString(str.Head(len), std::min(p - exp, int(MaxPrecision)), std::max(s, 0));
if (IsError(r) || IsNan(r)) {
return Err();
@@ -244,21 +262,25 @@ TInt128 FromStringEx(const TStringBuf& str, ui8 precision, ui8 scale) {
if (IsInf(r)) {
auto p = str.data();
- if (*p == '+' || *p == '-')
+ if (*p == '+' || *p == '-') {
++p;
+ }
- if (!std::isdigit(*p))
+ if (!std::isdigit(*p)) {
return Err();
+ }
return r;
}
if (const auto e = exp > 0 ? std::max(0, s - p) : std::min(0, s)) {
if (r) {
- if (exp > 0)
+ if (exp > 0) {
return Mul(r, GetDivider(+e));
- if (exp < 0)
+ }
+ if (exp < 0) {
return Div(r, GetDivider(-e));
+ }
}
}
@@ -273,8 +295,9 @@ bool IsValid(const TStringBuf& str) {
auto s = str.data();
auto l = str.size();
- if (!s || !l)
+ if (!s || !l) {
return false;
+ }
if ('-' == *s || '+' == *s) {
++s;
@@ -288,57 +311,67 @@ bool IsValid(const TStringBuf& str) {
for (bool dot = false; l--;) {
const char c = *s++;
if (c == '.') {
- if (dot)
+ if (dot) {
return false;
+ }
dot = true;
continue;
}
- if (!std::isdigit(c))
+ if (!std::isdigit(c)) {
return false;
+ }
}
return true;
}
TInt128 Mod(TInt128 a, TInt128 b) {
- if (!b || !(IsNormal(a) && IsNormal(b)))
+ if (!b || !(IsNormal(a) && IsNormal(b))) {
return Nan();
+ }
return a % b;
}
TInt128 Div(TInt128 a, TInt128 b) {
- if (IsNan(a) || IsNan(b))
+ if (IsNan(a) || IsNan(b)) {
return Nan();
+ }
if (!b) {
- if (a > 0)
+ if (a > 0) {
return Inf();
- else if (a < 0)
+ } else if (a < 0) {
return -Inf();
- else
+ } else {
return Nan();
+ }
} else if (IsInf(b)) {
return IsInf(a) ? Nan() : TInt128(0);
} else if (IsInf(a)) {
return b > 0 ? a : -a;
}
- if (b & 1)
+ if (b & 1) {
a = TUint128(a) << 1U;
- else
+ } else {
b >>= 1;
+ }
auto d = a / b;
if (d & 1) {
if (const auto m = a % b) {
- if (m > 0) ++d;
+ if (m > 0) {
+ ++d;
+ }
// else --d;
} else {
- if (d & 2) ++d;
+ if (d & 2) {
+ ++d;
+ }
}
}
@@ -352,10 +385,12 @@ using TInt256 = TWide<TInt128, TInt128, TUint128>;
TInt128 Normalize(const TInt256& v) {
static const TInt256 PInf256(+Inf()), NInf256(-Inf());
- if (v > PInf256)
+ if (v > PInf256) {
return +Inf();
- if (v < NInf256)
+ }
+ if (v < NInf256) {
return -Inf();
+ }
return *reinterpret_cast<const TInt128*>(&v);
}
@@ -390,53 +425,63 @@ TInt256 WidenMul(const TInt128& lhs, const TInt128& rhs) {
return nl == nr ? +combine : -combine;
}
-template<bool MayOddDivider>
+template <bool MayOddDivider>
TInt256 Div(TInt256&& a, TInt256&& b) {
- if (MayOddDivider && b & 1)
+ if (MayOddDivider && b & 1) {
a <<= 1;
- else
+ } else {
b >>= 1;
+ }
auto d = a / b;
if (d & 1) {
if (const auto m = a % b) {
- if (m > 0) ++d;
+ if (m > 0) {
+ ++d;
+ }
// else --d;
} else {
- if (d & 2) ++d;
+ if (d & 2) {
+ ++d;
+ }
}
}
return d >>= 1;
}
-}
+} // namespace
TInt128 Mul(TInt128 a, TInt128 b) {
- if (IsNan(a) || IsNan(b))
+ if (IsNan(a) || IsNan(b)) {
return Nan();
+ }
- if (IsInf(a))
+ if (IsInf(a)) {
return !b ? Nan() : (b > 0 ? a : -a);
+ }
- if (IsInf(b))
+ if (IsInf(b)) {
return !a ? Nan() : (a > 0 ? b : -b);
+ }
return Normalize(WidenMul(a, b));
}
TInt128 MulAndDivNormalMultiplier(TInt128 a, TInt128 b, TInt128 c) {
- if (IsNan(a) || IsNan(c))
+ if (IsNan(a) || IsNan(c)) {
return Nan();
+ }
if (!c) {
- if (a > 0)
+ if (a > 0) {
return Inf();
- else if (a < 0)
+ } else if (a < 0) {
return -Inf();
- else
+ } else {
return Nan();
+ }
} else if (IsInf(c)) {
return IsInf(a) ? Nan() : TInt128(0);
} else if (IsInf(a)) {
@@ -447,17 +492,20 @@ TInt128 MulAndDivNormalMultiplier(TInt128 a, TInt128 b, TInt128 c) {
}
TInt128 MulAndDivNormalDivider(TInt128 a, TInt128 b, TInt128 c) {
- if (IsNan(a) || IsNan(b))
+ if (IsNan(a) || IsNan(b)) {
return Nan();
+ }
- if (IsInf(a))
+ if (IsInf(a)) {
return !b ? Nan() : (b > 0 ? a : -a);
+ }
- if (IsInf(b))
+ if (IsInf(b)) {
return !a ? Nan() : (a > 0 ? b : -b);
+ }
return Normalize(Div<false>(WidenMul(a, b), TInt256(c)));
}
-}
-}
+} // namespace NDecimal
+} // namespace NYql
diff --git a/yql/essentials/public/decimal/yql_decimal.h b/yql/essentials/public/decimal/yql_decimal.h
index 01740ecfe2f..1967b4c120f 100644
--- a/yql/essentials/public/decimal/yql_decimal.h
+++ b/yql/essentials/public/decimal/yql_decimal.h
@@ -10,9 +10,9 @@ namespace NYql {
namespace NDecimal {
#ifdef _win_
-#ifndef DONT_USE_NATIVE_INT128
-#define DONT_USE_NATIVE_INT128
-#endif
+ #ifndef DONT_USE_NATIVE_INT128
+ #define DONT_USE_NATIVE_INT128
+ #endif
#endif
#ifdef DONT_USE_NATIVE_INT128
@@ -23,13 +23,26 @@ using TInt128 = signed __int128;
using TUint128 = unsigned __int128;
#endif
-template<ui8 Scale> struct TDivider;
+template <ui8 Scale>
+struct TDivider;
#if defined(__clang__) && defined(DONT_USE_NATIVE_INT128)
-template<> struct TDivider<0> { static inline constexpr TUint128 Value = 1U; };
-template<ui8 Scale> struct TDivider { static inline constexpr TInt128 Value = TDivider<Scale - 1U>::Value * 10U; };
+template <>
+struct TDivider<0> {
+ static inline constexpr TUint128 Value = 1U;
+};
+template <ui8 Scale>
+struct TDivider {
+ static inline constexpr TInt128 Value = TDivider<Scale - 1U>::Value * 10U;
+};
#else
-template<> struct TDivider<0> { static constexpr TUint128 Value = 1U; };
-template<ui8 Scale> struct TDivider { static constexpr TUint128 Value = TDivider<Scale - 1U>::Value * 10U; };
+template <>
+struct TDivider<0> {
+ static constexpr TUint128 Value = 1U;
+};
+template <ui8 Scale>
+struct TDivider {
+ static constexpr TUint128 Value = TDivider<Scale - 1U>::Value * 10U;
+};
#endif
constexpr ui8 MaxPrecision = 35;
@@ -50,12 +63,12 @@ inline constexpr TInt128 Err() {
TUint128 GetDivider(ui8 scale);
-template<ui8 Precision>
+template <ui8 Precision>
inline constexpr TUint128 GetDivider() {
return TDivider<Precision>::Value;
}
-template<ui8 Precision, bool IncLow = false, bool DecHigh = false>
+template <ui8 Precision, bool IncLow = false, bool DecHigh = false>
inline constexpr std::pair<TInt128, TInt128> GetBounds() {
return std::make_pair(-GetDivider<Precision>() + (IncLow ? 1 : 0), +GetDivider<Precision>() - (DecHigh ? 1 : 0));
}
@@ -67,7 +80,7 @@ bool IsInf(TInt128 v);
bool IsNormal(TInt128 v);
bool IsComparable(TInt128 v);
-template<ui8 Precision>
+template <ui8 Precision>
inline bool IsNormal(TInt128 v) {
const auto& b = GetBounds<Precision>();
return v > b.first && v < b.second;
@@ -79,7 +92,7 @@ TInt128 FromString(const TStringBuf& str, ui8 precision, ui8 scale = 0);
// Accept string representation with exponent.
TInt128 FromStringEx(const TStringBuf& str, ui8 precision, ui8 scale);
-template<typename TMkqlProto>
+template <typename TMkqlProto>
inline TInt128 FromProto(const TMkqlProto& val) {
ui64 half[2] = {val.GetLow128(), val.GetHi128()};
TInt128 val128;
@@ -87,22 +100,22 @@ inline TInt128 FromProto(const TMkqlProto& val) {
return val128;
}
-template<typename TValue>
+template <typename TValue>
inline constexpr TValue YtDecimalNan() {
return std::numeric_limits<TValue>::max();
}
-template<>
+template <>
inline constexpr TInt128 YtDecimalNan<TInt128>() {
return ~(TInt128(1) << 127);
}
-template<typename TValue>
+template <typename TValue>
inline constexpr TValue YtDecimalInf() {
return YtDecimalNan<TValue>() - 1;
}
-template<typename TValue>
+template <typename TValue>
inline TInt128 FromYtDecimal(TValue val) {
static_assert(std::is_same<TInt128, TValue>::value || std::is_signed<TValue>::value, "Expected signed value");
if (YtDecimalNan<TValue>() == val) {
@@ -116,7 +129,7 @@ inline TInt128 FromYtDecimal(TValue val) {
}
}
-template<typename TValue>
+template <typename TValue>
inline TValue ToYtDecimal(TInt128 val) {
static_assert(std::is_same<TInt128, TValue>::value || std::is_signed<TValue>::value, "Expected signed value");
if (IsNormal(val)) {
@@ -160,8 +173,11 @@ struct TDecimal {
TDecimal() = default;
- template<typename T>
- TDecimal(T t): Value(t) { }
+ template <typename T>
+ TDecimal(T t)
+ : Value(t)
+ {
+ }
explicit operator TInt128() const {
return Value;
@@ -177,8 +193,8 @@ struct TDecimal {
Value = Nan();
} else {
Value = a > 0
- ? +Inf()
- : -Inf();
+ ? +Inf()
+ : -Inf();
}
return *this;
}
@@ -209,7 +225,7 @@ struct TDecimal {
}
};
-template<typename TRight>
+template <typename TRight>
class TDecimalMultiplicator {
protected:
const TInt128 Bound_;
@@ -226,14 +242,15 @@ public:
TInt128 Do(TInt128 left, TRight right) const {
TInt128 mul = Mul(left, right);
- if (mul > -Bound_ && mul < +Bound_)
+ if (mul > -Bound_ && mul < +Bound_) {
return mul;
+ }
return IsNan(mul) ? Nan() : (mul > 0 ? +Inf() : -Inf());
}
};
-template<>
+template <>
class TDecimalMultiplicator<TInt128> {
protected:
const TInt128 Bound_;
@@ -245,21 +262,21 @@ public:
ui8 scale)
: Bound_(GetDivider(precision))
, Divider_(GetDivider(scale))
- { }
+ {
+ }
TInt128 Do(TInt128 left, TInt128 right) const {
- TInt128 mul = Divider_ > 1 ?
- MulAndDivNormalDivider(left, right, Divider_):
- Mul(left, right);
+ TInt128 mul = Divider_ > 1 ? MulAndDivNormalDivider(left, right, Divider_) : Mul(left, right);
- if (mul > -Bound_ && mul < +Bound_)
+ if (mul > -Bound_ && mul < +Bound_) {
return mul;
+ }
return IsNan(mul) ? Nan() : (mul > 0 ? +Inf() : -Inf());
}
};
-template<typename TRight>
+template <typename TRight>
class TDecimalDivisor {
public:
TDecimalDivisor(
@@ -275,7 +292,7 @@ public:
}
};
-template<>
+template <>
class TDecimalDivisor<TInt128> {
protected:
const TInt128 Bound_;
@@ -287,7 +304,8 @@ public:
ui8 scale)
: Bound_(GetDivider(precision))
, Divider_(GetDivider(scale))
- { }
+ {
+ }
TInt128 Do(TInt128 left, TInt128 right) const {
TInt128 div = MulAndDivNormalMultiplier(left, Divider_, right);
@@ -299,7 +317,7 @@ public:
}
};
-template<typename TRight>
+template <typename TRight>
class TDecimalRemainder {
protected:
const TInt128 Bound_;
@@ -311,22 +329,25 @@ public:
ui8 scale)
: Bound_(NYql::NDecimal::GetDivider(precision - scale))
, Divider_(NYql::NDecimal::GetDivider(scale))
- { }
+ {
+ }
TInt128 Do(TInt128 left, TRight right) const {
if constexpr (std::is_signed<TRight>::value) {
- if (TInt128(right) >= +Bound_ || TInt128(right) <= -Bound_)
+ if (TInt128(right) >= +Bound_ || TInt128(right) <= -Bound_) {
return left;
+ }
} else {
- if (TInt128(right) >= Bound_)
+ if (TInt128(right) >= Bound_) {
return left;
+ }
}
return Mod(left, Mul(Divider_, right));
}
};
-template<>
+template <>
class TDecimalRemainder<TInt128> {
public:
TDecimalRemainder(
@@ -342,5 +363,5 @@ public:
}
};
-}
-}
+} // namespace NDecimal
+} // namespace NYql
diff --git a/yql/essentials/public/decimal/yql_decimal_serialize.cpp b/yql/essentials/public/decimal/yql_decimal_serialize.cpp
index 5fb844f5f89..46b353424f8 100644
--- a/yql/essentials/public/decimal/yql_decimal_serialize.cpp
+++ b/yql/essentials/public/decimal/yql_decimal_serialize.cpp
@@ -30,12 +30,14 @@ size_t Serialize(TInt128 value, char* buf) {
auto p = reinterpret_cast<const char*>(&value) + size - 1U;
if (*(p - 1U) & 0x80) {
- while (size > 1U && ~0 == *--p)
+ while (size > 1U && ~0 == *--p) {
--size;
+ }
*buf = 0x80 - size;
} else {
- while (size > 1U && 0 == *--p)
+ while (size > 1U && 0 == *--p) {
--size;
+ }
*buf = 0x7F + size;
}
@@ -47,36 +49,42 @@ size_t Serialize(TInt128 value, char* buf) {
}
std::pair<TInt128, size_t> Deserialize(const char* b, size_t len) {
- if (!b || len == 0U)
+ if (!b || len == 0U) {
return std::make_pair(Err(), 0U);
+ }
const auto mark = ui8(*b);
const bool neg = mark < 0x80u;
- if (mark == 0x00u || mark == 0xFFu)
+ if (mark == 0x00u || mark == 0xFFu) {
return std::make_pair(neg ? -Nan() : +Nan(), 1U);
- if (mark == 0x01u || mark == 0xFEu)
+ }
+ if (mark == 0x01u || mark == 0xFEu) {
return std::make_pair(neg ? -Inf() : +Inf(), 1U);
+ }
if (mark < 0x70u || mark > 0x8Fu) {
return std::make_pair(Err(), 0U);
}
const auto used = neg ? 0x80u - mark : mark - 0x7Fu;
- if (len < used)
+ if (len < used) {
return std::make_pair(Err(), 0U);
+ }
TInt128 v;
const auto size = sizeof(v);
auto p = reinterpret_cast<char*>(&v) + size;
- for (auto fill = size - used + 2U; --fill;)
+ for (auto fill = size - used + 2U; --fill;) {
*--p = neg ? ~0 : 0;
+ }
- for (auto copy = used; --copy;)
+ for (auto copy = used; --copy;) {
*--p = *++b;
+ }
return std::make_pair(v, used);
}
-}
-}
+} // namespace NDecimal
+} // namespace NYql
diff --git a/yql/essentials/public/decimal/yql_decimal_serialize.h b/yql/essentials/public/decimal/yql_decimal_serialize.h
index 6fdb32e6f2a..0965125d841 100644
--- a/yql/essentials/public/decimal/yql_decimal_serialize.h
+++ b/yql/essentials/public/decimal/yql_decimal_serialize.h
@@ -9,5 +9,5 @@ namespace NDecimal {
size_t Serialize(TInt128 v, char* buff);
std::pair<TInt128, size_t> Deserialize(const char* buff, size_t len);
-}
-}
+} // namespace NDecimal
+} // namespace NYql
diff --git a/yql/essentials/public/decimal/yql_wide_int.h b/yql/essentials/public/decimal/yql_wide_int.h
index ce0506844ed..87922724284 100644
--- a/yql/essentials/public/decimal/yql_wide_int.h
+++ b/yql/essentials/public/decimal/yql_wide_int.h
@@ -13,7 +13,7 @@ typedef __int128 i128_t;
typedef unsigned __int128 ui128_t;
#endif
-template<typename TOneHalf, typename TSignedPart = std::make_signed_t<TOneHalf>, typename TUnsignedPart = std::make_unsigned_t<TOneHalf>>
+template <typename TOneHalf, typename TSignedPart = std::make_signed_t<TOneHalf>, typename TUnsignedPart = std::make_unsigned_t<TOneHalf>>
class TWide {
private:
using THalf = TOneHalf;
@@ -41,17 +41,17 @@ private:
return h & mask;
}
- template<typename T>
+ template <typename T>
constexpr std::enable_if_t<sizeof(T) <= sizeof(THalf), T> CastImpl() const {
return static_cast<T>(Lo_);
}
- template<typename T>
+ template <typename T>
constexpr std::enable_if_t<sizeof(T) == sizeof(THalf) << 1U, T> CastImpl() const {
return *reinterpret_cast<const T*>(this);
}
- template<typename T>
+ template <typename T>
constexpr std::enable_if_t<sizeof(THalf) << 1U < sizeof(T), T> CastImpl() const {
return (T(std::make_unsigned_t<T>(Hi_) << PartBitSize)) | Lo_;
}
@@ -67,8 +67,9 @@ private:
using TUnsigned = TWide<TUnsignedPart, TSignedPart, TUnsignedPart>;
using TSibling = std::conditional_t<std::is_same<THalf, TPart>::value,
- TWide<TSignedPart, TSignedPart, TUnsignedPart>, TWide<TUnsignedPart, TSignedPart, TUnsignedPart>>;
+ TWide<TSignedPart, TSignedPart, TUnsignedPart>, TWide<TUnsignedPart, TSignedPart, TUnsignedPart>>;
friend TSibling;
+
public:
constexpr TWide() = default;
constexpr TWide(const TWide& rhs) = default;
@@ -78,28 +79,38 @@ public:
constexpr TWide& operator=(TWide&& rhs) = default;
constexpr TWide(const TSibling& rhs)
- : Lo_(rhs.Lo_), Hi_(rhs.Hi_)
- {}
+ : Lo_(rhs.Lo_)
+ , Hi_(rhs.Hi_)
+ {
+ }
- template<typename U, typename L>
+ template <typename U, typename L>
constexpr TWide(const U upper_rhs, const L lower_rhs)
- : Lo_(lower_rhs), Hi_(upper_rhs)
- {}
+ : Lo_(lower_rhs)
+ , Hi_(upper_rhs)
+ {
+ }
template <typename T, std::enable_if_t<std::is_integral<T>::value && sizeof(THalf) < sizeof(T), size_t> Shift = PartBitSize>
constexpr TWide(const T rhs)
- : Lo_(rhs), Hi_(rhs >> Shift)
- {}
+ : Lo_(rhs)
+ , Hi_(rhs >> Shift)
+ {
+ }
template <typename T, std::enable_if_t<std::is_integral<T>::value && sizeof(T) <= sizeof(THalf), bool> Signed = std::is_signed<T>::value>
constexpr TWide(const T rhs)
- : Lo_(rhs), Hi_(Signed && rhs < 0 ? ~0 : 0)
- {}
+ : Lo_(rhs)
+ , Hi_(Signed && rhs < 0 ? ~0 : 0)
+ {
+ }
template <typename T, typename TArg = std::enable_if_t<std::is_class<T>::value && std::is_same<T, THalf>::value, THalf>>
constexpr explicit TWide(const T& rhs)
- : Lo_(rhs), Hi_(TIsSigned::value && rhs < 0 ? ~0 : 0)
- {}
+ : Lo_(rhs)
+ , Hi_(TIsSigned::value && rhs < 0 ? ~0 : 0)
+ {
+ }
template <typename T, std::enable_if_t<std::is_integral<T>::value && sizeof(THalf) < sizeof(T), size_t> Shift = PartBitSize>
constexpr TWide& operator=(const T rhs) {
@@ -115,19 +126,41 @@ public:
return *this;
}
- constexpr explicit operator bool() const { return bool(Hi_) || bool(Lo_); }
+ constexpr explicit operator bool() const {
+ return bool(Hi_) || bool(Lo_);
+ }
- constexpr explicit operator i8() const { return CastImpl<i8>(); }
- constexpr explicit operator ui8() const { return CastImpl<ui8>(); }
- constexpr explicit operator i16() const { return CastImpl<i16>(); }
- constexpr explicit operator ui16() const { return CastImpl<ui16>(); }
- constexpr explicit operator i32() const { return CastImpl<i32>(); }
- constexpr explicit operator ui32() const { return CastImpl<ui32>(); }
- constexpr explicit operator i64() const { return CastImpl<i64>(); }
- constexpr explicit operator ui64() const { return CastImpl<ui64>(); }
+ constexpr explicit operator i8() const {
+ return CastImpl<i8>();
+ }
+ constexpr explicit operator ui8() const {
+ return CastImpl<ui8>();
+ }
+ constexpr explicit operator i16() const {
+ return CastImpl<i16>();
+ }
+ constexpr explicit operator ui16() const {
+ return CastImpl<ui16>();
+ }
+ constexpr explicit operator i32() const {
+ return CastImpl<i32>();
+ }
+ constexpr explicit operator ui32() const {
+ return CastImpl<ui32>();
+ }
+ constexpr explicit operator i64() const {
+ return CastImpl<i64>();
+ }
+ constexpr explicit operator ui64() const {
+ return CastImpl<ui64>();
+ }
#ifndef _win_
- constexpr explicit operator i128_t() const { return CastImpl<i128_t>(); }
- constexpr explicit operator ui128_t() const { return CastImpl<ui128_t>(); }
+ constexpr explicit operator i128_t() const {
+ return CastImpl<i128_t>();
+ }
+ constexpr explicit operator ui128_t() const {
+ return CastImpl<ui128_t>();
+ }
#endif
constexpr explicit operator float() const {
return TIsSigned::value && Hi_ < 0 ? -float(-*this) : std::fma(float(Hi_), std::exp2(float(PartBitSize)), float(Lo_));
@@ -147,18 +180,23 @@ public:
constexpr TWide operator-() const {
const auto sign = THalf(1) << PartBitSize - 1U;
- if (TIsSigned::value && !Lo_ && Hi_ == sign)
+ if (TIsSigned::value && !Lo_ && Hi_ == sign) {
return *this;
+ }
return ++~*this;
}
constexpr TWide& operator++() {
- if (!++Lo_) ++Hi_;
+ if (!++Lo_) {
+ ++Hi_;
+ }
return *this;
}
constexpr TWide& operator--() {
- if (!Lo_--) --Hi_;
+ if (!Lo_--) {
+ --Hi_;
+ }
return *this;
}
@@ -196,7 +234,9 @@ public:
const auto l = Lo_;
Lo_ += rhs.Lo_;
Hi_ += rhs.Hi_;
- if (l > Lo_) ++Hi_;
+ if (l > Lo_) {
+ ++Hi_;
+ }
return *this;
}
@@ -204,7 +244,9 @@ public:
const auto l = Lo_;
Lo_ -= rhs.Lo_;
Hi_ -= rhs.Hi_;
- if (l < Lo_) --Hi_;
+ if (l < Lo_) {
+ --Hi_;
+ }
return *this;
}
@@ -238,30 +280,70 @@ public:
return *this;
}
- constexpr TWide& operator*=(const TWide& rhs) { return *this = Mul(*this, rhs); }
- constexpr TWide& operator/=(const TWide& rhs) { return *this = DivMod(*this, rhs).first; }
- constexpr TWide& operator%=(const TWide& rhs) { return *this = DivMod(*this, rhs).second; }
+ constexpr TWide& operator*=(const TWide& rhs) {
+ return *this = Mul(*this, rhs);
+ }
+ constexpr TWide& operator/=(const TWide& rhs) {
+ return *this = DivMod(*this, rhs).first;
+ }
+ constexpr TWide& operator%=(const TWide& rhs) {
+ return *this = DivMod(*this, rhs).second;
+ }
- constexpr TWide operator&(const TWide& rhs) const { return TWide(*this) &= rhs; }
- constexpr TWide operator|(const TWide& rhs) const { return TWide(*this) |= rhs; }
- constexpr TWide operator^(const TWide& rhs) const { return TWide(*this) ^= rhs; }
- constexpr TWide operator+(const TWide& rhs) const { return TWide(*this) += rhs; }
- constexpr TWide operator-(const TWide& rhs) const { return TWide(*this) -= rhs; }
- constexpr TWide operator*(const TWide& rhs) const { return Mul(*this, rhs); }
- constexpr TWide operator/(const TWide& rhs) const { return DivMod(*this, rhs).first; }
- constexpr TWide operator%(const TWide& rhs) const { return DivMod(*this, rhs).second; }
- constexpr TWide operator<<(const TWide& rhs) const { return TWide(*this) <<= rhs; }
- constexpr TWide operator>>(const TWide& rhs) const { return TWide(*this) >>= rhs; }
+ constexpr TWide operator&(const TWide& rhs) const {
+ return TWide(*this) &= rhs;
+ }
+ constexpr TWide operator|(const TWide& rhs) const {
+ return TWide(*this) |= rhs;
+ }
+ constexpr TWide operator^(const TWide& rhs) const {
+ return TWide(*this) ^= rhs;
+ }
+ constexpr TWide operator+(const TWide& rhs) const {
+ return TWide(*this) += rhs;
+ }
+ constexpr TWide operator-(const TWide& rhs) const {
+ return TWide(*this) -= rhs;
+ }
+ constexpr TWide operator*(const TWide& rhs) const {
+ return Mul(*this, rhs);
+ }
+ constexpr TWide operator/(const TWide& rhs) const {
+ return DivMod(*this, rhs).first;
+ }
+ constexpr TWide operator%(const TWide& rhs) const {
+ return DivMod(*this, rhs).second;
+ }
+ constexpr TWide operator<<(const TWide& rhs) const {
+ return TWide(*this) <<= rhs;
+ }
+ constexpr TWide operator>>(const TWide& rhs) const {
+ return TWide(*this) >>= rhs;
+ }
template <typename T>
- constexpr std::enable_if_t<std::is_integral<T>::value, T> operator&(const T rhs) const { return T(*this) & rhs; }
+ constexpr std::enable_if_t<std::is_integral<T>::value, T> operator&(const T rhs) const {
+ return T(*this) & rhs;
+ }
- constexpr bool operator==(const TWide& rhs) const { return std::tie(Hi_, Lo_) == std::tie(rhs.Hi_, rhs.Lo_); }
- constexpr bool operator!=(const TWide& rhs) const { return std::tie(Hi_, Lo_) != std::tie(rhs.Hi_, rhs.Lo_); }
- constexpr bool operator>=(const TWide& rhs) const { return std::tie(Hi_, Lo_) >= std::tie(rhs.Hi_, rhs.Lo_); }
- constexpr bool operator<=(const TWide& rhs) const { return std::tie(Hi_, Lo_) <= std::tie(rhs.Hi_, rhs.Lo_); }
- constexpr bool operator>(const TWide& rhs) const { return std::tie(Hi_, Lo_) > std::tie(rhs.Hi_, rhs.Lo_); }
- constexpr bool operator<(const TWide& rhs) const { return std::tie(Hi_, Lo_) < std::tie(rhs.Hi_, rhs.Lo_); }
+ constexpr bool operator==(const TWide& rhs) const {
+ return std::tie(Hi_, Lo_) == std::tie(rhs.Hi_, rhs.Lo_);
+ }
+ constexpr bool operator!=(const TWide& rhs) const {
+ return std::tie(Hi_, Lo_) != std::tie(rhs.Hi_, rhs.Lo_);
+ }
+ constexpr bool operator>=(const TWide& rhs) const {
+ return std::tie(Hi_, Lo_) >= std::tie(rhs.Hi_, rhs.Lo_);
+ }
+ constexpr bool operator<=(const TWide& rhs) const {
+ return std::tie(Hi_, Lo_) <= std::tie(rhs.Hi_, rhs.Lo_);
+ }
+ constexpr bool operator>(const TWide& rhs) const {
+ return std::tie(Hi_, Lo_) > std::tie(rhs.Hi_, rhs.Lo_);
+ }
+ constexpr bool operator<(const TWide& rhs) const {
+ return std::tie(Hi_, Lo_) < std::tie(rhs.Hi_, rhs.Lo_);
+ }
private:
static constexpr TWide Mul(const TWide& lhs, const TWide& rhs) {
@@ -274,14 +356,9 @@ private:
const TPart prod3[] = {TPart(lq[0] * rq[3]), TPart(lq[1] * rq[2]), TPart(lq[2] * rq[1]), TPart(lq[3] * rq[0])};
const TPart fourthQ = GetLowerQuarter(prod0[0]);
- const TPart thirdQ = GetUpperQuarter(prod0[0])
- + GetLowerQuarter(prod1[0]) + GetLowerQuarter(prod1[1]);
- const TPart secondQ = GetUpperQuarter(thirdQ)
- + GetUpperQuarter(prod1[0]) + GetUpperQuarter(prod1[1])
- + GetLowerQuarter(prod2[0]) + GetLowerQuarter(prod2[1]) + GetLowerQuarter(prod2[2]);
- const TPart firstQ = GetUpperQuarter(secondQ)
- + GetUpperQuarter(prod2[0]) + GetUpperQuarter(prod2[1]) + GetUpperQuarter(prod2[2])
- + GetLowerQuarter(prod3[0]) + GetLowerQuarter(prod3[1]) + GetLowerQuarter(prod3[2]) + GetLowerQuarter(prod3[3]);
+ const TPart thirdQ = GetUpperQuarter(prod0[0]) + GetLowerQuarter(prod1[0]) + GetLowerQuarter(prod1[1]);
+ const TPart secondQ = GetUpperQuarter(thirdQ) + GetUpperQuarter(prod1[0]) + GetUpperQuarter(prod1[1]) + GetLowerQuarter(prod2[0]) + GetLowerQuarter(prod2[1]) + GetLowerQuarter(prod2[2]);
+ const TPart firstQ = GetUpperQuarter(secondQ) + GetUpperQuarter(prod2[0]) + GetUpperQuarter(prod2[1]) + GetUpperQuarter(prod2[2]) + GetLowerQuarter(prod3[0]) + GetLowerQuarter(prod3[1]) + GetLowerQuarter(prod3[2]) + GetLowerQuarter(prod3[3]);
return TWide((firstQ << QuarterBitSize) | GetLowerQuarter(secondQ), (thirdQ << QuarterBitSize) | fourthQ);
}
@@ -308,37 +385,93 @@ private:
}
}
- if (nl) mod = -mod;
- if (nr != nl) div = -div;
+ if (nl) {
+ mod = -mod;
+ }
+ if (nr != nl) {
+ div = -div;
+ }
return {div, mod};
}
};
-template<typename T> struct THalfOf;
-template<> struct THalfOf<i16> { typedef i8 Type; };
-template<> struct THalfOf<ui16> { typedef ui8 Type; };
-template<> struct THalfOf<i32> { typedef i16 Type; };
-template<> struct THalfOf<ui32> { typedef ui16 Type; };
-template<> struct THalfOf<i64> { typedef i32 Type; };
-template<> struct THalfOf<ui64> { typedef ui32 Type; };
+template <typename T>
+struct THalfOf;
+template <>
+struct THalfOf<i16> {
+ typedef i8 Type;
+};
+template <>
+struct THalfOf<ui16> {
+ typedef ui8 Type;
+};
+template <>
+struct THalfOf<i32> {
+ typedef i16 Type;
+};
+template <>
+struct THalfOf<ui32> {
+ typedef ui16 Type;
+};
+template <>
+struct THalfOf<i64> {
+ typedef i32 Type;
+};
+template <>
+struct THalfOf<ui64> {
+ typedef ui32 Type;
+};
#ifndef _win_
-template<> struct THalfOf<i128_t> { typedef i64 Type; };
-template<> struct THalfOf<ui128_t> { typedef ui64 Type; };
+template <>
+struct THalfOf<i128_t> {
+ typedef i64 Type;
+};
+template <>
+struct THalfOf<ui128_t> {
+ typedef ui64 Type;
+};
#endif
-template<typename T> struct THalfOf {};
-
-template<typename T> struct TPairOf;
-template<> struct TPairOf<i8> { typedef i16 Type; };
-template<> struct TPairOf<ui8> { typedef ui16 Type; };
-template<> struct TPairOf<i16> { typedef i32 Type; };
-template<> struct TPairOf<ui16> { typedef ui32 Type; };
-template<> struct TPairOf<i32> { typedef i64 Type; };
-template<> struct TPairOf<ui32> { typedef ui64 Type; };
+template <typename T>
+struct THalfOf {};
+
+template <typename T>
+struct TPairOf;
+template <>
+struct TPairOf<i8> {
+ typedef i16 Type;
+};
+template <>
+struct TPairOf<ui8> {
+ typedef ui16 Type;
+};
+template <>
+struct TPairOf<i16> {
+ typedef i32 Type;
+};
+template <>
+struct TPairOf<ui16> {
+ typedef ui32 Type;
+};
+template <>
+struct TPairOf<i32> {
+ typedef i64 Type;
+};
+template <>
+struct TPairOf<ui32> {
+ typedef ui64 Type;
+};
#ifndef _win_
-template<> struct TPairOf<i64> { typedef i128_t Type; };
-template<> struct TPairOf<ui64> { typedef ui128_t Type; };
+template <>
+struct TPairOf<i64> {
+ typedef i128_t Type;
+};
+template <>
+struct TPairOf<ui64> {
+ typedef ui128_t Type;
+};
#endif
-template<typename T> struct TPairOf {};
+template <typename T>
+struct TPairOf {};
-}
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/check_runner.cpp b/yql/essentials/public/fastcheck/check_runner.cpp
index 97889d18858..1c7172675c0 100644
--- a/yql/essentials/public/fastcheck/check_runner.cpp
+++ b/yql/essentials/public/fastcheck/check_runner.cpp
@@ -27,5 +27,5 @@ TCheckResponse TCheckRunnerBase::Run(const TChecksRequest& request) {
return response;
}
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/check_runner.h b/yql/essentials/public/fastcheck/check_runner.h
index 74edd882ef0..1ba685c3176 100644
--- a/yql/essentials/public/fastcheck/check_runner.h
+++ b/yql/essentials/public/fastcheck/check_runner.h
@@ -12,7 +12,7 @@ public:
virtual TCheckResponse Run(const TChecksRequest& request) = 0;
};
-class TCheckRunnerBase : public ICheckRunner {
+class TCheckRunnerBase: public ICheckRunner {
public:
virtual TCheckResponse Run(const TChecksRequest& request) final;
@@ -32,5 +32,5 @@ std::unique_ptr<ICheckRunner> MakeParserRunner();
std::unique_ptr<ICheckRunner> MakeTranslatorRunner();
std::unique_ptr<ICheckRunner> MakeFormatRunner();
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/fastcheck.cpp b/yql/essentials/public/fastcheck/fastcheck.cpp
index 65b84a654b7..e534c2fa326 100644
--- a/yql/essentials/public/fastcheck/fastcheck.cpp
+++ b/yql/essentials/public/fastcheck/fastcheck.cpp
@@ -30,7 +30,7 @@ void FillSettings(NSQLTranslation::TTranslationSettings& settings, const TOption
settings.Flags = TranslationFlags();
}
-}
+} // namespace
bool CheckProgram(const TString& program, const TOptions& options, TIssues& errors) {
TMaybe<TIssue> verIssue;
@@ -53,8 +53,7 @@ bool CheckProgram(const TString& program, const TOptions& options, TIssues& erro
NSQLTranslation::TTranslators translators(
nullptr,
NSQLTranslationV1::MakeTranslator(lexers, parsers),
- NSQLTranslationPG::MakeTranslator()
- );
+ NSQLTranslationPG::MakeTranslator());
TAstParseResult astRes;
if (options.IsSql) {
@@ -133,5 +132,5 @@ bool CheckProgram(const TString& program, const TOptions& options, TIssues& erro
return true;
}
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/fastcheck.h b/yql/essentials/public/fastcheck/fastcheck.h
index 8edb554e922..45c1087284a 100644
--- a/yql/essentials/public/fastcheck/fastcheck.h
+++ b/yql/essentials/public/fastcheck/fastcheck.h
@@ -8,16 +8,16 @@ namespace NYql {
namespace NFastCheck {
struct TOptions {
- bool IsSql = true;
- bool ParseOnly = false;
- THashMap<TString, TString> ClusterMapping;
- ui16 SyntaxVersion = 1;
- TLangVersion LangVer = MinLangVersion;
- bool IsLibrary = false;
- THashMap<TString, TString> SqlLibs = {}; // mapping file name => SQL
+ bool IsSql = true;
+ bool ParseOnly = false;
+ THashMap<TString, TString> ClusterMapping;
+ ui16 SyntaxVersion = 1;
+ TLangVersion LangVer = MinLangVersion;
+ bool IsLibrary = false;
+ THashMap<TString, TString> SqlLibs = {}; // mapping file name => SQL
};
bool CheckProgram(const TString& program, const TOptions& options, TIssues& errors);
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/fastcheck_ut.cpp b/yql/essentials/public/fastcheck/fastcheck_ut.cpp
index 8aa403e6f57..4e7c894ae77 100644
--- a/yql/essentials/public/fastcheck/fastcheck_ut.cpp
+++ b/yql/essentials/public/fastcheck/fastcheck_ut.cpp
@@ -5,143 +5,143 @@ using namespace NYql;
using namespace NYql::NFastCheck;
Y_UNIT_TEST_SUITE(TFastCheckTests) {
- Y_UNIT_TEST(ParsePureYqlGood) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = false;
- options.ParseOnly = true;
- TIssues errors;
- UNIT_ASSERT(CheckProgram("(return world)", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
- }
-
- Y_UNIT_TEST(ParsePureYqlBad) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = false;
- options.ParseOnly = true;
- TIssues errors;
- UNIT_ASSERT(CheckProgram("(return world1)", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
- }
-
- Y_UNIT_TEST(ParsePureSqlGood) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.ParseOnly = true;
- TIssues errors;
- UNIT_ASSERT(CheckProgram("select 1", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
- }
-
- Y_UNIT_TEST(ParsePureSqlBad) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.ParseOnly = true;
- TIssues errors;
- UNIT_ASSERT(!CheckProgram("select1", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
- }
-
- Y_UNIT_TEST(CompilePureYqlBad) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = false;
- options.ParseOnly = false;
- TIssues errors;
- UNIT_ASSERT(!CheckProgram("(return world1)", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
- }
-
- Y_UNIT_TEST(CompileTableSqlGood) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.ParseOnly = false;
- options.ClusterMapping["plato"] = YtProviderName;
- TIssues errors;
- UNIT_ASSERT(CheckProgram("select key,count(*) from plato.Input group by key", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
- }
-
- Y_UNIT_TEST(CompileTableSqlBad) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.ParseOnly = false;
- TIssues errors;
- UNIT_ASSERT(!CheckProgram("select key,count(*) from plato.Input", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
- }
-
- Y_UNIT_TEST(CompileLibrary) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.IsLibrary = true;
- TIssues errors;
- UNIT_ASSERT(CheckProgram("$x = 1; export $x", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
- }
-
- Y_UNIT_TEST(CompileSqlWithLibsGood) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.ParseOnly = false;
- options.SqlLibs["foo.sql"] = "$x = 1; export $x;";
- TIssues errors;
- UNIT_ASSERT(CheckProgram("pragma library('foo.sql');import foo symbols $x; select $x", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
- }
-
- Y_UNIT_TEST(ParseSqlWithBadLib) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.ParseOnly = true;
- options.SqlLibs["foo.sql"] = "$x = 1; zexport $x;";
- TIssues errors;
- UNIT_ASSERT(!CheckProgram("pragma library('foo.sql');import foo symbols $x; select $x", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
- }
-
- Y_UNIT_TEST(CompileSqlWithUnresolvedLib) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.ParseOnly = false;
- options.SqlLibs["foo.sql"] = "$x = 1; export $x;";
- TIssues errors;
- UNIT_ASSERT(!CheckProgram("pragma library('foo.sql');import foo symbols $y; select $y", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
- }
-
- Y_UNIT_TEST(ParseSqlWithUnresolvedLib) {
- TOptions options;
- options.LangVer = GetMaxReleasedLangVersion();
- options.IsSql = true;
- options.ParseOnly = true;
- options.SqlLibs["foo.sql"] = "$x = 1; export $x;";
- TIssues errors;
- UNIT_ASSERT(CheckProgram("pragma library('foo.sql');import foo symbols $y; select $y", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
- }
-
- Y_UNIT_TEST(TooHighLangVer) {
- TOptions options;
- options.LangVer = GetMaxLangVersion();
- options.IsSql = false;
- options.ParseOnly = true;
- TIssues errors;
- UNIT_ASSERT(!CheckProgram("(return world)", options, errors));
- UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
- }
-
- Y_UNIT_TEST(UsedFlags) {
- TString program = R"sql(
+Y_UNIT_TEST(ParsePureYqlGood) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = false;
+ options.ParseOnly = true;
+ TIssues errors;
+ UNIT_ASSERT(CheckProgram("(return world)", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
+}
+
+Y_UNIT_TEST(ParsePureYqlBad) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = false;
+ options.ParseOnly = true;
+ TIssues errors;
+ UNIT_ASSERT(CheckProgram("(return world1)", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
+}
+
+Y_UNIT_TEST(ParsePureSqlGood) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.ParseOnly = true;
+ TIssues errors;
+ UNIT_ASSERT(CheckProgram("select 1", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
+}
+
+Y_UNIT_TEST(ParsePureSqlBad) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.ParseOnly = true;
+ TIssues errors;
+ UNIT_ASSERT(!CheckProgram("select1", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
+}
+
+Y_UNIT_TEST(CompilePureYqlBad) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = false;
+ options.ParseOnly = false;
+ TIssues errors;
+ UNIT_ASSERT(!CheckProgram("(return world1)", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
+}
+
+Y_UNIT_TEST(CompileTableSqlGood) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.ParseOnly = false;
+ options.ClusterMapping["plato"] = YtProviderName;
+ TIssues errors;
+ UNIT_ASSERT(CheckProgram("select key,count(*) from plato.Input group by key", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
+}
+
+Y_UNIT_TEST(CompileTableSqlBad) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.ParseOnly = false;
+ TIssues errors;
+ UNIT_ASSERT(!CheckProgram("select key,count(*) from plato.Input", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
+}
+
+Y_UNIT_TEST(CompileLibrary) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.IsLibrary = true;
+ TIssues errors;
+ UNIT_ASSERT(CheckProgram("$x = 1; export $x", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
+}
+
+Y_UNIT_TEST(CompileSqlWithLibsGood) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.ParseOnly = false;
+ options.SqlLibs["foo.sql"] = "$x = 1; export $x;";
+ TIssues errors;
+ UNIT_ASSERT(CheckProgram("pragma library('foo.sql');import foo symbols $x; select $x", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
+}
+
+Y_UNIT_TEST(ParseSqlWithBadLib) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.ParseOnly = true;
+ options.SqlLibs["foo.sql"] = "$x = 1; zexport $x;";
+ TIssues errors;
+ UNIT_ASSERT(!CheckProgram("pragma library('foo.sql');import foo symbols $x; select $x", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
+}
+
+Y_UNIT_TEST(CompileSqlWithUnresolvedLib) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.ParseOnly = false;
+ options.SqlLibs["foo.sql"] = "$x = 1; export $x;";
+ TIssues errors;
+ UNIT_ASSERT(!CheckProgram("pragma library('foo.sql');import foo symbols $y; select $y", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
+}
+
+Y_UNIT_TEST(ParseSqlWithUnresolvedLib) {
+ TOptions options;
+ options.LangVer = GetMaxReleasedLangVersion();
+ options.IsSql = true;
+ options.ParseOnly = true;
+ options.SqlLibs["foo.sql"] = "$x = 1; export $x;";
+ TIssues errors;
+ UNIT_ASSERT(CheckProgram("pragma library('foo.sql');import foo symbols $y; select $y", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(0, errors.Size());
+}
+
+Y_UNIT_TEST(TooHighLangVer) {
+ TOptions options;
+ options.LangVer = GetMaxLangVersion();
+ options.IsSql = false;
+ options.ParseOnly = true;
+ TIssues errors;
+ UNIT_ASSERT(!CheckProgram("(return world)", options, errors));
+ UNIT_ASSERT_VALUES_EQUAL(1, errors.Size());
+}
+
+Y_UNIT_TEST(UsedFlags) {
+ TString program = R"sql(
$input = AsList(
AsStruct(1 AS key, 1001 AS subkey, 'AAA' AS value),
);
@@ -155,11 +155,11 @@ Y_UNIT_TEST_SUITE(TFastCheckTests) {
AS_TABLE($input) AS i1
)sql";
- TOptions options;
- options.IsSql = true;
-
- TIssues errors;
- UNIT_ASSERT_C(CheckProgram(program, options, errors), errors.ToOneLineString());
- }
+ TOptions options;
+ options.IsSql = true;
+ TIssues errors;
+ UNIT_ASSERT_C(CheckProgram(program, options, errors), errors.ToOneLineString());
}
+
+} // Y_UNIT_TEST_SUITE(TFastCheckTests)
diff --git a/yql/essentials/public/fastcheck/format.cpp b/yql/essentials/public/fastcheck/format.cpp
index c17b2a027c3..f9f0b12520a 100644
--- a/yql/essentials/public/fastcheck/format.cpp
+++ b/yql/essentials/public/fastcheck/format.cpp
@@ -40,7 +40,7 @@ TString ReplaceHidden(TStringBuf input) {
return res;
}
-class TFormatRunner : public TCheckRunnerBase {
+class TFormatRunner: public TCheckRunnerBase {
public:
TString GetCheckName() const final {
return "format";
@@ -48,12 +48,12 @@ public:
TCheckResponse DoRun(const TChecksRequest& request) final {
switch (request.Syntax) {
- case ESyntax::SExpr:
- return RunSExpr(request);
- case ESyntax::PG:
- return RunPg(request);
- case ESyntax::YQL:
- return RunYql(request);
+ case ESyntax::SExpr:
+ return RunSExpr(request);
+ case ESyntax::PG:
+ return RunPg(request);
+ case ESyntax::YQL:
+ return RunYql(request);
}
}
@@ -71,7 +71,7 @@ private:
}
TCheckResponse RunYql(const TChecksRequest& request) {
- TCheckResponse res {.CheckName = GetCheckName()};
+ TCheckResponse res{.CheckName = GetCheckName()};
if (request.SyntaxVersion != 1) {
res.Issues.AddIssue(TIssue({}, "Only SyntaxVersion 1 is supported"));
return res;
@@ -122,8 +122,9 @@ private:
origSample.erase(origSample.size() - 1);
}
- auto issue = TIssue(origPos, TStringBuilder() <<
- "Format mismatch, expected:\n" << ReplaceHidden(formattedSample) << "\nbut got:\n" << ReplaceHidden(origSample) << "\n");
+ auto issue = TIssue(origPos, TStringBuilder() << "Format mismatch, expected:\n"
+ << ReplaceHidden(formattedSample) << "\nbut got:\n"
+ << ReplaceHidden(origSample) << "\n");
issue.SetCode(EYqlIssueCode::TIssuesIds_EIssueCode_WARNING, ESeverity::TSeverityIds_ESeverityId_S_WARNING);
res.Issues.AddIssue(issue);
}
@@ -132,11 +133,11 @@ private:
}
};
-}
+} // namespace
std::unique_ptr<ICheckRunner> MakeFormatRunner() {
return std::make_unique<TFormatRunner>();
}
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/lexer.cpp b/yql/essentials/public/fastcheck/lexer.cpp
index b1f26361704..e2c7b7d1fb4 100644
--- a/yql/essentials/public/fastcheck/lexer.cpp
+++ b/yql/essentials/public/fastcheck/lexer.cpp
@@ -9,7 +9,7 @@ namespace NFastCheck {
namespace {
-class TLexerRunner : public TCheckRunnerBase {
+class TLexerRunner: public TCheckRunnerBase {
public:
TString GetCheckName() const final {
return "lexer";
@@ -17,12 +17,12 @@ public:
TCheckResponse DoRun(const TChecksRequest& request) final {
switch (request.Syntax) {
- case ESyntax::SExpr:
- return RunSExpr(request);
- case ESyntax::PG:
- return RunPg(request);
- case ESyntax::YQL:
- return RunYql(request);
+ case ESyntax::SExpr:
+ return RunSExpr(request);
+ case ESyntax::PG:
+ return RunPg(request);
+ case ESyntax::YQL:
+ return RunYql(request);
}
}
@@ -40,7 +40,7 @@ private:
}
TCheckResponse RunYql(const TChecksRequest& request) {
- TCheckResponse res {.CheckName = GetCheckName()};
+ TCheckResponse res{.CheckName = GetCheckName()};
NSQLTranslation::TTranslationSettings settings;
settings.SyntaxVersion = request.SyntaxVersion;
settings.AnsiLexer = request.IsAnsiLexer;
@@ -65,11 +65,11 @@ private:
}
};
-}
+} // namespace
std::unique_ptr<ICheckRunner> MakeLexerRunner() {
return std::make_unique<TLexerRunner>();
}
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/linter.cpp b/yql/essentials/public/fastcheck/linter.cpp
index a32814e3ec3..1a2e904fd91 100644
--- a/yql/essentials/public/fastcheck/linter.cpp
+++ b/yql/essentials/public/fastcheck/linter.cpp
@@ -13,7 +13,7 @@ namespace NFastCheck {
namespace {
-class TCheckRunnerFactory : public ICheckRunnerFactory {
+class TCheckRunnerFactory: public ICheckRunnerFactory {
public:
using TRunnerFactoryFunction = std::function<std::unique_ptr<ICheckRunner>()>;
@@ -76,11 +76,11 @@ TCheckRunnerFactory& GetCheckRunnerFactory() {
return *Singleton<TCheckRunnerFactory>();
};
-}
+} // namespace
TVector<TCheckFilter> ParseChecks(const TString& checks) {
TVector<TCheckFilter> res;
- for (TStringBuf one: StringSplitter(checks).SplitByString(",")) {
+ for (TStringBuf one : StringSplitter(checks).SplitByString(",")) {
TCheckFilter f;
TStringBuf afterPrefix = one;
if (one.AfterPrefix("-", afterPrefix)) {
@@ -111,5 +111,5 @@ TChecksResponse RunChecks(const TChecksRequest& request) {
return res;
}
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/linter.h b/yql/essentials/public/fastcheck/linter.h
index 1314f7c065f..31a802f3f97 100644
--- a/yql/essentials/public/fastcheck/linter.h
+++ b/yql/essentials/public/fastcheck/linter.h
@@ -61,5 +61,5 @@ TVector<TCheckFilter> ParseChecks(const TString& checks);
TSet<TString> ListChecks(const TMaybe<TVector<TCheckFilter>>& filters = Nothing());
TChecksResponse RunChecks(const TChecksRequest& request);
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/linter_ut.cpp b/yql/essentials/public/fastcheck/linter_ut.cpp
index 740202cebd3..134bf48b113 100644
--- a/yql/essentials/public/fastcheck/linter_ut.cpp
+++ b/yql/essentials/public/fastcheck/linter_ut.cpp
@@ -8,631 +8,630 @@ namespace {
TChecksRequest MakeCheckRequest() {
return TChecksRequest{
- .LangVer = GetMaxReleasedLangVersion()
- };
+ .LangVer = GetMaxReleasedLangVersion()};
}
-}
+} // namespace
Y_UNIT_TEST_SUITE(TLinterTests) {
- Y_UNIT_TEST(ListChecksResult) {
- auto res = ListChecks();
- UNIT_ASSERT(!res.empty());
- }
+Y_UNIT_TEST(ListChecksResult) {
+ auto res = ListChecks();
+ UNIT_ASSERT(!res.empty());
+}
- Y_UNIT_TEST(DummyLexerSExpr) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "((return world))";
- request.Syntax = ESyntax::SExpr;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(DummyLexerSExpr) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "((return world))";
+ request.Syntax = ESyntax::SExpr;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(DummyLexerPg) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select 1::text";
- request.Syntax = ESyntax::PG;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(DummyLexerPg) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select 1::text";
+ request.Syntax = ESyntax::PG;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodLexerYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "1";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(GoodLexerYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "1";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(BadLexerYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "Я";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(BadLexerYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "Я";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(DummyFormatSExpr) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "((return world))";
- request.Syntax = ESyntax::SExpr;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(DummyFormatSExpr) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "((return world))";
+ request.Syntax = ESyntax::SExpr;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(DummyFormatPg) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select 1::text";
- request.Syntax = ESyntax::PG;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(DummyFormatPg) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select 1::text";
+ request.Syntax = ESyntax::PG;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodFormatYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "SELECT\n 1\n;\n";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(GoodFormatYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "SELECT\n 1\n;\n";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodFormatYqlWithWinEOL) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "SELECT\r\n 1\r\n;\r\n";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(GoodFormatYqlWithWinEOL) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "SELECT\r\n 1\r\n;\r\n";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodFormatYqlWithWinEOLInComment) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "--\r\nSELECT\n 1\n;\n\nSELECT\n 2\n;\n";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(GoodFormatYqlWithWinEOLInComment) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "--\r\nSELECT\n 1\n;\n\nSELECT\n 2\n;\n";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(UnparsedFormatYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select1\n";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(UnparsedFormatYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select1\n";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(BadFormatYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select 1";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(BadFormatYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select 1";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(ContextForBadFormatYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "SELECT\n 'привет',1;";
- request.File = "myFile.sql";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 1);
- const auto& pos = res.Checks[0].Issues.back().Position;
- UNIT_ASSERT_VALUES_EQUAL(pos.Row, 2);
- UNIT_ASSERT_VALUES_EQUAL(pos.Column, 13);
- }
+Y_UNIT_TEST(ContextForBadFormatYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "SELECT\n 'привет',1;";
+ request.File = "myFile.sql";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 1);
+ const auto& pos = res.Checks[0].Issues.back().Position;
+ UNIT_ASSERT_VALUES_EQUAL(pos.Row, 2);
+ UNIT_ASSERT_VALUES_EQUAL(pos.Column, 13);
+}
- Y_UNIT_TEST(BadFormatYqlHidden) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select\t1 ";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
- UNIT_ASSERT(!res.Checks[0].Success);
- UNIT_ASSERT_NO_DIFF(res.Checks[0].Issues.ToString(),
- "<main>:1:0: Warning: Format mismatch, expected:\n"
- "SELECT\n"
- "••••1\n"
- ";\n\n"
- "but got:\n"
- "select→1•\n"
- ", code: 3\n");
- }
+Y_UNIT_TEST(BadFormatYqlHidden) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select\t1 ";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ UNIT_ASSERT_NO_DIFF(res.Checks[0].Issues.ToString(),
+ "<main>:1:0: Warning: Format mismatch, expected:\n"
+ "SELECT\n"
+ "••••1\n"
+ ";\n\n"
+ "but got:\n"
+ "select→1•\n"
+ ", code: 3\n");
+}
- Y_UNIT_TEST(GoodParserSExpr) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "((return world))";
- request.Syntax = ESyntax::SExpr;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(GoodParserSExpr) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "((return world))";
+ request.Syntax = ESyntax::SExpr;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(BadParserSExpr) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = ")";
- request.Syntax = ESyntax::SExpr;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(BadParserSExpr) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = ")";
+ request.Syntax = ESyntax::SExpr;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(GoodParserPg) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select 1::text";
- request.Syntax = ESyntax::PG;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(GoodParserPg) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select 1::text";
+ request.Syntax = ESyntax::PG;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(BadParserPg) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "sel";
- request.Syntax = ESyntax::PG;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(BadParserPg) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "sel";
+ request.Syntax = ESyntax::PG;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(DummyParserPg) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select 1::text";
- request.Syntax = ESyntax::PG;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(DummyParserPg) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select 1::text";
+ request.Syntax = ESyntax::PG;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodParserYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "SELECT 1";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(GoodParserYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "SELECT 1";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(BadParserYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "1";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(BadParserYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "1";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(DummyTranslatorSExpr) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "((return world))";
- request.Syntax = ESyntax::SExpr;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
- }
+Y_UNIT_TEST(DummyTranslatorSExpr) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "((return world))";
+ request.Syntax = ESyntax::SExpr;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodTranslatorPg) {
- TChecksRequest request = MakeCheckRequest();
- request.ClusterMapping["plato"] = TString(YtProviderName);
- request.Program = "select * from plato.\"Input\"";
- request.Syntax = ESyntax::PG;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(GoodTranslatorPg) {
+ TChecksRequest request = MakeCheckRequest();
+ request.ClusterMapping["plato"] = TString(YtProviderName);
+ request.Program = "select * from plato.\"Input\"";
+ request.Syntax = ESyntax::PG;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(BadTranslatorPg) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select * from \"Input\"";
- request.Syntax = ESyntax::PG;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(BadTranslatorPg) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select * from \"Input\"";
+ request.Syntax = ESyntax::PG;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(GoodTranslatorYql) {
- TChecksRequest request = MakeCheckRequest();
- request.ClusterMapping["plato"] = TString(YtProviderName);
- request.Program = "use plato; select * from Input";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(GoodTranslatorYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.ClusterMapping["plato"] = TString(YtProviderName);
+ request.Program = "use plato; select * from Input";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(BadTranslatorYql) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select ListLengggth([1,2,3])";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(BadTranslatorYql) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select ListLengggth([1,2,3])";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(AllowYqlExportsForLibrary) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "$a = 1; export $a";
- request.Mode = EMode::Library;
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(AllowYqlExportsForLibrary) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "$a = 1; export $a";
+ request.Mode = EMode::Library;
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(AllowYqlExportsForDefault) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "$a = 1; export $a";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(AllowYqlExportsForDefault) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "$a = 1; export $a";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(DisallowYqlExportsForMain) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "$a = 1; export $a";
- request.Syntax = ESyntax::YQL;
- request.Mode = EMode::Main;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(DisallowYqlExportsForMain) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "$a = 1; export $a";
+ request.Syntax = ESyntax::YQL;
+ request.Mode = EMode::Main;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(DisallowYqlExportsForView) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "$a = 1; export $a";
- request.Syntax = ESyntax::YQL;
- request.Mode = EMode::View;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(DisallowYqlExportsForView) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "$a = 1; export $a";
+ request.Syntax = ESyntax::YQL;
+ request.Mode = EMode::View;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(GoodYqlView) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select 1";
- request.Syntax = ESyntax::YQL;
- request.Mode = EMode::View;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(GoodYqlView) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select 1";
+ request.Syntax = ESyntax::YQL;
+ request.Mode = EMode::View;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(BadYqlView) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select 1;select 2";
- request.Syntax = ESyntax::YQL;
- request.Mode = EMode::View;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(BadYqlView) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select 1;select 2";
+ request.Syntax = ESyntax::YQL;
+ request.Mode = EMode::View;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(AllChecks) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "SELECT\n 1\n;\n";
- request.Syntax = ESyntax::YQL;
- auto res = RunChecks(request);
- TSet<TString> passedChecks;
- for (const auto& r : res.Checks) {
- Cerr << r.CheckName << "\n";
- UNIT_ASSERT(r.Success);
- Cerr << r.Issues.ToString();
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- passedChecks.insert(r.CheckName);
- }
-
- UNIT_ASSERT_VALUES_EQUAL(passedChecks, ListChecks());
+Y_UNIT_TEST(AllChecks) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "SELECT\n 1\n;\n";
+ request.Syntax = ESyntax::YQL;
+ auto res = RunChecks(request);
+ TSet<TString> passedChecks;
+ for (const auto& r : res.Checks) {
+ Cerr << r.CheckName << "\n";
+ UNIT_ASSERT(r.Success);
+ Cerr << r.Issues.ToString();
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+ passedChecks.insert(r.CheckName);
}
- Y_UNIT_TEST(AllChecksByStar) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "SELECT\n 1\n;\n";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "*"});
- auto res = RunChecks(request);
- TSet<TString> passedChecks;
- for (const auto& r : res.Checks) {
- Cerr << r.CheckName << "\n";
- UNIT_ASSERT(r.Success);
- Cerr << r.Issues.ToString();
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- passedChecks.insert(r.CheckName);
- }
-
- UNIT_ASSERT_VALUES_EQUAL(passedChecks, ListChecks());
- }
+ UNIT_ASSERT_VALUES_EQUAL(passedChecks, ListChecks());
+}
- Y_UNIT_TEST(NoChecksByStarWithSecondFilter) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "1";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.Include = false, .CheckNameGlob = "*"});
- request.Filters->push_back(TCheckFilter{.Include = true, .CheckNameGlob = "lexer"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+Y_UNIT_TEST(AllChecksByStar) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "SELECT\n 1\n;\n";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "*"});
+ auto res = RunChecks(request);
+ TSet<TString> passedChecks;
+ for (const auto& r : res.Checks) {
+ Cerr << r.CheckName << "\n";
+ UNIT_ASSERT(r.Success);
+ Cerr << r.Issues.ToString();
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+ passedChecks.insert(r.CheckName);
}
- Y_UNIT_TEST(BadTranslatorYqlWithoutUseMany) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select * from Input";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+ UNIT_ASSERT_VALUES_EQUAL(passedChecks, ListChecks());
+}
- Y_UNIT_TEST(GoodTranslatorYqlWithoutUseSingle) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select * from Input";
- request.ClusterMode = EClusterMode::Single;
- request.ClusterSystem = YtProviderName;
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(NoChecksByStarWithSecondFilter) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "1";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.Include = false, .CheckNameGlob = "*"});
+ request.Filters->push_back(TCheckFilter{.Include = true, .CheckNameGlob = "lexer"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+}
- Y_UNIT_TEST(GoodTranslatorYqlWithoutUseUnknown) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select * from Input";
- request.ClusterMode = EClusterMode::Unknown;
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(BadTranslatorYqlWithoutUseMany) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select * from Input";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(BadTranslatorYqlAnotherClusterMany) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select * from foo.Input";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(GoodTranslatorYqlWithoutUseSingle) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select * from Input";
+ request.ClusterMode = EClusterMode::Single;
+ request.ClusterSystem = YtProviderName;
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodTranslatorYqlAnotherClusterMany) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "select * from foo.Input";
- request.ClusterSystem = YtProviderName;
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(GoodTranslatorYqlWithoutUseUnknown) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select * from Input";
+ request.ClusterMode = EClusterMode::Unknown;
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemUpdate) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "update foo set value = 1";
- request.ClusterMode = EClusterMode::Unknown;
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(BadTranslatorYqlAnotherClusterMany) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select * from foo.Input";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
- Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemDelete) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "delete from foo where value = 1";
- request.ClusterMode = EClusterMode::Unknown;
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(GoodTranslatorYqlAnotherClusterMany) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "select * from foo.Input";
+ request.ClusterSystem = YtProviderName;
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemReplaceInto) {
- TChecksRequest request = MakeCheckRequest();
- request.Program = "replace into foo select 1";
- request.ClusterMode = EClusterMode::Unknown;
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
+Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemUpdate) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "update foo set value = 1";
+ request.ClusterMode = EClusterMode::Unknown;
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(TooHighLangVersion) {
- TChecksRequest request;
- request.LangVer = GetMaxLangVersion();
- request.ClusterMapping["plato"] = TString(YtProviderName);
- request.Program = "use plato; select * from Input";
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT(!res.Checks[0].Success);
- Cerr << res.Checks[0].Issues.ToString();
- UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
- }
+Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemDelete) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "delete from foo where value = 1";
+ request.ClusterMode = EClusterMode::Unknown;
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
- Y_UNIT_TEST(UsedFlags) {
- TChecksRequest request;
- request.Program = R"sql(
+Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemReplaceInto) {
+ TChecksRequest request = MakeCheckRequest();
+ request.Program = "replace into foo select 1";
+ request.ClusterMode = EClusterMode::Unknown;
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
+}
+
+Y_UNIT_TEST(TooHighLangVersion) {
+ TChecksRequest request;
+ request.LangVer = GetMaxLangVersion();
+ request.ClusterMapping["plato"] = TString(YtProviderName);
+ request.Program = "use plato; select * from Input";
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT(!res.Checks[0].Success);
+ Cerr << res.Checks[0].Issues.ToString();
+ UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
+}
+
+Y_UNIT_TEST(UsedFlags) {
+ TChecksRequest request;
+ request.Program = R"sql(
$input = AsList(
AsStruct(1 AS key, 1001 AS subkey, 'AAA' AS value),
);
@@ -645,16 +644,16 @@ Y_UNIT_TEST_SUITE(TLinterTests) {
FROM
AS_TABLE($input) AS i1
)sql";
- request.ClusterMode = EClusterMode::Unknown;
- request.Syntax = ESyntax::YQL;
- request.Filters.ConstructInPlace();
- request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
-
- auto res = RunChecks(request);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
- UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
- UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
- }
-
+ request.ClusterMode = EClusterMode::Unknown;
+ request.Syntax = ESyntax::YQL;
+ request.Filters.ConstructInPlace();
+ request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
+
+ auto res = RunChecks(request);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
+ UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString());
+ UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
}
+
+} // Y_UNIT_TEST_SUITE(TLinterTests)
diff --git a/yql/essentials/public/fastcheck/parser.cpp b/yql/essentials/public/fastcheck/parser.cpp
index 9ab04728744..e122beb1291 100644
--- a/yql/essentials/public/fastcheck/parser.cpp
+++ b/yql/essentials/public/fastcheck/parser.cpp
@@ -14,7 +14,7 @@ namespace NFastCheck {
namespace {
-class TParserRunner : public TCheckRunnerBase {
+class TParserRunner: public TCheckRunnerBase {
public:
TString GetCheckName() const final {
return "parser";
@@ -22,12 +22,12 @@ public:
TCheckResponse DoRun(const TChecksRequest& request) final {
switch (request.Syntax) {
- case ESyntax::SExpr:
- return RunSExpr(request);
- case ESyntax::PG:
- return RunPg(request);
- case ESyntax::YQL:
- return RunYql(request);
+ case ESyntax::SExpr:
+ return RunSExpr(request);
+ case ESyntax::PG:
+ return RunPg(request);
+ case ESyntax::YQL:
+ return RunYql(request);
}
}
@@ -37,15 +37,15 @@ private:
return TCheckResponse{
.CheckName = GetCheckName(),
.Success = res.IsOk(),
- .Issues = res.Issues
- };
+ .Issues = res.Issues};
}
- class TPGParseEventsHandler : public IPGParseEvents {
+ class TPGParseEventsHandler: public IPGParseEvents {
public:
TPGParseEventsHandler(TCheckResponse& res)
: Res_(res)
- {}
+ {
+ }
void OnResult(const List* raw) final {
Y_UNUSED(raw);
@@ -61,14 +61,14 @@ private:
};
TCheckResponse RunPg(const TChecksRequest& request) {
- TCheckResponse res {.CheckName = GetCheckName()};
+ TCheckResponse res{.CheckName = GetCheckName()};
TPGParseEventsHandler handler(res);
PGParse(request.Program, handler);
return res;
}
TCheckResponse RunYql(const TChecksRequest& request) {
- TCheckResponse res {.CheckName = GetCheckName()};
+ TCheckResponse res{.CheckName = GetCheckName()};
NSQLTranslation::TTranslationSettings settings;
settings.SyntaxVersion = request.SyntaxVersion;
settings.AnsiLexer = request.IsAnsiLexer;
@@ -92,7 +92,7 @@ private:
parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
auto msg = NSQLTranslationV1::SqlAST(parsers, request.Program, request.File, res.Issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS,
- settings.AnsiLexer, true, &arena);
+ settings.AnsiLexer, true, &arena);
if (msg) {
res.Success = true;
}
@@ -102,11 +102,11 @@ private:
}
};
-}
+} // namespace
std::unique_ptr<ICheckRunner> MakeParserRunner() {
return std::make_unique<TParserRunner>();
}
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/settings.cpp b/yql/essentials/public/fastcheck/settings.cpp
index a26ef6ca43c..a3313c8d94c 100644
--- a/yql/essentials/public/fastcheck/settings.cpp
+++ b/yql/essentials/public/fastcheck/settings.cpp
@@ -2,17 +2,17 @@
namespace NYql::NFastCheck {
- THashSet<TString> TranslationFlags() {
- return {
- "AnsiOrderByLimitInUnionAll",
- "DisableCoalesceJoinKeysOnQualifiedAll",
- "AnsiRankForNullableKeys",
- "DisableUnorderedSubqueries",
- "DisableAnsiOptionalAs",
- "FlexibleTypes",
- "CompactNamedExprs",
- "DistinctOverWindow",
- };
- }
+THashSet<TString> TranslationFlags() {
+ return {
+ "AnsiOrderByLimitInUnionAll",
+ "DisableCoalesceJoinKeysOnQualifiedAll",
+ "AnsiRankForNullableKeys",
+ "DisableUnorderedSubqueries",
+ "DisableAnsiOptionalAs",
+ "FlexibleTypes",
+ "CompactNamedExprs",
+ "DistinctOverWindow",
+ };
+}
} // namespace NYql::NFastCheck
diff --git a/yql/essentials/public/fastcheck/settings.h b/yql/essentials/public/fastcheck/settings.h
index 4e63b554fb8..cb8eb8c41a6 100644
--- a/yql/essentials/public/fastcheck/settings.h
+++ b/yql/essentials/public/fastcheck/settings.h
@@ -5,6 +5,6 @@
namespace NYql::NFastCheck {
- THashSet<TString> TranslationFlags();
+THashSet<TString> TranslationFlags();
} // namespace NYql::NFastCheck
diff --git a/yql/essentials/public/fastcheck/translator.cpp b/yql/essentials/public/fastcheck/translator.cpp
index aa17b6272bb..cadeb4ec296 100644
--- a/yql/essentials/public/fastcheck/translator.cpp
+++ b/yql/essentials/public/fastcheck/translator.cpp
@@ -16,7 +16,7 @@ namespace NFastCheck {
namespace {
-class TTranslatorRunner : public TCheckRunnerBase {
+class TTranslatorRunner: public TCheckRunnerBase {
public:
TString GetCheckName() const final {
return "translator";
@@ -24,12 +24,12 @@ public:
TCheckResponse DoRun(const TChecksRequest& request) final {
switch (request.Syntax) {
- case ESyntax::SExpr:
- return RunSExpr(request);
- case ESyntax::PG:
- return RunPg(request);
- case ESyntax::YQL:
- return RunYql(request);
+ case ESyntax::SExpr:
+ return RunSExpr(request);
+ case ESyntax::PG:
+ return RunPg(request);
+ case ESyntax::YQL:
+ return RunYql(request);
}
}
@@ -51,12 +51,11 @@ private:
return TCheckResponse{
.CheckName = GetCheckName(),
.Success = astRes.IsOk(),
- .Issues = astRes.Issues
- };
+ .Issues = astRes.Issues};
}
TCheckResponse RunYql(const TChecksRequest& request) {
- TCheckResponse res {.CheckName = GetCheckName()};
+ TCheckResponse res{.CheckName = GetCheckName()};
google::protobuf::Arena arena;
NSQLTranslation::TTranslationSettings settings;
settings.Arena = &arena;
@@ -69,17 +68,17 @@ private:
settings.Flags = TranslationFlags();
switch (request.Mode) {
- case EMode::Default:
- settings.AlwaysAllowExports = true;
- break;
- case EMode::Library:
- settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
- break;
- case EMode::Main:
- break;
- case EMode::View:
- settings.Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
- break;
+ case EMode::Default:
+ settings.AlwaysAllowExports = true;
+ break;
+ case EMode::Library:
+ settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
+ break;
+ case EMode::Main:
+ break;
+ case EMode::View:
+ settings.Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
+ break;
}
if (!ParseTranslationSettings(request.Program, settings, res.Issues)) {
@@ -102,39 +101,39 @@ private:
void FillClusters(const TChecksRequest& request, NSQLTranslation::TTranslationSettings& settings) {
if (!request.ClusterSystem.empty()) {
Y_ENSURE(AnyOf(Providers, [&](const auto& p) { return p == request.ClusterSystem; }),
- "Invalid ClusterSystem value: " + request.ClusterSystem);
+ "Invalid ClusterSystem value: " + request.ClusterSystem);
}
switch (request.ClusterMode) {
- case EClusterMode::Many:
- for (const auto& x : request.ClusterMapping) {
- Y_ENSURE(AnyOf(Providers, [&](const auto& p) { return p == x.second; }),
- "Invalid system: " + x.second);
- }
-
- settings.ClusterMapping = request.ClusterMapping;
- settings.DynamicClusterProvider = request.ClusterSystem;
- break;
- case EClusterMode::Single:
- Y_ENSURE(!request.ClusterSystem.empty(), "Missing ClusterSystem parameter");
- settings.DefaultCluster = "single";
- settings.ClusterMapping["single"] = request.ClusterSystem;
- settings.DynamicClusterProvider = request.ClusterSystem;
- break;
- case EClusterMode::Unknown:
- settings.DefaultCluster = "single";
- settings.ClusterMapping["single"] = UnknownProviderName;
- settings.DynamicClusterProvider = UnknownProviderName;
- break;
+ case EClusterMode::Many:
+ for (const auto& x : request.ClusterMapping) {
+ Y_ENSURE(AnyOf(Providers, [&](const auto& p) { return p == x.second; }),
+ "Invalid system: " + x.second);
+ }
+
+ settings.ClusterMapping = request.ClusterMapping;
+ settings.DynamicClusterProvider = request.ClusterSystem;
+ break;
+ case EClusterMode::Single:
+ Y_ENSURE(!request.ClusterSystem.empty(), "Missing ClusterSystem parameter");
+ settings.DefaultCluster = "single";
+ settings.ClusterMapping["single"] = request.ClusterSystem;
+ settings.DynamicClusterProvider = request.ClusterSystem;
+ break;
+ case EClusterMode::Unknown:
+ settings.DefaultCluster = "single";
+ settings.ClusterMapping["single"] = UnknownProviderName;
+ settings.DynamicClusterProvider = UnknownProviderName;
+ break;
}
}
};
-}
+} // namespace
std::unique_ptr<ICheckRunner> MakeTranslatorRunner() {
return std::make_unique<TTranslatorRunner>();
}
-}
-}
+} // namespace NFastCheck
+} // namespace NYql
diff --git a/yql/essentials/public/fastcheck/ut/ya.make b/yql/essentials/public/fastcheck/ut/ya.make
index 91a2c5c9b40..244dffd1249 100644
--- a/yql/essentials/public/fastcheck/ut/ya.make
+++ b/yql/essentials/public/fastcheck/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST_FOR(yql/essentials/public/fastcheck)
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
fastcheck_ut.cpp
linter_ut.cpp
diff --git a/yql/essentials/public/fastcheck/ya.make b/yql/essentials/public/fastcheck/ya.make
index 2b374581d43..01999ded3bd 100644
--- a/yql/essentials/public/fastcheck/ya.make
+++ b/yql/essentials/public/fastcheck/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
check_runner.cpp
fastcheck.cpp
diff --git a/yql/essentials/public/issue/ut/ya.make b/yql/essentials/public/issue/ut/ya.make
index 46f35941bcb..28bebef5d25 100644
--- a/yql/essentials/public/issue/ut/ya.make
+++ b/yql/essentials/public/issue/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST_FOR(yql/essentials/public/issue)
+ENABLE(YQL_STYLE_CPP)
+
FORK_SUBTESTS()
SRCS(
diff --git a/yql/essentials/public/issue/ya.make b/yql/essentials/public/issue/ya.make
index f376c8bcda7..5d91d21a7f7 100644
--- a/yql/essentials/public/issue/ya.make
+++ b/yql/essentials/public/issue/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
yql_issue.cpp
yql_issue_message.cpp
diff --git a/yql/essentials/public/issue/yql_issue.cpp b/yql/essentials/public/issue/yql_issue.cpp
index 02d8bd2e273..d91ca5af1b3 100644
--- a/yql/essentials/public/issue/yql_issue.cpp
+++ b/yql/essentials/public/issue/yql_issue.cpp
@@ -15,7 +15,6 @@
#include <util/generic/stack.h>
#include <cstdlib>
-
namespace NYql {
void SanitizeNonAscii(TString& s) {
@@ -117,12 +116,12 @@ Y_NO_INLINE void Indent(IOutputStream& out, ui32 indentation) {
}
void ProgramLinesWithErrors(
- const TString& programText,
- const TVector<TIssue>& errors,
- TMap<ui32, TStringBuf>& lines)
+ const TString& programText,
+ const TVector<TIssue>& errors,
+ TMap<ui32, TStringBuf>& lines)
{
TVector<ui32> rows;
- for (const auto& topIssue: errors) {
+ for (const auto& topIssue : errors) {
WalkThroughIssues(topIssue, false, [&](const TIssue& issue, ui16 /*level*/) {
for (ui32 row = issue.Position.Row; row <= issue.EndPosition.Row; row++) {
rows.push_back(row);
@@ -135,7 +134,7 @@ void ProgramLinesWithErrors(
auto progIt = prog.begin(), progEnd = prog.end();
ui32 progRow = 1;
- for (ui32 row: rows) {
+ for (ui32 row : rows) {
while (progRow < row && progIt != progEnd) {
++progRow;
++progIt;
@@ -146,34 +145,30 @@ void ProgramLinesWithErrors(
}
}
-} // namspace
+} // namespace
-void TIssues::PrintTo(IOutputStream& out, bool oneLine) const
-{
+void TIssues::PrintTo(IOutputStream& out, bool oneLine) const {
if (oneLine) {
bool printWithSpace = false;
if (Issues_.size() > 1) {
printWithSpace = true;
out << "[";
}
- for (const auto& topIssue: Issues_) {
+ for (const auto& topIssue : Issues_) {
WalkThroughIssues(topIssue, false, [&](const TIssue& issue, ui16 level) {
if (level > 0) {
out << " subissue: { ";
} else {
out << (printWithSpace ? " { " : "{ ");
}
- issue.PrintTo(out, true);
- },
- [&](const TIssue&, ui16) {
- out << " }";
- });
+ issue.PrintTo(out, true); },
+ [&](const TIssue&, ui16) { out << " }"; });
}
if (Issues_.size() > 1) {
out << " ]";
}
} else {
- for (const auto& topIssue: Issues_) {
+ for (const auto& topIssue : Issues_) {
WalkThroughIssues(topIssue, false, [&](const TIssue& issue, ui16 level) {
auto shift = level * 4;
Indent(out, shift);
@@ -184,17 +179,16 @@ void TIssues::PrintTo(IOutputStream& out, bool oneLine) const
}
void TIssues::PrintWithProgramTo(
- IOutputStream& out,
- const TString& programFilename,
- const TString& programText,
- bool colorize) const
-{
+ IOutputStream& out,
+ const TString& programFilename,
+ const TString& programText,
+ bool colorize) const {
using namespace NColorizer;
TMap<ui32, TStringBuf> lines;
ProgramLinesWithErrors(programText, Issues_, lines);
- for (const TIssue& topIssue: Issues_) {
+ for (const TIssue& topIssue : Issues_) {
WalkThroughIssues(topIssue, false, [&](const TIssue& issue, ui16 level) {
auto shift = level * 4;
Indent(out, shift);
@@ -227,7 +221,7 @@ void TIssues::PrintWithProgramTo(
}
}
- out << ": "<< severityName << ": " << issue.GetMessage();
+ out << ": " << severityName << ": " << issue.GetMessage();
if (colorize) {
out << Old();
}
@@ -270,7 +264,7 @@ TMaybe<TPosition> TryParseTerminationMessage(TStringBuf& message) {
endPos = message.find(')', startPos + TerminationMessageMarker.size());
if (endPos != TString::npos) {
TStringBuf lenText = message.Tail(startPos + TerminationMessageMarker.size())
- .Trunc(endPos - startPos - TerminationMessageMarker.size());
+ .Trunc(endPos - startPos - TerminationMessageMarker.size());
try {
len = FromString<size_t>(lenText);
} catch (const TFromStringException&) {
@@ -298,7 +292,7 @@ TMaybe<TPosition> TryParseTerminationMessage(TStringBuf& message) {
return Nothing();
}
-} // namspace NYql
+} // namespace NYql
template <>
void Out<NYql::TPosition>(IOutputStream& out, const NYql::TPosition& pos) {
@@ -308,8 +302,8 @@ void Out<NYql::TPosition>(IOutputStream& out, const NYql::TPosition& pos) {
}
}
-template<>
-void Out<NYql::TRange>(IOutputStream & out, const NYql::TRange & range) {
+template <>
+void Out<NYql::TRange>(IOutputStream& out, const NYql::TRange& range) {
if (range.IsRange()) {
out << '[' << range.Position << '-' << range.EndPosition << ']';
} else {
diff --git a/yql/essentials/public/issue/yql_issue.h b/yql/essentials/public/issue/yql_issue.h
index 7f354b8670b..4ccc6a88ac7 100644
--- a/yql/essentials/public/issue/yql_issue.h
+++ b/yql/essentials/public/issue/yql_issue.h
@@ -61,7 +61,7 @@ public:
{
}
- template<typename T>
+ template <typename T>
TTextWalker& Advance(const T& buf) {
for (char c : buf) {
Advance(c);
@@ -108,6 +108,7 @@ using TIssuePtr = TIntrusivePtr<TIssue>;
class TIssue: public TThrRefBase {
TVector<TIntrusivePtr<TIssue>> Children_;
TString Message_;
+
public:
TPosition Position;
TPosition EndPosition;
@@ -135,7 +136,7 @@ public:
}
inline TRange Range() const {
- return{ Position, EndPosition };
+ return {Position, EndPosition};
}
template <typename T>
@@ -148,16 +149,14 @@ public:
}
inline bool operator==(const TIssue& other) const {
- return Position == other.Position && Message_ == other.Message_
- && IssueCode == other.IssueCode;
+ return Position == other.Position && Message_ == other.Message_ && IssueCode == other.IssueCode;
}
ui64 Hash() const noexcept {
return CombineHashes(
CombineHashes(
(size_t)CombineHashes(IntHash(Position.Row), IntHash(Position.Column)),
- ComputeHash(Position.File)
- ),
+ ComputeHash(Position.File)),
(size_t)CombineHashes((size_t)IntHash(static_cast<int>(IssueCode)), ComputeHash(Message_)));
}
@@ -247,7 +246,8 @@ public:
return *this;
}
- inline TIssues(TIssues&& rhs) : Issues_(std::move(rhs.Issues_))
+ inline TIssues(TIssues&& rhs)
+ : Issues_(std::move(rhs.Issues_))
{
}
@@ -256,7 +256,8 @@ public:
return *this;
}
- template <typename ... Args> void AddIssue(Args&& ... args) {
+ template <typename... Args>
+ void AddIssue(Args&&... args) {
Issues_.emplace_back(std::forward<Args>(args)...);
}
@@ -267,7 +268,7 @@ public:
inline void AddIssues(const TPosition& pos, const TIssues& errors) {
Issues_.reserve(Issues_.size() + errors.Size());
- for (const auto& e: errors) {
+ for (const auto& e : errors) {
TIssue& issue = Issues_.emplace_back();
*issue.MutableMessage() = e.GetMessage(); // No need to sanitize message, it has already been sanitized.
issue.Position = pos;
@@ -305,10 +306,10 @@ public:
void PrintTo(IOutputStream& out, bool oneLine = false) const;
void PrintWithProgramTo(
- IOutputStream& out,
- const TString& programFilename,
- const TString& programText,
- bool colorize = true) const;
+ IOutputStream& out,
+ const TString& programFilename,
+ const TString& programText,
+ bool colorize = true) const;
inline TString ToString(bool oneLine = false) const {
TStringStream out;
@@ -332,12 +333,14 @@ private:
TVector<TIssue> Issues_;
};
-class TErrorException : public yexception {
+class TErrorException: public yexception {
const TIssueCode Code_;
+
public:
explicit TErrorException(TIssueCode code)
: Code_(code)
- {}
+ {
+ }
TIssueCode GetCode() const {
return Code_;
}
diff --git a/yql/essentials/public/issue/yql_issue_id.h b/yql/essentials/public/issue/yql_issue_id.h
index b4889319a77..692fdb6216d 100644
--- a/yql/essentials/public/issue/yql_issue_id.h
+++ b/yql/essentials/public/issue/yql_issue_id.h
@@ -14,9 +14,9 @@
#include <util/string/subst.h>
#ifdef _win_
-#ifdef GetMessage
-#undef GetMessage
-#endif
+ #ifdef GetMessage
+ #undef GetMessage
+ #endif
#endif
namespace NYql {
@@ -29,7 +29,7 @@ const TIssueCode UNEXPECTED_ERROR = 1;
inline TString SeverityToString(ESeverity severity)
{
auto ret = NYql::TSeverityIds::ESeverityId_Name(severity);
- return ret.empty() ? "Unknown" : to_title(ret.substr(2)); //remove prefix "S_"
+ return ret.empty() ? "Unknown" : to_title(ret.substr(2)); // remove prefix "S_"
}
template <typename T>
@@ -43,7 +43,7 @@ inline TString IssueCodeToString(TIssueCode id) {
}
}
-template<typename TProto, const char* ResourceName>
+template <typename TProto, const char* ResourceName>
class TIssueId {
TProto ProtoIssues_;
THashMap<TIssueCode, NYql::TSeverityIds::ESeverityId> IssuesMap_;
@@ -56,7 +56,7 @@ class TIssueId {
}
bool CheckSeverityNameFormat(const TString& name) const {
- if (name.size() > 2 && name.substr(0,2) == "S_") {
+ if (name.size() > 2 && name.substr(0, 2) == "S_") {
return true;
}
return false;
@@ -66,14 +66,14 @@ public:
ESeverity GetSeverity(TIssueCode id) const {
auto it = IssuesMap_.find(id);
Y_ENSURE(it != IssuesMap_.end(), "Unknown issue id: "
- << id << "(" << IssueCodeToString<TProto>(id) << ")");
+ << id << "(" << IssueCodeToString<TProto>(id) << ")");
return it->second;
}
TString GetMessage(TIssueCode id) const {
auto it = IssuesFormatMap_.find(id);
Y_ENSURE(it != IssuesFormatMap_.end(), "Unknown issue id: "
- << id << "(" << IssueCodeToString<TProto>(id) << ")");
+ << id << "(" << IssueCodeToString<TProto>(id) << ")");
return it->second;
}
@@ -87,14 +87,14 @@ public:
for (int i = 0; i < sDesc->value_count(); i++) {
const auto& name = sDesc->value(i)->name();
Y_ENSURE(CheckSeverityNameFormat(name),
- "Wrong severity name: " << name << ". Severity must starts with \"S_\" prefix");
+ "Wrong severity name: " << name << ". Severity must starts with \"S_\" prefix");
}
for (const auto& x : ProtoIssues_.ids()) {
auto rv = IssuesMap_.insert(std::make_pair(x.code(), x.severity()));
Y_ENSURE(rv.second, "Duplicate issue code found, code: "
- << static_cast<int>(x.code())
- << "(" << IssueCodeToString<TProto>(x.code()) <<")");
+ << static_cast<int>(x.code())
+ << "(" << IssueCodeToString<TProto>(x.code()) << ")");
}
// Check all IssueCodes have mapping to severity
@@ -102,27 +102,27 @@ public:
for (int i = 0; i < eDesc->value_count(); i++) {
auto it = IssuesMap_.find(eDesc->value(i)->number());
Y_ENSURE(it != IssuesMap_.end(), "IssueCode: "
- << eDesc->value(i)->name()
- << " is not found in protobuf data file");
+ << eDesc->value(i)->name()
+ << " is not found in protobuf data file");
}
for (const auto& x : ProtoIssues_.ids()) {
auto rv = IssuesFormatMap_.insert(std::make_pair(x.code(), x.format()));
Y_ENSURE(rv.second, "Duplicate issue code found, code: "
- << static_cast<int>(x.code())
- << "(" << IssueCodeToString<TProto>(x.code()) <<")");
+ << static_cast<int>(x.code())
+ << "(" << IssueCodeToString<TProto>(x.code()) << ")");
}
}
};
-template<typename TProto, const char* ResourceName>
+template <typename TProto, const char* ResourceName>
inline ESeverity GetSeverity(TIssueCode id) {
return Singleton<TIssueId<TProto, ResourceName>>()->GetSeverity(id);
}
-template<typename TProto, const char* ResourceName>
+template <typename TProto, const char* ResourceName>
inline TString GetMessage(TIssueCode id) {
return Singleton<TIssueId<TProto, ResourceName>>()->GetMessage(id);
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/issue/yql_issue_manager.cpp b/yql/essentials/public/issue/yql_issue_manager.cpp
index 8ffeed9fb08..1d1ed624282 100644
--- a/yql/essentials/public/issue/yql_issue_manager.cpp
+++ b/yql/essentials/public/issue/yql_issue_manager.cpp
@@ -55,7 +55,7 @@ void TIssueManager::LeaveScope() {
RawIssues_.top().first = new TIssue();
(*RawIssues_.top().first)->SetCode(Max<ui32>(), ESeverity::TSeverityIds_ESeverityId_S_INFO);
} else {
- (*RawIssues_.top().first)->Severity = ESeverity::TSeverityIds_ESeverityId_S_INFO;
+ (*RawIssues_.top().first)->Severity = ESeverity::TSeverityIds_ESeverityId_S_INFO;
}
}
@@ -93,7 +93,7 @@ TIssuePtr TIssueManager::CheckUniqAndLimit(TIssuePtr issue) {
}
if (IssueLimit_ && UniqueIssues_[severity].size() == IssueLimit_) {
OverflowIssues_[severity] = MakeIntrusive<TIssue>(TStringBuilder()
- << "Too many " << SeverityToString(issue->GetSeverity()) << " issues");
+ << "Too many " << SeverityToString(issue->GetSeverity()) << " issues");
OverflowIssues_[severity]->Severity = severity;
return {};
}
@@ -125,7 +125,7 @@ void TIssueManager::RaiseIssue(const TIssue& issue) {
(*RawIssues_.top().first)->SetCode(Max<ui32>(), ESeverity::TSeverityIds_ESeverityId_S_INFO);
} else {
(*RawIssues_.top().first)->Severity = ESeverity::TSeverityIds_ESeverityId_S_INFO;
- }
+ }
}
RawIssues_.top().first->Get()->AddSubIssue(p);
}
@@ -179,7 +179,7 @@ TIssues TIssueManager::GetIssues() {
TIssues TIssueManager::GetCompletedIssues() const {
TIssues res;
- for (auto& p: OverflowIssues_) {
+ for (auto& p : OverflowIssues_) {
if (p) {
res.AddIssue(*p);
}
@@ -189,7 +189,7 @@ TIssues TIssueManager::GetCompletedIssues() const {
}
void TIssueManager::AddIssues(const TIssues& issues) {
- for (auto& issue: issues) {
+ for (auto& issue : issues) {
if (auto p = CheckUniqAndLimit(issue)) {
CompletedIssues_.AddIssue(*p);
}
@@ -197,7 +197,7 @@ void TIssueManager::AddIssues(const TIssues& issues) {
}
void TIssueManager::AddIssues(const TPosition& pos, const TIssues& issues) {
- for (auto& issue: issues) {
+ for (auto& issue : issues) {
if (auto p = CheckUniqAndLimit(TIssue(pos, issue.GetMessage()))) {
CompletedIssues_.AddIssue(*p);
}
@@ -205,11 +205,11 @@ void TIssueManager::AddIssues(const TPosition& pos, const TIssues& issues) {
}
void TIssueManager::Reset(const TIssues& issues) {
- for (auto& p: OverflowIssues_) {
+ for (auto& p : OverflowIssues_) {
p.Drop();
}
- for (auto& s: UniqueIssues_) {
+ for (auto& s : UniqueIssues_) {
s.clear();
}
CompletedIssues_.Clear();
@@ -224,7 +224,7 @@ void TIssueManager::Reset() {
Reset(TIssues());
}
-void TIssueManager::AddWarningRule(const TWarningRule &rule)
+void TIssueManager::AddWarningRule(const TWarningRule& rule)
{
WarningPolicy_.AddRule(rule);
}
diff --git a/yql/essentials/public/issue/yql_issue_manager.h b/yql/essentials/public/issue/yql_issue_manager.h
index 6b6ec2c7194..8a5ef8daea1 100644
--- a/yql/essentials/public/issue/yql_issue_manager.h
+++ b/yql/essentials/public/issue/yql_issue_manager.h
@@ -27,7 +27,7 @@ public:
void Reset(const TIssues& issues);
void Reset();
- void AddWarningRule(const TWarningRule &rule);
+ void AddWarningRule(const TWarningRule& rule);
void SetWarningToErrorTreatMessage(const TString& msg);
void SetIssueCountLimit(size_t limit) {
@@ -63,6 +63,7 @@ private:
class TIssueScopeGuard: private TNonCopyable {
TIssueManager& Manager_;
+
public:
TIssueScopeGuard(TIssueManager& manager, std::function<TIssuePtr()> fn)
: Manager_(manager)
@@ -80,4 +81,4 @@ public:
}
};
-}
+} // namespace NYql
diff --git a/yql/essentials/public/issue/yql_issue_manager_ut.cpp b/yql/essentials/public/issue/yql_issue_manager_ut.cpp
index e3308163c34..9c135ecd15f 100644
--- a/yql/essentials/public/issue/yql_issue_manager_ut.cpp
+++ b/yql/essentials/public/issue/yql_issue_manager_ut.cpp
@@ -11,186 +11,186 @@ static std::function<TIssuePtr()> CreateScopeIssueFunction(TString name, ui32 co
}
Y_UNIT_TEST_SUITE(TIssueManagerTest) {
- Y_UNIT_TEST(NoErrorNoLevelTest) {
- TIssueManager issueManager;
- auto completedIssues = issueManager.GetCompletedIssues();
- UNIT_ASSERT_VALUES_EQUAL(completedIssues.Size(), 0);
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 0);
- }
+Y_UNIT_TEST(NoErrorNoLevelTest) {
+ TIssueManager issueManager;
+ auto completedIssues = issueManager.GetCompletedIssues();
+ UNIT_ASSERT_VALUES_EQUAL(completedIssues.Size(), 0);
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 0);
+}
- Y_UNIT_TEST(NoErrorOneLevelTest) {
- TIssueManager issueManager;
- issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
- auto completedIssues = issueManager.GetCompletedIssues();
- UNIT_ASSERT_VALUES_EQUAL(completedIssues.Size(), 0);
- issueManager.LeaveScope();
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 0);
- }
+Y_UNIT_TEST(NoErrorOneLevelTest) {
+ TIssueManager issueManager;
+ issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
+ auto completedIssues = issueManager.GetCompletedIssues();
+ UNIT_ASSERT_VALUES_EQUAL(completedIssues.Size(), 0);
+ issueManager.LeaveScope();
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 0);
+}
- Y_UNIT_TEST(NoErrorTwoLevelsTest) {
- TIssueManager issueManager;
- issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
- issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
- issueManager.LeaveScope();
- auto completedIssues = issueManager.GetCompletedIssues();
- UNIT_ASSERT_VALUES_EQUAL(completedIssues.Size(), 0);
- issueManager.LeaveScope();
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 0);
- }
+Y_UNIT_TEST(NoErrorTwoLevelsTest) {
+ TIssueManager issueManager;
+ issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
+ issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
+ issueManager.LeaveScope();
+ auto completedIssues = issueManager.GetCompletedIssues();
+ UNIT_ASSERT_VALUES_EQUAL(completedIssues.Size(), 0);
+ issueManager.LeaveScope();
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 0);
+}
- Y_UNIT_TEST(OneErrorOneLevelTest) {
- TIssueManager issueManager;
- issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
- auto completedIssues1 = issueManager.GetCompletedIssues();
- UNIT_ASSERT_VALUES_EQUAL(completedIssues1.Size(), 0);
- issueManager.RaiseIssue(TIssue(TPosition(1,2), "IssueOne"));
- auto completedIssues2 = issueManager.GetCompletedIssues();
- UNIT_ASSERT_VALUES_EQUAL(completedIssues2.Size(), 0);
- issueManager.LeaveScope();
- auto completedIssues3 = issueManager.GetCompletedIssues();
- UNIT_ASSERT_VALUES_EQUAL(completedIssues3.Size(), 1);
+Y_UNIT_TEST(OneErrorOneLevelTest) {
+ TIssueManager issueManager;
+ issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
+ auto completedIssues1 = issueManager.GetCompletedIssues();
+ UNIT_ASSERT_VALUES_EQUAL(completedIssues1.Size(), 0);
+ issueManager.RaiseIssue(TIssue(TPosition(1, 2), "IssueOne"));
+ auto completedIssues2 = issueManager.GetCompletedIssues();
+ UNIT_ASSERT_VALUES_EQUAL(completedIssues2.Size(), 0);
+ issueManager.LeaveScope();
+ auto completedIssues3 = issueManager.GetCompletedIssues();
+ UNIT_ASSERT_VALUES_EQUAL(completedIssues3.Size(), 1);
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
- auto scopeIssue = issues.begin();
- UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A");
- auto subIssues = scopeIssue->GetSubIssues();
- UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "IssueOne");
- }
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
+ auto scopeIssue = issues.begin();
+ UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A");
+ auto subIssues = scopeIssue->GetSubIssues();
+ UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "IssueOne");
+}
- Y_UNIT_TEST(OneErrorTwoLevelsTest) {
- TIssueManager issueManager;
- issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
- issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
- issueManager.RaiseIssue(TIssue(TPosition(1,2), "IssueOne"));
- issueManager.LeaveScope();
- issueManager.LeaveScope();
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
- auto scopeIssue = issues.begin();
- UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A");
- auto subIssues = scopeIssue->GetSubIssues();
- UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "B");
+Y_UNIT_TEST(OneErrorTwoLevelsTest) {
+ TIssueManager issueManager;
+ issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
+ issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 2), "IssueOne"));
+ issueManager.LeaveScope();
+ issueManager.LeaveScope();
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
+ auto scopeIssue = issues.begin();
+ UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A");
+ auto subIssues = scopeIssue->GetSubIssues();
+ UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "B");
- UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues().size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues()[0]->GetMessage(), "IssueOne");
- }
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues().size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues()[0]->GetMessage(), "IssueOne");
+}
- Y_UNIT_TEST(MultiErrorsMultiLevelsTest) {
- TIssueManager issueManager;
- issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
- issueManager.RaiseIssue(TIssue(TPosition(), "WarningScope1"));
- issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
- issueManager.AddScope(CreateScopeIssueFunction("C", 2, 2));
- issueManager.RaiseIssue(TIssue(TPosition(), "ErrorScope3"));
- issueManager.LeaveScope();
- issueManager.RaiseIssue(TIssue(TPosition(), "ErrorScope2"));
- issueManager.LeaveScope();
- issueManager.LeaveScope();
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
- auto scopeIssue = issues.begin();
- auto subIssues = scopeIssue->GetSubIssues();
- UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues().size(), 0); //WarningScope1
- UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "WarningScope1");
- UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues().size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[0]->GetSubIssues().size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[0]->GetSubIssues()[0]->GetMessage(), "ErrorScope3");
- UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[1]->GetMessage(), "ErrorScope2");
- auto ref = R"___(<main>: Error: A
+Y_UNIT_TEST(MultiErrorsMultiLevelsTest) {
+ TIssueManager issueManager;
+ issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
+ issueManager.RaiseIssue(TIssue(TPosition(), "WarningScope1"));
+ issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
+ issueManager.AddScope(CreateScopeIssueFunction("C", 2, 2));
+ issueManager.RaiseIssue(TIssue(TPosition(), "ErrorScope3"));
+ issueManager.LeaveScope();
+ issueManager.RaiseIssue(TIssue(TPosition(), "ErrorScope2"));
+ issueManager.LeaveScope();
+ issueManager.LeaveScope();
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
+ auto scopeIssue = issues.begin();
+ auto subIssues = scopeIssue->GetSubIssues();
+ UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues().size(), 0); // WarningScope1
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "WarningScope1");
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues().size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[0]->GetSubIssues().size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[0]->GetSubIssues()[0]->GetMessage(), "ErrorScope3");
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[1]->GetMessage(), "ErrorScope2");
+ auto ref = R"___(<main>: Error: A
<main>: Error: WarningScope1
<main>:1:1: Error: B
<main>:2:2: Error: C
<main>: Error: ErrorScope3
<main>: Error: ErrorScope2
)___";
- UNIT_ASSERT_VALUES_EQUAL(issues.ToString(), ref);
- }
+ UNIT_ASSERT_VALUES_EQUAL(issues.ToString(), ref);
+}
- Y_UNIT_TEST(TIssueScopeGuardSimpleTest) {
- TIssueManager issueManager;
- {
- TIssueScopeGuard guard(issueManager, CreateScopeIssueFunction("A", 0, 0));
- issueManager.RaiseIssue(TIssue(TPosition(1,2), "ErrorScope1"));
- }
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
- auto scopeIssue = issues.begin();
- UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A");
- auto subIssues = scopeIssue->GetSubIssues();
- UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "ErrorScope1");
+Y_UNIT_TEST(TIssueScopeGuardSimpleTest) {
+ TIssueManager issueManager;
+ {
+ TIssueScopeGuard guard(issueManager, CreateScopeIssueFunction("A", 0, 0));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 2), "ErrorScope1"));
}
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
+ auto scopeIssue = issues.begin();
+ UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A");
+ auto subIssues = scopeIssue->GetSubIssues();
+ UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "ErrorScope1");
+}
- Y_UNIT_TEST(FuseScopesTest) {
- TIssueManager issueManager;
- issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
- issueManager.AddScope(CreateScopeIssueFunction("B", 0, 0));
- issueManager.AddScope(CreateScopeIssueFunction("C", 0, 0));
- issueManager.AddScope(CreateScopeIssueFunction("D", 0, 0));
- issueManager.RaiseIssue(TIssue(TPosition(1,2), "IssueOne"));
- issueManager.LeaveScope();
- issueManager.RaiseIssue(TIssue(TPosition(1,2), "IssueTwo"));
- issueManager.LeaveScope();
- issueManager.LeaveScope();
- issueManager.LeaveScope();
- auto issues = issueManager.GetIssues();
- auto ref = R"___(<main>: Error: A
+Y_UNIT_TEST(FuseScopesTest) {
+ TIssueManager issueManager;
+ issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
+ issueManager.AddScope(CreateScopeIssueFunction("B", 0, 0));
+ issueManager.AddScope(CreateScopeIssueFunction("C", 0, 0));
+ issueManager.AddScope(CreateScopeIssueFunction("D", 0, 0));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 2), "IssueOne"));
+ issueManager.LeaveScope();
+ issueManager.RaiseIssue(TIssue(TPosition(1, 2), "IssueTwo"));
+ issueManager.LeaveScope();
+ issueManager.LeaveScope();
+ issueManager.LeaveScope();
+ auto issues = issueManager.GetIssues();
+ auto ref = R"___(<main>: Error: A
<main>: Error: B, C
<main>: Error: D
<main>:2:1: Error: IssueOne
<main>:2:1: Error: IssueTwo
)___";
- UNIT_ASSERT_VALUES_EQUAL(issues.ToString(), ref);
- }
+ UNIT_ASSERT_VALUES_EQUAL(issues.ToString(), ref);
+}
- Y_UNIT_TEST(UniqIssues) {
- TIssueManager issueManager;
- issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
- issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
- issueManager.RaiseIssue(TIssue(TPosition(1,2), "IssueOne"));
- issueManager.RaiseIssue(TIssue(TPosition(1,2), "IssueTwo"));
- issueManager.RaiseIssue(TIssue(TPosition(2,3), "IssueOne"));
- issueManager.RaiseWarning(TIssue(TPosition(2,3), "IssueOne").SetCode(1, ESeverity::TSeverityIds_ESeverityId_S_WARNING));
- issueManager.LeaveScope();
- issueManager.LeaveScope();
- issueManager.RaiseIssue(TIssue(TPosition(1,2), "IssueOne"));
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
- auto ref = R"___(<main>: Error: A
+Y_UNIT_TEST(UniqIssues) {
+ TIssueManager issueManager;
+ issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
+ issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 2), "IssueOne"));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 2), "IssueTwo"));
+ issueManager.RaiseIssue(TIssue(TPosition(2, 3), "IssueOne"));
+ issueManager.RaiseWarning(TIssue(TPosition(2, 3), "IssueOne").SetCode(1, ESeverity::TSeverityIds_ESeverityId_S_WARNING));
+ issueManager.LeaveScope();
+ issueManager.LeaveScope();
+ issueManager.RaiseIssue(TIssue(TPosition(1, 2), "IssueOne"));
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1);
+ auto ref = R"___(<main>: Error: A
<main>:1:1: Error: B
<main>:2:1: Error: IssueOne
<main>:2:1: Error: IssueTwo
<main>:3:2: Error: IssueOne
<main>:3:2: Warning: IssueOne, code: 1
)___";
- UNIT_ASSERT_VALUES_EQUAL(issues.ToString(), ref);
- }
+ UNIT_ASSERT_VALUES_EQUAL(issues.ToString(), ref);
+}
- Y_UNIT_TEST(Limits) {
- TIssueManager issueManager;
- issueManager.SetIssueCountLimit(2);
- issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
- issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
- issueManager.RaiseIssue(TIssue(TPosition(1,1), "Issue1"));
- issueManager.RaiseIssue(TIssue(TPosition(1,1), "Issue2"));
- issueManager.RaiseIssue(TIssue(TPosition(1,1), "Issue3"));
- issueManager.RaiseIssue(TIssue(TPosition(1,1), "Issue4").SetCode(1, ESeverity::TSeverityIds_ESeverityId_S_WARNING));
- issueManager.RaiseIssue(TIssue(TPosition(1,1), "Issue5").SetCode(1, ESeverity::TSeverityIds_ESeverityId_S_WARNING));
- issueManager.RaiseIssue(TIssue(TPosition(1,1), "Issue6").SetCode(1, ESeverity::TSeverityIds_ESeverityId_S_WARNING));
- issueManager.RaiseIssue(TIssue(TPosition(1,1), "Issue7").SetCode(2, ESeverity::TSeverityIds_ESeverityId_S_INFO));
- issueManager.RaiseIssue(TIssue(TPosition(1,1), "Issue8").SetCode(2, ESeverity::TSeverityIds_ESeverityId_S_INFO));
- issueManager.LeaveScope();
- issueManager.LeaveScope();
- auto issues = issueManager.GetIssues();
- UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 3);
- auto ref = R"___(<main>: Error: Too many Error issues
+Y_UNIT_TEST(Limits) {
+ TIssueManager issueManager;
+ issueManager.SetIssueCountLimit(2);
+ issueManager.AddScope(CreateScopeIssueFunction("A", 0, 0));
+ issueManager.AddScope(CreateScopeIssueFunction("B", 1, 1));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 1), "Issue1"));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 1), "Issue2"));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 1), "Issue3"));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 1), "Issue4").SetCode(1, ESeverity::TSeverityIds_ESeverityId_S_WARNING));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 1), "Issue5").SetCode(1, ESeverity::TSeverityIds_ESeverityId_S_WARNING));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 1), "Issue6").SetCode(1, ESeverity::TSeverityIds_ESeverityId_S_WARNING));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 1), "Issue7").SetCode(2, ESeverity::TSeverityIds_ESeverityId_S_INFO));
+ issueManager.RaiseIssue(TIssue(TPosition(1, 1), "Issue8").SetCode(2, ESeverity::TSeverityIds_ESeverityId_S_INFO));
+ issueManager.LeaveScope();
+ issueManager.LeaveScope();
+ auto issues = issueManager.GetIssues();
+ UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 3);
+ auto ref = R"___(<main>: Error: Too many Error issues
<main>: Warning: Too many Warning issues
<main>: Error: A
<main>:1:1: Error: B
@@ -201,6 +201,6 @@ Y_UNIT_TEST_SUITE(TIssueManagerTest) {
<main>:1:1: Info: Issue7, code: 2
<main>:1:1: Info: Issue8, code: 2
)___";
- UNIT_ASSERT_VALUES_EQUAL(issues.ToString(), ref);
- }
+ UNIT_ASSERT_VALUES_EQUAL(issues.ToString(), ref);
}
+} // Y_UNIT_TEST_SUITE(TIssueManagerTest)
diff --git a/yql/essentials/public/issue/yql_issue_message.cpp b/yql/essentials/public/issue/yql_issue_message.cpp
index d759edf432f..59742a8b776 100644
--- a/yql/essentials/public/issue/yql_issue_message.cpp
+++ b/yql/essentials/public/issue/yql_issue_message.cpp
@@ -11,17 +11,13 @@ namespace NYql {
using namespace NIssue::NProto;
-template
-TIssue IssueFromMessage<NYql::NIssue::NProto::IssueMessage>(const NYql::NIssue::NProto::IssueMessage& issueMessage);
+template TIssue IssueFromMessage<NYql::NIssue::NProto::IssueMessage>(const NYql::NIssue::NProto::IssueMessage& issueMessage);
-template
-void IssuesFromMessage<NYql::NIssue::NProto::IssueMessage>(const ::google::protobuf::RepeatedPtrField<NYql::NIssue::NProto::IssueMessage>& message, TIssues& issues);
+template void IssuesFromMessage<NYql::NIssue::NProto::IssueMessage>(const ::google::protobuf::RepeatedPtrField<NYql::NIssue::NProto::IssueMessage>& message, TIssues& issues);
-template
-void IssueToMessage<NYql::NIssue::NProto::IssueMessage>(const TIssue& topIssue, NYql::NIssue::NProto::IssueMessage* issueMessage);
+template void IssueToMessage<NYql::NIssue::NProto::IssueMessage>(const TIssue& topIssue, NYql::NIssue::NProto::IssueMessage* issueMessage);
-template
-void IssuesToMessage<NYql::NIssue::NProto::IssueMessage>(const TIssues& issues, ::google::protobuf::RepeatedPtrField<NYql::NIssue::NProto::IssueMessage>* message);
+template void IssuesToMessage<NYql::NIssue::NProto::IssueMessage>(const TIssues& issues, ::google::protobuf::RepeatedPtrField<NYql::NIssue::NProto::IssueMessage>* message);
NIssue::NProto::IssueMessage IssueToMessage(const TIssue& topIssue) {
NIssue::NProto::IssueMessage issueMessage;
@@ -29,8 +25,8 @@ NIssue::NProto::IssueMessage IssueToMessage(const TIssue& topIssue) {
return issueMessage;
}
-}
+} // namespace NYql
Y_DECLARE_OUT_SPEC(, google::protobuf::RepeatedPtrField<NYql::NIssue::NProto::IssueMessage>, stream, issues) {
stream << JoinSeq("", issues);
-} \ No newline at end of file
+}
diff --git a/yql/essentials/public/issue/yql_issue_message.h b/yql/essentials/public/issue/yql_issue_message.h
index be1d1a45bb8..d60ce09ce95 100644
--- a/yql/essentials/public/issue/yql_issue_message.h
+++ b/yql/essentials/public/issue/yql_issue_message.h
@@ -9,15 +9,15 @@ namespace NYql {
namespace NIssue {
namespace NProto {
class IssueMessage;
-}
-}
+} // namespace NProto
+} // namespace NIssue
-template<typename TIssueMessage>
+template <typename TIssueMessage>
TIssue IssueFromMessage(const TIssueMessage& issueMessage);
-template<typename TIssueMessage>
+template <typename TIssueMessage>
void IssuesFromMessage(const ::google::protobuf::RepeatedPtrField<TIssueMessage>& message, TIssues& issues);
-template<typename TIssueMessage>
+template <typename TIssueMessage>
TString IssuesFromMessageAsString(const ::google::protobuf::RepeatedPtrField<TIssueMessage>& message) {
TIssues issues;
IssuesFromMessage(message, issues);
@@ -26,9 +26,9 @@ TString IssuesFromMessageAsString(const ::google::protobuf::RepeatedPtrField<TIs
NIssue::NProto::IssueMessage IssueToMessage(const TIssue& topIssue);
-template<typename TIssueMessage>
+template <typename TIssueMessage>
void IssueToMessage(const TIssue& topIssue, TIssueMessage* message);
-template<typename TIssueMessage>
+template <typename TIssueMessage>
void IssuesToMessage(const TIssues& issues, ::google::protobuf::RepeatedPtrField<TIssueMessage>* message);
-}
+} // namespace NYql
diff --git a/yql/essentials/public/issue/yql_issue_message_impl.h b/yql/essentials/public/issue/yql_issue_message_impl.h
index c59134e183a..a169f8cd303 100644
--- a/yql/essentials/public/issue/yql_issue_message_impl.h
+++ b/yql/essentials/public/issue/yql_issue_message_impl.h
@@ -10,7 +10,7 @@ namespace NYql {
using namespace NIssue::NProto;
-template<typename TIssueMessage>
+template <typename TIssueMessage>
TIssue IssueFromMessage(const TIssueMessage& issueMessage) {
TIssue topIssue;
TDeque<std::pair<TIssue*, const TIssueMessage*>> queue;
@@ -42,17 +42,18 @@ TIssue IssueFromMessage(const TIssueMessage& issueMessage) {
return topIssue;
}
-template<typename TIssueMessage>
-void IssuesFromMessage(const ::google::protobuf::RepeatedPtrField<TIssueMessage> &message, TIssues &issues) {
+template <typename TIssueMessage>
+void IssuesFromMessage(const ::google::protobuf::RepeatedPtrField<TIssueMessage>& message, TIssues& issues) {
issues.Clear();
if (message.size()) {
issues.Reserve(message.size());
- for (auto &x : message)
+ for (auto& x : message) {
issues.AddIssue(IssueFromMessage(x));
+ }
}
}
-template<typename TIssueMessage>
+template <typename TIssueMessage>
void IssueToMessage(const TIssue& topIssue, TIssueMessage* issueMessage) {
TDeque<std::pair<const TIssue*, TIssueMessage*>> queue;
queue.push_front(std::make_pair(&topIssue, issueMessage));
@@ -82,15 +83,16 @@ void IssueToMessage(const TIssue& topIssue, TIssueMessage* issueMessage) {
}
}
-template<typename TIssueMessage>
-void IssuesToMessage(const TIssues& issues, ::google::protobuf::RepeatedPtrField<TIssueMessage> *message) {
+template <typename TIssueMessage>
+void IssuesToMessage(const TIssues& issues, ::google::protobuf::RepeatedPtrField<TIssueMessage>* message) {
message->Clear();
- if (!issues)
+ if (!issues) {
return;
+ }
message->Reserve(issues.Size());
- for (const auto &issue : issues) {
+ for (const auto& issue : issues) {
IssueToMessage(issue, message->Add());
}
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/issue/yql_issue_ut.cpp b/yql/essentials/public/issue/yql_issue_ut.cpp
index 9076c0ee3da..00f146555d0 100644
--- a/yql/essentials/public/issue/yql_issue_ut.cpp
+++ b/yql/essentials/public/issue/yql_issue_ut.cpp
@@ -18,123 +18,123 @@ using namespace google::protobuf;
using namespace NYql;
Y_UNIT_TEST_SUITE(IssueTest) {
- Y_UNIT_TEST(Ascii) {
- TIssue issue1("тест abc");
- UNIT_ASSERT_VALUES_EQUAL(issue1.GetMessage(), "тест abc");
- TIssue issue2("\xFF abc");
- UNIT_ASSERT_VALUES_EQUAL(issue2.GetMessage(), "? abc");
- TIssue issue3("");
- UNIT_ASSERT_VALUES_EQUAL(issue3.GetMessage(), "");
- TIssue issue4("abc");
- UNIT_ASSERT_VALUES_EQUAL(issue4.GetMessage(), "abc");
- }
+Y_UNIT_TEST(Ascii) {
+ TIssue issue1("тест abc");
+ UNIT_ASSERT_VALUES_EQUAL(issue1.GetMessage(), "тест abc");
+ TIssue issue2("\xFF abc");
+ UNIT_ASSERT_VALUES_EQUAL(issue2.GetMessage(), "? abc");
+ TIssue issue3("");
+ UNIT_ASSERT_VALUES_EQUAL(issue3.GetMessage(), "");
+ TIssue issue4("abc");
+ UNIT_ASSERT_VALUES_EQUAL(issue4.GetMessage(), "abc");
}
+} // Y_UNIT_TEST_SUITE(IssueTest)
Y_UNIT_TEST_SUITE(TextWalkerTest) {
- Y_UNIT_TEST(BasicTest) {
- TPosition pos;
- pos.Row = 1;
+Y_UNIT_TEST(BasicTest) {
+ TPosition pos;
+ pos.Row = 1;
- TTextWalker walker(pos, false);
- walker.Advance(TStringBuf("a\r\taa"));
+ TTextWalker walker(pos, false);
+ walker.Advance(TStringBuf("a\r\taa"));
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(5, 1));
- walker.Advance(TStringBuf("\na"));
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(1, 2));
- }
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(5, 1));
+ walker.Advance(TStringBuf("\na"));
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(1, 2));
+}
+
+Y_UNIT_TEST(CrLfTest) {
+ TPosition pos;
+ pos.Row = 1;
+
+ TTextWalker walker(pos, false);
+ walker.Advance(TStringBuf("a\raa\r"));
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(5, 1));
+ walker.Advance('\n');
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(0, 2));
+ walker.Advance(TStringBuf("\r\r\ra"));
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(4, 2));
+ walker.Advance('\r');
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(5, 2));
+ walker.Advance('\n');
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(0, 3));
+ walker.Advance('a');
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(1, 3));
+}
- Y_UNIT_TEST(CrLfTest) {
+Y_UNIT_TEST(UnicodeTest) {
+ {
TPosition pos;
pos.Row = 1;
TTextWalker walker(pos, false);
- walker.Advance(TStringBuf("a\raa\r"));
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(5, 1));
- walker.Advance('\n');
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(0, 2));
- walker.Advance(TStringBuf("\r\r\ra"));
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(4, 2));
- walker.Advance('\r');
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(5, 2));
- walker.Advance('\n');
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(0, 3));
- walker.Advance('a');
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(1, 3));
- }
-
- Y_UNIT_TEST(UnicodeTest) {
- {
- TPosition pos;
- pos.Row = 1;
+ walker.Advance(TStringBuf("привет"));
- TTextWalker walker(pos, false);
- walker.Advance(TStringBuf("привет"));
-
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(12, 1));
- }
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(12, 1));
+ }
- {
- TPosition pos;
- pos.Row = 1;
+ {
+ TPosition pos;
+ pos.Row = 1;
- TTextWalker walker(pos, true);
- walker.Advance(TStringBuf("привет"));
+ TTextWalker walker(pos, true);
+ walker.Advance(TStringBuf("привет"));
- UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(6, 1));
- }
+ UNIT_ASSERT_VALUES_EQUAL(pos, TPosition(6, 1));
}
}
+} // Y_UNIT_TEST_SUITE(TextWalkerTest)
Y_UNIT_TEST_SUITE(ToOneLineStringTest) {
- Y_UNIT_TEST(OneMessageTest) {
- TIssues issues;
- issues.AddIssue(TPosition(12, 34, "file.abc"), "error");
- UNIT_ASSERT_STRINGS_EQUAL(issues.ToOneLineString(), "{ file.abc:34:12: Error: error }");
- }
+Y_UNIT_TEST(OneMessageTest) {
+ TIssues issues;
+ issues.AddIssue(TPosition(12, 34, "file.abc"), "error");
+ UNIT_ASSERT_STRINGS_EQUAL(issues.ToOneLineString(), "{ file.abc:34:12: Error: error }");
+}
- Y_UNIT_TEST(SubIssuesTest) {
- TIssue issue(TPosition(12, 34, "file.abc"), "error");
- TIssue subissue("suberror");
- subissue.AddSubIssue(MakeIntrusive<TIssue>("subsuberror"));
- issue.AddSubIssue(MakeIntrusive<TIssue>(subissue));
+Y_UNIT_TEST(SubIssuesTest) {
+ TIssue issue(TPosition(12, 34, "file.abc"), "error");
+ TIssue subissue("suberror");
+ subissue.AddSubIssue(MakeIntrusive<TIssue>("subsuberror"));
+ issue.AddSubIssue(MakeIntrusive<TIssue>(subissue));
- TIssues issues;
- issues.AddIssue(issue);
- UNIT_ASSERT_STRINGS_EQUAL(issues.ToOneLineString(), "{ file.abc:34:12: Error: error subissue: { <main>: Error: suberror subissue: { <main>: Error: subsuberror } } }");
- }
+ TIssues issues;
+ issues.AddIssue(issue);
+ UNIT_ASSERT_STRINGS_EQUAL(issues.ToOneLineString(), "{ file.abc:34:12: Error: error subissue: { <main>: Error: suberror subissue: { <main>: Error: subsuberror } } }");
+}
- Y_UNIT_TEST(ManyIssuesTest) {
- TIssue issue(TPosition(12, 34, "file.abc"), "error\n");
- issue.AddSubIssue(MakeIntrusive<TIssue>("suberror"));
- TIssues issues;
- issues.AddIssue(issue);
- issues.AddIssue(TPosition(100, 2, "abc.file"), "my\nmessage");
- UNIT_ASSERT_STRINGS_EQUAL(issues.ToOneLineString(), "[ { file.abc:34:12: Error: error subissue: { <main>: Error: suberror } } { abc.file:2:100: Error: my message } ]");
- }
+Y_UNIT_TEST(ManyIssuesTest) {
+ TIssue issue(TPosition(12, 34, "file.abc"), "error\n");
+ issue.AddSubIssue(MakeIntrusive<TIssue>("suberror"));
+ TIssues issues;
+ issues.AddIssue(issue);
+ issues.AddIssue(TPosition(100, 2, "abc.file"), "my\nmessage");
+ UNIT_ASSERT_STRINGS_EQUAL(issues.ToOneLineString(), "[ { file.abc:34:12: Error: error subissue: { <main>: Error: suberror } } { abc.file:2:100: Error: my message } ]");
}
+} // Y_UNIT_TEST_SUITE(ToOneLineStringTest)
Y_UNIT_TEST_SUITE(EscapeNonUtf8) {
- Y_UNIT_TEST(Escape) {
- const TString nonUtf8String = "\xfe\xfa\xf5\xc2";
- UNIT_ASSERT(!IsUtf(nonUtf8String));
-
- // Check that our escaping correctly processes unicode pairs
- const TString toNormalize = "Ёлка";
- const TString nfd = WideToUTF8(Normalize<NUnicode::ENormalization::NFD>(UTF8ToWide(toNormalize))); // dots over 'ё' will be separate unicode symbol
- const TString nfc = WideToUTF8(Normalize<NUnicode::ENormalization::NFC>(UTF8ToWide(toNormalize))); // dots over 'ё' will be with with their letter
- UNIT_ASSERT_STRINGS_UNEQUAL(nfc, nfd);
- std::pair<TString, TString> nonUtf8Messages[] = {
- { nonUtf8String, "????" },
- { TStringBuilder() << nonUtf8String << "Failed to parse file " << nonUtf8String << "עברית" << nonUtf8String, "????Failed to parse file ????עברית????" },
- { nfd, nfd },
- { nfc, nfc },
- { TStringBuilder() << nfc << nonUtf8String << nfd, TStringBuilder() << nfc << "????" << nfd },
- { TStringBuilder() << nfd << nonUtf8String << nfc, TStringBuilder() << nfd << "????" << nfc },
- };
-
- for (const auto& [src, dst] : nonUtf8Messages) {
- TIssue issue(src);
- UNIT_ASSERT_STRINGS_EQUAL(issue.GetMessage(), dst);
- }
+Y_UNIT_TEST(Escape) {
+ const TString nonUtf8String = "\xfe\xfa\xf5\xc2";
+ UNIT_ASSERT(!IsUtf(nonUtf8String));
+
+ // Check that our escaping correctly processes unicode pairs
+ const TString toNormalize = "Ёлка";
+ const TString nfd = WideToUTF8(Normalize<NUnicode::ENormalization::NFD>(UTF8ToWide(toNormalize))); // dots over 'ё' will be separate unicode symbol
+ const TString nfc = WideToUTF8(Normalize<NUnicode::ENormalization::NFC>(UTF8ToWide(toNormalize))); // dots over 'ё' will be with with their letter
+ UNIT_ASSERT_STRINGS_UNEQUAL(nfc, nfd);
+ std::pair<TString, TString> nonUtf8Messages[] = {
+ {nonUtf8String, "????"},
+ {TStringBuilder() << nonUtf8String << "Failed to parse file " << nonUtf8String << "עברית" << nonUtf8String, "????Failed to parse file ????עברית????"},
+ {nfd, nfd},
+ {nfc, nfc},
+ {TStringBuilder() << nfc << nonUtf8String << nfd, TStringBuilder() << nfc << "????" << nfd},
+ {TStringBuilder() << nfd << nonUtf8String << nfc, TStringBuilder() << nfd << "????" << nfc},
+ };
+
+ for (const auto& [src, dst] : nonUtf8Messages) {
+ TIssue issue(src);
+ UNIT_ASSERT_STRINGS_EQUAL(issue.GetMessage(), dst);
}
}
+} // Y_UNIT_TEST_SUITE(EscapeNonUtf8)
diff --git a/yql/essentials/public/issue/yql_issue_utils.cpp b/yql/essentials/public/issue/yql_issue_utils.cpp
index 2be0b8e57bb..8f441122f72 100644
--- a/yql/essentials/public/issue/yql_issue_utils.cpp
+++ b/yql/essentials/public/issue/yql_issue_utils.cpp
@@ -43,7 +43,7 @@ TIssue TruncateIssueLevels(const TIssue& topIssue, TTruncateIssueOpts opts) {
}
if (depthBeforeLeaf && !leafs.empty()) {
- for (size_t pos: leafs) {
+ for (size_t pos : leafs) {
ui32 depth = depthBeforeLeaf;
auto parent = std::get<3>(issues.at(pos));
while (depth && parent) {
@@ -64,7 +64,7 @@ TIssue TruncateIssueLevels(const TIssue& topIssue, TTruncateIssueOpts opts) {
leafs.clear();
TIssue result;
- for (auto& i: issues) {
+ for (auto& i : issues) {
const auto srcIssue = std::get<0>(i);
auto& targetIssue = std::get<1>(i);
const auto level = std::get<2>(i);
@@ -102,4 +102,4 @@ TIssue TruncateIssueLevels(const TIssue& topIssue, TTruncateIssueOpts opts) {
return result;
}
-} // namspace NYql
+} // namespace NYql
diff --git a/yql/essentials/public/issue/yql_issue_utils.h b/yql/essentials/public/issue/yql_issue_utils.h
index 023ea0edbfb..c820d7c5383 100644
--- a/yql/essentials/public/issue/yql_issue_utils.h
+++ b/yql/essentials/public/issue/yql_issue_utils.h
@@ -8,16 +8,15 @@
namespace NYql {
struct TTruncateIssueOpts {
-
-#define YQL_TRUNC_DECL_FIELD(type, name, def) \
+#define YQL_TRUNC_DECL_FIELD(type, name, def) \
TTruncateIssueOpts& Set##name(type arg##name)& { \
- name = arg##name; \
- return *this; \
- } \
+ name = arg##name; \
+ return *this; \
+ } \
TTruncateIssueOpts&& Set##name(type arg##name)&& { \
- name = arg##name; \
- return std::move(*this); \
- } \
+ name = arg##name; \
+ return std::move(*this); \
+ } \
type name = def;
YQL_TRUNC_DECL_FIELD(ui32, MaxLevels, Max<ui32>())
diff --git a/yql/essentials/public/issue/yql_issue_utils_ut.cpp b/yql/essentials/public/issue/yql_issue_utils_ut.cpp
index 657643a6134..685d652ef7e 100644
--- a/yql/essentials/public/issue/yql_issue_utils_ut.cpp
+++ b/yql/essentials/public/issue/yql_issue_utils_ut.cpp
@@ -9,42 +9,42 @@
using namespace NYql;
Y_UNIT_TEST_SUITE(TIssueUtilsTest) {
- Y_UNIT_TEST(TruncLevels1) {
- auto level0 = MakeIntrusive<TIssue>("level0");
- auto level1 = MakeIntrusive<TIssue>("level1");
- auto level2 = MakeIntrusive<TIssue>("level2");
- auto level30 = MakeIntrusive<TIssue>("level30");
- auto level31 = MakeIntrusive<TIssue>("level31");
- auto level40 = MakeIntrusive<TIssue>("level40");
- auto level41 = MakeIntrusive<TIssue>("level41");
- auto level51 = MakeIntrusive<TIssue>("level51");
-
- /*
- * * 0
- * |
- * * 1
- * |
- * * 2 --
- * | |
- * * 30 * 31
- * | |
- * * 40 * 41
- * |
- * * 51
- */
-
- level0->AddSubIssue(level1);
- level1->AddSubIssue(level2);
- level2->AddSubIssue(level30);
- level2->AddSubIssue(level31);
- level30->AddSubIssue(level40);
- level31->AddSubIssue(level41);
- level41->AddSubIssue(level51);
-
- {
- const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(2))}).ToString();
- const auto expected =
-R"___(<main>: Error: level0
+Y_UNIT_TEST(TruncLevels1) {
+ auto level0 = MakeIntrusive<TIssue>("level0");
+ auto level1 = MakeIntrusive<TIssue>("level1");
+ auto level2 = MakeIntrusive<TIssue>("level2");
+ auto level30 = MakeIntrusive<TIssue>("level30");
+ auto level31 = MakeIntrusive<TIssue>("level31");
+ auto level40 = MakeIntrusive<TIssue>("level40");
+ auto level41 = MakeIntrusive<TIssue>("level41");
+ auto level51 = MakeIntrusive<TIssue>("level51");
+
+ /*
+ * * 0
+ * |
+ * * 1
+ * |
+ * * 2 --
+ * | |
+ * * 30 * 31
+ * | |
+ * * 40 * 41
+ * |
+ * * 51
+ */
+
+ level0->AddSubIssue(level1);
+ level1->AddSubIssue(level2);
+ level2->AddSubIssue(level30);
+ level2->AddSubIssue(level31);
+ level30->AddSubIssue(level40);
+ level31->AddSubIssue(level41);
+ level41->AddSubIssue(level51);
+
+ {
+ const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(2))}).ToString();
+ const auto expected =
+ R"___(<main>: Error: level0
<main>: Error: level1
<main>: Error: (skipped levels)
<main>: Error: level30
@@ -52,109 +52,109 @@ R"___(<main>: Error: level0
<main>: Error: level41
<main>: Error: level51
)___";
- UNIT_ASSERT_STRINGS_EQUAL(res, expected);
- }
+ UNIT_ASSERT_STRINGS_EQUAL(res, expected);
+ }
- {
- const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(3).SetKeepTailLevels(1))}).ToString();
- const auto expected =
-R"___(<main>: Error: level0
+ {
+ const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(3).SetKeepTailLevels(1))}).ToString();
+ const auto expected =
+ R"___(<main>: Error: level0
<main>: Error: level1
<main>: Error: (skipped levels)
<main>: Error: level40
<main>: Error: level51
)___";
- UNIT_ASSERT_STRINGS_EQUAL(res, expected);
- }
+ UNIT_ASSERT_STRINGS_EQUAL(res, expected);
}
+}
- Y_UNIT_TEST(TruncLevels2) {
- auto level0 = MakeIntrusive<TIssue>("level0");
- auto level1 = MakeIntrusive<TIssue>("level1");
- auto level2 = MakeIntrusive<TIssue>("level2");
- auto level3 = MakeIntrusive<TIssue>("level3");
- auto level40 = MakeIntrusive<TIssue>("level40");
- auto level41 = MakeIntrusive<TIssue>("level41");
-
- /*
- * * 0
- * |
- * * 1
- * |
- * * 2
- * |
- * * 3 --
- * | |
- * * 40 * 41
- */
-
- level0->AddSubIssue(level1);
- level1->AddSubIssue(level2);
- level2->AddSubIssue(level3);
- level3->AddSubIssue(level40);
- level3->AddSubIssue(level41);
-
- {
- const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(2))}).ToString();
- const auto expected =
-R"___(<main>: Error: level0
+Y_UNIT_TEST(TruncLevels2) {
+ auto level0 = MakeIntrusive<TIssue>("level0");
+ auto level1 = MakeIntrusive<TIssue>("level1");
+ auto level2 = MakeIntrusive<TIssue>("level2");
+ auto level3 = MakeIntrusive<TIssue>("level3");
+ auto level40 = MakeIntrusive<TIssue>("level40");
+ auto level41 = MakeIntrusive<TIssue>("level41");
+
+ /*
+ * * 0
+ * |
+ * * 1
+ * |
+ * * 2
+ * |
+ * * 3 --
+ * | |
+ * * 40 * 41
+ */
+
+ level0->AddSubIssue(level1);
+ level1->AddSubIssue(level2);
+ level2->AddSubIssue(level3);
+ level3->AddSubIssue(level40);
+ level3->AddSubIssue(level41);
+
+ {
+ const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(2))}).ToString();
+ const auto expected =
+ R"___(<main>: Error: level0
<main>: Error: level1
<main>: Error: (skipped levels)
<main>: Error: level3
<main>: Error: level40
<main>: Error: level41
)___";
- UNIT_ASSERT_STRINGS_EQUAL(res, expected);
- }
+ UNIT_ASSERT_STRINGS_EQUAL(res, expected);
}
+}
- Y_UNIT_TEST(TruncLevels3) {
- auto level0 = MakeIntrusive<TIssue>("level0");
- auto level1 = MakeIntrusive<TIssue>("level1");
- auto level2 = MakeIntrusive<TIssue>("level2");
- auto level3 = MakeIntrusive<TIssue>("level3");
- auto level40 = MakeIntrusive<TIssue>("level40");
- auto level41 = MakeIntrusive<TIssue>("level41");
- auto level50 = MakeIntrusive<TIssue>("level50");
-
- /*
- * * 0
- * |
- * * 1
- * |
- * * 2
- * |
- * * 3 --
- * | |
- * * 40 |
- * | |
- * * 50 * 41
- */
-
- level0->AddSubIssue(level1);
- level1->AddSubIssue(level2);
- level2->AddSubIssue(level3);
- level3->AddSubIssue(level40);
- level3->AddSubIssue(level41);
- level40->AddSubIssue(level50);
-
- {
- const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(1))}).ToString();
- const auto expected =
-R"___(<main>: Error: level0
+Y_UNIT_TEST(TruncLevels3) {
+ auto level0 = MakeIntrusive<TIssue>("level0");
+ auto level1 = MakeIntrusive<TIssue>("level1");
+ auto level2 = MakeIntrusive<TIssue>("level2");
+ auto level3 = MakeIntrusive<TIssue>("level3");
+ auto level40 = MakeIntrusive<TIssue>("level40");
+ auto level41 = MakeIntrusive<TIssue>("level41");
+ auto level50 = MakeIntrusive<TIssue>("level50");
+
+ /*
+ * * 0
+ * |
+ * * 1
+ * |
+ * * 2
+ * |
+ * * 3 --
+ * | |
+ * * 40 |
+ * | |
+ * * 50 * 41
+ */
+
+ level0->AddSubIssue(level1);
+ level1->AddSubIssue(level2);
+ level2->AddSubIssue(level3);
+ level3->AddSubIssue(level40);
+ level3->AddSubIssue(level41);
+ level40->AddSubIssue(level50);
+
+ {
+ const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(1))}).ToString();
+ const auto expected =
+ R"___(<main>: Error: level0
<main>: Error: level1
<main>: Error: level2
<main>: Error: (skipped levels)
<main>: Error: level41
<main>: Error: level50
)___";
- UNIT_ASSERT_STRINGS_EQUAL(res, expected);
- }
+ UNIT_ASSERT_STRINGS_EQUAL(res, expected);
+ }
- {
- const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(2))}).ToString();
- const auto expected =
-R"___(<main>: Error: level0
+ {
+ const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(2))}).ToString();
+ const auto expected =
+ R"___(<main>: Error: level0
<main>: Error: level1
<main>: Error: (skipped levels)
<main>: Error: level3
@@ -162,13 +162,13 @@ R"___(<main>: Error: level0
<main>: Error: level40
<main>: Error: level50
)___";
- UNIT_ASSERT_STRINGS_EQUAL(res, expected);
- }
+ UNIT_ASSERT_STRINGS_EQUAL(res, expected);
+ }
- {
- const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(3))}).ToString();
- const auto expected =
-R"___(<main>: Error: level0
+ {
+ const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(4).SetKeepTailLevels(3))}).ToString();
+ const auto expected =
+ R"___(<main>: Error: level0
<main>: Error: (skipped levels)
<main>: Error: level2
<main>: Error: level3
@@ -176,25 +176,24 @@ R"___(<main>: Error: level0
<main>: Error: level50
<main>: Error: level41
)___";
- UNIT_ASSERT_STRINGS_EQUAL(res, expected);
- }
+ UNIT_ASSERT_STRINGS_EQUAL(res, expected);
}
+}
- Y_UNIT_TEST(KeepSeverity) {
- const auto templ =
-R"___(<main>: {severity}: level0, code: 1
+Y_UNIT_TEST(KeepSeverity) {
+ const auto templ =
+ R"___(<main>: {severity}: level0, code: 1
<main>: {severity}: level1, code: 1
)___";
- for (auto severity: {ESeverity::TSeverityIds_ESeverityId_S_INFO, ESeverity::TSeverityIds_ESeverityId_S_WARNING, ESeverity::TSeverityIds_ESeverityId_S_ERROR, ESeverity::TSeverityIds_ESeverityId_S_FATAL}) {
-
- auto level0 = MakeIntrusive<TIssue>(TIssue("level0").SetCode(1, severity));
- auto level1 = MakeIntrusive<TIssue>(TIssue("level1").SetCode(1, severity));
+ for (auto severity : {ESeverity::TSeverityIds_ESeverityId_S_INFO, ESeverity::TSeverityIds_ESeverityId_S_WARNING, ESeverity::TSeverityIds_ESeverityId_S_ERROR, ESeverity::TSeverityIds_ESeverityId_S_FATAL}) {
+ auto level0 = MakeIntrusive<TIssue>(TIssue("level0").SetCode(1, severity));
+ auto level1 = MakeIntrusive<TIssue>(TIssue("level1").SetCode(1, severity));
- level0->AddSubIssue(level1);
+ level0->AddSubIssue(level1);
- const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(15).SetKeepTailLevels(3))}).ToString();
- const auto expected = SubstGlobalCopy<TString, TString>(templ, "{severity}", SeverityToString(severity));
- UNIT_ASSERT_STRINGS_EQUAL(res, expected);
- }
+ const auto res = TIssues({TruncateIssueLevels(*level0, TTruncateIssueOpts().SetMaxLevels(15).SetKeepTailLevels(3))}).ToString();
+ const auto expected = SubstGlobalCopy<TString, TString>(templ, "{severity}", SeverityToString(severity));
+ UNIT_ASSERT_STRINGS_EQUAL(res, expected);
}
}
+} // Y_UNIT_TEST_SUITE(TIssueUtilsTest)
diff --git a/yql/essentials/public/issue/yql_warning.cpp b/yql/essentials/public/issue/yql_warning.cpp
index 80d4686d1e5..82e350b4939 100644
--- a/yql/essentials/public/issue/yql_warning.cpp
+++ b/yql/essentials/public/issue/yql_warning.cpp
@@ -3,7 +3,6 @@
#include <util/string/cast.h>
#include <util/string/join.h>
-
namespace NYql {
TWarningRule::EParseResult TWarningRule::ParseFrom(const TString& codePattern, const TString& action,
@@ -33,7 +32,8 @@ TWarningRule::EParseResult TWarningRule::ParseFrom(const TString& codePattern, c
TWarningPolicy::TWarningPolicy(bool isReplay)
: IsReplay_(isReplay)
-{}
+{
+}
void TWarningPolicy::AddRule(const TWarningRule& rule)
{
@@ -65,8 +65,7 @@ void TWarningPolicy::AddRule(const TWarningRule& rule)
}
}
-EWarningAction TWarningPolicy::GetAction(TIssueCode code) const
-{
+EWarningAction TWarningPolicy::GetAction(TIssueCode code) const {
auto it = Overrides_.find(code);
return (it == Overrides_.end()) ? BaseAction_ : it->second;
}
@@ -78,4 +77,4 @@ void TWarningPolicy::Clear()
Rules_.clear();
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/issue/yql_warning.h b/yql/essentials/public/issue/yql_warning.h
index e21972d1d17..16cf21dc82c 100644
--- a/yql/essentials/public/issue/yql_warning.h
+++ b/yql/essentials/public/issue/yql_warning.h
@@ -6,7 +6,7 @@
#include <util/generic/string.h>
#if defined(_win_)
-#undef ERROR
+ #undef ERROR
#endif
namespace NYql {
@@ -19,12 +19,19 @@ enum class EWarningAction {
class TWarningRule {
public:
- const TString& GetPattern() const { return IssueCodePattern_; }
- EWarningAction GetAction() const { return Action_; }
-
- enum class EParseResult { PARSE_OK, PARSE_PATTERN_FAIL, PARSE_ACTION_FAIL };
+ const TString& GetPattern() const {
+ return IssueCodePattern_;
+ }
+ EWarningAction GetAction() const {
+ return Action_;
+ }
+
+ enum class EParseResult { PARSE_OK,
+ PARSE_PATTERN_FAIL,
+ PARSE_ACTION_FAIL };
static EParseResult ParseFrom(const TString& codePattern, const TString& action,
TWarningRule& result, TString& errorMessage);
+
private:
TString IssueCodePattern_;
EWarningAction Action_ = EWarningAction::DEFAULT;
@@ -40,15 +47,17 @@ public:
EWarningAction GetAction(TIssueCode code) const;
- const TWarningRules& GetRules() const { return Rules_; }
+ const TWarningRules& GetRules() const {
+ return Rules_;
+ }
void Clear();
private:
- const bool IsReplay_;
+ const bool IsReplay_;
TWarningRules Rules_;
EWarningAction BaseAction_ = EWarningAction::DEFAULT;
THashMap<TIssueCode, EWarningAction> Overrides_;
};
-}
+} // namespace NYql
diff --git a/yql/essentials/public/issue/yql_warning_ut.cpp b/yql/essentials/public/issue/yql_warning_ut.cpp
index 5edf7ed3631..c224e9e4a22 100644
--- a/yql/essentials/public/issue/yql_warning_ut.cpp
+++ b/yql/essentials/public/issue/yql_warning_ut.cpp
@@ -6,31 +6,30 @@ using namespace NYql;
Y_UNIT_TEST_SUITE(TWarningRuleTest) {
- Y_UNIT_TEST(AllValidActionsAndPatternsAreParsed) {
- TWarningRule rule;
- TString errorMessage;
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("1234", "disable", rule, errorMessage), TWarningRule::EParseResult::PARSE_OK);
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("*", "error", rule, errorMessage), TWarningRule::EParseResult::PARSE_OK);
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("0", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_OK);
- }
-
- Y_UNIT_TEST(InvalidActionIsDetected) {
- TWarningRule rule;
- TString errorMessage;
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("1234", "wrong", rule, errorMessage), TWarningRule::EParseResult::PARSE_ACTION_FAIL);
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("1234", "", rule, errorMessage), TWarningRule::EParseResult::PARSE_ACTION_FAIL);
- }
-
- Y_UNIT_TEST(InvalidPatternIsDetected) {
- TWarningRule rule;
- TString errorMessage;
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_PATTERN_FAIL);
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("-1", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_PATTERN_FAIL);
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("*1", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_PATTERN_FAIL);
- UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("default", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_PATTERN_FAIL);
- }
+Y_UNIT_TEST(AllValidActionsAndPatternsAreParsed) {
+ TWarningRule rule;
+ TString errorMessage;
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("1234", "disable", rule, errorMessage), TWarningRule::EParseResult::PARSE_OK);
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("*", "error", rule, errorMessage), TWarningRule::EParseResult::PARSE_OK);
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("0", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_OK);
}
+Y_UNIT_TEST(InvalidActionIsDetected) {
+ TWarningRule rule;
+ TString errorMessage;
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("1234", "wrong", rule, errorMessage), TWarningRule::EParseResult::PARSE_ACTION_FAIL);
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("1234", "", rule, errorMessage), TWarningRule::EParseResult::PARSE_ACTION_FAIL);
+}
+
+Y_UNIT_TEST(InvalidPatternIsDetected) {
+ TWarningRule rule;
+ TString errorMessage;
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_PATTERN_FAIL);
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("-1", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_PATTERN_FAIL);
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("*1", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_PATTERN_FAIL);
+ UNIT_ASSERT_VALUES_EQUAL(TWarningRule::ParseFrom("default", "default", rule, errorMessage), TWarningRule::EParseResult::PARSE_PATTERN_FAIL);
+}
+} // Y_UNIT_TEST_SUITE(TWarningRuleTest)
void AddRule(TWarningPolicy& policy, const TString& codePattern, const TString& action)
{
@@ -40,55 +39,52 @@ void AddRule(TWarningPolicy& policy, const TString& codePattern, const TString&
policy.AddRule(rule);
}
-
Y_UNIT_TEST_SUITE(TWarningPolicyTest) {
- Y_UNIT_TEST(BasicIntegerRules) {
- TWarningPolicy policy;
- AddRule(policy, "123", "error");
- AddRule(policy, "456", "error");
- AddRule(policy, "456", "disable");
-
- UNIT_ASSERT_VALUES_EQUAL(policy.GetRules().size(), 3);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(123), EWarningAction::ERROR);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DISABLE);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(111), EWarningAction::DEFAULT);
- }
+Y_UNIT_TEST(BasicIntegerRules) {
+ TWarningPolicy policy;
+ AddRule(policy, "123", "error");
+ AddRule(policy, "456", "error");
+ AddRule(policy, "456", "disable");
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetRules().size(), 3);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(123), EWarningAction::ERROR);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DISABLE);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(111), EWarningAction::DEFAULT);
+}
- Y_UNIT_TEST(AsteriskRules) {
- TWarningPolicy policy;
- AddRule(policy, "*", "error");
- AddRule(policy, "456", "disable");
-
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(999), EWarningAction::ERROR);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DISABLE);
+Y_UNIT_TEST(AsteriskRules) {
+ TWarningPolicy policy;
+ AddRule(policy, "*", "error");
+ AddRule(policy, "456", "disable");
- AddRule(policy, "*", "default");
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(999), EWarningAction::ERROR);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DISABLE);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetRules().size(), 3);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(999), EWarningAction::DEFAULT);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DEFAULT);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(123), EWarningAction::DEFAULT);
+ AddRule(policy, "*", "default");
- }
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetRules().size(), 3);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(999), EWarningAction::DEFAULT);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DEFAULT);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(123), EWarningAction::DEFAULT);
+}
- Y_UNIT_TEST(ReactionOnPull) {
- TWarningPolicy policy;
- AddRule(policy, "*", "error");
- AddRule(policy, "456", "default");
- AddRule(policy, "999", "disable");
+Y_UNIT_TEST(ReactionOnPull) {
+ TWarningPolicy policy;
+ AddRule(policy, "*", "error");
+ AddRule(policy, "456", "default");
+ AddRule(policy, "999", "disable");
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(999), EWarningAction::DISABLE);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DEFAULT);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(123), EWarningAction::ERROR);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(999), EWarningAction::DISABLE);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DEFAULT);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(123), EWarningAction::ERROR);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetRules().size(), 3);
- policy.Clear();
- UNIT_ASSERT_VALUES_EQUAL(policy.GetRules().size(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetRules().size(), 3);
+ policy.Clear();
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetRules().size(), 0);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(999), EWarningAction::DEFAULT);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DEFAULT);
- UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(123), EWarningAction::DEFAULT);
- }
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(999), EWarningAction::DEFAULT);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(456), EWarningAction::DEFAULT);
+ UNIT_ASSERT_VALUES_EQUAL(policy.GetAction(123), EWarningAction::DEFAULT);
}
+} // Y_UNIT_TEST_SUITE(TWarningPolicyTest)
diff --git a/yql/essentials/public/langver/ut/ya.make b/yql/essentials/public/langver/ut/ya.make
index ab179a9c34a..092ac834a94 100644
--- a/yql/essentials/public/langver/ut/ya.make
+++ b/yql/essentials/public/langver/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST_FOR(yql/essentials/public/langver)
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
yql_langver_ut.cpp
)
diff --git a/yql/essentials/public/langver/ut/yql_langver_ut.cpp b/yql/essentials/public/langver/ut/yql_langver_ut.cpp
index 67f7586e643..82151bca563 100644
--- a/yql/essentials/public/langver/ut/yql_langver_ut.cpp
+++ b/yql/essentials/public/langver/ut/yql_langver_ut.cpp
@@ -5,126 +5,126 @@
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(FormatString) {
- UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(99999, 1)));
- UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(999, 1)));
- UNIT_ASSERT_VALUES_EQUAL(FormatLangVersion(MakeLangVersion(2025, 1)), "2025.01");
- UNIT_ASSERT_VALUES_EQUAL(FormatLangVersion(MakeLangVersion(2025, 12)), "2025.12");
- }
-
- 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(IsAvailableLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2025,2)));
- UNIT_ASSERT(!IsAvailableLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2025,2)));
- }
-
- Y_UNIT_TEST(MaxReleasedLangVersionIsValid) {
- UNIT_ASSERT(IsValidLangVersion(GetMaxReleasedLangVersion()));
- }
-
- Y_UNIT_TEST(MaxLangVersionIsValid) {
- UNIT_ASSERT(IsValidLangVersion(GetMaxLangVersion()));
- }
-
- Y_UNIT_TEST(MaxVersionIsAboveThanReleased) {
- UNIT_ASSERT(GetMaxLangVersion() > GetMaxReleasedLangVersion());
- }
-
- Y_UNIT_TEST(BackwardCompatibleFeatureAvailable_All) {
- UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, MinLangVersion,
- EBackportCompatibleFeaturesMode::All));
- UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxReleasedLangVersion(),
- EBackportCompatibleFeaturesMode::All));
- UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxLangVersion(),
- EBackportCompatibleFeaturesMode::All));
- }
-
- Y_UNIT_TEST(BackwardCompatibleFeatureAvailable_Released) {
- UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, MinLangVersion,
- EBackportCompatibleFeaturesMode::Released));
- UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxReleasedLangVersion(),
- EBackportCompatibleFeaturesMode::Released));
- UNIT_ASSERT(!IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxLangVersion(),
- EBackportCompatibleFeaturesMode::Released));
- }
-
- Y_UNIT_TEST(BackwardCompatibleFeatureAvailable_None) {
- UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, MinLangVersion,
- EBackportCompatibleFeaturesMode::None));
- UNIT_ASSERT(!IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxReleasedLangVersion(),
- EBackportCompatibleFeaturesMode::None));
- UNIT_ASSERT(!IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxLangVersion(),
- EBackportCompatibleFeaturesMode::None));
- }
-
- Y_UNIT_TEST(EnumerateAllValid) {
- const auto max = GetMaxLangVersion();
- const auto maxReleased = GetMaxReleasedLangVersion();
- bool hasMin = false;
- bool hasMax = false;
- bool hasMaxReleased = false;
- EnumerateLangVersions([&](TLangVersion ver) {
- UNIT_ASSERT(IsValidLangVersion(ver));
- UNIT_ASSERT(ver >= MinLangVersion);
- UNIT_ASSERT(ver <= max);
- if (ver == MinLangVersion) {
- hasMin = true;
- }
-
- if (ver == max) {
- hasMax = true;
- }
-
- if (ver == maxReleased) {
- hasMaxReleased = true;
- }
- });
-
- UNIT_ASSERT(hasMin);
- UNIT_ASSERT(hasMax);
- UNIT_ASSERT(hasMaxReleased);
- }
+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(FormatString) {
+ UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(99999, 1)));
+ UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(999, 1)));
+ UNIT_ASSERT_VALUES_EQUAL(FormatLangVersion(MakeLangVersion(2025, 1)), "2025.01");
+ UNIT_ASSERT_VALUES_EQUAL(FormatLangVersion(MakeLangVersion(2025, 12)), "2025.12");
+}
+
+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(IsAvailableLangVersion(MakeLangVersion(2025, 2), MakeLangVersion(2025, 2)));
+ UNIT_ASSERT(!IsAvailableLangVersion(MakeLangVersion(2025, 3), MakeLangVersion(2025, 2)));
+}
+
+Y_UNIT_TEST(MaxReleasedLangVersionIsValid) {
+ UNIT_ASSERT(IsValidLangVersion(GetMaxReleasedLangVersion()));
+}
+
+Y_UNIT_TEST(MaxLangVersionIsValid) {
+ UNIT_ASSERT(IsValidLangVersion(GetMaxLangVersion()));
+}
+
+Y_UNIT_TEST(MaxVersionIsAboveThanReleased) {
+ UNIT_ASSERT(GetMaxLangVersion() > GetMaxReleasedLangVersion());
+}
+
+Y_UNIT_TEST(BackwardCompatibleFeatureAvailable_All) {
+ UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, MinLangVersion,
+ EBackportCompatibleFeaturesMode::All));
+ UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxReleasedLangVersion(),
+ EBackportCompatibleFeaturesMode::All));
+ UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxLangVersion(),
+ EBackportCompatibleFeaturesMode::All));
+}
+
+Y_UNIT_TEST(BackwardCompatibleFeatureAvailable_Released) {
+ UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, MinLangVersion,
+ EBackportCompatibleFeaturesMode::Released));
+ UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxReleasedLangVersion(),
+ EBackportCompatibleFeaturesMode::Released));
+ UNIT_ASSERT(!IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxLangVersion(),
+ EBackportCompatibleFeaturesMode::Released));
+}
+
+Y_UNIT_TEST(BackwardCompatibleFeatureAvailable_None) {
+ UNIT_ASSERT(IsBackwardCompatibleFeatureAvailable(MinLangVersion, MinLangVersion,
+ EBackportCompatibleFeaturesMode::None));
+ UNIT_ASSERT(!IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxReleasedLangVersion(),
+ EBackportCompatibleFeaturesMode::None));
+ UNIT_ASSERT(!IsBackwardCompatibleFeatureAvailable(MinLangVersion, GetMaxLangVersion(),
+ EBackportCompatibleFeaturesMode::None));
+}
+
+Y_UNIT_TEST(EnumerateAllValid) {
+ const auto max = GetMaxLangVersion();
+ const auto maxReleased = GetMaxReleasedLangVersion();
+ bool hasMin = false;
+ bool hasMax = false;
+ bool hasMaxReleased = false;
+ EnumerateLangVersions([&](TLangVersion ver) {
+ UNIT_ASSERT(IsValidLangVersion(ver));
+ UNIT_ASSERT(ver >= MinLangVersion);
+ UNIT_ASSERT(ver <= max);
+ if (ver == MinLangVersion) {
+ hasMin = true;
+ }
+
+ if (ver == max) {
+ hasMax = true;
+ }
+
+ if (ver == maxReleased) {
+ hasMaxReleased = true;
+ }
+ });
+
+ UNIT_ASSERT(hasMin);
+ UNIT_ASSERT(hasMax);
+ UNIT_ASSERT(hasMaxReleased);
+}
+} // Y_UNIT_TEST_SUITE(TLangVerTests)
+
+} // namespace NYql
diff --git a/yql/essentials/public/langver/ya.make b/yql/essentials/public/langver/ya.make
index b00ca55b9c0..77a7b1116c1 100644
--- a/yql/essentials/public/langver/ya.make
+++ b/yql/essentials/public/langver/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
yql_langver.cpp
)
diff --git a/yql/essentials/public/langver/yql_langver.cpp b/yql/essentials/public/langver/yql_langver.cpp
index 5f91735eaa9..6360ecf3c37 100644
--- a/yql/essentials/public/langver/yql_langver.cpp
+++ b/yql/essentials/public/langver/yql_langver.cpp
@@ -11,11 +11,11 @@ namespace {
constexpr TLangVersion MaxReleasedLangVersion = MakeLangVersion(2025, 3);
-const std::pair<ui32,ui32> Versions[] = {
+const std::pair<ui32, ui32> Versions[] = {
#include "yql_langver_list.inc"
};
-}
+} // namespace
bool IsValidLangVersion(TLangVersion ver) {
for (size_t i = 0; i < Y_ARRAY_SIZE(Versions); ++i) {
@@ -94,14 +94,14 @@ TLangVersion GetMaxLangVersion() {
}
bool IsBackwardCompatibleFeatureAvailable(TLangVersion currentVer, TLangVersion featureVer,
- EBackportCompatibleFeaturesMode mode) {
+ EBackportCompatibleFeaturesMode mode) {
switch (mode) {
- case EBackportCompatibleFeaturesMode::All:
- return true;
- case EBackportCompatibleFeaturesMode::Released:
- return IsAvailableLangVersion(featureVer, GetMaxReleasedLangVersion());
- case EBackportCompatibleFeaturesMode::None:
- return IsAvailableLangVersion(featureVer, currentVer);
+ case EBackportCompatibleFeaturesMode::All:
+ return true;
+ case EBackportCompatibleFeaturesMode::Released:
+ return IsAvailableLangVersion(featureVer, GetMaxReleasedLangVersion());
+ case EBackportCompatibleFeaturesMode::None:
+ return IsAvailableLangVersion(featureVer, currentVer);
}
}
@@ -111,4 +111,4 @@ void EnumerateLangVersions(const std::function<void(TLangVersion)>& callback) {
}
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/langver/yql_langver.h b/yql/essentials/public/langver/yql_langver.h
index c646ce9ac08..2799746e18f 100644
--- a/yql/essentials/public/langver/yql_langver.h
+++ b/yql/essentials/public/langver/yql_langver.h
@@ -70,6 +70,6 @@ enum class EBackportCompatibleFeaturesMode {
};
bool IsBackwardCompatibleFeatureAvailable(TLangVersion currentVer, TLangVersion featureVer,
- EBackportCompatibleFeaturesMode mode);
+ EBackportCompatibleFeaturesMode mode);
-}
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/compile_mkql.cpp b/yql/essentials/public/purecalc/common/compile_mkql.cpp
index 7bb95e20754..2a7500927f9 100644
--- a/yql/essentials/public/purecalc/common/compile_mkql.cpp
+++ b/yql/essentials/public/purecalc/common/compile_mkql.cpp
@@ -90,10 +90,10 @@ NCommon::IMkqlCallableCompiler::TCompiler MakeFolderPathCallableCompiler(const T
};
}
-}
+} // namespace
NKikimr::NMiniKQL::TRuntimeNode CompileMkql(const TExprNode::TPtr& exprRoot, TExprContext& exprCtx,
- const NKikimr::NMiniKQL::IFunctionRegistry& funcRegistry, const NKikimr::NMiniKQL::TTypeEnvironment& env, const TUserDataTable& userData, NCommon::TMemoizedTypesMap* typeMemoization)
+ const NKikimr::NMiniKQL::IFunctionRegistry& funcRegistry, const NKikimr::NMiniKQL::TTypeEnvironment& env, const TUserDataTable& userData, NCommon::TMemoizedTypesMap* typeMemoization)
{
NCommon::TMkqlCommonCallableCompiler compiler;
@@ -106,11 +106,11 @@ NKikimr::NMiniKQL::TRuntimeNode CompileMkql(const TExprNode::TPtr& exprRoot, TEx
// Prepare build context
NKikimr::NMiniKQL::TProgramBuilder pgmBuilder(env, funcRegistry);
- NCommon::TMkqlBuildContext buildCtx(compiler, pgmBuilder, exprCtx, /*lambdaId*/0, /*args*/{}, typeMemoization);
+ NCommon::TMkqlBuildContext buildCtx(compiler, pgmBuilder, exprCtx, /*lambdaId*/ 0, /*args*/ {}, typeMemoization);
// Build the root MKQL node
return NCommon::MkqlBuildExpr(*exprRoot, buildCtx);
}
-} // NYql::NPureCalc
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/compile_mkql.h b/yql/essentials/public/purecalc/common/compile_mkql.h
index caba3baa2b9..09991e3d590 100644
--- a/yql/essentials/public/purecalc/common/compile_mkql.h
+++ b/yql/essentials/public/purecalc/common/compile_mkql.h
@@ -6,15 +6,14 @@
#include <yql/essentials/ast/yql_expr.h>
#include <yql/essentials/core/yql_user_data.h>
-
namespace NYql::NPureCalc {
- /**
- * Compile expr to mkql byte-code
- */
+/**
+ * Compile expr to mkql byte-code
+ */
- NKikimr::NMiniKQL::TRuntimeNode CompileMkql(const TExprNode::TPtr& exprRoot, TExprContext& exprCtx,
- const NKikimr::NMiniKQL::IFunctionRegistry& funcRegistry, const NKikimr::NMiniKQL::TTypeEnvironment& env, const TUserDataTable& userData,
- NCommon::TMemoizedTypesMap* typeMemoization = nullptr);
+NKikimr::NMiniKQL::TRuntimeNode CompileMkql(const TExprNode::TPtr& exprRoot, TExprContext& exprCtx,
+ const NKikimr::NMiniKQL::IFunctionRegistry& funcRegistry, const NKikimr::NMiniKQL::TTypeEnvironment& env, const TUserDataTable& userData,
+ NCommon::TMemoizedTypesMap* typeMemoization = nullptr);
-}
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/fwd.h b/yql/essentials/public/purecalc/common/fwd.h
index 22df90a6b29..dc77d14b96b 100644
--- a/yql/essentials/public/purecalc/common/fwd.h
+++ b/yql/essentials/public/purecalc/common/fwd.h
@@ -4,53 +4,53 @@
#include <memory>
namespace NYql::NPureCalc {
- class TCompileError;
+class TCompileError;
- template <typename>
- class IConsumer;
+template <typename>
+class IConsumer;
- template <typename>
- class IStream;
+template <typename>
+class IStream;
- class IProgramFactory;
+class IProgramFactory;
- class IWorkerFactory;
+class IWorkerFactory;
- class IPullStreamWorkerFactory;
+class IPullStreamWorkerFactory;
- class IPullListWorkerFactory;
+class IPullListWorkerFactory;
- class IPushStreamWorkerFactory;
+class IPushStreamWorkerFactory;
- class IWorker;
+class IWorker;
- class IPullStreamWorker;
+class IPullStreamWorker;
- class IPullListWorker;
+class IPullListWorker;
- class IPushStreamWorker;
+class IPushStreamWorker;
- class TInputSpecBase;
+class TInputSpecBase;
- class TOutputSpecBase;
+class TOutputSpecBase;
- class IProgram;
+class IProgram;
- template <typename, typename, typename>
- class TProgramCommon;
+template <typename, typename, typename>
+class TProgramCommon;
- template <typename, typename>
- class TPullStreamProgram;
+template <typename, typename>
+class TPullStreamProgram;
- template <typename, typename>
- class TPullListProgram;
+template <typename, typename>
+class TPullListProgram;
- template <typename, typename>
- class TPushStreamProgram;
+template <typename, typename>
+class TPushStreamProgram;
- using IProgramFactoryPtr = TIntrusivePtr<IProgramFactory>;
- using IWorkerFactoryPtr = std::shared_ptr<IWorkerFactory>;
- using IPullStreamWorkerFactoryPtr = std::shared_ptr<IPullStreamWorkerFactory>;
- using IPullListWorkerFactoryPtr = std::shared_ptr<IPullListWorkerFactory>;
- using IPushStreamWorkerFactoryPtr = std::shared_ptr<IPushStreamWorkerFactory>;
-}
+using IProgramFactoryPtr = TIntrusivePtr<IProgramFactory>;
+using IWorkerFactoryPtr = std::shared_ptr<IWorkerFactory>;
+using IPullStreamWorkerFactoryPtr = std::shared_ptr<IPullStreamWorkerFactory>;
+using IPullListWorkerFactoryPtr = std::shared_ptr<IPullListWorkerFactory>;
+using IPushStreamWorkerFactoryPtr = std::shared_ptr<IPushStreamWorkerFactory>;
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/inspect_input.cpp b/yql/essentials/public/purecalc/common/inspect_input.cpp
index 9ca56da5dec..7717aac2e04 100644
--- a/yql/essentials/public/purecalc/common/inspect_input.cpp
+++ b/yql/essentials/public/purecalc/common/inspect_input.cpp
@@ -3,31 +3,31 @@
#include <yql/essentials/core/yql_expr_type_annotation.h>
namespace NYql::NPureCalc {
- bool TryFetchInputIndexFromSelf(const TExprNode& node, TExprContext& ctx, ui32 inputsCount, ui32& result) {
- TIssueScopeGuard issueSope(ctx.IssueManager, [&]() {
- return MakeIntrusive<TIssue>(ctx.GetPosition(node.Pos()), TStringBuilder() << "At function: " << node.Content());
- });
+bool TryFetchInputIndexFromSelf(const TExprNode& node, TExprContext& ctx, ui32 inputsCount, ui32& result) {
+ TIssueScopeGuard issueSope(ctx.IssueManager, [&]() {
+ return MakeIntrusive<TIssue>(ctx.GetPosition(node.Pos()), TStringBuilder() << "At function: " << node.Content());
+ });
- if (!EnsureArgsCount(node, 1, ctx)) {
- return false;
- }
-
- if (!EnsureAtom(*node.Child(0), ctx)) {
- return false;
- }
+ if (!EnsureArgsCount(node, 1, ctx)) {
+ return false;
+ }
- if (!TryFromString(node.Child(0)->Content(), result)) {
- auto message = TStringBuilder() << "Index " << TString{node.Child(0)->Content()}.Quote() << " isn't UI32";
- ctx.AddError(TIssue(ctx.GetPosition(node.Child(0)->Pos()), std::move(message)));
- return false;
- }
+ if (!EnsureAtom(*node.Child(0), ctx)) {
+ return false;
+ }
- if (result >= inputsCount) {
- auto message = TStringBuilder() << "Invalid input index: " << result << " is out of range [0;" << inputsCount << ")";
- ctx.AddError(TIssue(ctx.GetPosition(node.Child(0)->Pos()), std::move(message)));
- return false;
- }
+ if (!TryFromString(node.Child(0)->Content(), result)) {
+ auto message = TStringBuilder() << "Index " << TString{node.Child(0)->Content()}.Quote() << " isn't UI32";
+ ctx.AddError(TIssue(ctx.GetPosition(node.Child(0)->Pos()), std::move(message)));
+ return false;
+ }
- return true;
+ if (result >= inputsCount) {
+ auto message = TStringBuilder() << "Invalid input index: " << result << " is out of range [0;" << inputsCount << ")";
+ ctx.AddError(TIssue(ctx.GetPosition(node.Child(0)->Pos()), std::move(message)));
+ return false;
}
+
+ return true;
}
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/inspect_input.h b/yql/essentials/public/purecalc/common/inspect_input.h
index 558144865da..46a6a0b4fbe 100644
--- a/yql/essentials/public/purecalc/common/inspect_input.h
+++ b/yql/essentials/public/purecalc/common/inspect_input.h
@@ -3,5 +3,5 @@
#include <yql/essentials/ast/yql_expr.h>
namespace NYql::NPureCalc {
- bool TryFetchInputIndexFromSelf(const TExprNode&, TExprContext&, ui32, ui32&);
-}
+bool TryFetchInputIndexFromSelf(const TExprNode&, TExprContext&, ui32, ui32&);
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/interface.h b/yql/essentials/public/purecalc/common/interface.h
index 23aa93bdf23..36741ed24d3 100644
--- a/yql/essentials/public/purecalc/common/interface.h
+++ b/yql/essentials/public/purecalc/common/interface.h
@@ -24,970 +24,970 @@
class ITimeProvider;
namespace NKikimr {
- namespace NMiniKQL {
- class TScopedAlloc;
- class IComputationGraph;
- class IFunctionRegistry;
- class TTypeEnvironment;
- class TType;
- class TStructType;
+namespace NMiniKQL {
+class TScopedAlloc;
+class IComputationGraph;
+class IFunctionRegistry;
+class TTypeEnvironment;
+class TType;
+class TStructType;
+} // namespace NMiniKQL
+} // namespace NKikimr
+
+namespace NYql {
+namespace NPureCalc {
+/**
+ * SQL or s-expression translation error.
+ */
+class TCompileError: public yexception {
+private:
+ TString Yql_;
+ TString Issues_;
+
+public:
+ // TODO: maybe accept an actual list of issues here?
+ // See https://a.yandex-team.ru/arc/review/439403/details#comment-778237
+ TCompileError(TString yql, TString issues)
+ : Yql_(std::move(yql))
+ , Issues_(std::move(issues))
+ {
+ }
+
+public:
+ /**
+ * Get the sql query which caused the error (if there is one available).
+ */
+ const TString& GetYql() const {
+ return Yql_;
+ }
+
+ /**
+ * Get detailed description for all errors and warnings that happened during sql translation.
+ */
+ const TString& GetIssues() const {
+ return Issues_;
}
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * A generic input stream of objects.
+ */
+template <typename T>
+class IStream {
+public:
+ virtual ~IStream() = default;
+
+public:
+ /**
+ * Pops and returns a next value in the stream. If the stream is finished, should return some sentinel object.
+ *
+ * Depending on return type, this function may not transfer object ownership to a user.
+ * Thus, the stream may manage the returned object * itself.
+ * That is, the returned object's lifetime may be bound to the input stream lifetime; it may be destroyed
+ * upon calling Fetch() or upon destroying the stream, whichever happens first.
+ */
+ virtual T Fetch() = 0;
+};
+
+/**
+ * Create a new stream which applies the given functor to the elements of the original stream.
+ */
+template <typename TOld, typename TNew, typename TFunctor>
+inline THolder<IStream<TNew>> MapStream(THolder<IStream<TOld>> stream, TFunctor functor) {
+ return THolder(new NPrivate::TMappingStream<TNew, TOld, TFunctor>(std::move(stream), std::move(functor)));
+};
+
+/**
+ * Convert stream of objects into a stream of potentially incompatible objects.
+ *
+ * This conversion applies static cast to the output of the original stream. Use with caution!
+ */
+/// @{
+template <
+ typename TNew, typename TOld,
+ std::enable_if_t<!std::is_same<TNew, TOld>::value>* = nullptr>
+inline THolder<IStream<TNew>> ConvertStreamUnsafe(THolder<IStream<TOld>> stream) {
+ return MapStream<TOld, TNew>(std::move(stream), [](TOld x) -> TNew { return static_cast<TNew>(x); });
+}
+template <typename T>
+inline THolder<IStream<T>> ConvertStreamUnsafe(THolder<IStream<T>> stream) {
+ return stream;
+}
+/// @}
+
+/**
+ * Convert stream of objects into a stream of compatible objects.
+ *
+ * Note: each conversion adds one level of indirection so avoid them if possible.
+ */
+template <typename TNew, typename TOld, std::enable_if_t<std::is_convertible<TOld, TNew>::value>* = nullptr>
+inline THolder<IStream<TNew>> ConvertStream(THolder<IStream<TOld>> stream) {
+ return ConvertStreamUnsafe<TNew, TOld>(std::move(stream));
}
-namespace NYql {
- namespace NPureCalc {
- /**
- * SQL or s-expression translation error.
- */
- class TCompileError: public yexception {
- private:
- TString Yql_;
- TString Issues_;
-
- public:
- // TODO: maybe accept an actual list of issues here?
- // See https://a.yandex-team.ru/arc/review/439403/details#comment-778237
- TCompileError(TString yql, TString issues)
- : Yql_(std::move(yql))
- , Issues_(std::move(issues))
- {
- }
-
- public:
- /**
- * Get the sql query which caused the error (if there is one available).
- */
- const TString& GetYql() const {
- return Yql_;
- }
-
- /**
- * Get detailed description for all errors and warnings that happened during sql translation.
- */
- const TString& GetIssues() const {
- return Issues_;
- }
- };
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * A generic input stream of objects.
- */
- template <typename T>
- class IStream {
- public:
- virtual ~IStream() = default;
-
- public:
- /**
- * Pops and returns a next value in the stream. If the stream is finished, should return some sentinel object.
- *
- * Depending on return type, this function may not transfer object ownership to a user.
- * Thus, the stream may manage the returned object * itself.
- * That is, the returned object's lifetime may be bound to the input stream lifetime; it may be destroyed
- * upon calling Fetch() or upon destroying the stream, whichever happens first.
- */
- virtual T Fetch() = 0;
- };
-
- /**
- * Create a new stream which applies the given functor to the elements of the original stream.
- */
- template <typename TOld, typename TNew, typename TFunctor>
- inline THolder<IStream<TNew>> MapStream(THolder<IStream<TOld>> stream, TFunctor functor) {
- return THolder(new NPrivate::TMappingStream<TNew, TOld, TFunctor>(std::move(stream), std::move(functor)));
- };
-
- /**
- * Convert stream of objects into a stream of potentially incompatible objects.
- *
- * This conversion applies static cast to the output of the original stream. Use with caution!
- */
- /// @{
- template <
- typename TNew, typename TOld,
- std::enable_if_t<!std::is_same<TNew, TOld>::value>* = nullptr>
- inline THolder<IStream<TNew>> ConvertStreamUnsafe(THolder<IStream<TOld>> stream) {
- return MapStream<TOld, TNew>(std::move(stream), [](TOld x) -> TNew { return static_cast<TNew>(x); });
- }
- template <typename T>
- inline THolder<IStream<T>> ConvertStreamUnsafe(THolder<IStream<T>> stream) {
- return stream;
- }
- /// @}
-
- /**
- * Convert stream of objects into a stream of compatible objects.
- *
- * Note: each conversion adds one level of indirection so avoid them if possible.
- */
- template <typename TNew, typename TOld, std::enable_if_t<std::is_convertible<TOld, TNew>::value>* = nullptr>
- inline THolder<IStream<TNew>> ConvertStream(THolder<IStream<TOld>> stream) {
- return ConvertStreamUnsafe<TNew, TOld>(std::move(stream));
- }
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * A generic push consumer.
+ */
+template <typename T>
+class IConsumer {
+public:
+ virtual ~IConsumer() = default;
+
+public:
+ /**
+ * Feed an object to consumer.
+ *
+ * Depending on argument type, the consumer may not take ownership of the passed object;
+ * in that case it is the caller responsibility to manage the object lifetime after passing it to this method.
+ *
+ * The passed object can be destroyed after the consumer returns from this function; the consumer should
+ * not store pointer to the passed object or the passed object itself without taking all necessary precautions
+ * to ensure that the pointer or the object stays valid after returning.
+ */
+ virtual void OnObject(T) = 0;
+
+ /**
+ * Close the consumer and run finalization logic. Calling OnObject after calling this function is an error.
+ */
+ virtual void OnFinish() = 0;
+};
+
+/**
+ * Create a new consumer which applies the given functor to objects before .
+ */
+template <typename TOld, typename TNew, typename TFunctor>
+inline THolder<IConsumer<TNew>> MapConsumer(THolder<IConsumer<TOld>> stream, TFunctor functor) {
+ return THolder(new NPrivate::TMappingConsumer<TNew, TOld, TFunctor>(std::move(stream), std::move(functor)));
+};
+
+/**
+ * Convert consumer of objects into a consumer of potentially incompatible objects.
+ *
+ * This conversion applies static cast to the input value. Use with caution.
+ */
+/// @{
+template <
+ typename TNew, typename TOld,
+ std::enable_if_t<!std::is_same<TNew, TOld>::value>* = nullptr>
+inline THolder<IConsumer<TNew>> ConvertConsumerUnsafe(THolder<IConsumer<TOld>> consumer) {
+ return MapConsumer<TOld, TNew>(std::move(consumer), [](TNew x) -> TOld { return static_cast<TOld>(x); });
+}
+template <typename T>
+inline THolder<IConsumer<T>> ConvertConsumerUnsafe(THolder<IConsumer<T>> consumer) {
+ return consumer;
+}
+/// @}
+
+/**
+ * Convert consumer of objects into a consumer of compatible objects.
+ *
+ * Note: each conversion adds one level of indirection so avoid them if possible.
+ */
+template <typename TNew, typename TOld, std::enable_if_t<std::is_convertible<TNew, TOld>::value>* = nullptr>
+inline THolder<IConsumer<TNew>> ConvertConsumer(THolder<IConsumer<TOld>> consumer) {
+ return ConvertConsumerUnsafe<TNew, TOld>(std::move(consumer));
+}
- ////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * A generic push consumer.
- */
- template <typename T>
- class IConsumer {
- public:
- virtual ~IConsumer() = default;
-
- public:
- /**
- * Feed an object to consumer.
- *
- * Depending on argument type, the consumer may not take ownership of the passed object;
- * in that case it is the caller responsibility to manage the object lifetime after passing it to this method.
- *
- * The passed object can be destroyed after the consumer returns from this function; the consumer should
- * not store pointer to the passed object or the passed object itself without taking all necessary precautions
- * to ensure that the pointer or the object stays valid after returning.
- */
- virtual void OnObject(T) = 0;
-
- /**
- * Close the consumer and run finalization logic. Calling OnObject after calling this function is an error.
- */
- virtual void OnFinish() = 0;
- };
-
- /**
- * Create a new consumer which applies the given functor to objects before .
- */
- template <typename TOld, typename TNew, typename TFunctor>
- inline THolder<IConsumer<TNew>> MapConsumer(THolder<IConsumer<TOld>> stream, TFunctor functor) {
- return THolder(new NPrivate::TMappingConsumer<TNew, TOld, TFunctor>(std::move(stream), std::move(functor)));
- };
-
-
- /**
- * Convert consumer of objects into a consumer of potentially incompatible objects.
- *
- * This conversion applies static cast to the input value. Use with caution.
- */
- /// @{
- template <
- typename TNew, typename TOld,
- std::enable_if_t<!std::is_same<TNew, TOld>::value>* = nullptr>
- inline THolder<IConsumer<TNew>> ConvertConsumerUnsafe(THolder<IConsumer<TOld>> consumer) {
- return MapConsumer<TOld, TNew>(std::move(consumer), [](TNew x) -> TOld { return static_cast<TOld>(x); });
- }
- template <typename T>
- inline THolder<IConsumer<T>> ConvertConsumerUnsafe(THolder<IConsumer<T>> consumer) {
- return consumer;
- }
- /// @}
-
- /**
- * Convert consumer of objects into a consumer of compatible objects.
- *
- * Note: each conversion adds one level of indirection so avoid them if possible.
- */
- template <typename TNew, typename TOld, std::enable_if_t<std::is_convertible<TNew, TOld>::value>* = nullptr>
- inline THolder<IConsumer<TNew>> ConvertConsumer(THolder<IConsumer<TOld>> consumer) {
- return ConvertConsumerUnsafe<TNew, TOld>(std::move(consumer));
- }
+/**
+ * Create a consumer which holds a non-owning pointer to the given consumer
+ * and passes all messages to the latter.
+ */
+template <typename T, typename C>
+THolder<NPrivate::TNonOwningConsumer<T, C>> MakeNonOwningConsumer(C consumer) {
+ return MakeHolder<NPrivate::TNonOwningConsumer<T, C>>(consumer);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Logging options.
+ */
+struct TLoggingOptions final {
+public:
+ /// Logging level for messages generated during compilation.
+ ELogPriority LogLevel;
+
+ /// Where to write log messages.
+ IOutputStream* LogDestination;
+
+public:
+ TLoggingOptions();
+ /**
+ * Set a new logging level.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TLoggingOptions& SetLogLevel(ELogPriority);
+
+ /**
+ * Set a new logging destination.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TLoggingOptions& SetLogDestination(IOutputStream*);
+};
+
+/**
+ * General options for program factory.
+ */
+struct TProgramFactoryOptions final {
+public:
+ /// Path to a directory with compiled UDFs. Leave empty to disable loading external UDFs.
+ TString UdfsDir;
+
+ /// List of available external resources, e.g. files, UDFs, libraries.
+ TVector<NUserData::TUserData> UserData;
+
+ /// LLVM settings. Assign "OFF" to disable LLVM, empty string for default settings.
+ TString LLVMSettings;
+
+ /// Block engine settings. Assign "force" to unconditionally enable
+ /// it, "disable" for turn it off and "auto" to left the final
+ /// decision to the platform heuristics.
+ TString BlockEngineSettings;
+
+ /// Output stream to dump the compiled and optimized expressions.
+ IOutputStream* ExprOutputStream;
+
+ /// Provider for generic counters which can be used to export statistics from UDFs.
+ NKikimr::NUdf::ICountersProvider* CountersProvider;
+
+ /// YT Type V3 flags for Skiff/Yson serialization.
+ ui64 NativeYtTypeFlags;
+
+ /// Seed for deterministic time provider
+ TMaybe<ui64> DeterministicTimeProviderSeed;
+
+ /// Use special system columns to support tables naming (supports non empty ``TablePath()``/``TableName()``)
+ bool UseSystemColumns;
+
+ /// Reuse allocated workers
+ bool UseWorkerPool;
+
+ /// Use Antlr4 parser (for migration)
+ bool UseAntlr4;
+
+ /// Language version
+ TLangVersion LangVer;
+
+public:
+ TProgramFactoryOptions();
+
+public:
+ /**
+ * Set language version for queries
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetLanguageVersion(TLangVersion langver);
+
+ /**
+ * Set a new path to a directory with UDFs.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetUDFsDir(TStringBuf);
+
+ /**
+ * Add a new library to the UserData list.
+ *
+ * @param disposition where the resource resides, e.g. on filesystem, in memory, etc.
+ * NB: URL disposition is not supported.
+ * @param name name of the resource.
+ * @param content depending on disposition, either path to the resource or its content.
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& AddLibrary(NUserData::EDisposition disposition, TStringBuf name, TStringBuf content);
+
+ /**
+ * Add a new file to the UserData list.
+ *
+ * @param disposition where the resource resides, e.g. on filesystem, in memory, etc.
+ * NB: URL disposition is not supported.
+ * @param name name of the resource.
+ * @param content depending on disposition, either path to the resource or its content.
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& AddFile(NUserData::EDisposition disposition, TStringBuf name, TStringBuf content);
+
+ /**
+ * Add a new UDF to the UserData list.
+ *
+ * @param disposition where the resource resides, e.g. on filesystem, in memory, etc.
+ * NB: URL disposition is not supported.
+ * @param name name of the resource.
+ * @param content depending on disposition, either path to the resource or its content.
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& AddUDF(NUserData::EDisposition disposition, TStringBuf name, TStringBuf content);
+
+ /**
+ * Set new LLVM settings.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetLLVMSettings(TStringBuf llvm_settings);
+
+ /**
+ * Set new block engine settings.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetBlockEngineSettings(TStringBuf blockEngineSettings);
+
+ /**
+ * Set the stream to dump the compiled and optimized expressions.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetExprOutputStream(IOutputStream* exprOutputStream);
+
+ /**
+ * Set new counters provider. Passed pointer should stay alive for as long as the processor factory
+ * stays alive.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetCountersProvider(NKikimr::NUdf::ICountersProvider* countersProvider);
+
+ /**
+ * Set new YT Type V3 mode. Deprecated method. Use SetNativeYtTypeFlags instead
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetUseNativeYtTypes(bool useNativeTypes);
+
+ /**
+ * Set YT Type V3 flags.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetNativeYtTypeFlags(ui64 nativeTypeFlags);
+
+ /**
+ * Set seed for deterministic time provider.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetDeterministicTimeProviderSeed(TMaybe<ui64> seed);
+
+ /**
+ * Set new flag whether to allow using system columns or not.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetUseSystemColumns(bool useSystemColumns);
+
+ /**
+ * Set new flag whether to allow reusing workers or not.
+ *
+ * @return reference to self, to allow method chaining.
+ */
+ TProgramFactoryOptions& SetUseWorkerPool(bool useWorkerPool);
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * What exactly are we parsing: SQL or an s-expression.
+ */
+enum class ETranslationMode {
+ SQL /* "SQL" */,
+ SExpr /* "s-expression" */,
+ Mkql /* "mkql" */,
+ PG /* PostgreSQL */
+};
+
+/**
+ * A facility for compiling sql and s-expressions and making programs from them.
+ */
+class IProgramFactory: public TThrRefBase {
+protected:
+ virtual IPullStreamWorkerFactoryPtr MakePullStreamWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) = 0;
+ virtual IPullListWorkerFactoryPtr MakePullListWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) = 0;
+ virtual IPushStreamWorkerFactoryPtr MakePushStreamWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) = 0;
+
+public:
+ /**
+ * Add new udf module. It's not specified whether adding new modules will affect existing programs
+ * (theoretical answer is 'no').
+ */
+ virtual void AddUdfModule(const TStringBuf&, NKikimr::NUdf::TUniquePtr<NKikimr::NUdf::IUdfModule>&&) = 0;
+ // TODO: support setting udf modules via factory options.
+
+ /**
+ * Set new counters provider, override one that was specified via factory options. Note that existing
+ * programs will still reference the previous provider.
+ */
+ virtual void SetCountersProvider(NKikimr::NUdf::ICountersProvider*) = 0;
+ // TODO: support setting providers via factory options.
+
+ template <typename TInputSpec, typename TOutputSpec>
+ THolder<TPullStreamProgram<TInputSpec, TOutputSpec>> MakePullStreamProgram(
+ TInputSpec inputSpec, TOutputSpec outputSpec, TString query, ETranslationMode mode = ETranslationMode::SQL, ui16 syntaxVersion = 1) {
+ auto workerFactory = MakePullStreamWorkerFactory(inputSpec, outputSpec, std::move(query), mode, syntaxVersion);
+ return MakeHolder<TPullStreamProgram<TInputSpec, TOutputSpec>>(std::move(inputSpec), std::move(outputSpec), workerFactory);
+ }
- /**
- * Create a consumer which holds a non-owning pointer to the given consumer
- * and passes all messages to the latter.
- */
- template <typename T, typename C>
- THolder<NPrivate::TNonOwningConsumer<T, C>> MakeNonOwningConsumer(C consumer) {
- return MakeHolder<NPrivate::TNonOwningConsumer<T, C>>(consumer);
+ template <typename TInputSpec, typename TOutputSpec>
+ THolder<TPullListProgram<TInputSpec, TOutputSpec>> MakePullListProgram(
+ TInputSpec inputSpec, TOutputSpec outputSpec, TString query, ETranslationMode mode = ETranslationMode::SQL, ui16 syntaxVersion = 1) {
+ auto workerFactory = MakePullListWorkerFactory(inputSpec, outputSpec, std::move(query), mode, syntaxVersion);
+ return MakeHolder<TPullListProgram<TInputSpec, TOutputSpec>>(std::move(inputSpec), std::move(outputSpec), workerFactory);
+ }
+
+ template <typename TInputSpec, typename TOutputSpec>
+ THolder<TPushStreamProgram<TInputSpec, TOutputSpec>> MakePushStreamProgram(
+ TInputSpec inputSpec, TOutputSpec outputSpec, TString query, ETranslationMode mode = ETranslationMode::SQL, ui16 syntaxVersion = 1) {
+ auto workerFactory = MakePushStreamWorkerFactory(inputSpec, outputSpec, std::move(query), mode, syntaxVersion);
+ return MakeHolder<TPushStreamProgram<TInputSpec, TOutputSpec>>(std::move(inputSpec), std::move(outputSpec), workerFactory);
+ }
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * A facility for creating workers. Despite being a part of a public API, worker factory is not used directly.
+ */
+class IWorkerFactory: public std::enable_shared_from_this<IWorkerFactory> {
+public:
+ virtual ~IWorkerFactory() = default;
+ /**
+ * Get input column names for specified input that are actually used in the query.
+ */
+ virtual const THashSet<TString>& GetUsedColumns(ui32) const = 0;
+ /**
+ * Overload for single-input programs.
+ */
+ virtual const THashSet<TString>& GetUsedColumns() const = 0;
+
+ /**
+ * Make input type schema for specified input as deduced by program optimizer. This schema is equivalent
+ * to one provided by input spec up to the order of the fields in structures.
+ */
+ virtual NYT::TNode MakeInputSchema(ui32) const = 0;
+ /**
+ * Overload for single-input programs.
+ */
+ virtual NYT::TNode MakeInputSchema() const = 0;
+
+ /**
+ * Make output type schema as deduced by program optimizer. If output spec provides its own schema, than
+ * this schema is equivalent to one provided by output spec up to the order of the fields in structures.
+ */
+ /// @{
+ /**
+ * Overload for single-table output programs (i.e. output type is struct).
+ */
+ virtual NYT::TNode MakeOutputSchema() const = 0;
+ /**
+ * Overload for multi-table output programs (i.e. output type is variant over tuple).
+ */
+ virtual NYT::TNode MakeOutputSchema(ui32) const = 0;
+ /**
+ * Overload for multi-table output programs (i.e. output type is variant over struct).
+ */
+ virtual NYT::TNode MakeOutputSchema(TStringBuf) const = 0;
+ /// @}
+
+ /**
+ * Make full output schema. For single-output programs returns struct type, for multi-output programs
+ * returns variant type.
+ *
+ * Warning: calling this function may result in extended memory usage for large number of output tables.
+ */
+ virtual NYT::TNode MakeFullOutputSchema() const = 0;
+
+ /**
+ * Get compilation issues
+ */
+ virtual TIssues GetIssues() const = 0;
+
+ /**
+ * Get precompiled mkql program
+ */
+ virtual TString GetCompiledProgram() = 0;
+
+ /**
+ * Return a worker to the factory for possible reuse
+ */
+ virtual void ReturnWorker(IWorker* worker) = 0;
+};
+
+class TReleaseWorker {
+public:
+ template <class T>
+ static inline void Destroy(T* t) noexcept {
+ t->Release();
+ }
+};
+
+template <class T>
+using TWorkerHolder = THolder<T, TReleaseWorker>;
+
+/**
+ * Factory for generating pull stream workers.
+ */
+class IPullStreamWorkerFactory: public IWorkerFactory {
+public:
+ /**
+ * Create a new pull stream worker.
+ */
+ virtual TWorkerHolder<IPullStreamWorker> MakeWorker() = 0;
+};
+
+/**
+ * Factory for generating pull list workers.
+ */
+class IPullListWorkerFactory: public IWorkerFactory {
+public:
+ /**
+ * Create a new pull list worker.
+ */
+ virtual TWorkerHolder<IPullListWorker> MakeWorker() = 0;
+};
+
+/**
+ * Factory for generating push stream workers.
+ */
+class IPushStreamWorkerFactory: public IWorkerFactory {
+public:
+ /**
+ * Create a new push stream worker.
+ */
+ virtual TWorkerHolder<IPushStreamWorker> MakeWorker() = 0;
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Worker is a central part of any program instance. It contains current computation state
+ * (called computation graph) and objects required to work with it, including an allocator for unboxed values.
+ *
+ * Usually, users do not interact with workers directly. They use program instance entry points such as streams
+ * and consumers instead. The only case when one would have to to interact with workers is when implementing
+ * custom io-specification.
+ */
+class IWorker {
+protected:
+ friend class TReleaseWorker;
+ /**
+ * Cleanup the worker and return to a worker factory for reuse
+ */
+ virtual void Release() = 0;
+
+public:
+ virtual ~IWorker() = default;
+
+public:
+ /**
+ * Number of inputs for this program.
+ */
+ virtual ui32 GetInputsCount() const = 0;
+
+ /**
+ * MiniKQL input struct type of specified input for this program. Type is equivalent to the deduced input
+ * schema (see IWorker::MakeInputSchema())
+ *
+ * If ``original`` is set to ``true``, returns type without virtual system columns.
+ */
+ virtual const NKikimr::NMiniKQL::TStructType* GetInputType(ui32, bool original = false) const = 0;
+ /**
+ * Overload for single-input programs.
+ */
+ virtual const NKikimr::NMiniKQL::TStructType* GetInputType(bool original = false) const = 0;
+
+ /**
+ * MiniKQL input struct type of the specified input for this program.
+ * The returned type is the actual type of the specified input node.
+ */
+ virtual const NKikimr::NMiniKQL::TStructType* GetRawInputType(ui32) const = 0;
+ /**
+ * Overload for single-input programs.
+ */
+ virtual const NKikimr::NMiniKQL::TStructType* GetRawInputType() const = 0;
+
+ /**
+ * MiniKQL output struct type for this program. The returned type is equivalent to the deduced output
+ * schema (see IWorker::MakeFullOutputSchema()).
+ */
+ virtual const NKikimr::NMiniKQL::TType* GetOutputType() const = 0;
+
+ /**
+ * MiniKQL output struct type for this program. The returned type is
+ * the actual type of the root node.
+ */
+ virtual const NKikimr::NMiniKQL::TType* GetRawOutputType() const = 0;
+
+ /**
+ * Make input type schema for specified input as deduced by program optimizer. This schema is equivalent
+ * to one provided by input spec up to the order of the fields in structures.
+ */
+ virtual NYT::TNode MakeInputSchema(ui32) const = 0;
+ /**
+ * Overload for single-input programs.
+ */
+ virtual NYT::TNode MakeInputSchema() const = 0;
+
+ /**
+ * Make output type schema as deduced by program optimizer. If output spec provides its own schema, than
+ * this schema is equivalent to one provided by output spec up to the order of the fields in structures.
+ */
+ /// @{
+ /**
+ * Overload for single-table output programs (i.e. output type is struct).
+ */
+ virtual NYT::TNode MakeOutputSchema() const = 0;
+ /**
+ * Overload for multi-table output programs (i.e. output type is variant over tuple).
+ */
+ virtual NYT::TNode MakeOutputSchema(ui32) const = 0;
+ /**
+ * Overload for multi-table output programs (i.e. output type is variant over struct).
+ */
+ virtual NYT::TNode MakeOutputSchema(TStringBuf) const = 0;
+ /// @}
+
+ /**
+ * Generates full output schema. For single-output programs returns struct type, for multi-output programs
+ * returns variant type.
+ *
+ * Warning: calling this function may result in extended memory usage for large number of output tables.
+ */
+ virtual NYT::TNode MakeFullOutputSchema() const = 0;
+
+ /**
+ * Get scoped alloc used in this worker.
+ */
+ virtual NKikimr::NMiniKQL::TScopedAlloc& GetScopedAlloc() = 0;
+
+ /**
+ * Get computation graph.
+ */
+ virtual NKikimr::NMiniKQL::IComputationGraph& GetGraph() = 0;
+
+ /**
+ * Get function registry for this worker.
+ */
+ virtual const NKikimr::NMiniKQL::IFunctionRegistry& GetFunctionRegistry() const = 0;
+
+ /**
+ * Get type environment for this worker.
+ */
+ virtual NKikimr::NMiniKQL::TTypeEnvironment& GetTypeEnvironment() = 0;
+
+ /**
+ * Get llvm settings for this worker.
+ */
+ virtual const TString& GetLLVMSettings() const = 0;
+
+ /**
+ * Get YT Type V3 flags
+ */
+ virtual ui64 GetNativeYtTypeFlags() const = 0;
+
+ /**
+ * Get time provider
+ */
+ virtual ITimeProvider* GetTimeProvider() const = 0;
+
+ /**
+ * Release all input data from worker state
+ */
+ virtual void Invalidate() = 0;
+};
+
+/**
+ * Worker which operates in pull stream mode.
+ */
+class IPullStreamWorker: public IWorker {
+public:
+ /**
+ * Set input computation graph node for specified input. The passed unboxed value should be a stream of
+ * structs. It should be created via the allocator associated with this very worker.
+ * This function can only be called once for each input.
+ */
+ virtual void SetInput(NKikimr::NUdf::TUnboxedValue&&, ui32) = 0;
+
+ /**
+ * Get the output computation graph node. The returned node will be a stream of structs or variants.
+ * This function cannot be called before setting an input value.
+ */
+ virtual NKikimr::NUdf::TUnboxedValue& GetOutput() = 0;
+};
+
+/**
+ * Worker which operates in pull list mode.
+ */
+class IPullListWorker: public IWorker {
+public:
+ /**
+ * Set input computation graph node for specified input. The passed unboxed value should be a list of
+ * structs. It should be created via the allocator associated with this very worker.
+ * This function can only be called once for each index.
+ */
+ virtual void SetInput(NKikimr::NUdf::TUnboxedValue&&, ui32) = 0;
+
+ /**
+ * Get the output computation graph node. The returned node will be a list of structs or variants.
+ * This function cannot be called before setting an input value.
+ */
+ virtual NKikimr::NUdf::TUnboxedValue& GetOutput() = 0;
+
+ /**
+ * Get iterator over the output list.
+ */
+ virtual NKikimr::NUdf::TUnboxedValue& GetOutputIterator() = 0;
+
+ /**
+ * Reset iterator to the beginning of the output list. After calling this function, GetOutputIterator()
+ * will return a fresh iterator; all previously returned iterators will become invalid.
+ */
+ virtual void ResetOutputIterator() = 0;
+};
+
+/**
+ * Worker which operates in push stream mode.
+ */
+class IPushStreamWorker: public IWorker {
+public:
+ /**
+ * Set a consumer where the worker will relay its output. This function can only be called once.
+ */
+ virtual void SetConsumer(THolder<IConsumer<const NKikimr::NUdf::TUnboxedValue*>>) = 0;
+
+ /**
+ * Push new value to the graph, than feed all new output to the consumer. Values cannot be pushed before
+ * assigning a consumer.
+ */
+ virtual void Push(NKikimr::NUdf::TUnboxedValue&&) = 0;
+
+ /**
+ * Send finish event and clear the computation graph. No new values will be accepted.
+ */
+ virtual void OnFinish() = 0;
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Input specifications describe format for program input. They carry information about input data schema
+ * as well as the knowledge about how to convert input structures into unboxed values (data format which can be
+ * processed by the YQL runtime).
+ *
+ * Input spec defines the arguments of the program's Apply method. For example, a program
+ * with the protobuf input spec will accept a stream of protobuf messages while a program with the
+ * yson spec will accept an input stream (binary or text one).
+ *
+ * See documentation for input and output spec traits for hints on how to implement a custom specs.
+ */
+class TInputSpecBase {
+protected:
+ mutable TVector<THashMap<TString, NYT::TNode>> AllVirtualColumns_;
+
+public:
+ virtual ~TInputSpecBase() = default;
+
+public:
+ /**
+ * Get input data schemas in YQL format (NB: not a YT format). Each item of the returned vector must
+ * describe a structure.
+ *
+ * Format of each item is approximately this one:
+ *
+ * @code
+ * [
+ * 'StructType',
+ * [
+ * ["Field1Name", ["DataType", "Int32"]],
+ * ["Field2Name", ["DataType", "String"]],
+ * ...
+ * ]
+ * ]
+ * @endcode
+ */
+ virtual const TVector<NYT::TNode>& GetSchemas() const = 0;
+ // TODO: make a neat schema builder
+
+ /**
+ * Get virtual columns for each input.
+ *
+ * Key of each mapping is column name, value is data schema in YQL format.
+ */
+ const TVector<THashMap<TString, NYT::TNode>>& GetAllVirtualColumns() const {
+ if (AllVirtualColumns_.empty()) {
+ AllVirtualColumns_ = TVector<THashMap<TString, NYT::TNode>>(GetSchemas().size());
}
- ////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * Logging options.
- */
- struct TLoggingOptions final {
- public:
- /// Logging level for messages generated during compilation.
- ELogPriority LogLevel;
-
- /// Where to write log messages.
- IOutputStream* LogDestination;
-
- public:
- TLoggingOptions();
- /**
- * Set a new logging level.
- *
- * @return reference to self, to allow method chaining.
- */
- TLoggingOptions& SetLogLevel(ELogPriority);
-
- /**
- * Set a new logging destination.
- *
- * @return reference to self, to allow method chaining.
- */
- TLoggingOptions& SetLogDestination(IOutputStream*);
- };
-
- /**
- * General options for program factory.
- */
- struct TProgramFactoryOptions final {
- public:
- /// Path to a directory with compiled UDFs. Leave empty to disable loading external UDFs.
- TString UdfsDir;
-
- /// List of available external resources, e.g. files, UDFs, libraries.
- TVector<NUserData::TUserData> UserData;
-
- /// LLVM settings. Assign "OFF" to disable LLVM, empty string for default settings.
- TString LLVMSettings;
-
- /// Block engine settings. Assign "force" to unconditionally enable
- /// it, "disable" for turn it off and "auto" to left the final
- /// decision to the platform heuristics.
- TString BlockEngineSettings;
-
- /// Output stream to dump the compiled and optimized expressions.
- IOutputStream* ExprOutputStream;
-
- /// Provider for generic counters which can be used to export statistics from UDFs.
- NKikimr::NUdf::ICountersProvider* CountersProvider;
-
- /// YT Type V3 flags for Skiff/Yson serialization.
- ui64 NativeYtTypeFlags;
-
- /// Seed for deterministic time provider
- TMaybe<ui64> DeterministicTimeProviderSeed;
-
- /// Use special system columns to support tables naming (supports non empty ``TablePath()``/``TableName()``)
- bool UseSystemColumns;
-
- /// Reuse allocated workers
- bool UseWorkerPool;
-
- /// Use Antlr4 parser (for migration)
- bool UseAntlr4;
-
- /// Language version
- TLangVersion LangVer;
-
- public:
- TProgramFactoryOptions();
-
- public:
- /**
- * Set language version for queries
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetLanguageVersion(TLangVersion langver);
-
- /**
- * Set a new path to a directory with UDFs.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetUDFsDir(TStringBuf);
-
- /**
- * Add a new library to the UserData list.
- *
- * @param disposition where the resource resides, e.g. on filesystem, in memory, etc.
- * NB: URL disposition is not supported.
- * @param name name of the resource.
- * @param content depending on disposition, either path to the resource or its content.
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& AddLibrary(NUserData::EDisposition disposition, TStringBuf name, TStringBuf content);
-
- /**
- * Add a new file to the UserData list.
- *
- * @param disposition where the resource resides, e.g. on filesystem, in memory, etc.
- * NB: URL disposition is not supported.
- * @param name name of the resource.
- * @param content depending on disposition, either path to the resource or its content.
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& AddFile(NUserData::EDisposition disposition, TStringBuf name, TStringBuf content);
-
- /**
- * Add a new UDF to the UserData list.
- *
- * @param disposition where the resource resides, e.g. on filesystem, in memory, etc.
- * NB: URL disposition is not supported.
- * @param name name of the resource.
- * @param content depending on disposition, either path to the resource or its content.
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& AddUDF(NUserData::EDisposition disposition, TStringBuf name, TStringBuf content);
-
- /**
- * Set new LLVM settings.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetLLVMSettings(TStringBuf llvm_settings);
-
- /**
- * Set new block engine settings.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetBlockEngineSettings(TStringBuf blockEngineSettings);
-
- /**
- * Set the stream to dump the compiled and optimized expressions.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetExprOutputStream(IOutputStream* exprOutputStream);
-
- /**
- * Set new counters provider. Passed pointer should stay alive for as long as the processor factory
- * stays alive.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetCountersProvider(NKikimr::NUdf::ICountersProvider* countersProvider);
-
- /**
- * Set new YT Type V3 mode. Deprecated method. Use SetNativeYtTypeFlags instead
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetUseNativeYtTypes(bool useNativeTypes);
-
- /**
- * Set YT Type V3 flags.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetNativeYtTypeFlags(ui64 nativeTypeFlags);
-
- /**
- * Set seed for deterministic time provider.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetDeterministicTimeProviderSeed(TMaybe<ui64> seed);
-
- /**
- * Set new flag whether to allow using system columns or not.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetUseSystemColumns(bool useSystemColumns);
-
- /**
- * Set new flag whether to allow reusing workers or not.
- *
- * @return reference to self, to allow method chaining.
- */
- TProgramFactoryOptions& SetUseWorkerPool(bool useWorkerPool);
- };
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * What exactly are we parsing: SQL or an s-expression.
- */
- enum class ETranslationMode {
- SQL /* "SQL" */,
- SExpr /* "s-expression" */,
- Mkql /* "mkql" */,
- PG /* PostgreSQL */
- };
-
- /**
- * A facility for compiling sql and s-expressions and making programs from them.
- */
- class IProgramFactory: public TThrRefBase {
- protected:
- virtual IPullStreamWorkerFactoryPtr MakePullStreamWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) = 0;
- virtual IPullListWorkerFactoryPtr MakePullListWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) = 0;
- virtual IPushStreamWorkerFactoryPtr MakePushStreamWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) = 0;
-
- public:
- /**
- * Add new udf module. It's not specified whether adding new modules will affect existing programs
- * (theoretical answer is 'no').
- */
- virtual void AddUdfModule(const TStringBuf&, NKikimr::NUdf::TUniquePtr<NKikimr::NUdf::IUdfModule>&&) = 0;
- // TODO: support setting udf modules via factory options.
-
- /**
- * Set new counters provider, override one that was specified via factory options. Note that existing
- * programs will still reference the previous provider.
- */
- virtual void SetCountersProvider(NKikimr::NUdf::ICountersProvider*) = 0;
- // TODO: support setting providers via factory options.
-
- template <typename TInputSpec, typename TOutputSpec>
- THolder<TPullStreamProgram<TInputSpec, TOutputSpec>> MakePullStreamProgram(
- TInputSpec inputSpec, TOutputSpec outputSpec, TString query, ETranslationMode mode = ETranslationMode::SQL, ui16 syntaxVersion = 1
- ) {
- auto workerFactory = MakePullStreamWorkerFactory(inputSpec, outputSpec, std::move(query), mode, syntaxVersion);
- return MakeHolder<TPullStreamProgram<TInputSpec, TOutputSpec>>(std::move(inputSpec), std::move(outputSpec), workerFactory);
- }
-
- template <typename TInputSpec, typename TOutputSpec>
- THolder<TPullListProgram<TInputSpec, TOutputSpec>> MakePullListProgram(
- TInputSpec inputSpec, TOutputSpec outputSpec, TString query, ETranslationMode mode = ETranslationMode::SQL, ui16 syntaxVersion = 1
- ) {
- auto workerFactory = MakePullListWorkerFactory(inputSpec, outputSpec, std::move(query), mode, syntaxVersion);
- return MakeHolder<TPullListProgram<TInputSpec, TOutputSpec>>(std::move(inputSpec), std::move(outputSpec), workerFactory);
- }
-
- template <typename TInputSpec, typename TOutputSpec>
- THolder<TPushStreamProgram<TInputSpec, TOutputSpec>> MakePushStreamProgram(
- TInputSpec inputSpec, TOutputSpec outputSpec, TString query, ETranslationMode mode = ETranslationMode::SQL, ui16 syntaxVersion = 1
- ) {
- auto workerFactory = MakePushStreamWorkerFactory(inputSpec, outputSpec, std::move(query), mode, syntaxVersion);
- return MakeHolder<TPushStreamProgram<TInputSpec, TOutputSpec>>(std::move(inputSpec), std::move(outputSpec), workerFactory);
- }
- };
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * A facility for creating workers. Despite being a part of a public API, worker factory is not used directly.
- */
- class IWorkerFactory: public std::enable_shared_from_this<IWorkerFactory> {
- public:
- virtual ~IWorkerFactory() = default;
- /**
- * Get input column names for specified input that are actually used in the query.
- */
- virtual const THashSet<TString>& GetUsedColumns(ui32) const = 0;
- /**
- * Overload for single-input programs.
- */
- virtual const THashSet<TString>& GetUsedColumns() const = 0;
-
- /**
- * Make input type schema for specified input as deduced by program optimizer. This schema is equivalent
- * to one provided by input spec up to the order of the fields in structures.
- */
- virtual NYT::TNode MakeInputSchema(ui32) const = 0;
- /**
- * Overload for single-input programs.
- */
- virtual NYT::TNode MakeInputSchema() const = 0;
-
- /**
- * Make output type schema as deduced by program optimizer. If output spec provides its own schema, than
- * this schema is equivalent to one provided by output spec up to the order of the fields in structures.
- */
- /// @{
- /**
- * Overload for single-table output programs (i.e. output type is struct).
- */
- virtual NYT::TNode MakeOutputSchema() const = 0;
- /**
- * Overload for multi-table output programs (i.e. output type is variant over tuple).
- */
- virtual NYT::TNode MakeOutputSchema(ui32) const = 0;
- /**
- * Overload for multi-table output programs (i.e. output type is variant over struct).
- */
- virtual NYT::TNode MakeOutputSchema(TStringBuf) const = 0;
- /// @}
-
- /**
- * Make full output schema. For single-output programs returns struct type, for multi-output programs
- * returns variant type.
- *
- * Warning: calling this function may result in extended memory usage for large number of output tables.
- */
- virtual NYT::TNode MakeFullOutputSchema() const = 0;
-
- /**
- * Get compilation issues
- */
- virtual TIssues GetIssues() const = 0;
-
- /**
- * Get precompiled mkql program
- */
- virtual TString GetCompiledProgram() = 0;
-
- /**
- * Return a worker to the factory for possible reuse
- */
- virtual void ReturnWorker(IWorker* worker) = 0;
- };
-
- class TReleaseWorker {
- public:
- template <class T>
- static inline void Destroy(T* t) noexcept {
- t->Release();
- }
- };
-
- template <class T>
- using TWorkerHolder = THolder<T, TReleaseWorker>;
-
- /**
- * Factory for generating pull stream workers.
- */
- class IPullStreamWorkerFactory: public IWorkerFactory {
- public:
- /**
- * Create a new pull stream worker.
- */
- virtual TWorkerHolder<IPullStreamWorker> MakeWorker() = 0;
- };
-
- /**
- * Factory for generating pull list workers.
- */
- class IPullListWorkerFactory: public IWorkerFactory {
- public:
- /**
- * Create a new pull list worker.
- */
- virtual TWorkerHolder<IPullListWorker> MakeWorker() = 0;
- };
-
- /**
- * Factory for generating push stream workers.
- */
- class IPushStreamWorkerFactory: public IWorkerFactory {
- public:
- /**
- * Create a new push stream worker.
- */
- virtual TWorkerHolder<IPushStreamWorker> MakeWorker() = 0;
- };
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * Worker is a central part of any program instance. It contains current computation state
- * (called computation graph) and objects required to work with it, including an allocator for unboxed values.
- *
- * Usually, users do not interact with workers directly. They use program instance entry points such as streams
- * and consumers instead. The only case when one would have to to interact with workers is when implementing
- * custom io-specification.
- */
- class IWorker {
- protected:
- friend class TReleaseWorker;
- /**
- * Cleanup the worker and return to a worker factory for reuse
- */
- virtual void Release() = 0;
-
- public:
- virtual ~IWorker() = default;
-
- public:
- /**
- * Number of inputs for this program.
- */
- virtual ui32 GetInputsCount() const = 0;
-
- /**
- * MiniKQL input struct type of specified input for this program. Type is equivalent to the deduced input
- * schema (see IWorker::MakeInputSchema())
- *
- * If ``original`` is set to ``true``, returns type without virtual system columns.
- */
- virtual const NKikimr::NMiniKQL::TStructType* GetInputType(ui32, bool original = false) const = 0;
- /**
- * Overload for single-input programs.
- */
- virtual const NKikimr::NMiniKQL::TStructType* GetInputType(bool original = false) const = 0;
-
- /**
- * MiniKQL input struct type of the specified input for this program.
- * The returned type is the actual type of the specified input node.
- */
- virtual const NKikimr::NMiniKQL::TStructType* GetRawInputType(ui32) const = 0;
- /**
- * Overload for single-input programs.
- */
- virtual const NKikimr::NMiniKQL::TStructType* GetRawInputType() const = 0;
-
- /**
- * MiniKQL output struct type for this program. The returned type is equivalent to the deduced output
- * schema (see IWorker::MakeFullOutputSchema()).
- */
- virtual const NKikimr::NMiniKQL::TType* GetOutputType() const = 0;
-
- /**
- * MiniKQL output struct type for this program. The returned type is
- * the actual type of the root node.
- */
- virtual const NKikimr::NMiniKQL::TType* GetRawOutputType() const = 0;
-
- /**
- * Make input type schema for specified input as deduced by program optimizer. This schema is equivalent
- * to one provided by input spec up to the order of the fields in structures.
- */
- virtual NYT::TNode MakeInputSchema(ui32) const = 0;
- /**
- * Overload for single-input programs.
- */
- virtual NYT::TNode MakeInputSchema() const = 0;
-
- /**
- * Make output type schema as deduced by program optimizer. If output spec provides its own schema, than
- * this schema is equivalent to one provided by output spec up to the order of the fields in structures.
- */
- /// @{
- /**
- * Overload for single-table output programs (i.e. output type is struct).
- */
- virtual NYT::TNode MakeOutputSchema() const = 0;
- /**
- * Overload for multi-table output programs (i.e. output type is variant over tuple).
- */
- virtual NYT::TNode MakeOutputSchema(ui32) const = 0;
- /**
- * Overload for multi-table output programs (i.e. output type is variant over struct).
- */
- virtual NYT::TNode MakeOutputSchema(TStringBuf) const = 0;
- /// @}
-
- /**
- * Generates full output schema. For single-output programs returns struct type, for multi-output programs
- * returns variant type.
- *
- * Warning: calling this function may result in extended memory usage for large number of output tables.
- */
- virtual NYT::TNode MakeFullOutputSchema() const = 0;
-
- /**
- * Get scoped alloc used in this worker.
- */
- virtual NKikimr::NMiniKQL::TScopedAlloc& GetScopedAlloc() = 0;
-
- /**
- * Get computation graph.
- */
- virtual NKikimr::NMiniKQL::IComputationGraph& GetGraph() = 0;
-
- /**
- * Get function registry for this worker.
- */
- virtual const NKikimr::NMiniKQL::IFunctionRegistry& GetFunctionRegistry() const = 0;
-
- /**
- * Get type environment for this worker.
- */
- virtual NKikimr::NMiniKQL::TTypeEnvironment& GetTypeEnvironment() = 0;
-
- /**
- * Get llvm settings for this worker.
- */
- virtual const TString& GetLLVMSettings() const = 0;
-
- /**
- * Get YT Type V3 flags
- */
- virtual ui64 GetNativeYtTypeFlags() const = 0;
-
- /**
- * Get time provider
- */
- virtual ITimeProvider* GetTimeProvider() const = 0;
-
- /**
- * Release all input data from worker state
- */
- virtual void Invalidate() = 0;
- };
-
- /**
- * Worker which operates in pull stream mode.
- */
- class IPullStreamWorker: public IWorker {
- public:
- /**
- * Set input computation graph node for specified input. The passed unboxed value should be a stream of
- * structs. It should be created via the allocator associated with this very worker.
- * This function can only be called once for each input.
- */
- virtual void SetInput(NKikimr::NUdf::TUnboxedValue&&, ui32) = 0;
-
- /**
- * Get the output computation graph node. The returned node will be a stream of structs or variants.
- * This function cannot be called before setting an input value.
- */
- virtual NKikimr::NUdf::TUnboxedValue& GetOutput() = 0;
- };
-
- /**
- * Worker which operates in pull list mode.
- */
- class IPullListWorker: public IWorker {
- public:
- /**
- * Set input computation graph node for specified input. The passed unboxed value should be a list of
- * structs. It should be created via the allocator associated with this very worker.
- * This function can only be called once for each index.
- */
- virtual void SetInput(NKikimr::NUdf::TUnboxedValue&&, ui32) = 0;
-
- /**
- * Get the output computation graph node. The returned node will be a list of structs or variants.
- * This function cannot be called before setting an input value.
- */
- virtual NKikimr::NUdf::TUnboxedValue& GetOutput() = 0;
-
- /**
- * Get iterator over the output list.
- */
- virtual NKikimr::NUdf::TUnboxedValue& GetOutputIterator() = 0;
-
- /**
- * Reset iterator to the beginning of the output list. After calling this function, GetOutputIterator()
- * will return a fresh iterator; all previously returned iterators will become invalid.
- */
- virtual void ResetOutputIterator() = 0;
- };
-
- /**
- * Worker which operates in push stream mode.
- */
- class IPushStreamWorker: public IWorker {
- public:
- /**
- * Set a consumer where the worker will relay its output. This function can only be called once.
- */
- virtual void SetConsumer(THolder<IConsumer<const NKikimr::NUdf::TUnboxedValue*>>) = 0;
-
- /**
- * Push new value to the graph, than feed all new output to the consumer. Values cannot be pushed before
- * assigning a consumer.
- */
- virtual void Push(NKikimr::NUdf::TUnboxedValue&&) = 0;
-
- /**
- * Send finish event and clear the computation graph. No new values will be accepted.
- */
- virtual void OnFinish() = 0;
- };
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * Input specifications describe format for program input. They carry information about input data schema
- * as well as the knowledge about how to convert input structures into unboxed values (data format which can be
- * processed by the YQL runtime).
- *
- * Input spec defines the arguments of the program's Apply method. For example, a program
- * with the protobuf input spec will accept a stream of protobuf messages while a program with the
- * yson spec will accept an input stream (binary or text one).
- *
- * See documentation for input and output spec traits for hints on how to implement a custom specs.
- */
- class TInputSpecBase {
- protected:
- mutable TVector<THashMap<TString, NYT::TNode>> AllVirtualColumns_;
-
- public:
- virtual ~TInputSpecBase() = default;
-
- public:
- /**
- * Get input data schemas in YQL format (NB: not a YT format). Each item of the returned vector must
- * describe a structure.
- *
- * Format of each item is approximately this one:
- *
- * @code
- * [
- * 'StructType',
- * [
- * ["Field1Name", ["DataType", "Int32"]],
- * ["Field2Name", ["DataType", "String"]],
- * ...
- * ]
- * ]
- * @endcode
- */
- virtual const TVector<NYT::TNode>& GetSchemas() const = 0;
- // TODO: make a neat schema builder
-
- /**
- * Get virtual columns for each input.
- *
- * Key of each mapping is column name, value is data schema in YQL format.
- */
- const TVector<THashMap<TString, NYT::TNode>>& GetAllVirtualColumns() const {
- if (AllVirtualColumns_.empty()) {
- AllVirtualColumns_ = TVector<THashMap<TString, NYT::TNode>>(GetSchemas().size());
- }
-
- return AllVirtualColumns_;
- }
-
- virtual bool ProvidesBlocks() const { return false; }
- };
-
- /**
- * Output specifications describe format for program output. Like input specifications, they cary knowledge
- * about program output type and how to convert unboxed values into that type.
- */
- class TOutputSpecBase {
- private:
- TMaybe<THashSet<TString>> OutputColumnsFilter_;
-
- public:
- virtual ~TOutputSpecBase() = default;
-
- public:
- /**
- * Get output data schema in YQL format (NB: not a YT format). The returned value must describe a structure
- * or a variant made of structures for fulti-table outputs (note: not all specs support multi-table output).
- *
- * See docs for the input spec's GetSchemas().
- *
- * Also TNode entity could be returned (NYT::TNode::CreateEntity()),
- * in which case output schema would be inferred from query and could be
- * obtained by Program::GetOutputSchema() call.
- */
- virtual const NYT::TNode& GetSchema() const = 0;
-
- /**
- * Get an output columns filter.
- *
- * Output columns filter is a set of column names that should be left in the output. All columns that are
- * not in this set will not be calculated. Depending on the output schema, they will be either removed
- * completely (for optional columns) or filled with defaults (for required columns).
- */
- const TMaybe<THashSet<TString>>& GetOutputColumnsFilter() const {
- return OutputColumnsFilter_;
- }
-
- /**
- * Set new output columns filter.
- */
- void SetOutputColumnsFilter(const TMaybe<THashSet<TString>>& outputColumnsFilter) {
- OutputColumnsFilter_ = outputColumnsFilter;
- }
-
- virtual bool AcceptsBlocks() const { return false; }
- };
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * Input spec traits provide information on how to process program input.
- *
- * Each input spec should create a template specialization for this class, in which it should provide several
- * static variables and functions.
- *
- * For example, a hypothetical example of implementing a JSON input spec would look like this:
- *
- * @code
- * class TJsonInputSpec: public TInputSpecBase {
- * // whatever magic you require for this spec
- * };
- *
- * template <>
- * class TInputSpecTraits<TJsonInputSpec> {
- * // write here four constants, one typedef and three static functions described below
- * };
- * @endcode
- *
- * @tparam T input spec type.
- */
- template <typename T>
- struct TInputSpecTraits {
- /// Safety flag which should be set to false in all template specializations of this class. Attempt to
- /// build a program using a spec with `IsPartial=true` will result in compilation error.
- static const constexpr bool IsPartial = true;
-
- /// Indicates whether this spec supports pull stream mode.
- static const constexpr bool SupportPullStreamMode = false;
- /// Indicates whether this spec supports pull list mode.
- static const constexpr bool SupportPullListMode = false;
- /// Indicates whether this spec supports push stream mode.
- static const constexpr bool SupportPushStreamMode = false;
-
- /// For push mode, indicates the return type of the builder's Process function.
- using TConsumerType = void;
-
- /// For pull stream mode, should take an input spec, a pull stream worker and whatever the user passed
- /// to the program's Apply function, create an unboxed values with a custom stream implementations
- /// and pass it to the worker's SetInput function for each input.
- template <typename ...A>
- static void PreparePullStreamWorker(const T&, IPullStreamWorker*, A&&...) {
- Y_UNREACHABLE();
- }
-
- /// For pull list mode, should take an input spec, a pull list worker and whatever the user passed
- /// to the program's Apply function, create an unboxed values with a custom list implementations
- /// and pass it to the worker's SetInput function for each input.
- template <typename ...A>
- static void PreparePullListWorker(const T&, IPullListWorker*, A&&...) {
- Y_UNREACHABLE();
- }
-
- /// For push stream mode, should take an input spec and a worker and create a consumer which will
- /// be returned to the user. The consumer should keep the worker alive until its own destruction.
- /// The return type of this function should exactly match the one defined in ConsumerType typedef.
- static TConsumerType MakeConsumer(const T&, TWorkerHolder<IPushStreamWorker>) {
- Y_UNREACHABLE();
- }
- };
-
- /**
- * Output spec traits provide information on how to process program output. Like with input specs, each output
- * spec requires an appropriate template specialization of this class.
- *
- * @tparam T output spec type.
- */
- template <typename T>
- struct TOutputSpecTraits {
- /// Safety flag which should be set to false in all template specializations of this class. Attempt to
- /// build a program using a spec with `IsPartial=false` will result in compilation error.
- static const constexpr bool IsPartial = true;
-
- /// Indicates whether this spec supports pull stream mode.
- static const constexpr bool SupportPullStreamMode = false;
- /// Indicates whether this spec supports pull list mode.
- static const constexpr bool SupportPullListMode = false;
- /// Indicates whether this spec supports push stream mode.
- static const constexpr bool SupportPushStreamMode = false;
-
- /// For pull stream mode, indicates the return type of the program's Apply function.
- using TPullStreamReturnType = void;
-
- /// For pull list mode, indicates the return type of the program's Apply function.
- using TPullListReturnType = void;
-
- /// For pull stream mode, should take an output spec and a worker and build a stream which will be returned
- /// to the user. The return type of this function must match the one specified in the PullStreamReturnType.
- static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const T&, TWorkerHolder<IPullStreamWorker>) {
- Y_UNREACHABLE();
- }
-
- /// For pull list mode, should take an output spec and a worker and build a list which will be returned
- /// to the user. The return type of this function must match the one specified in the PullListReturnType.
- static TPullListReturnType ConvertPullListWorkerToOutputType(const T&, TWorkerHolder<IPullListWorker>) {
- Y_UNREACHABLE();
- }
-
- /// For push stream mode, should take an output spec, a worker and whatever arguments the user passed
- /// to the program's Apply function, create a consumer for unboxed values and pass it to the worker's
- /// SetConsumer function.
- template <typename ...A>
- static void SetConsumerToWorker(const T&, IPushStreamWorker*, A&&...) {
- Y_UNREACHABLE();
- }
- };
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////
+ return AllVirtualColumns_;
+ }
+
+ virtual bool ProvidesBlocks() const {
+ return false;
+ }
+};
+
+/**
+ * Output specifications describe format for program output. Like input specifications, they cary knowledge
+ * about program output type and how to convert unboxed values into that type.
+ */
+class TOutputSpecBase {
+private:
+ TMaybe<THashSet<TString>> OutputColumnsFilter_;
+
+public:
+ virtual ~TOutputSpecBase() = default;
+
+public:
+ /**
+ * Get output data schema in YQL format (NB: not a YT format). The returned value must describe a structure
+ * or a variant made of structures for fulti-table outputs (note: not all specs support multi-table output).
+ *
+ * See docs for the input spec's GetSchemas().
+ *
+ * Also TNode entity could be returned (NYT::TNode::CreateEntity()),
+ * in which case output schema would be inferred from query and could be
+ * obtained by Program::GetOutputSchema() call.
+ */
+ virtual const NYT::TNode& GetSchema() const = 0;
+
+ /**
+ * Get an output columns filter.
+ *
+ * Output columns filter is a set of column names that should be left in the output. All columns that are
+ * not in this set will not be calculated. Depending on the output schema, they will be either removed
+ * completely (for optional columns) or filled with defaults (for required columns).
+ */
+ const TMaybe<THashSet<TString>>& GetOutputColumnsFilter() const {
+ return OutputColumnsFilter_;
+ }
+
+ /**
+ * Set new output columns filter.
+ */
+ void SetOutputColumnsFilter(const TMaybe<THashSet<TString>>& outputColumnsFilter) {
+ OutputColumnsFilter_ = outputColumnsFilter;
+ }
+
+ virtual bool AcceptsBlocks() const {
+ return false;
+ }
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Input spec traits provide information on how to process program input.
+ *
+ * Each input spec should create a template specialization for this class, in which it should provide several
+ * static variables and functions.
+ *
+ * For example, a hypothetical example of implementing a JSON input spec would look like this:
+ *
+ * @code
+ * class TJsonInputSpec: public TInputSpecBase {
+ * // whatever magic you require for this spec
+ * };
+ *
+ * template <>
+ * class TInputSpecTraits<TJsonInputSpec> {
+ * // write here four constants, one typedef and three static functions described below
+ * };
+ * @endcode
+ *
+ * @tparam T input spec type.
+ */
+template <typename T>
+struct TInputSpecTraits {
+ /// Safety flag which should be set to false in all template specializations of this class. Attempt to
+ /// build a program using a spec with `IsPartial=true` will result in compilation error.
+ static const constexpr bool IsPartial = true;
+
+ /// Indicates whether this spec supports pull stream mode.
+ static const constexpr bool SupportPullStreamMode = false;
+ /// Indicates whether this spec supports pull list mode.
+ static const constexpr bool SupportPullListMode = false;
+ /// Indicates whether this spec supports push stream mode.
+ static const constexpr bool SupportPushStreamMode = false;
+
+ /// For push mode, indicates the return type of the builder's Process function.
+ using TConsumerType = void;
+
+ /// For pull stream mode, should take an input spec, a pull stream worker and whatever the user passed
+ /// to the program's Apply function, create an unboxed values with a custom stream implementations
+ /// and pass it to the worker's SetInput function for each input.
+ template <typename... A>
+ static void PreparePullStreamWorker(const T&, IPullStreamWorker*, A&&...) {
+ Y_UNREACHABLE();
+ }
+
+ /// For pull list mode, should take an input spec, a pull list worker and whatever the user passed
+ /// to the program's Apply function, create an unboxed values with a custom list implementations
+ /// and pass it to the worker's SetInput function for each input.
+ template <typename... A>
+ static void PreparePullListWorker(const T&, IPullListWorker*, A&&...) {
+ Y_UNREACHABLE();
+ }
+
+ /// For push stream mode, should take an input spec and a worker and create a consumer which will
+ /// be returned to the user. The consumer should keep the worker alive until its own destruction.
+ /// The return type of this function should exactly match the one defined in ConsumerType typedef.
+ static TConsumerType MakeConsumer(const T&, TWorkerHolder<IPushStreamWorker>) {
+ Y_UNREACHABLE();
+ }
+};
+
+/**
+ * Output spec traits provide information on how to process program output. Like with input specs, each output
+ * spec requires an appropriate template specialization of this class.
+ *
+ * @tparam T output spec type.
+ */
+template <typename T>
+struct TOutputSpecTraits {
+ /// Safety flag which should be set to false in all template specializations of this class. Attempt to
+ /// build a program using a spec with `IsPartial=false` will result in compilation error.
+ static const constexpr bool IsPartial = true;
+
+ /// Indicates whether this spec supports pull stream mode.
+ static const constexpr bool SupportPullStreamMode = false;
+ /// Indicates whether this spec supports pull list mode.
+ static const constexpr bool SupportPullListMode = false;
+ /// Indicates whether this spec supports push stream mode.
+ static const constexpr bool SupportPushStreamMode = false;
+
+ /// For pull stream mode, indicates the return type of the program's Apply function.
+ using TPullStreamReturnType = void;
+
+ /// For pull list mode, indicates the return type of the program's Apply function.
+ using TPullListReturnType = void;
+
+ /// For pull stream mode, should take an output spec and a worker and build a stream which will be returned
+ /// to the user. The return type of this function must match the one specified in the PullStreamReturnType.
+ static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const T&, TWorkerHolder<IPullStreamWorker>) {
+ Y_UNREACHABLE();
+ }
+
+ /// For pull list mode, should take an output spec and a worker and build a list which will be returned
+ /// to the user. The return type of this function must match the one specified in the PullListReturnType.
+ static TPullListReturnType ConvertPullListWorkerToOutputType(const T&, TWorkerHolder<IPullListWorker>) {
+ Y_UNREACHABLE();
+ }
+
+ /// For push stream mode, should take an output spec, a worker and whatever arguments the user passed
+ /// to the program's Apply function, create a consumer for unboxed values and pass it to the worker's
+ /// SetConsumer function.
+ template <typename... A>
+ static void SetConsumerToWorker(const T&, IPushStreamWorker*, A&&...) {
+ Y_UNREACHABLE();
+ }
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
#define NOT_SPEC_MSG(spec_type) "passed class should be derived from " spec_type " spec base"
#define PARTIAL_SPEC_MSG(spec_type) "this " spec_type " spec does not define its traits. Make sure you've passed " \
@@ -996,204 +996,203 @@ namespace NYql {
"a spec traits template specialization"
#define UNSUPPORTED_MODE_MSG(spec_type, mode) "this " spec_type " spec does not support " mode " mode"
- class IProgram {
- public:
- virtual ~IProgram() = default;
-
- public:
- virtual const TInputSpecBase& GetInputSpecBase() const = 0;
- virtual const TOutputSpecBase& GetOutputSpecBase() const = 0;
- virtual const THashSet<TString>& GetUsedColumns(ui32) const = 0;
- virtual const THashSet<TString>& GetUsedColumns() const = 0;
- virtual NYT::TNode MakeInputSchema(ui32) const = 0;
- virtual NYT::TNode MakeInputSchema() const = 0;
- virtual NYT::TNode MakeOutputSchema() const = 0;
- virtual NYT::TNode MakeOutputSchema(ui32) const = 0;
- virtual NYT::TNode MakeOutputSchema(TStringBuf) const = 0;
- virtual NYT::TNode MakeFullOutputSchema() const = 0;
- virtual TIssues GetIssues() const = 0;
- virtual TString GetCompiledProgram() = 0;
-
- inline void MergeUsedColumns(THashSet<TString>& columns, ui32 inputIndex) {
- const auto& usedColumns = GetUsedColumns(inputIndex);
- columns.insert(usedColumns.begin(), usedColumns.end());
- }
-
- inline void MergeUsedColumns(THashSet<TString>& columns) {
- const auto& usedColumns = GetUsedColumns();
- columns.insert(usedColumns.begin(), usedColumns.end());
- }
- };
-
- template <typename TInputSpec, typename TOutputSpec, typename WorkerFactory>
- class TProgramCommon: public IProgram {
- static_assert(std::is_base_of<TInputSpecBase, TInputSpec>::value, NOT_SPEC_MSG("input"));
- static_assert(std::is_base_of<TOutputSpecBase, TOutputSpec>::value, NOT_SPEC_MSG("output"));
-
- protected:
- TInputSpec InputSpec_;
- TOutputSpec OutputSpec_;
- std::shared_ptr<WorkerFactory> WorkerFactory_;
-
- public:
- explicit TProgramCommon(
- TInputSpec inputSpec,
- TOutputSpec outputSpec,
- std::shared_ptr<WorkerFactory> workerFactory
- )
- : InputSpec_(inputSpec)
- , OutputSpec_(outputSpec)
- , WorkerFactory_(std::move(workerFactory))
- {
- }
-
- public:
- const TInputSpec& GetInputSpec() const {
- return InputSpec_;
- }
-
- const TOutputSpec& GetOutputSpec() const {
- return OutputSpec_;
- }
-
- const TInputSpecBase& GetInputSpecBase() const override {
- return InputSpec_;
- }
-
- const TOutputSpecBase& GetOutputSpecBase() const override {
- return OutputSpec_;
- }
-
- const THashSet<TString>& GetUsedColumns(ui32 inputIndex) const override {
- return WorkerFactory_->GetUsedColumns(inputIndex);
- }
-
- const THashSet<TString>& GetUsedColumns() const override {
- return WorkerFactory_->GetUsedColumns();
- }
-
- NYT::TNode MakeInputSchema(ui32 inputIndex) const override {
- return WorkerFactory_->MakeInputSchema(inputIndex);
- }
-
- NYT::TNode MakeInputSchema() const override {
- return WorkerFactory_->MakeInputSchema();
- }
-
- NYT::TNode MakeOutputSchema() const override {
- return WorkerFactory_->MakeOutputSchema();
- }
-
- NYT::TNode MakeOutputSchema(ui32 outputIndex) const override {
- return WorkerFactory_->MakeOutputSchema(outputIndex);
- }
-
- NYT::TNode MakeOutputSchema(TStringBuf outputName) const override {
- return WorkerFactory_->MakeOutputSchema(outputName);
- }
-
- NYT::TNode MakeFullOutputSchema() const override {
- return WorkerFactory_->MakeFullOutputSchema();
- }
-
- TIssues GetIssues() const override {
- return WorkerFactory_->GetIssues();
- }
-
- TString GetCompiledProgram() override {
- return WorkerFactory_->GetCompiledProgram();
- }
- };
-
- template <typename TInputSpec, typename TOutputSpec>
- class TPullStreamProgram final: public TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory> {
- using TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory>::WorkerFactory_;
- using TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory>::InputSpec_;
- using TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory>::OutputSpec_;
-
- public:
- using TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory>::TProgramCommon;
-
- public:
- template <typename ...T>
- typename TOutputSpecTraits<TOutputSpec>::TPullStreamReturnType Apply(T&& ... t) {
- static_assert(!TInputSpecTraits<TInputSpec>::IsPartial, PARTIAL_SPEC_MSG("input"));
- static_assert(!TOutputSpecTraits<TOutputSpec>::IsPartial, PARTIAL_SPEC_MSG("output"));
- static_assert(TInputSpecTraits<TInputSpec>::SupportPullStreamMode, UNSUPPORTED_MODE_MSG("input", "pull stream"));
- static_assert(TOutputSpecTraits<TOutputSpec>::SupportPullStreamMode, UNSUPPORTED_MODE_MSG("output", "pull stream"));
-
- auto worker = WorkerFactory_->MakeWorker();
- TInputSpecTraits<TInputSpec>::PreparePullStreamWorker(InputSpec_, worker.Get(), std::forward<T>(t)...);
- return TOutputSpecTraits<TOutputSpec>::ConvertPullStreamWorkerToOutputType(OutputSpec_, std::move(worker));
- }
- };
-
- template <typename TInputSpec, typename TOutputSpec>
- class TPullListProgram final: public TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory> {
- using TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory>::WorkerFactory_;
- using TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory>::InputSpec_;
- using TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory>::OutputSpec_;
-
- public:
- using TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory>::TProgramCommon;
-
- public:
- template <typename ...T>
- typename TOutputSpecTraits<TOutputSpec>::TPullListReturnType Apply(T&& ... t) {
- static_assert(!TInputSpecTraits<TInputSpec>::IsPartial, PARTIAL_SPEC_MSG("input"));
- static_assert(!TOutputSpecTraits<TOutputSpec>::IsPartial, PARTIAL_SPEC_MSG("output"));
- static_assert(TInputSpecTraits<TInputSpec>::SupportPullListMode, UNSUPPORTED_MODE_MSG("input", "pull list"));
- static_assert(TOutputSpecTraits<TOutputSpec>::SupportPullListMode, UNSUPPORTED_MODE_MSG("output", "pull list"));
-
- auto worker = WorkerFactory_->MakeWorker();
- TInputSpecTraits<TInputSpec>::PreparePullListWorker(InputSpec_, worker.Get(), std::forward<T>(t)...);
- return TOutputSpecTraits<TOutputSpec>::ConvertPullListWorkerToOutputType(OutputSpec_, std::move(worker));
- }
- };
-
- template <typename TInputSpec, typename TOutputSpec>
- class TPushStreamProgram final: public TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory> {
- using TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory>::WorkerFactory_;
- using TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory>::InputSpec_;
- using TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory>::OutputSpec_;
-
- public:
- using TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory>::TProgramCommon;
-
- public:
- template <typename ...T>
- typename TInputSpecTraits<TInputSpec>::TConsumerType Apply(T&& ... t) {
- static_assert(!TInputSpecTraits<TInputSpec>::IsPartial, PARTIAL_SPEC_MSG("input"));
- static_assert(!TOutputSpecTraits<TOutputSpec>::IsPartial, PARTIAL_SPEC_MSG("output"));
- static_assert(TInputSpecTraits<TInputSpec>::SupportPushStreamMode, UNSUPPORTED_MODE_MSG("input", "push stream"));
- static_assert(TOutputSpecTraits<TOutputSpec>::SupportPushStreamMode, UNSUPPORTED_MODE_MSG("output", "push stream"));
-
- auto worker = WorkerFactory_->MakeWorker();
- TOutputSpecTraits<TOutputSpec>::SetConsumerToWorker(OutputSpec_, worker.Get(), std::forward<T>(t)...);
- return TInputSpecTraits<TInputSpec>::MakeConsumer(InputSpec_, std::move(worker));
- }
- };
+class IProgram {
+public:
+ virtual ~IProgram() = default;
+
+public:
+ virtual const TInputSpecBase& GetInputSpecBase() const = 0;
+ virtual const TOutputSpecBase& GetOutputSpecBase() const = 0;
+ virtual const THashSet<TString>& GetUsedColumns(ui32) const = 0;
+ virtual const THashSet<TString>& GetUsedColumns() const = 0;
+ virtual NYT::TNode MakeInputSchema(ui32) const = 0;
+ virtual NYT::TNode MakeInputSchema() const = 0;
+ virtual NYT::TNode MakeOutputSchema() const = 0;
+ virtual NYT::TNode MakeOutputSchema(ui32) const = 0;
+ virtual NYT::TNode MakeOutputSchema(TStringBuf) const = 0;
+ virtual NYT::TNode MakeFullOutputSchema() const = 0;
+ virtual TIssues GetIssues() const = 0;
+ virtual TString GetCompiledProgram() = 0;
+
+ inline void MergeUsedColumns(THashSet<TString>& columns, ui32 inputIndex) {
+ const auto& usedColumns = GetUsedColumns(inputIndex);
+ columns.insert(usedColumns.begin(), usedColumns.end());
+ }
+
+ inline void MergeUsedColumns(THashSet<TString>& columns) {
+ const auto& usedColumns = GetUsedColumns();
+ columns.insert(usedColumns.begin(), usedColumns.end());
+ }
+};
+
+template <typename TInputSpec, typename TOutputSpec, typename WorkerFactory>
+class TProgramCommon: public IProgram {
+ static_assert(std::is_base_of<TInputSpecBase, TInputSpec>::value, NOT_SPEC_MSG("input"));
+ static_assert(std::is_base_of<TOutputSpecBase, TOutputSpec>::value, NOT_SPEC_MSG("output"));
+
+protected:
+ TInputSpec InputSpec_;
+ TOutputSpec OutputSpec_;
+ std::shared_ptr<WorkerFactory> WorkerFactory_;
+
+public:
+ explicit TProgramCommon(
+ TInputSpec inputSpec,
+ TOutputSpec outputSpec,
+ std::shared_ptr<WorkerFactory> workerFactory)
+ : InputSpec_(inputSpec)
+ , OutputSpec_(outputSpec)
+ , WorkerFactory_(std::move(workerFactory))
+ {
+ }
+
+public:
+ const TInputSpec& GetInputSpec() const {
+ return InputSpec_;
+ }
+
+ const TOutputSpec& GetOutputSpec() const {
+ return OutputSpec_;
+ }
+
+ const TInputSpecBase& GetInputSpecBase() const override {
+ return InputSpec_;
+ }
+
+ const TOutputSpecBase& GetOutputSpecBase() const override {
+ return OutputSpec_;
+ }
+
+ const THashSet<TString>& GetUsedColumns(ui32 inputIndex) const override {
+ return WorkerFactory_->GetUsedColumns(inputIndex);
+ }
+
+ const THashSet<TString>& GetUsedColumns() const override {
+ return WorkerFactory_->GetUsedColumns();
+ }
+
+ NYT::TNode MakeInputSchema(ui32 inputIndex) const override {
+ return WorkerFactory_->MakeInputSchema(inputIndex);
+ }
+
+ NYT::TNode MakeInputSchema() const override {
+ return WorkerFactory_->MakeInputSchema();
+ }
+
+ NYT::TNode MakeOutputSchema() const override {
+ return WorkerFactory_->MakeOutputSchema();
+ }
+
+ NYT::TNode MakeOutputSchema(ui32 outputIndex) const override {
+ return WorkerFactory_->MakeOutputSchema(outputIndex);
+ }
+
+ NYT::TNode MakeOutputSchema(TStringBuf outputName) const override {
+ return WorkerFactory_->MakeOutputSchema(outputName);
+ }
+
+ NYT::TNode MakeFullOutputSchema() const override {
+ return WorkerFactory_->MakeFullOutputSchema();
+ }
+
+ TIssues GetIssues() const override {
+ return WorkerFactory_->GetIssues();
+ }
+
+ TString GetCompiledProgram() override {
+ return WorkerFactory_->GetCompiledProgram();
+ }
+};
+
+template <typename TInputSpec, typename TOutputSpec>
+class TPullStreamProgram final: public TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory> {
+ using TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory>::WorkerFactory_;
+ using TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory>::InputSpec_;
+ using TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory>::OutputSpec_;
+
+public:
+ using TProgramCommon<TInputSpec, TOutputSpec, IPullStreamWorkerFactory>::TProgramCommon;
+
+public:
+ template <typename... T>
+ typename TOutputSpecTraits<TOutputSpec>::TPullStreamReturnType Apply(T&&... t) {
+ static_assert(!TInputSpecTraits<TInputSpec>::IsPartial, PARTIAL_SPEC_MSG("input"));
+ static_assert(!TOutputSpecTraits<TOutputSpec>::IsPartial, PARTIAL_SPEC_MSG("output"));
+ static_assert(TInputSpecTraits<TInputSpec>::SupportPullStreamMode, UNSUPPORTED_MODE_MSG("input", "pull stream"));
+ static_assert(TOutputSpecTraits<TOutputSpec>::SupportPullStreamMode, UNSUPPORTED_MODE_MSG("output", "pull stream"));
+
+ auto worker = WorkerFactory_->MakeWorker();
+ TInputSpecTraits<TInputSpec>::PreparePullStreamWorker(InputSpec_, worker.Get(), std::forward<T>(t)...);
+ return TOutputSpecTraits<TOutputSpec>::ConvertPullStreamWorkerToOutputType(OutputSpec_, std::move(worker));
+ }
+};
+
+template <typename TInputSpec, typename TOutputSpec>
+class TPullListProgram final: public TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory> {
+ using TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory>::WorkerFactory_;
+ using TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory>::InputSpec_;
+ using TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory>::OutputSpec_;
+
+public:
+ using TProgramCommon<TInputSpec, TOutputSpec, IPullListWorkerFactory>::TProgramCommon;
+
+public:
+ template <typename... T>
+ typename TOutputSpecTraits<TOutputSpec>::TPullListReturnType Apply(T&&... t) {
+ static_assert(!TInputSpecTraits<TInputSpec>::IsPartial, PARTIAL_SPEC_MSG("input"));
+ static_assert(!TOutputSpecTraits<TOutputSpec>::IsPartial, PARTIAL_SPEC_MSG("output"));
+ static_assert(TInputSpecTraits<TInputSpec>::SupportPullListMode, UNSUPPORTED_MODE_MSG("input", "pull list"));
+ static_assert(TOutputSpecTraits<TOutputSpec>::SupportPullListMode, UNSUPPORTED_MODE_MSG("output", "pull list"));
+
+ auto worker = WorkerFactory_->MakeWorker();
+ TInputSpecTraits<TInputSpec>::PreparePullListWorker(InputSpec_, worker.Get(), std::forward<T>(t)...);
+ return TOutputSpecTraits<TOutputSpec>::ConvertPullListWorkerToOutputType(OutputSpec_, std::move(worker));
+ }
+};
+
+template <typename TInputSpec, typename TOutputSpec>
+class TPushStreamProgram final: public TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory> {
+ using TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory>::WorkerFactory_;
+ using TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory>::InputSpec_;
+ using TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory>::OutputSpec_;
+
+public:
+ using TProgramCommon<TInputSpec, TOutputSpec, IPushStreamWorkerFactory>::TProgramCommon;
+
+public:
+ template <typename... T>
+ typename TInputSpecTraits<TInputSpec>::TConsumerType Apply(T&&... t) {
+ static_assert(!TInputSpecTraits<TInputSpec>::IsPartial, PARTIAL_SPEC_MSG("input"));
+ static_assert(!TOutputSpecTraits<TOutputSpec>::IsPartial, PARTIAL_SPEC_MSG("output"));
+ static_assert(TInputSpecTraits<TInputSpec>::SupportPushStreamMode, UNSUPPORTED_MODE_MSG("input", "push stream"));
+ static_assert(TOutputSpecTraits<TOutputSpec>::SupportPushStreamMode, UNSUPPORTED_MODE_MSG("output", "push stream"));
+
+ auto worker = WorkerFactory_->MakeWorker();
+ TOutputSpecTraits<TOutputSpec>::SetConsumerToWorker(OutputSpec_, worker.Get(), std::forward<T>(t)...);
+ return TInputSpecTraits<TInputSpec>::MakeConsumer(InputSpec_, std::move(worker));
+ }
+};
#undef NOT_SPEC_MSG
#undef PARTIAL_SPEC_MSG
#undef UNSUPPORTED_MODE_MSG
- ////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
- /**
- * Configure global logging facilities. Affects all YQL modules.
- */
- void ConfigureLogging(const TLoggingOptions& = {});
+/**
+ * Configure global logging facilities. Affects all YQL modules.
+ */
+void ConfigureLogging(const TLoggingOptions& = {});
- /**
- * Create a new program factory.
- * Custom logging initialization could be preformed by a call to the ConfigureLogging method beforehand.
- * If the ConfigureLogging method has not been called the default logging initialization will be performed.
- */
- IProgramFactoryPtr MakeProgramFactory(const TProgramFactoryOptions& = {});
- }
-}
+/**
+ * Create a new program factory.
+ * Custom logging initialization could be preformed by a call to the ConfigureLogging method beforehand.
+ * If the ConfigureLogging method has not been called the default logging initialization will be performed.
+ */
+IProgramFactoryPtr MakeProgramFactory(const TProgramFactoryOptions& = {});
+} // namespace NPureCalc
+} // namespace NYql
Y_DECLARE_OUT_SPEC(inline, NYql::NPureCalc::TCompileError, stream, value) {
- stream << value.AsStrBuf() << Endl << "Issues:" << Endl << value.GetIssues() << Endl << Endl << "Yql:" << Endl <<value.GetYql();
+ stream << value.AsStrBuf() << Endl << "Issues:" << Endl << value.GetIssues() << Endl << Endl << "Yql:" << Endl << value.GetYql();
}
diff --git a/yql/essentials/public/purecalc/common/logger_init.cpp b/yql/essentials/public/purecalc/common/logger_init.cpp
index 0c1e53d0338..ec3f66140bb 100644
--- a/yql/essentials/public/purecalc/common/logger_init.cpp
+++ b/yql/essentials/public/purecalc/common/logger_init.cpp
@@ -8,25 +8,25 @@ namespace NYql {
namespace NPureCalc {
namespace {
- std::atomic_bool Initialized;
-}
+std::atomic_bool Initialized;
+} // namespace
- void InitLogging(const TLoggingOptions& options) {
- NLog::InitLogger(options.LogDestination);
- auto& logger = NLog::YqlLogger();
- logger.SetDefaultPriority(options.LogLevel);
- for (int i = 0; i < NLog::EComponentHelpers::ToInt(NLog::EComponent::MaxValue); ++i) {
- logger.SetComponentLevel((NLog::EComponent) i, (NLog::ELevel) options.LogLevel);
- }
- Initialized = true;
+void InitLogging(const TLoggingOptions& options) {
+ NLog::InitLogger(options.LogDestination);
+ auto& logger = NLog::YqlLogger();
+ logger.SetDefaultPriority(options.LogLevel);
+ for (int i = 0; i < NLog::EComponentHelpers::ToInt(NLog::EComponent::MaxValue); ++i) {
+ logger.SetComponentLevel((NLog::EComponent)i, (NLog::ELevel)options.LogLevel);
}
+ Initialized = true;
+}
- void EnsureLoggingInitialized() {
- if (Initialized.load()) {
- return;
- }
- InitLogging(TLoggingOptions());
+void EnsureLoggingInitialized() {
+ if (Initialized.load()) {
+ return;
}
-
-}
+ InitLogging(TLoggingOptions());
}
+
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/logger_init.h b/yql/essentials/public/purecalc/common/logger_init.h
index 039cbd44118..349d74b0025 100644
--- a/yql/essentials/public/purecalc/common/logger_init.h
+++ b/yql/essentials/public/purecalc/common/logger_init.h
@@ -3,8 +3,8 @@
#include "interface.h"
namespace NYql {
- namespace NPureCalc {
- void InitLogging(const TLoggingOptions& options);
- void EnsureLoggingInitialized();
- }
-}
+namespace NPureCalc {
+void InitLogging(const TLoggingOptions& options);
+void EnsureLoggingInitialized();
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/names.cpp b/yql/essentials/public/purecalc/common/names.cpp
index 5e8412a7b22..b678969daf6 100644
--- a/yql/essentials/public/purecalc/common/names.cpp
+++ b/yql/essentials/public/purecalc/common/names.cpp
@@ -3,17 +3,17 @@
#include <util/generic/strbuf.h>
namespace NYql::NPureCalc {
- const TStringBuf PurecalcSysColumnsPrefix = "_yql_sys_";
- const TStringBuf PurecalcSysColumnTablePath = "_yql_sys_tablepath";
- const TStringBuf PurecalcBlockColumnLength = "_yql_block_length";
+const TStringBuf PurecalcSysColumnsPrefix = "_yql_sys_";
+const TStringBuf PurecalcSysColumnTablePath = "_yql_sys_tablepath";
+const TStringBuf PurecalcBlockColumnLength = "_yql_block_length";
- const TStringBuf PurecalcDefaultCluster = "view";
- const TStringBuf PurecalcDefaultService = "data";
+const TStringBuf PurecalcDefaultCluster = "view";
+const TStringBuf PurecalcDefaultService = "data";
- const TStringBuf PurecalcInputCallableName = "Self";
- const TStringBuf PurecalcInputTablePrefix = "Input";
+const TStringBuf PurecalcInputCallableName = "Self";
+const TStringBuf PurecalcInputTablePrefix = "Input";
- const TStringBuf PurecalcBlockInputCallableName = "BlockSelf";
+const TStringBuf PurecalcBlockInputCallableName = "BlockSelf";
- const TStringBuf PurecalcUdfModulePrefix = "<purecalc>::";
-}
+const TStringBuf PurecalcUdfModulePrefix = "<purecalc>::";
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/names.h b/yql/essentials/public/purecalc/common/names.h
index b19c15ca4fe..fccfe7caad8 100644
--- a/yql/essentials/public/purecalc/common/names.h
+++ b/yql/essentials/public/purecalc/common/names.h
@@ -3,17 +3,17 @@
#include <util/generic/fwd.h>
namespace NYql::NPureCalc {
- extern const TStringBuf PurecalcSysColumnsPrefix;
- extern const TStringBuf PurecalcSysColumnTablePath;
- extern const TStringBuf PurecalcBlockColumnLength;
+extern const TStringBuf PurecalcSysColumnsPrefix;
+extern const TStringBuf PurecalcSysColumnTablePath;
+extern const TStringBuf PurecalcBlockColumnLength;
- extern const TStringBuf PurecalcDefaultCluster;
- extern const TStringBuf PurecalcDefaultService;
+extern const TStringBuf PurecalcDefaultCluster;
+extern const TStringBuf PurecalcDefaultService;
- extern const TStringBuf PurecalcInputCallableName;
- extern const TStringBuf PurecalcInputTablePrefix;
+extern const TStringBuf PurecalcInputCallableName;
+extern const TStringBuf PurecalcInputTablePrefix;
- extern const TStringBuf PurecalcBlockInputCallableName;
+extern const TStringBuf PurecalcBlockInputCallableName;
- extern const TStringBuf PurecalcUdfModulePrefix;
-}
+extern const TStringBuf PurecalcUdfModulePrefix;
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/processor_mode.h b/yql/essentials/public/purecalc/common/processor_mode.h
index 9bec87cadc9..49368c81c11 100644
--- a/yql/essentials/public/purecalc/common/processor_mode.h
+++ b/yql/essentials/public/purecalc/common/processor_mode.h
@@ -1,11 +1,11 @@
#pragma once
namespace NYql {
- namespace NPureCalc {
- enum class EProcessorMode {
- PullList,
- PullStream,
- PushStream
- };
- }
-}
+namespace NPureCalc {
+enum class EProcessorMode {
+ PullList,
+ PullStream,
+ PushStream
+};
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/program_factory.cpp b/yql/essentials/public/purecalc/common/program_factory.cpp
index 320d1b6aa8a..1096f6acc4f 100644
--- a/yql/essentials/public/purecalc/common/program_factory.cpp
+++ b/yql/essentials/public/purecalc/common/program_factory.cpp
@@ -33,11 +33,10 @@ TProgramFactory::TProgramFactory(const TProgramFactoryOptions& options)
}
TVector<TString> UDFsPaths;
- for (const auto& item: Options_.UserData) {
+ for (const auto& item : Options_.UserData) {
if (
item.Type == NUserData::EType::UDF &&
- item.Disposition == NUserData::EDisposition::FILESYSTEM
- ) {
+ item.Disposition == NUserData::EDisposition::FILESYSTEM) {
UDFsPaths.push_back(item.Content);
}
}
@@ -47,7 +46,8 @@ TProgramFactory::TProgramFactory(const TProgramFactoryOptions& options)
}
FuncRegistry_ = NKikimr::NMiniKQL::CreateFunctionRegistry(
- &NYql::NBacktrace::KikimrBackTrace, NKikimr::NMiniKQL::CreateBuiltinRegistry(), false, UDFsPaths)->Clone();
+ &NYql::NBacktrace::KikimrBackTrace, NKikimr::NMiniKQL::CreateBuiltinRegistry(), false, UDFsPaths)
+ ->Clone();
NKikimr::NMiniKQL::FillStaticModules(*FuncRegistry_);
}
@@ -57,11 +57,9 @@ TProgramFactory::~TProgramFactory() {
void TProgramFactory::AddUdfModule(
const TStringBuf& moduleName,
- NKikimr::NUdf::TUniquePtr<NKikimr::NUdf::IUdfModule>&& module
-) {
+ NKikimr::NUdf::TUniquePtr<NKikimr::NUdf::IUdfModule>&& module) {
FuncRegistry_->AddModule(
- TString::Join(PurecalcUdfModulePrefix, moduleName), moduleName, std::move(module)
- );
+ TString::Join(PurecalcUdfModulePrefix, moduleName), moduleName, std::move(module));
}
void TProgramFactory::SetCountersProvider(NKikimr::NUdf::ICountersProvider* provider) {
@@ -73,8 +71,7 @@ IPullStreamWorkerFactoryPtr TProgramFactory::MakePullStreamWorkerFactory(
const TOutputSpecBase& outputSpec,
TString query,
ETranslationMode mode,
- ui16 syntaxVersion
-) {
+ ui16 syntaxVersion) {
return std::make_shared<TPullStreamWorkerFactory>(TWorkerFactoryOptions(
TIntrusivePtr<TProgramFactory>(this),
inputSpec,
@@ -95,8 +92,7 @@ IPullStreamWorkerFactoryPtr TProgramFactory::MakePullStreamWorkerFactory(
Options_.DeterministicTimeProviderSeed,
Options_.UseSystemColumns,
Options_.UseWorkerPool,
- Options_.UseAntlr4
- ));
+ Options_.UseAntlr4));
}
IPullListWorkerFactoryPtr TProgramFactory::MakePullListWorkerFactory(
@@ -104,8 +100,7 @@ IPullListWorkerFactoryPtr TProgramFactory::MakePullListWorkerFactory(
const TOutputSpecBase& outputSpec,
TString query,
ETranslationMode mode,
- ui16 syntaxVersion
-) {
+ ui16 syntaxVersion) {
return std::make_shared<TPullListWorkerFactory>(TWorkerFactoryOptions(
TIntrusivePtr<TProgramFactory>(this),
inputSpec,
@@ -126,8 +121,7 @@ IPullListWorkerFactoryPtr TProgramFactory::MakePullListWorkerFactory(
Options_.DeterministicTimeProviderSeed,
Options_.UseSystemColumns,
Options_.UseWorkerPool,
- Options_.UseAntlr4
- ));
+ Options_.UseAntlr4));
}
IPushStreamWorkerFactoryPtr TProgramFactory::MakePushStreamWorkerFactory(
@@ -135,8 +129,7 @@ IPushStreamWorkerFactoryPtr TProgramFactory::MakePushStreamWorkerFactory(
const TOutputSpecBase& outputSpec,
TString query,
ETranslationMode mode,
- ui16 syntaxVersion
-) {
+ ui16 syntaxVersion) {
if (inputSpec.GetSchemas().size() > 1) {
ythrow yexception() << "push stream mode doesn't support several inputs";
}
@@ -161,6 +154,5 @@ IPushStreamWorkerFactoryPtr TProgramFactory::MakePushStreamWorkerFactory(
Options_.DeterministicTimeProviderSeed,
Options_.UseSystemColumns,
Options_.UseWorkerPool,
- Options_.UseAntlr4
- ));
+ Options_.UseAntlr4));
}
diff --git a/yql/essentials/public/purecalc/common/program_factory.h b/yql/essentials/public/purecalc/common/program_factory.h
index 278d3e05a6a..e46de24d9ee 100644
--- a/yql/essentials/public/purecalc/common/program_factory.h
+++ b/yql/essentials/public/purecalc/common/program_factory.h
@@ -15,34 +15,33 @@
#include <util/generic/strbuf.h>
namespace NYql {
- namespace NPureCalc {
- class TProgramFactory: public IProgramFactory {
- private:
- TProgramFactoryOptions Options_;
- TExprContext ExprContext_;
- TIntrusivePtr<NKikimr::NMiniKQL::IMutableFunctionRegistry> FuncRegistry_;
- IModuleResolver::TPtr ModuleResolver_;
- TUserDataTable UserData_;
- EBlockEngineMode BlockEngineMode_;
- IOutputStream* ExprOutputStream_;
- THashMap<TString, TString> Modules_;
- NKikimr::NUdf::ICountersProvider* CountersProvider_;
-
- public:
- explicit TProgramFactory(const TProgramFactoryOptions&);
- ~TProgramFactory() override;
-
- public:
- void AddUdfModule(
- const TStringBuf& moduleName,
- NKikimr::NUdf::TUniquePtr<NKikimr::NUdf::IUdfModule>&& module
- ) override;
-
- void SetCountersProvider(NKikimr::NUdf::ICountersProvider* provider) override;
-
- IPullStreamWorkerFactoryPtr MakePullStreamWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) override;
- IPullListWorkerFactoryPtr MakePullListWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) override;
- IPushStreamWorkerFactoryPtr MakePushStreamWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) override;
- };
- }
-}
+namespace NPureCalc {
+class TProgramFactory: public IProgramFactory {
+private:
+ TProgramFactoryOptions Options_;
+ TExprContext ExprContext_;
+ TIntrusivePtr<NKikimr::NMiniKQL::IMutableFunctionRegistry> FuncRegistry_;
+ IModuleResolver::TPtr ModuleResolver_;
+ TUserDataTable UserData_;
+ EBlockEngineMode BlockEngineMode_;
+ IOutputStream* ExprOutputStream_;
+ THashMap<TString, TString> Modules_;
+ NKikimr::NUdf::ICountersProvider* CountersProvider_;
+
+public:
+ explicit TProgramFactory(const TProgramFactoryOptions&);
+ ~TProgramFactory() override;
+
+public:
+ void AddUdfModule(
+ const TStringBuf& moduleName,
+ NKikimr::NUdf::TUniquePtr<NKikimr::NUdf::IUdfModule>&& module) override;
+
+ void SetCountersProvider(NKikimr::NUdf::ICountersProvider* provider) override;
+
+ IPullStreamWorkerFactoryPtr MakePullStreamWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) override;
+ IPullListWorkerFactoryPtr MakePullListWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) override;
+ IPushStreamWorkerFactoryPtr MakePushStreamWorkerFactory(const TInputSpecBase&, const TOutputSpecBase&, TString, ETranslationMode, ui16) override;
+};
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/transformations/align_output_schema.cpp b/yql/essentials/public/purecalc/common/transformations/align_output_schema.cpp
index f11195bf756..47806d6846e 100644
--- a/yql/essentials/public/purecalc/common/transformations/align_output_schema.cpp
+++ b/yql/essentials/public/purecalc/common/transformations/align_output_schema.cpp
@@ -10,117 +10,115 @@ using namespace NYql;
using namespace NYql::NPureCalc;
namespace {
- class TOutputAligner : public TSyncTransformerBase {
- private:
- const TTypeAnnotationNode* OutputStruct_;
- bool AcceptsBlocks_;
- EProcessorMode ProcessorMode_;
- const TTypeAnnotationContext& TypeCtx_;
-
- public:
- explicit TOutputAligner(
- const TTypeAnnotationNode* outputStruct,
- bool acceptsBlocks,
- EProcessorMode processorMode,
- const TTypeAnnotationContext& typeCtx
- )
- : OutputStruct_(outputStruct)
- , AcceptsBlocks_(acceptsBlocks)
- , ProcessorMode_(processorMode)
- , TypeCtx_(typeCtx)
- {
- }
-
- public:
- TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
- output = input;
-
- const auto* expectedType = MakeExpectedType(ctx);
- const auto* expectedItemType = MakeExpectedItemType();
- const auto* actualType = MakeActualType(input);
- const auto* actualItemType = MakeActualItemType(input);
-
- // XXX: Tweak the obtained expression type, is the spec supports blocks:
- // 1. Remove "_yql_block_length" attribute, since it's for internal usage.
- // 2. Strip block container from the type to store its internal type.
- if (AcceptsBlocks_) {
- Y_ENSURE(actualItemType->GetKind() == ETypeAnnotationKind::Struct);
- actualItemType = UnwrapBlockStruct(actualItemType->Cast<TStructExprType>(), ctx);
- if (ProcessorMode_ == EProcessorMode::PullList) {
- actualType = ctx.MakeType<TListExprType>(actualItemType);
- } else {
- actualType = ctx.MakeType<TStreamExprType>(actualItemType);
- }
- }
-
- if (!ValidateOutputType(actualItemType, expectedItemType, ctx, TypeCtx_)) {
- return TStatus::Error;
- }
-
- if (!expectedType) {
- return TStatus::Ok;
- }
-
- auto status = TryConvertTo(output, *actualType, *expectedType, ctx, TypeCtx_);
-
- if (status.Level == IGraphTransformer::TStatus::Repeat) {
- status = IGraphTransformer::TStatus(IGraphTransformer::TStatus::Repeat, true);
+class TOutputAligner: public TSyncTransformerBase {
+private:
+ const TTypeAnnotationNode* OutputStruct_;
+ bool AcceptsBlocks_;
+ EProcessorMode ProcessorMode_;
+ const TTypeAnnotationContext& TypeCtx_;
+
+public:
+ explicit TOutputAligner(
+ const TTypeAnnotationNode* outputStruct,
+ bool acceptsBlocks,
+ EProcessorMode processorMode,
+ const TTypeAnnotationContext& typeCtx)
+ : OutputStruct_(outputStruct)
+ , AcceptsBlocks_(acceptsBlocks)
+ , ProcessorMode_(processorMode)
+ , TypeCtx_(typeCtx)
+ {
+ }
+
+public:
+ TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ output = input;
+
+ const auto* expectedType = MakeExpectedType(ctx);
+ const auto* expectedItemType = MakeExpectedItemType();
+ const auto* actualType = MakeActualType(input);
+ const auto* actualItemType = MakeActualItemType(input);
+
+ // XXX: Tweak the obtained expression type, is the spec supports blocks:
+ // 1. Remove "_yql_block_length" attribute, since it's for internal usage.
+ // 2. Strip block container from the type to store its internal type.
+ if (AcceptsBlocks_) {
+ Y_ENSURE(actualItemType->GetKind() == ETypeAnnotationKind::Struct);
+ actualItemType = UnwrapBlockStruct(actualItemType->Cast<TStructExprType>(), ctx);
+ if (ProcessorMode_ == EProcessorMode::PullList) {
+ actualType = ctx.MakeType<TListExprType>(actualItemType);
+ } else {
+ actualType = ctx.MakeType<TStreamExprType>(actualItemType);
}
-
- return status;
}
- void Rewind() final {
+ if (!ValidateOutputType(actualItemType, expectedItemType, ctx, TypeCtx_)) {
+ return TStatus::Error;
}
- private:
- const TTypeAnnotationNode* MakeExpectedType(TExprContext& ctx) {
- if (!OutputStruct_) {
- return nullptr;
- }
+ if (!expectedType) {
+ return TStatus::Ok;
+ }
- switch (ProcessorMode_) {
- case EProcessorMode::PullList:
- return ctx.MakeType<TListExprType>(OutputStruct_);
- case EProcessorMode::PullStream:
- case EProcessorMode::PushStream:
- return ctx.MakeType<TStreamExprType>(OutputStruct_);
- }
+ auto status = TryConvertTo(output, *actualType, *expectedType, ctx, TypeCtx_);
- Y_ABORT("Unexpected");
+ if (status.Level == IGraphTransformer::TStatus::Repeat) {
+ status = IGraphTransformer::TStatus(IGraphTransformer::TStatus::Repeat, true);
}
- const TTypeAnnotationNode* MakeExpectedItemType() {
- return OutputStruct_;
+ return status;
+ }
+
+ void Rewind() final {
+ }
+
+private:
+ const TTypeAnnotationNode* MakeExpectedType(TExprContext& ctx) {
+ if (!OutputStruct_) {
+ return nullptr;
}
- const TTypeAnnotationNode* MakeActualType(TExprNode::TPtr& input) {
- return input->GetTypeAnn();
+ switch (ProcessorMode_) {
+ case EProcessorMode::PullList:
+ return ctx.MakeType<TListExprType>(OutputStruct_);
+ case EProcessorMode::PullStream:
+ case EProcessorMode::PushStream:
+ return ctx.MakeType<TStreamExprType>(OutputStruct_);
}
- const TTypeAnnotationNode* MakeActualItemType(TExprNode::TPtr& input) {
- auto actualType = MakeActualType(input);
- switch (actualType->GetKind()) {
- case ETypeAnnotationKind::Stream:
- Y_ENSURE(ProcessorMode_ != EProcessorMode::PullList,
- "processor mode mismatches the actual container type");
- return actualType->Cast<TStreamExprType>()->GetItemType();
- case ETypeAnnotationKind::List:
- Y_ENSURE(ProcessorMode_ == EProcessorMode::PullList,
- "processor mode mismatches the actual container type");
- return actualType->Cast<TListExprType>()->GetItemType();
- default:
- Y_ABORT("unexpected return type");
- }
+ Y_ABORT("Unexpected");
+ }
+
+ const TTypeAnnotationNode* MakeExpectedItemType() {
+ return OutputStruct_;
+ }
+
+ const TTypeAnnotationNode* MakeActualType(TExprNode::TPtr& input) {
+ return input->GetTypeAnn();
+ }
+
+ const TTypeAnnotationNode* MakeActualItemType(TExprNode::TPtr& input) {
+ auto actualType = MakeActualType(input);
+ switch (actualType->GetKind()) {
+ case ETypeAnnotationKind::Stream:
+ Y_ENSURE(ProcessorMode_ != EProcessorMode::PullList,
+ "processor mode mismatches the actual container type");
+ return actualType->Cast<TStreamExprType>()->GetItemType();
+ case ETypeAnnotationKind::List:
+ Y_ENSURE(ProcessorMode_ == EProcessorMode::PullList,
+ "processor mode mismatches the actual container type");
+ return actualType->Cast<TListExprType>()->GetItemType();
+ default:
+ Y_ABORT("unexpected return type");
}
- };
-}
+ }
+};
+} // namespace
TAutoPtr<IGraphTransformer> NYql::NPureCalc::MakeOutputAligner(
const TTypeAnnotationNode* outputStruct,
bool acceptsBlocks,
EProcessorMode processorMode,
- const TTypeAnnotationContext& typeCtx
-) {
+ const TTypeAnnotationContext& typeCtx) {
return new TOutputAligner(outputStruct, acceptsBlocks, processorMode, typeCtx);
}
diff --git a/yql/essentials/public/purecalc/common/transformations/align_output_schema.h b/yql/essentials/public/purecalc/common/transformations/align_output_schema.h
index a1bf1717ce1..4cbcdcd81fa 100644
--- a/yql/essentials/public/purecalc/common/transformations/align_output_schema.h
+++ b/yql/essentials/public/purecalc/common/transformations/align_output_schema.h
@@ -6,23 +6,22 @@
#include <yql/essentials/core/yql_type_annotation.h>
namespace NYql {
- struct TTypeAnnotationContext;
+struct TTypeAnnotationContext;
- namespace NPureCalc {
- /**
- * A transformer which converts an output type of the expression to the given type or reports an error.
- *
- * @param outputStruct destination output struct type.
- * @param acceptsBlocks indicates, whether the output type need to be
- * preprocessed.
- * @param processorMode specifies the top-most container of the result.
- * @return a graph transformer for type alignment.
- */
- TAutoPtr<IGraphTransformer> MakeOutputAligner(
- const TTypeAnnotationNode* outputStruct,
- bool acceptsBlocks,
- EProcessorMode processorMode,
- const TTypeAnnotationContext& typeCtx
- );
- }
-}
+namespace NPureCalc {
+/**
+ * A transformer which converts an output type of the expression to the given type or reports an error.
+ *
+ * @param outputStruct destination output struct type.
+ * @param acceptsBlocks indicates, whether the output type need to be
+ * preprocessed.
+ * @param processorMode specifies the top-most container of the result.
+ * @return a graph transformer for type alignment.
+ */
+TAutoPtr<IGraphTransformer> MakeOutputAligner(
+ const TTypeAnnotationNode* outputStruct,
+ bool acceptsBlocks,
+ EProcessorMode processorMode,
+ const TTypeAnnotationContext& typeCtx);
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/transformations/extract_used_columns.cpp b/yql/essentials/public/purecalc/common/transformations/extract_used_columns.cpp
index 9ff7a0df638..4190ce1fad9 100644
--- a/yql/essentials/public/purecalc/common/transformations/extract_used_columns.cpp
+++ b/yql/essentials/public/purecalc/common/transformations/extract_used_columns.cpp
@@ -9,88 +9,86 @@ using namespace NYql;
using namespace NYql::NPureCalc;
namespace {
- class TUsedColumnsExtractor : public TSyncTransformerBase {
- private:
- TVector<THashSet<TString>>* const Destination_;
- const TVector<THashSet<TString>>& AllColumns_;
- TString NodeName_;
-
- bool CalculatedUsedFields_ = false;
-
- public:
- TUsedColumnsExtractor(
- TVector<THashSet<TString>>* destination,
- const TVector<THashSet<TString>>& allColumns,
- TString nodeName
- )
- : Destination_(destination)
- , AllColumns_(allColumns)
- , NodeName_(std::move(nodeName))
- {
+class TUsedColumnsExtractor: public TSyncTransformerBase {
+private:
+ TVector<THashSet<TString>>* const Destination_;
+ const TVector<THashSet<TString>>& AllColumns_;
+ TString NodeName_;
+
+ bool CalculatedUsedFields_ = false;
+
+public:
+ TUsedColumnsExtractor(
+ TVector<THashSet<TString>>* destination,
+ const TVector<THashSet<TString>>& allColumns,
+ TString nodeName)
+ : Destination_(destination)
+ , AllColumns_(allColumns)
+ , NodeName_(std::move(nodeName))
+ {
+ }
+
+ TUsedColumnsExtractor(TVector<THashSet<TString>>*, TVector<THashSet<TString>>&&, TString) = delete;
+
+public:
+ TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ output = input;
+
+ if (CalculatedUsedFields_) {
+ return IGraphTransformer::TStatus::Ok;
}
- TUsedColumnsExtractor(TVector<THashSet<TString>>*, TVector<THashSet<TString>>&&, TString) = delete;
-
- public:
- TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
- output = input;
+ bool hasError = false;
- if (CalculatedUsedFields_) {
- return IGraphTransformer::TStatus::Ok;
- }
+ *Destination_ = AllColumns_;
- bool hasError = false;
-
- *Destination_ = AllColumns_;
-
- VisitExpr(input, [&](const TExprNode::TPtr& inputExpr) {
- NNodes::TExprBase node(inputExpr);
- if (auto maybeExtract = node.Maybe<NNodes::TCoExtractMembers>()) {
- auto extract = maybeExtract.Cast();
- const auto& arg = extract.Input().Ref();
- if (arg.IsCallable(NodeName_)) {
- ui32 inputIndex;
- if (!TryFetchInputIndexFromSelf(arg, ctx, AllColumns_.size(), inputIndex)) {
- hasError = true;
- return false;
- }
-
- YQL_ENSURE(inputIndex < AllColumns_.size());
-
- auto& destinationColumnsSet = (*Destination_)[inputIndex];
- const auto& allColumnsSet = AllColumns_[inputIndex];
-
- destinationColumnsSet.clear();
- for (const auto& columnAtom : extract.Members()) {
- TString name = TString(columnAtom.Value());
- YQL_ENSURE(allColumnsSet.contains(name), "unexpected column in the input struct");
- destinationColumnsSet.insert(name);
- }
+ VisitExpr(input, [&](const TExprNode::TPtr& inputExpr) {
+ NNodes::TExprBase node(inputExpr);
+ if (auto maybeExtract = node.Maybe<NNodes::TCoExtractMembers>()) {
+ auto extract = maybeExtract.Cast();
+ const auto& arg = extract.Input().Ref();
+ if (arg.IsCallable(NodeName_)) {
+ ui32 inputIndex;
+ if (!TryFetchInputIndexFromSelf(arg, ctx, AllColumns_.size(), inputIndex)) {
+ hasError = true;
+ return false;
}
- }
- return true;
- });
+ YQL_ENSURE(inputIndex < AllColumns_.size());
+
+ auto& destinationColumnsSet = (*Destination_)[inputIndex];
+ const auto& allColumnsSet = AllColumns_[inputIndex];
- if (hasError) {
- return IGraphTransformer::TStatus::Error;
+ destinationColumnsSet.clear();
+ for (const auto& columnAtom : extract.Members()) {
+ TString name = TString(columnAtom.Value());
+ YQL_ENSURE(allColumnsSet.contains(name), "unexpected column in the input struct");
+ destinationColumnsSet.insert(name);
+ }
+ }
}
- CalculatedUsedFields_ = true;
+ return true;
+ });
- return IGraphTransformer::TStatus::Ok;
+ if (hasError) {
+ return IGraphTransformer::TStatus::Error;
}
- void Rewind() final {
- CalculatedUsedFields_ = false;
- }
- };
-}
+ CalculatedUsedFields_ = true;
+
+ return IGraphTransformer::TStatus::Ok;
+ }
+
+ void Rewind() final {
+ CalculatedUsedFields_ = false;
+ }
+};
+} // namespace
TAutoPtr<IGraphTransformer> NYql::NPureCalc::MakeUsedColumnsExtractor(
TVector<THashSet<TString>>* destination,
const TVector<THashSet<TString>>& allColumns,
- const TString& nodeName
-) {
+ const TString& nodeName) {
return new TUsedColumnsExtractor(destination, allColumns, nodeName);
}
diff --git a/yql/essentials/public/purecalc/common/transformations/extract_used_columns.h b/yql/essentials/public/purecalc/common/transformations/extract_used_columns.h
index d0850e28b59..09f82d04e6d 100644
--- a/yql/essentials/public/purecalc/common/transformations/extract_used_columns.h
+++ b/yql/essentials/public/purecalc/common/transformations/extract_used_columns.h
@@ -9,21 +9,20 @@
#include <util/generic/string.h>
namespace NYql {
- namespace NPureCalc {
- /**
- * Make transformation which builds sets of input columns from the given expression.
- *
- * @param destination a vector of string sets which will be populated with column names sets when
- * transformation pipeline is launched. This pointer should contain a valid
- * TVector<THashSet> instance. The transformation will overwrite its contents.
- * @param allColumns vector of sets with all available columns for each input.
- * @param nodeName name of the callable used to get input data, e.g. `Self`.
- * @return an extractor which scans an input structs contents and populates destination.
- */
- TAutoPtr<IGraphTransformer> MakeUsedColumnsExtractor(
- TVector<THashSet<TString>>* destination,
- const TVector<THashSet<TString>>& allColumns,
- const TString& nodeName = TString{PurecalcInputCallableName}
- );
- }
-}
+namespace NPureCalc {
+/**
+ * Make transformation which builds sets of input columns from the given expression.
+ *
+ * @param destination a vector of string sets which will be populated with column names sets when
+ * transformation pipeline is launched. This pointer should contain a valid
+ * TVector<THashSet> instance. The transformation will overwrite its contents.
+ * @param allColumns vector of sets with all available columns for each input.
+ * @param nodeName name of the callable used to get input data, e.g. `Self`.
+ * @return an extractor which scans an input structs contents and populates destination.
+ */
+TAutoPtr<IGraphTransformer> MakeUsedColumnsExtractor(
+ TVector<THashSet<TString>>* destination,
+ const TVector<THashSet<TString>>& allColumns,
+ const TString& nodeName = TString{PurecalcInputCallableName});
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/transformations/output_columns_filter.cpp b/yql/essentials/public/purecalc/common/transformations/output_columns_filter.cpp
index 04181db7c83..38dd2f074ba 100644
--- a/yql/essentials/public/purecalc/common/transformations/output_columns_filter.cpp
+++ b/yql/essentials/public/purecalc/common/transformations/output_columns_filter.cpp
@@ -6,94 +6,102 @@ using namespace NYql;
using namespace NYql::NPureCalc;
namespace {
- class TOutputColumnsFilter: public TSyncTransformerBase {
- private:
- TMaybe<THashSet<TString>> Filter_;
- bool Fired_;
-
- public:
- explicit TOutputColumnsFilter(TMaybe<THashSet<TString>> filter)
- : Filter_(std::move(filter))
- , Fired_(false)
- {
+class TOutputColumnsFilter: public TSyncTransformerBase {
+private:
+ TMaybe<THashSet<TString>> Filter_;
+ bool Fired_;
+
+public:
+ explicit TOutputColumnsFilter(TMaybe<THashSet<TString>> filter)
+ : Filter_(std::move(filter))
+ , Fired_(false)
+ {
+ }
+
+public:
+ void Rewind() override {
+ Fired_ = false;
+ }
+
+ TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ output = input;
+
+ if (Fired_ || Filter_.Empty()) {
+ return IGraphTransformer::TStatus::Ok;
}
- public:
- void Rewind() override {
- Fired_ = false;
+ const TTypeAnnotationNode* returnType = output->GetTypeAnn();
+ const TTypeAnnotationNode* returnItemType = nullptr;
+ switch (returnType->GetKind()) {
+ case ETypeAnnotationKind::Stream:
+ returnItemType = returnType->Cast<TStreamExprType>()->GetItemType();
+ break;
+ case ETypeAnnotationKind::List:
+ returnItemType = returnType->Cast<TListExprType>()->GetItemType();
+ break;
+ default:
+ Y_ABORT("unexpected return type");
}
- TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
- output = input;
-
- if (Fired_ || Filter_.Empty()) {
- return IGraphTransformer::TStatus::Ok;
- }
-
- const TTypeAnnotationNode* returnType = output->GetTypeAnn();
- const TTypeAnnotationNode* returnItemType = nullptr;
- switch (returnType->GetKind()) {
- case ETypeAnnotationKind::Stream:
- returnItemType = returnType->Cast<TStreamExprType>()->GetItemType();
- break;
- case ETypeAnnotationKind::List:
- returnItemType = returnType->Cast<TListExprType>()->GetItemType();
- break;
- default:
- Y_ABORT("unexpected return type");
- }
-
- if (returnItemType->GetKind() != ETypeAnnotationKind::Struct) {
- ctx.AddError(TIssue(ctx.GetPosition(output->Pos()), "columns filter only supported for single-output programs"));
- }
+ if (returnItemType->GetKind() != ETypeAnnotationKind::Struct) {
+ ctx.AddError(TIssue(ctx.GetPosition(output->Pos()), "columns filter only supported for single-output programs"));
+ }
- const auto* returnItemStruct = returnItemType->Cast<TStructExprType>();
-
- auto arg = ctx.NewArgument(TPositionHandle(), "row");
- TExprNode::TListType asStructItems;
- for (const auto& x : returnItemStruct->GetItems()) {
- TExprNode::TPtr value;
- if (Filter_->contains(x->GetName())) {
- value = ctx.Builder({})
- .Callable("Member")
- .Add(0, arg)
- .Atom(1, x->GetName())
- .Seal()
- .Build();
- } else {
- auto type = x->GetItemType();
- value = ctx.Builder({})
- .Callable(type->GetKind() == ETypeAnnotationKind::Optional ? "Nothing" : "Default")
- .Add(0, ExpandType({}, *type, ctx))
- .Seal()
- .Build();
- }
-
- auto item = ctx.Builder({})
- .List()
- .Atom(0, x->GetName())
- .Add(1, value)
- .Seal()
- .Build();
-
- asStructItems.push_back(item);
+ const auto* returnItemStruct = returnItemType->Cast<TStructExprType>();
+
+ auto arg = ctx.NewArgument(TPositionHandle(), "row");
+ TExprNode::TListType asStructItems;
+ for (const auto& x : returnItemStruct->GetItems()) {
+ TExprNode::TPtr value;
+ if (Filter_->contains(x->GetName())) {
+ // clang-format off
+ value = ctx.Builder({})
+ .Callable("Member")
+ .Add(0, arg)
+ .Atom(1, x->GetName())
+ .Seal()
+ .Build();
+ // clang-format on
+ } else {
+ auto type = x->GetItemType();
+ // clang-format off
+ value = ctx.Builder({})
+ .Callable(type->GetKind() == ETypeAnnotationKind::Optional ? "Nothing" : "Default")
+ .Add(0, ExpandType({}, *type, ctx))
+ .Seal()
+ .Build();
+ // clang-format on
}
- auto body = ctx.NewCallable(TPositionHandle(), "AsStruct", std::move(asStructItems));
- auto lambda = ctx.NewLambda(TPositionHandle(), ctx.NewArguments(TPositionHandle(), {arg}), std::move(body));
- output = ctx.Builder(TPositionHandle())
- .Callable("Map")
- .Add(0, output)
- .Add(1, lambda)
- .Seal()
- .Build();
-
- Fired_ = true;
+ // clang-format off
+ auto item = ctx.Builder({})
+ .List()
+ .Atom(0, x->GetName())
+ .Add(1, value)
+ .Seal()
+ .Build();
+ // clang-format on
- return IGraphTransformer::TStatus(IGraphTransformer::TStatus::Repeat, true);
+ asStructItems.push_back(item);
}
- };
-}
+
+ auto body = ctx.NewCallable(TPositionHandle(), "AsStruct", std::move(asStructItems));
+ auto lambda = ctx.NewLambda(TPositionHandle(), ctx.NewArguments(TPositionHandle(), {arg}), std::move(body));
+ // clang-format off
+ output = ctx.Builder(TPositionHandle())
+ .Callable("Map")
+ .Add(0, output)
+ .Add(1, lambda)
+ .Seal()
+ .Build();
+ // clang-format on
+
+ Fired_ = true;
+
+ return IGraphTransformer::TStatus(IGraphTransformer::TStatus::Repeat, true);
+ }
+};
+} // namespace
TAutoPtr<IGraphTransformer> NYql::NPureCalc::MakeOutputColumnsFilter(const TMaybe<THashSet<TString>>& columns) {
return new TOutputColumnsFilter(columns);
diff --git a/yql/essentials/public/purecalc/common/transformations/output_columns_filter.h b/yql/essentials/public/purecalc/common/transformations/output_columns_filter.h
index 85302d82feb..235f02a8379 100644
--- a/yql/essentials/public/purecalc/common/transformations/output_columns_filter.h
+++ b/yql/essentials/public/purecalc/common/transformations/output_columns_filter.h
@@ -6,13 +6,13 @@
#include <yql/essentials/core/yql_type_annotation.h>
namespace NYql {
- namespace NPureCalc {
- /**
- * A transformer which removes unwanted columns from output.
- *
- * @param columns remove all columns that are not in this set.
- * @return a graph transformer for filtering output.
- */
- TAutoPtr<IGraphTransformer> MakeOutputColumnsFilter(const TMaybe<THashSet<TString>>& columns);
- }
-}
+namespace NPureCalc {
+/**
+ * A transformer which removes unwanted columns from output.
+ *
+ * @param columns remove all columns that are not in this set.
+ * @return a graph transformer for filtering output.
+ */
+TAutoPtr<IGraphTransformer> MakeOutputColumnsFilter(const TMaybe<THashSet<TString>>& columns);
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/transformations/replace_table_reads.cpp b/yql/essentials/public/purecalc/common/transformations/replace_table_reads.cpp
index 141e92baf28..ae160ee3e91 100644
--- a/yql/essentials/public/purecalc/common/transformations/replace_table_reads.cpp
+++ b/yql/essentials/public/purecalc/common/transformations/replace_table_reads.cpp
@@ -10,238 +10,242 @@ using namespace NYql;
using namespace NYql::NPureCalc;
namespace {
- class TTableReadsReplacer: public TSyncTransformerBase {
- private:
- const TVector<const TStructExprType*>& InputStructs_;
- bool UseSystemColumns_;
- EProcessorMode ProcessorMode_;
- TString CallableName_;
- TString TablePrefix_;
- bool Complete_ = false;
-
- public:
- explicit TTableReadsReplacer(
- const TVector<const TStructExprType*>& inputStructs,
- bool useSystemColumns,
- EProcessorMode processorMode,
- TString inputNodeName,
- TString tablePrefix
- )
- : InputStructs_(inputStructs)
- , UseSystemColumns_(useSystemColumns)
- , ProcessorMode_(processorMode)
- , CallableName_(std::move(inputNodeName))
- , TablePrefix_(std::move(tablePrefix))
- {
+class TTableReadsReplacer: public TSyncTransformerBase {
+private:
+ const TVector<const TStructExprType*>& InputStructs_;
+ bool UseSystemColumns_;
+ EProcessorMode ProcessorMode_;
+ TString CallableName_;
+ TString TablePrefix_;
+ bool Complete_ = false;
+
+public:
+ explicit TTableReadsReplacer(
+ const TVector<const TStructExprType*>& inputStructs,
+ bool useSystemColumns,
+ EProcessorMode processorMode,
+ TString inputNodeName,
+ TString tablePrefix)
+ : InputStructs_(inputStructs)
+ , UseSystemColumns_(useSystemColumns)
+ , ProcessorMode_(processorMode)
+ , CallableName_(std::move(inputNodeName))
+ , TablePrefix_(std::move(tablePrefix))
+ {
+ }
+
+ TTableReadsReplacer(TVector<const TStructExprType*>&&, TString, TString) = delete;
+
+public:
+ TStatus DoTransform(const TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ output = input;
+ if (Complete_) {
+ return TStatus::Ok;
}
- TTableReadsReplacer(TVector<const TStructExprType*>&&, TString, TString) = delete;
-
- public:
- TStatus DoTransform(const TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
- output = input;
- if (Complete_) {
- return TStatus::Ok;
- }
-
- TOptimizeExprSettings settings(nullptr);
+ TOptimizeExprSettings settings(nullptr);
- auto status = OptimizeExpr(input, output, [&](const TExprNode::TPtr& node, TExprContext& ctx) -> TExprNode::TPtr {
- if (node->IsCallable(NNodes::TCoRight::CallableName())) {
- TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
- return new TIssue(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
- });
+ auto status = OptimizeExpr(input, output, [&](const TExprNode::TPtr& node, TExprContext& ctx) -> TExprNode::TPtr {
+ if (node->IsCallable(NNodes::TCoRight::CallableName())) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
+ return new TIssue(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
+ });
- if (!EnsureMinArgsCount(*node, 1, ctx)) {
- return nullptr;
- }
-
- if (node->Child(0)->IsCallable(NNodes::TCoCons::CallableName())) {
- return node;
- }
-
- if (!node->Child(0)->IsCallable(NNodes::TCoRead::CallableName())) {
- ctx.AddError(TIssue(ctx.GetPosition(node->Child(0)->Pos()), TStringBuilder() << "Expected Read!"));
- return nullptr;
- }
+ if (!EnsureMinArgsCount(*node, 1, ctx)) {
+ return nullptr;
+ }
- return BuildInputFromRead(node->Pos(), node->ChildPtr(0), ctx);
- } else if (node->IsCallable(NNodes::TCoLeft::CallableName())) {
- TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
- return new TIssue(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
- });
+ if (node->Child(0)->IsCallable(NNodes::TCoCons::CallableName())) {
+ return node;
+ }
- if (!EnsureMinArgsCount(*node, 1, ctx)) {
- return nullptr;
- }
+ if (!node->Child(0)->IsCallable(NNodes::TCoRead::CallableName())) {
+ ctx.AddError(TIssue(ctx.GetPosition(node->Child(0)->Pos()), TStringBuilder() << "Expected Read!"));
+ return nullptr;
+ }
- if (!node->Child(0)->IsCallable(NNodes::TCoRead::CallableName())) {
- ctx.AddError(TIssue(ctx.GetPosition(node->Child(0)->Pos()), TStringBuilder() << "Expected Read!"));
- return nullptr;
- }
+ return BuildInputFromRead(node->Pos(), node->ChildPtr(0), ctx);
+ } else if (node->IsCallable(NNodes::TCoLeft::CallableName())) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
+ return new TIssue(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
+ });
- return node->Child(0)->HeadPtr();
+ if (!EnsureMinArgsCount(*node, 1, ctx)) {
+ return nullptr;
}
- return node;
- }, ctx, settings);
+ if (!node->Child(0)->IsCallable(NNodes::TCoRead::CallableName())) {
+ ctx.AddError(TIssue(ctx.GetPosition(node->Child(0)->Pos()), TStringBuilder() << "Expected Read!"));
+ return nullptr;
+ }
- if (status.Level == TStatus::Ok) {
- Complete_ = true;
+ return node->Child(0)->HeadPtr();
}
- return status;
- }
-
- void Rewind() override {
- Complete_ = false;
- }
- private:
- TExprNode::TPtr BuildInputFromRead(TPositionHandle replacePos, const TExprNode::TPtr& node, TExprContext& ctx) {
- TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
- return MakeIntrusive<TIssue>(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
- });
+ return node;
+ }, ctx, settings);
- if (!EnsureMinArgsCount(*node, 3, ctx)) {
- return nullptr;
- }
+ if (status.Level == TStatus::Ok) {
+ Complete_ = true;
+ }
+ return status;
+ }
- const auto source = node->ChildPtr(2);
- if (source->IsCallable(NNodes::TCoKey::CallableName())) {
- return BuildInputFromKey(replacePos, source, ctx);
- }
- if (source->IsCallable("DataTables")) {
- return BuildInputFromDataTables(replacePos, source, ctx);
- }
+ void Rewind() override {
+ Complete_ = false;
+ }
- ctx.AddError(TIssue(ctx.GetPosition(source->Pos()), TStringBuilder() << "Unsupported read source: " << source->Content()));
+private:
+ TExprNode::TPtr BuildInputFromRead(TPositionHandle replacePos, const TExprNode::TPtr& node, TExprContext& ctx) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
+ return MakeIntrusive<TIssue>(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
+ });
+ if (!EnsureMinArgsCount(*node, 3, ctx)) {
return nullptr;
}
- TExprNode::TPtr BuildInputFromKey(TPositionHandle replacePos, const TExprNode::TPtr& node, TExprContext& ctx) {
- TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
- return MakeIntrusive<TIssue>(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
- });
+ const auto source = node->ChildPtr(2);
+ if (source->IsCallable(NNodes::TCoKey::CallableName())) {
+ return BuildInputFromKey(replacePos, source, ctx);
+ }
+ if (source->IsCallable("DataTables")) {
+ return BuildInputFromDataTables(replacePos, source, ctx);
+ }
- ui32 inputIndex;
- TExprNode::TPtr inputTableName;
+ ctx.AddError(TIssue(ctx.GetPosition(source->Pos()), TStringBuilder() << "Unsupported read source: " << source->Content()));
- if (!TryFetchInputIndexFromKey(node, ctx, inputIndex, inputTableName)) {
- return nullptr;
- }
+ return nullptr;
+ }
- YQL_ENSURE(inputTableName->IsCallable(NNodes::TCoString::CallableName()));
+ TExprNode::TPtr BuildInputFromKey(TPositionHandle replacePos, const TExprNode::TPtr& node, TExprContext& ctx) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
+ return MakeIntrusive<TIssue>(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
+ });
- auto inputNode = ctx.Builder(replacePos)
- .Callable(CallableName_)
- .Atom(0, ToString(inputIndex))
- .Seal()
- .Build();
+ ui32 inputIndex;
+ TExprNode::TPtr inputTableName;
- if (inputNode->IsCallable(PurecalcBlockInputCallableName)) {
- const auto inputStruct = InputStructs_[inputIndex]->Cast<TStructExprType>();
- const auto blocksLambda = NodeFromBlocks(replacePos, inputStruct, ctx);
- bool wrapLMap = ProcessorMode_ == EProcessorMode::PullList;
- inputNode = ApplyToIterable(replacePos, inputNode, blocksLambda, wrapLMap, ctx);
- }
+ if (!TryFetchInputIndexFromKey(node, ctx, inputIndex, inputTableName)) {
+ return nullptr;
+ }
- if (UseSystemColumns_) {
- auto mapLambda = ctx.Builder(replacePos)
- .Lambda()
- .Param("row")
- .Callable(0, NNodes::TCoAddMember::CallableName())
- .Arg(0, "row")
- .Atom(1, PurecalcSysColumnTablePath)
- .Add(2, inputTableName)
- .Seal()
- .Seal()
- .Build();
+ YQL_ENSURE(inputTableName->IsCallable(NNodes::TCoString::CallableName()));
+
+ // clang-format off
+ auto inputNode = ctx.Builder(replacePos)
+ .Callable(CallableName_)
+ .Atom(0, ToString(inputIndex))
+ .Seal()
+ .Build();
+ // clang-format on
+
+ if (inputNode->IsCallable(PurecalcBlockInputCallableName)) {
+ const auto inputStruct = InputStructs_[inputIndex]->Cast<TStructExprType>();
+ const auto blocksLambda = NodeFromBlocks(replacePos, inputStruct, ctx);
+ bool wrapLMap = ProcessorMode_ == EProcessorMode::PullList;
+ inputNode = ApplyToIterable(replacePos, inputNode, blocksLambda, wrapLMap, ctx);
+ }
- return ctx.Builder(replacePos)
- .Callable(NNodes::TCoMap::CallableName())
- .Add(0, std::move(inputNode))
- .Add(1, std::move(mapLambda))
+ if (UseSystemColumns_) {
+ // clang-format off
+ auto mapLambda = ctx.Builder(replacePos)
+ .Lambda()
+ .Param("row")
+ .Callable(0, NNodes::TCoAddMember::CallableName())
+ .Arg(0, "row")
+ .Atom(1, PurecalcSysColumnTablePath)
+ .Add(2, inputTableName)
.Seal()
- .Build();
- }
+ .Seal()
+ .Build();
+ // clang-format on
- return inputNode;
+ // clang-format off
+ return ctx.Builder(replacePos)
+ .Callable(NNodes::TCoMap::CallableName())
+ .Add(0, std::move(inputNode))
+ .Add(1, std::move(mapLambda))
+ .Seal()
+ .Build();
+ // clang-format on
}
- TExprNode::TPtr BuildInputFromDataTables(TPositionHandle replacePos, const TExprNode::TPtr& node, TExprContext& ctx) {
- TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
- return MakeIntrusive<TIssue>(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
- });
+ return inputNode;
+ }
- if (InputStructs_.empty()) {
- ctx.AddError(TIssue(ctx.GetPosition(node->Pos()), "No inputs provided by input spec"));
- return nullptr;
- }
+ TExprNode::TPtr BuildInputFromDataTables(TPositionHandle replacePos, const TExprNode::TPtr& node, TExprContext& ctx) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
+ return MakeIntrusive<TIssue>(ctx.GetPosition(node->Pos()), TStringBuilder() << "At function: " << node->Content());
+ });
- if (!EnsureArgsCount(*node, 0, ctx)) {
- return nullptr;
- }
+ if (InputStructs_.empty()) {
+ ctx.AddError(TIssue(ctx.GetPosition(node->Pos()), "No inputs provided by input spec"));
+ return nullptr;
+ }
- auto builder = ctx.Builder(replacePos);
+ if (!EnsureArgsCount(*node, 0, ctx)) {
+ return nullptr;
+ }
- if (InputStructs_.size() > 1) {
- auto listBuilder = builder.List();
+ auto builder = ctx.Builder(replacePos);
- for (ui32 i = 0; i < InputStructs_.size(); ++i) {
- listBuilder.Callable(i, CallableName_).Atom(0, ToString(i)).Seal();
- }
+ if (InputStructs_.size() > 1) {
+ auto listBuilder = builder.List();
- return listBuilder.Seal().Build();
+ for (ui32 i = 0; i < InputStructs_.size(); ++i) {
+ listBuilder.Callable(i, CallableName_).Atom(0, ToString(i)).Seal();
}
- return builder.Callable(CallableName_).Atom(0, "0").Seal().Build();
+ return listBuilder.Seal().Build();
}
- bool TryFetchInputIndexFromKey(const TExprNode::TPtr& node, TExprContext& ctx, ui32& resultIndex, TExprNode::TPtr& resultTableName) {
- if (!EnsureArgsCount(*node, 1, ctx)) {
- return false;
- }
+ return builder.Callable(CallableName_).Atom(0, "0").Seal().Build();
+ }
- const auto* keyArg = node->Child(0);
- if (!keyArg->IsList() || keyArg->ChildrenSize() != 2 || !keyArg->Child(0)->IsAtom("table") ||
- !keyArg->Child(1)->IsCallable(NNodes::TCoString::CallableName()))
- {
- ctx.AddError(TIssue(ctx.GetPosition(keyArg->Pos()), "Expected single table name"));
- return false;
- }
+ bool TryFetchInputIndexFromKey(const TExprNode::TPtr& node, TExprContext& ctx, ui32& resultIndex, TExprNode::TPtr& resultTableName) {
+ if (!EnsureArgsCount(*node, 1, ctx)) {
+ return false;
+ }
- resultTableName = keyArg->ChildPtr(1);
+ const auto* keyArg = node->Child(0);
+ if (!keyArg->IsList() || keyArg->ChildrenSize() != 2 || !keyArg->Child(0)->IsAtom("table") ||
+ !keyArg->Child(1)->IsCallable(NNodes::TCoString::CallableName()))
+ {
+ ctx.AddError(TIssue(ctx.GetPosition(keyArg->Pos()), "Expected single table name"));
+ return false;
+ }
- auto tableName = resultTableName->Child(0)->Content();
+ resultTableName = keyArg->ChildPtr(1);
- if (!tableName.StartsWith(TablePrefix_)) {
- ctx.AddError(TIssue(ctx.GetPosition(resultTableName->Child(0)->Pos()),
- TStringBuilder() << "Invalid table name " << TString{tableName}.Quote() << ": prefix must be " << TablePrefix_.Quote()));
- return false;
- }
+ auto tableName = resultTableName->Child(0)->Content();
- tableName.SkipPrefix(TablePrefix_);
+ if (!tableName.StartsWith(TablePrefix_)) {
+ ctx.AddError(TIssue(ctx.GetPosition(resultTableName->Child(0)->Pos()),
+ TStringBuilder() << "Invalid table name " << TString{tableName}.Quote() << ": prefix must be " << TablePrefix_.Quote()));
+ return false;
+ }
- if (!tableName) {
- resultIndex = 0;
- } else if (!TryFromString(tableName, resultIndex)) {
- ctx.AddError(TIssue(ctx.GetPosition(resultTableName->Child(0)->Pos()),
- TStringBuilder() << "Invalid table name " << TString{tableName}.Quote() << ": suffix must be UI32 number"));
- return false;
- }
+ tableName.SkipPrefix(TablePrefix_);
- return true;
+ if (!tableName) {
+ resultIndex = 0;
+ } else if (!TryFromString(tableName, resultIndex)) {
+ ctx.AddError(TIssue(ctx.GetPosition(resultTableName->Child(0)->Pos()),
+ TStringBuilder() << "Invalid table name " << TString{tableName}.Quote() << ": suffix must be UI32 number"));
+ return false;
}
- };
-}
+
+ return true;
+ }
+};
+} // namespace
TAutoPtr<IGraphTransformer> NYql::NPureCalc::MakeTableReadsReplacer(
const TVector<const TStructExprType*>& inputStructs,
bool useSystemColumns,
EProcessorMode processorMode,
TString callableName,
- TString tablePrefix
-) {
+ TString tablePrefix) {
return new TTableReadsReplacer(inputStructs, useSystemColumns, processorMode, std::move(callableName), std::move(tablePrefix));
}
diff --git a/yql/essentials/public/purecalc/common/transformations/replace_table_reads.h b/yql/essentials/public/purecalc/common/transformations/replace_table_reads.h
index 33bc7174ac4..750ed8b37fb 100644
--- a/yql/essentials/public/purecalc/common/transformations/replace_table_reads.h
+++ b/yql/essentials/public/purecalc/common/transformations/replace_table_reads.h
@@ -6,25 +6,24 @@
#include <yql/essentials/core/yql_graph_transformer.h>
namespace NYql::NPureCalc {
- /**
- * SQL translation would generate a standard Read! call to read each input table. It will than generate
- * a Right! call to get the table data from a tuple returned by Read!. This transformation replaces any Right!
- * call with a call to special function used to get input data.
- *
- * Each table name must starts with the specified prefix and ends with an index of program input (e.g. `Input0`).
- * Name without numeric suffix is an alias for the first input.
- *
- * @param inputStructs types of each input.
- * @param useSystemColumns whether to allow special system columns in input structs.
- * @param callableName name of the special callable used to get input data (e.g. `Self`).
- * @param tablePrefix required prefix for all table names (e.g. `Input`).
- * @param return a graph transformer for replacing table reads.
- */
- TAutoPtr<IGraphTransformer> MakeTableReadsReplacer(
- const TVector<const TStructExprType*>& inputStructs,
- bool useSystemColumns,
- EProcessorMode processorMode,
- TString callableName = TString{PurecalcInputCallableName},
- TString tablePrefix = TString{PurecalcInputTablePrefix}
- );
-}
+/**
+ * SQL translation would generate a standard Read! call to read each input table. It will than generate
+ * a Right! call to get the table data from a tuple returned by Read!. This transformation replaces any Right!
+ * call with a call to special function used to get input data.
+ *
+ * Each table name must starts with the specified prefix and ends with an index of program input (e.g. `Input0`).
+ * Name without numeric suffix is an alias for the first input.
+ *
+ * @param inputStructs types of each input.
+ * @param useSystemColumns whether to allow special system columns in input structs.
+ * @param callableName name of the special callable used to get input data (e.g. `Self`).
+ * @param tablePrefix required prefix for all table names (e.g. `Input`).
+ * @param return a graph transformer for replacing table reads.
+ */
+TAutoPtr<IGraphTransformer> MakeTableReadsReplacer(
+ const TVector<const TStructExprType*>& inputStructs,
+ bool useSystemColumns,
+ EProcessorMode processorMode,
+ TString callableName = TString{PurecalcInputCallableName},
+ TString tablePrefix = TString{PurecalcInputTablePrefix});
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/transformations/root_to_blocks.cpp b/yql/essentials/public/purecalc/common/transformations/root_to_blocks.cpp
index 07c959d1077..67f6f59a1ef 100644
--- a/yql/essentials/public/purecalc/common/transformations/root_to_blocks.cpp
+++ b/yql/essentials/public/purecalc/common/transformations/root_to_blocks.cpp
@@ -59,7 +59,6 @@ public:
TAutoPtr<IGraphTransformer> NYql::NPureCalc::MakeRootToBlocks(
bool acceptsBlocks,
- EProcessorMode processorMode
-) {
+ EProcessorMode processorMode) {
return new TRootToBlocks(acceptsBlocks, processorMode);
}
diff --git a/yql/essentials/public/purecalc/common/transformations/root_to_blocks.h b/yql/essentials/public/purecalc/common/transformations/root_to_blocks.h
index 13a7a9dfc11..46ff25d2051 100644
--- a/yql/essentials/public/purecalc/common/transformations/root_to_blocks.h
+++ b/yql/essentials/public/purecalc/common/transformations/root_to_blocks.h
@@ -5,18 +5,17 @@
#include <yql/essentials/core/yql_graph_transformer.h>
namespace NYql {
- namespace NPureCalc {
- /**
- * A transformer which rewrite the root to respect block types.
- *
- * @param acceptsBlock allows using this transformer in pipeline and
- * skip this phase if no block output is required.
- * @param processorMode specifies the top-most container of the result.
- * @return a graph transformer for rewriting the root node.
- */
- TAutoPtr<IGraphTransformer> MakeRootToBlocks(
- bool acceptsBlocks,
- EProcessorMode processorMode
- );
- }
-}
+namespace NPureCalc {
+/**
+ * A transformer which rewrite the root to respect block types.
+ *
+ * @param acceptsBlock allows using this transformer in pipeline and
+ * skip this phase if no block output is required.
+ * @param processorMode specifies the top-most container of the result.
+ * @return a graph transformer for rewriting the root node.
+ */
+TAutoPtr<IGraphTransformer> MakeRootToBlocks(
+ bool acceptsBlocks,
+ EProcessorMode processorMode);
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/transformations/type_annotation.cpp b/yql/essentials/public/purecalc/common/transformations/type_annotation.cpp
index 63105cb8878..61f14fcc65a 100644
--- a/yql/essentials/public/purecalc/common/transformations/type_annotation.cpp
+++ b/yql/essentials/public/purecalc/common/transformations/type_annotation.cpp
@@ -14,171 +14,144 @@ using namespace NYql;
using namespace NYql::NPureCalc;
namespace {
- class TTypeAnnotatorBase: public TSyncTransformerBase {
- public:
- using THandler = std::function<TStatus(const TExprNode::TPtr&, TExprNode::TPtr&, TExprContext&)>;
+class TTypeAnnotatorBase: public TSyncTransformerBase {
+public:
+ using THandler = std::function<TStatus(const TExprNode::TPtr&, TExprNode::TPtr&, TExprContext&)>;
- TTypeAnnotatorBase(TTypeAnnotationContextPtr typeAnnotationContext)
- {
- OriginalTransformer_.reset(CreateExtCallableTypeAnnotationTransformer(*typeAnnotationContext).Release());
- }
+ TTypeAnnotatorBase(TTypeAnnotationContextPtr typeAnnotationContext)
+ {
+ OriginalTransformer_.reset(CreateExtCallableTypeAnnotationTransformer(*typeAnnotationContext).Release());
+ }
- TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
- if (input->Type() == TExprNode::Callable) {
- if (auto handler = Handlers_.FindPtr(input->Content())) {
- return (*handler)(input, output, ctx);
- }
+ TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ if (input->Type() == TExprNode::Callable) {
+ if (auto handler = Handlers_.FindPtr(input->Content())) {
+ return (*handler)(input, output, ctx);
}
-
- auto status = OriginalTransformer_->Transform(input, output, ctx);
-
- YQL_ENSURE(status.Level != IGraphTransformer::TStatus::Async, "Async type check is not supported");
-
- return status;
}
- void Rewind() final {
- OriginalTransformer_->Rewind();
- }
+ auto status = OriginalTransformer_->Transform(input, output, ctx);
- protected:
- void AddHandler(std::initializer_list<TStringBuf> names, THandler handler) {
- for (auto name: names) {
- YQL_ENSURE(Handlers_.emplace(name, handler).second, "Duplicate handler for " << name);
- }
- }
+ YQL_ENSURE(status.Level != IGraphTransformer::TStatus::Async, "Async type check is not supported");
- template <class TDerived>
- THandler Hndl(TStatus(TDerived::* handler)(const TExprNode::TPtr&, TExprNode::TPtr&, TExprContext&)) {
- return [this, handler] (TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) {
- return (static_cast<TDerived*>(this)->*handler)(input, output, ctx);
- };
- }
-
- template <class TDerived>
- THandler Hndl(TStatus(TDerived::* handler)(const TExprNode::TPtr&, TExprContext&)) {
- return [this, handler] (TExprNode::TPtr input, TExprNode::TPtr& /*output*/, TExprContext& ctx) {
- return (static_cast<TDerived*>(this)->*handler)(input, ctx);
- };
- }
-
- private:
- std::shared_ptr<IGraphTransformer> OriginalTransformer_;
- THashMap<TStringBuf, THandler> Handlers_;
- };
-
- class TTypeAnnotator : public TTypeAnnotatorBase {
- private:
- TTypeAnnotationContextPtr TypeAnnotationContext_;
- const TVector<const TStructExprType*>& InputStructs_;
- TVector<const TStructExprType*>& RawInputTypes_;
- EProcessorMode ProcessorMode_;
- TString InputNodeName_;
-
- public:
- TTypeAnnotator(
- TTypeAnnotationContextPtr typeAnnotationContext,
- const TVector<const TStructExprType*>& inputStructs,
- TVector<const TStructExprType*>& rawInputTypes,
- EProcessorMode processorMode,
- TString nodeName
- )
- : TTypeAnnotatorBase(typeAnnotationContext)
- , TypeAnnotationContext_(typeAnnotationContext)
- , InputStructs_(inputStructs)
- , RawInputTypes_(rawInputTypes)
- , ProcessorMode_(processorMode)
- , InputNodeName_(std::move(nodeName))
- {
- AddHandler({InputNodeName_}, Hndl(&TTypeAnnotator::HandleInputNode));
- AddHandler({NNodes::TCoTableName::CallableName()}, Hndl(&TTypeAnnotator::HandleTableName));
- AddHandler({NNodes::TCoTablePath::CallableName()}, Hndl(&TTypeAnnotator::HandleTablePath));
- AddHandler({NNodes::TCoHoppingTraits::CallableName()}, Hndl(&TTypeAnnotator::HandleHoppingTraits));
- }
-
- TTypeAnnotator(TTypeAnnotationContextPtr, TVector<const TStructExprType*>&&, EProcessorMode, TString) = delete;
-
- private:
- TStatus HandleInputNode(const TExprNode::TPtr& input, TExprContext& ctx) {
- ui32 inputIndex;
- if (!TryFetchInputIndexFromSelf(*input, ctx, InputStructs_.size(), inputIndex)) {
- return IGraphTransformer::TStatus::Error;
- }
+ return status;
+ }
- YQL_ENSURE(inputIndex < InputStructs_.size());
+ void Rewind() final {
+ OriginalTransformer_->Rewind();
+ }
- auto itemType = InputStructs_[inputIndex];
+protected:
+ void AddHandler(std::initializer_list<TStringBuf> names, THandler handler) {
+ for (auto name : names) {
+ YQL_ENSURE(Handlers_.emplace(name, handler).second, "Duplicate handler for " << name);
+ }
+ }
+
+ template <class TDerived>
+ THandler Hndl(TStatus (TDerived::*handler)(const TExprNode::TPtr&, TExprNode::TPtr&, TExprContext&)) {
+ return [this, handler](TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) {
+ return (static_cast<TDerived*>(this)->*handler)(input, output, ctx);
+ };
+ }
+
+ template <class TDerived>
+ THandler Hndl(TStatus (TDerived::*handler)(const TExprNode::TPtr&, TExprContext&)) {
+ return [this, handler](TExprNode::TPtr input, TExprNode::TPtr& /*output*/, TExprContext& ctx) {
+ return (static_cast<TDerived*>(this)->*handler)(input, ctx);
+ };
+ }
+
+private:
+ std::shared_ptr<IGraphTransformer> OriginalTransformer_;
+ THashMap<TStringBuf, THandler> Handlers_;
+};
+
+class TTypeAnnotator: public TTypeAnnotatorBase {
+private:
+ TTypeAnnotationContextPtr TypeAnnotationContext_;
+ const TVector<const TStructExprType*>& InputStructs_;
+ TVector<const TStructExprType*>& RawInputTypes_;
+ EProcessorMode ProcessorMode_;
+ TString InputNodeName_;
+
+public:
+ TTypeAnnotator(
+ TTypeAnnotationContextPtr typeAnnotationContext,
+ const TVector<const TStructExprType*>& inputStructs,
+ TVector<const TStructExprType*>& rawInputTypes,
+ EProcessorMode processorMode,
+ TString nodeName)
+ : TTypeAnnotatorBase(typeAnnotationContext)
+ , TypeAnnotationContext_(typeAnnotationContext)
+ , InputStructs_(inputStructs)
+ , RawInputTypes_(rawInputTypes)
+ , ProcessorMode_(processorMode)
+ , InputNodeName_(std::move(nodeName))
+ {
+ AddHandler({InputNodeName_}, Hndl(&TTypeAnnotator::HandleInputNode));
+ AddHandler({NNodes::TCoTableName::CallableName()}, Hndl(&TTypeAnnotator::HandleTableName));
+ AddHandler({NNodes::TCoTablePath::CallableName()}, Hndl(&TTypeAnnotator::HandleTablePath));
+ AddHandler({NNodes::TCoHoppingTraits::CallableName()}, Hndl(&TTypeAnnotator::HandleHoppingTraits));
+ }
+
+ TTypeAnnotator(TTypeAnnotationContextPtr, TVector<const TStructExprType*>&&, EProcessorMode, TString) = delete;
+
+private:
+ TStatus HandleInputNode(const TExprNode::TPtr& input, TExprContext& ctx) {
+ ui32 inputIndex;
+ if (!TryFetchInputIndexFromSelf(*input, ctx, InputStructs_.size(), inputIndex)) {
+ return IGraphTransformer::TStatus::Error;
+ }
- // XXX: Tweak the input expression type, if the spec supports blocks:
- // 1. Add "_yql_block_length" attribute for internal usage.
- // 2. Add block container to wrap the actual item type.
- if (input->IsCallable(PurecalcBlockInputCallableName)) {
- itemType = WrapBlockStruct(itemType, ctx);
- }
+ YQL_ENSURE(inputIndex < InputStructs_.size());
- RawInputTypes_[inputIndex] = itemType;
+ auto itemType = InputStructs_[inputIndex];
- TColumnOrder columnOrder;
- for (const auto& i : itemType->GetItems()) {
- columnOrder.AddColumn(TString(i->GetName()));
- }
+ // XXX: Tweak the input expression type, if the spec supports blocks:
+ // 1. Add "_yql_block_length" attribute for internal usage.
+ // 2. Add block container to wrap the actual item type.
+ if (input->IsCallable(PurecalcBlockInputCallableName)) {
+ itemType = WrapBlockStruct(itemType, ctx);
+ }
- if (ProcessorMode_ != EProcessorMode::PullList) {
- input->SetTypeAnn(ctx.MakeType<TStreamExprType>(itemType));
- } else {
- input->SetTypeAnn(ctx.MakeType<TListExprType>(itemType));
- }
+ RawInputTypes_[inputIndex] = itemType;
- TypeAnnotationContext_->SetColumnOrder(*input, columnOrder, ctx);
- return TStatus::Ok;
+ TColumnOrder columnOrder;
+ for (const auto& i : itemType->GetItems()) {
+ columnOrder.AddColumn(TString(i->GetName()));
}
- TStatus HandleTableName(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
- if (!EnsureMinMaxArgsCount(*input, 1, 2, ctx)) {
- return TStatus::Error;
- }
-
- if (input->ChildrenSize() > 1) {
- if (!EnsureAtom(input->Tail(), ctx)) {
- return TStatus::Error;
- }
-
- if (input->Tail().Content() != PurecalcDefaultService) {
- ctx.AddError(
- TIssue(
- ctx.GetPosition(input->Tail().Pos()),
- TStringBuilder() << "Unsupported system: " << input->Tail().Content()));
- return TStatus::Error;
- }
- }
+ if (ProcessorMode_ != EProcessorMode::PullList) {
+ input->SetTypeAnn(ctx.MakeType<TStreamExprType>(itemType));
+ } else {
+ input->SetTypeAnn(ctx.MakeType<TListExprType>(itemType));
+ }
- if (NNodes::TCoDependsOnBase::Match(&input->Head())) {
- if (!EnsureArgsCount(input->Head(), 1, ctx)) {
- return TStatus::Error;
- }
-
- if (!TryBuildTableNameNode(input->Pos(), input->Head().HeadPtr(), output, ctx)) {
- return TStatus::Error;
- }
- } else {
- if (!EnsureSpecificDataType(input->Head(), EDataSlot::String, ctx)) {
- return TStatus::Error;
- }
- output = input->HeadPtr();
- }
+ TypeAnnotationContext_->SetColumnOrder(*input, columnOrder, ctx);
+ return TStatus::Ok;
+ }
- return TStatus::Repeat;
+ TStatus HandleTableName(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
+ if (!EnsureMinMaxArgsCount(*input, 1, 2, ctx)) {
+ return TStatus::Error;
}
- TStatus HandleTablePath(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
- if (!EnsureArgsCount(*input, 1, ctx)) {
+ if (input->ChildrenSize() > 1) {
+ if (!EnsureAtom(input->Tail(), ctx)) {
return TStatus::Error;
}
- if (!EnsureDependsOn(input->Head(), ctx)) {
+ if (input->Tail().Content() != PurecalcDefaultService) {
+ ctx.AddError(
+ TIssue(
+ ctx.GetPosition(input->Tail().Pos()),
+ TStringBuilder() << "Unsupported system: " << input->Tail().Content()));
return TStatus::Error;
}
+ }
+ if (NNodes::TCoDependsOnBase::Match(&input->Head())) {
if (!EnsureArgsCount(input->Head(), 1, ctx)) {
return TStatus::Error;
}
@@ -186,66 +159,97 @@ namespace {
if (!TryBuildTableNameNode(input->Pos(), input->Head().HeadPtr(), output, ctx)) {
return TStatus::Error;
}
+ } else {
+ if (!EnsureSpecificDataType(input->Head(), EDataSlot::String, ctx)) {
+ return TStatus::Error;
+ }
+ output = input->HeadPtr();
+ }
+
+ return TStatus::Repeat;
+ }
+
+ TStatus HandleTablePath(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
+ if (!EnsureArgsCount(*input, 1, ctx)) {
+ return TStatus::Error;
+ }
+
+ if (!EnsureDependsOn(input->Head(), ctx)) {
+ return TStatus::Error;
+ }
+ if (!EnsureArgsCount(input->Head(), 1, ctx)) {
+ return TStatus::Error;
+ }
+
+ if (!TryBuildTableNameNode(input->Pos(), input->Head().HeadPtr(), output, ctx)) {
+ return TStatus::Error;
+ }
+
+ return TStatus::Repeat;
+ }
+
+ TStatus HandleHoppingTraits(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
+ Y_UNUSED(output);
+ if (input->ChildrenSize() == 1) {
+ auto children = input->ChildrenList();
+ // clang-format off
+ auto falseArg = ctx.Builder(input->Pos())
+ .Atom("false")
+ .Seal()
+ .Build();
+ // clang-format on
+ children.emplace_back(falseArg);
+ input->ChangeChildrenInplace(std::move(children));
return TStatus::Repeat;
}
- TStatus HandleHoppingTraits(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
- Y_UNUSED(output);
- if (input->ChildrenSize() == 1) {
- auto children = input->ChildrenList();
- auto falseArg = ctx.Builder(input->Pos())
- .Atom("false")
- .Seal()
- .Build();
- children.emplace_back(falseArg);
- input->ChangeChildrenInplace(std::move(children));
- return TStatus::Repeat;
- }
+ return TStatus::Ok;
+ }
- return TStatus::Ok;
+private:
+ bool TryBuildTableNameNode(
+ TPositionHandle position, const TExprNode::TPtr& row, TExprNode::TPtr& result, TExprContext& ctx)
+ {
+ if (!EnsureStructType(*row, ctx)) {
+ return false;
}
- private:
- bool TryBuildTableNameNode(
- TPositionHandle position, const TExprNode::TPtr& row, TExprNode::TPtr& result, TExprContext& ctx)
- {
- if (!EnsureStructType(*row, ctx)) {
- return false;
- }
+ const auto* structType = row->GetTypeAnn()->Cast<TStructExprType>();
- const auto* structType = row->GetTypeAnn()->Cast<TStructExprType>();
-
- if (auto pos = structType->FindItem(PurecalcSysColumnTablePath)) {
- if (!EnsureSpecificDataType(row->Pos(), *structType->GetItems()[*pos]->GetItemType(), EDataSlot::String, ctx)) {
- return false;
- }
-
- result = ctx.Builder(position)
- .Callable(NNodes::TCoMember::CallableName())
- .Add(0, row)
- .Atom(1, PurecalcSysColumnTablePath)
- .Seal()
- .Build();
- } else {
- result = ctx.Builder(position)
- .Callable(NNodes::TCoString::CallableName())
- .Atom(0, "")
- .Seal()
- .Build();
+ if (auto pos = structType->FindItem(PurecalcSysColumnTablePath)) {
+ if (!EnsureSpecificDataType(row->Pos(), *structType->GetItems()[*pos]->GetItemType(), EDataSlot::String, ctx)) {
+ return false;
}
- return true;
+ // clang-format off
+ result = ctx.Builder(position)
+ .Callable(NNodes::TCoMember::CallableName())
+ .Add(0, row)
+ .Atom(1, PurecalcSysColumnTablePath)
+ .Seal()
+ .Build();
+ // clang-format on
+ } else {
+ // clang-format off
+ result = ctx.Builder(position)
+ .Callable(NNodes::TCoString::CallableName())
+ .Atom(0, "")
+ .Seal()
+ .Build();
+ // clang-format on
}
- };
-}
+
+ return true;
+ }
+};
+} // namespace
TAutoPtr<IGraphTransformer> NYql::NPureCalc::MakeTypeAnnotationTransformer(
TTypeAnnotationContextPtr typeAnnotationContext,
const TVector<const TStructExprType*>& inputStructs,
TVector<const TStructExprType*>& rawInputTypes,
EProcessorMode processorMode,
- const TString& nodeName
-) {
+ const TString& nodeName) {
return new TTypeAnnotator(typeAnnotationContext, inputStructs, rawInputTypes, processorMode, nodeName);
}
diff --git a/yql/essentials/public/purecalc/common/transformations/type_annotation.h b/yql/essentials/public/purecalc/common/transformations/type_annotation.h
index 87649fd231a..5ec0df2da5c 100644
--- a/yql/essentials/public/purecalc/common/transformations/type_annotation.h
+++ b/yql/essentials/public/purecalc/common/transformations/type_annotation.h
@@ -7,24 +7,23 @@
#include <yql/essentials/core/yql_type_annotation.h>
namespace NYql {
- namespace NPureCalc {
- /**
- * Build type annotation transformer that is aware of type of the input rows.
- *
- * @param typeAnnotationContext current context.
- * @param inputStructs types of each input.
- * @param rawInputStructs container to store the resulting input item type.
- * @param processorMode current processor mode. This will affect generated input type,
- * e.g. list node or struct node.
- * @param nodeName name of the callable used to get input data, e.g. `Self`.
- * @return a graph transformer for type annotation.
- */
- TAutoPtr<IGraphTransformer> MakeTypeAnnotationTransformer(
- TTypeAnnotationContextPtr typeAnnotationContext,
- const TVector<const TStructExprType*>& inputStructs,
- TVector<const TStructExprType*>& rawInputStructs,
- EProcessorMode processorMode,
- const TString& nodeName = TString{PurecalcInputCallableName}
- );
- }
-}
+namespace NPureCalc {
+/**
+ * Build type annotation transformer that is aware of type of the input rows.
+ *
+ * @param typeAnnotationContext current context.
+ * @param inputStructs types of each input.
+ * @param rawInputStructs container to store the resulting input item type.
+ * @param processorMode current processor mode. This will affect generated input type,
+ * e.g. list node or struct node.
+ * @param nodeName name of the callable used to get input data, e.g. `Self`.
+ * @return a graph transformer for type annotation.
+ */
+TAutoPtr<IGraphTransformer> MakeTypeAnnotationTransformer(
+ TTypeAnnotationContextPtr typeAnnotationContext,
+ const TVector<const TStructExprType*>& inputStructs,
+ TVector<const TStructExprType*>& rawInputStructs,
+ EProcessorMode processorMode,
+ const TString& nodeName = TString{PurecalcInputCallableName});
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/transformations/utils.cpp b/yql/essentials/public/purecalc/common/transformations/utils.cpp
index 54e0ef7caf8..82d84187a44 100644
--- a/yql/essentials/public/purecalc/common/transformations/utils.cpp
+++ b/yql/essentials/public/purecalc/common/transformations/utils.cpp
@@ -9,10 +9,10 @@ using namespace NYql::NPureCalc;
TExprNode::TPtr NYql::NPureCalc::NodeFromBlocks(
const TPositionHandle& pos,
const TStructExprType* structType,
- TExprContext& ctx
-) {
+ TExprContext& ctx) {
const auto items = structType->GetItems();
Y_ENSURE(items.size() > 0);
+ // clang-format off
return ctx.Builder(pos)
.Lambda()
.Param("stream")
@@ -50,30 +50,31 @@ TExprNode::TPtr NYql::NPureCalc::NodeFromBlocks(
.Params("fields", items.size())
.Callable("AsStruct")
.Do([&](TExprNodeBuilder& parent) -> TExprNodeBuilder& {
- ui32 i = 0;
- for (const auto& item : items) {
- parent.List(i)
- .Atom(0, item->GetName())
- .Arg(1, "fields", i++)
- .Seal();
- }
- return parent;
- })
+ ui32 i = 0;
+ for (const auto& item : items) {
+ parent.List(i)
+ .Atom(0, item->GetName())
+ .Arg(1, "fields", i++)
+ .Seal();
+ }
+ return parent;
+ })
.Seal()
.Seal()
.Seal()
.Seal()
.Seal()
.Build();
+ // clang-format on
}
TExprNode::TPtr NYql::NPureCalc::NodeToBlocks(
const TPositionHandle& pos,
const TStructExprType* structType,
- TExprContext& ctx
-) {
+ TExprContext& ctx) {
const auto items = structType->GetItems();
Y_ENSURE(items.size() > 0);
+ // clang-format off
return ctx.Builder(pos)
.Lambda()
.Param("stream")
@@ -126,6 +127,7 @@ TExprNode::TPtr NYql::NPureCalc::NodeToBlocks(
.Seal()
.Seal()
.Build();
+ // clang-format on
}
TExprNode::TPtr NYql::NPureCalc::ApplyToIterable(
@@ -133,9 +135,9 @@ TExprNode::TPtr NYql::NPureCalc::ApplyToIterable(
const TExprNode::TPtr iterable,
const TExprNode::TPtr lambda,
bool wrapLMap,
- TExprContext& ctx
-) {
+ TExprContext& ctx) {
if (wrapLMap) {
+ // clang-format off
return ctx.Builder(pos)
.Callable("LMap")
.Add(0, iterable)
@@ -147,19 +149,21 @@ TExprNode::TPtr NYql::NPureCalc::ApplyToIterable(
.Seal()
.Seal()
.Build();
+ // clang-format on
} else {
+ // clang-format off
return ctx.Builder(pos)
.Apply(lambda)
.With(0, iterable)
.Seal()
.Build();
+ // clang-format on
}
}
const TStructExprType* NYql::NPureCalc::WrapBlockStruct(
const TStructExprType* structType,
- TExprContext& ctx
-) {
+ TExprContext& ctx) {
TVector<const TItemExprType*> members;
for (const auto& item : structType->GetItems()) {
const auto blockItemType = ctx.MakeType<TBlockExprType>(item->GetItemType());
@@ -172,8 +176,7 @@ const TStructExprType* NYql::NPureCalc::WrapBlockStruct(
const TStructExprType* NYql::NPureCalc::UnwrapBlockStruct(
const TStructExprType* structType,
- TExprContext& ctx
-) {
+ TExprContext& ctx) {
TVector<const TItemExprType*> members;
for (const auto& item : structType->GetItems()) {
if (item->GetName() == PurecalcBlockColumnLength) {
diff --git a/yql/essentials/public/purecalc/common/transformations/utils.h b/yql/essentials/public/purecalc/common/transformations/utils.h
index cc8849b7e3a..c2ddf299ce3 100644
--- a/yql/essentials/public/purecalc/common/transformations/utils.h
+++ b/yql/essentials/public/purecalc/common/transformations/utils.h
@@ -3,81 +3,76 @@
#include <yql/essentials/core/yql_graph_transformer.h>
namespace NYql {
- namespace NPureCalc {
- /**
- * A transformer which wraps the given input node with the pipeline
- * converting the input type to the block one.
- *
- * @param pos the position of the given node to be rewritten.
- * @param structType the item type of the container provided by the node.
- * @param ctx the context to make ExprNode rewrites.
- * @return the resulting ExprNode.
- */
- TExprNode::TPtr NodeFromBlocks(
- const TPositionHandle& pos,
- const TStructExprType* structType,
- TExprContext& ctx
- );
+namespace NPureCalc {
+/**
+ * A transformer which wraps the given input node with the pipeline
+ * converting the input type to the block one.
+ *
+ * @param pos the position of the given node to be rewritten.
+ * @param structType the item type of the container provided by the node.
+ * @param ctx the context to make ExprNode rewrites.
+ * @return the resulting ExprNode.
+ */
+TExprNode::TPtr NodeFromBlocks(
+ const TPositionHandle& pos,
+ const TStructExprType* structType,
+ TExprContext& ctx);
- /**
- * A transformer which wraps the given root node with the pipeline
- * converting the output type to the block one.
- *
- * @param pos the position of the given node to be rewritten.
- * @param structType the item type of the container provided by the node.
- * @param ctx the context to make ExprNode rewrites.
- * @return the resulting ExprNode.
- */
- TExprNode::TPtr NodeToBlocks(
- const TPositionHandle& pos,
- const TStructExprType* structType,
- TExprContext& ctx
- );
+/**
+ * A transformer which wraps the given root node with the pipeline
+ * converting the output type to the block one.
+ *
+ * @param pos the position of the given node to be rewritten.
+ * @param structType the item type of the container provided by the node.
+ * @param ctx the context to make ExprNode rewrites.
+ * @return the resulting ExprNode.
+ */
+TExprNode::TPtr NodeToBlocks(
+ const TPositionHandle& pos,
+ const TStructExprType* structType,
+ TExprContext& ctx);
- /**
- * A transformer to apply the given lambda to the given iterable (either
- * list or stream). If the iterable is list, the lambda should be passed
- * to the <LMap> callable; if the iterable is stream, the lambda should
- * be applied right to the iterable.
- *
- * @param pos the position of the given node to be rewritten.
- * @param iterable the node, that provides the iterable to be processed.
- * @param lambda the node, that provides lambda to be applied.
- * @param wrapLMap indicator to wrap the result with LMap callable.
- * @oaram ctx the context to make ExprNode rewrites.
- */
- TExprNode::TPtr ApplyToIterable(
- const TPositionHandle& pos,
- const TExprNode::TPtr iterable,
- const TExprNode::TPtr lambda,
- bool wrapLMap,
- TExprContext& ctx
- );
+/**
+ * A transformer to apply the given lambda to the given iterable (either
+ * list or stream). If the iterable is list, the lambda should be passed
+ * to the <LMap> callable; if the iterable is stream, the lambda should
+ * be applied right to the iterable.
+ *
+ * @param pos the position of the given node to be rewritten.
+ * @param iterable the node, that provides the iterable to be processed.
+ * @param lambda the node, that provides lambda to be applied.
+ * @param wrapLMap indicator to wrap the result with LMap callable.
+ * @oaram ctx the context to make ExprNode rewrites.
+ */
+TExprNode::TPtr ApplyToIterable(
+ const TPositionHandle& pos,
+ const TExprNode::TPtr iterable,
+ const TExprNode::TPtr lambda,
+ bool wrapLMap,
+ TExprContext& ctx);
- /**
- * A helper which wraps the items of the given struct with the block
- * type container and appends the new item for _yql_block_length column.
- *
- * @param structType original struct to be wrapped.
- * @param ctx the context to make ExprType rewrite.
- * @return the new struct with block items.
- */
- const TStructExprType* WrapBlockStruct(
- const TStructExprType* structType,
- TExprContext& ctx
- );
+/**
+ * A helper which wraps the items of the given struct with the block
+ * type container and appends the new item for _yql_block_length column.
+ *
+ * @param structType original struct to be wrapped.
+ * @param ctx the context to make ExprType rewrite.
+ * @return the new struct with block items.
+ */
+const TStructExprType* WrapBlockStruct(
+ const TStructExprType* structType,
+ TExprContext& ctx);
- /**
- * A helper which unwraps the block container from the items of the
- * given struct and removes the item for _yql_block_length column.
- *
- * @param structType original struct to be unwrapped.
- * @param ctx the context to make ExprType rewrite.
- * @return the new struct without block items.
- */
- const TStructExprType* UnwrapBlockStruct(
- const TStructExprType* structType,
- TExprContext& ctx
- );
- }
-}
+/**
+ * A helper which unwraps the block container from the items of the
+ * given struct and removes the item for _yql_block_length column.
+ *
+ * @param structType original struct to be unwrapped.
+ * @param ctx the context to make ExprType rewrite.
+ * @return the new struct without block items.
+ */
+const TStructExprType* UnwrapBlockStruct(
+ const TStructExprType* structType,
+ TExprContext& ctx);
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/type_from_schema.cpp b/yql/essentials/public/purecalc/common/type_from_schema.cpp
index 09a3ff50a77..184419bbc97 100644
--- a/yql/essentials/public/purecalc/common/type_from_schema.cpp
+++ b/yql/essentials/public/purecalc/common/type_from_schema.cpp
@@ -6,255 +6,251 @@
#include <yql/essentials/providers/common/schema/expr/yql_expr_schema.h>
namespace {
- using namespace NYql;
+using namespace NYql;
#define REPORT(...) ctx.AddError(TIssue(TString(TStringBuilder() << __VA_ARGS__)))
- bool CheckStruct(const TStructExprType* got, const TStructExprType* expected, TExprContext& ctx, const TTypeAnnotationContext& typeCtx) {
- auto status = true;
-
- if (expected) {
- for (const auto* gotNamedItem : got->GetItems()) {
- auto expectedIndex = expected->FindItem(gotNamedItem->GetName());
- if (expectedIndex) {
- const auto* gotItem = gotNamedItem->GetItemType();
- const auto* expectedItem = expected->GetItems()[*expectedIndex]->GetItemType();
-
- auto arg = ctx.NewArgument(TPositionHandle(), "arg");
- auto fieldConversionStatus = TryConvertTo(arg, *gotItem, *expectedItem, ctx, typeCtx);
- if (fieldConversionStatus.Level == IGraphTransformer::TStatus::Error) {
- status = false;
- }
- } else {
- REPORT("Got unexpected item " << TString{gotNamedItem->GetName()}.Quote());
- status = false;
- }
- }
+bool CheckStruct(const TStructExprType* got, const TStructExprType* expected, TExprContext& ctx, const TTypeAnnotationContext& typeCtx) {
+ auto status = true;
- for (const auto* expectedNamedItem : expected->GetItems()) {
- if (expectedNamedItem->GetItemType()->GetKind() == ETypeAnnotationKind::Optional) {
- continue;
- }
- if (!got->FindItem(expectedNamedItem->GetName())) {
- REPORT("Expected item " << TString{expectedNamedItem->GetName()}.Quote());
+ if (expected) {
+ for (const auto* gotNamedItem : got->GetItems()) {
+ auto expectedIndex = expected->FindItem(gotNamedItem->GetName());
+ if (expectedIndex) {
+ const auto* gotItem = gotNamedItem->GetItemType();
+ const auto* expectedItem = expected->GetItems()[*expectedIndex]->GetItemType();
+
+ auto arg = ctx.NewArgument(TPositionHandle(), "arg");
+ auto fieldConversionStatus = TryConvertTo(arg, *gotItem, *expectedItem, ctx, typeCtx);
+ if (fieldConversionStatus.Level == IGraphTransformer::TStatus::Error) {
status = false;
}
+ } else {
+ REPORT("Got unexpected item " << TString{gotNamedItem->GetName()}.Quote());
+ status = false;
}
}
- return status;
- }
-
- bool CheckVariantContent(const TStructExprType* got, const TStructExprType* expected, TExprContext& ctx,
- const TTypeAnnotationContext& typeCtx) {
- auto status = true;
-
- if (expected) {
- for (const auto* gotNamedItem : got->GetItems()) {
- if (!expected->FindItem(gotNamedItem->GetName())) {
- REPORT("Got unexpected alternative " << TString{gotNamedItem->GetName()}.Quote());
- status = false;
- }
+ for (const auto* expectedNamedItem : expected->GetItems()) {
+ if (expectedNamedItem->GetItemType()->GetKind() == ETypeAnnotationKind::Optional) {
+ continue;
}
-
- for (const auto* expectedNamedItem : expected->GetItems()) {
- if (!got->FindItem(expectedNamedItem->GetName())) {
- REPORT("Expected alternative " << TString{expectedNamedItem->GetName()}.Quote());
- status = false;
- }
+ if (!got->FindItem(expectedNamedItem->GetName())) {
+ REPORT("Expected item " << TString{expectedNamedItem->GetName()}.Quote());
+ status = false;
}
}
+ }
- for (const auto* gotNamedItem : got->GetItems()) {
- const auto* gotItem = gotNamedItem->GetItemType();
- auto expectedIndex = expected ? expected->FindItem(gotNamedItem->GetName()) : Nothing();
- const auto* expectedItem = expected && expectedIndex ? expected->GetItems()[*expectedIndex]->GetItemType() : nullptr;
+ return status;
+}
- TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
- return new TIssue(TPosition(), TStringBuilder() << "Alternative " << TString{gotNamedItem->GetName()}.Quote());
- });
+bool CheckVariantContent(const TStructExprType* got, const TStructExprType* expected, TExprContext& ctx,
+ const TTypeAnnotationContext& typeCtx) {
+ auto status = true;
- if (expectedItem && expectedItem->GetKind() != gotItem->GetKind()) {
- REPORT("Expected to be " << expectedItem->GetKind() << ", but got " << gotItem->GetKind());
+ if (expected) {
+ for (const auto* gotNamedItem : got->GetItems()) {
+ if (!expected->FindItem(gotNamedItem->GetName())) {
+ REPORT("Got unexpected alternative " << TString{gotNamedItem->GetName()}.Quote());
status = false;
}
+ }
- if (gotItem->GetKind() != ETypeAnnotationKind::Struct) {
- REPORT("Expected to be Struct, but got " << gotItem->GetKind());
+ for (const auto* expectedNamedItem : expected->GetItems()) {
+ if (!got->FindItem(expectedNamedItem->GetName())) {
+ REPORT("Expected alternative " << TString{expectedNamedItem->GetName()}.Quote());
status = false;
}
+ }
+ }
- const auto* gotStruct = gotItem->Cast<TStructExprType>();
- const auto* expectedStruct = expectedItem ? expectedItem->Cast<TStructExprType>() : nullptr;
+ for (const auto* gotNamedItem : got->GetItems()) {
+ const auto* gotItem = gotNamedItem->GetItemType();
+ auto expectedIndex = expected ? expected->FindItem(gotNamedItem->GetName()) : Nothing();
+ const auto* expectedItem = expected && expectedIndex ? expected->GetItems()[*expectedIndex]->GetItemType() : nullptr;
- if (!CheckStruct(gotStruct, expectedStruct, ctx, typeCtx)) {
- status = false;
- }
+ TIssueScopeGuard issueScope(ctx.IssueManager, [&]() {
+ return new TIssue(TPosition(), TStringBuilder() << "Alternative " << TString{gotNamedItem->GetName()}.Quote());
+ });
+
+ if (expectedItem && expectedItem->GetKind() != gotItem->GetKind()) {
+ REPORT("Expected to be " << expectedItem->GetKind() << ", but got " << gotItem->GetKind());
+ status = false;
}
- return status;
- }
+ if (gotItem->GetKind() != ETypeAnnotationKind::Struct) {
+ REPORT("Expected to be Struct, but got " << gotItem->GetKind());
+ status = false;
+ }
- bool CheckVariantContent(const TTupleExprType* got, const TTupleExprType* expected, TExprContext& ctx,
- const TTypeAnnotationContext& typeCtx) {
- if (expected && expected->GetSize() != got->GetSize()) {
- REPORT("Expected to have " << expected->GetSize() << " alternatives, but got " << got->GetSize());
- return false;
+ const auto* gotStruct = gotItem->Cast<TStructExprType>();
+ const auto* expectedStruct = expectedItem ? expectedItem->Cast<TStructExprType>() : nullptr;
+
+ if (!CheckStruct(gotStruct, expectedStruct, ctx, typeCtx)) {
+ status = false;
}
+ }
- auto status = true;
+ return status;
+}
- for (size_t i = 0; i < got->GetSize(); i++) {
- const auto* gotItem = got->GetItems()[i];
- const auto* expectedItem = expected ? expected->GetItems()[i] : nullptr;
+bool CheckVariantContent(const TTupleExprType* got, const TTupleExprType* expected, TExprContext& ctx,
+ const TTypeAnnotationContext& typeCtx) {
+ if (expected && expected->GetSize() != got->GetSize()) {
+ REPORT("Expected to have " << expected->GetSize() << " alternatives, but got " << got->GetSize());
+ return false;
+ }
- TIssueScopeGuard issueScope(ctx.IssueManager, [i]() {
- return new TIssue(TPosition(), TStringBuilder() << "Alternative #" << i);
- });
+ auto status = true;
- if (expectedItem && expectedItem->GetKind() != gotItem->GetKind()) {
- REPORT("Expected " << expectedItem->GetKind() << ", but got " << gotItem->GetKind());
- status = false;
- }
+ for (size_t i = 0; i < got->GetSize(); i++) {
+ const auto* gotItem = got->GetItems()[i];
+ const auto* expectedItem = expected ? expected->GetItems()[i] : nullptr;
- if (gotItem->GetKind() != ETypeAnnotationKind::Struct) {
- REPORT("Expected Struct, but got " << gotItem->GetKind());
- status = false;
- }
+ TIssueScopeGuard issueScope(ctx.IssueManager, [i]() {
+ return new TIssue(TPosition(), TStringBuilder() << "Alternative #" << i);
+ });
- const auto* gotStruct = gotItem->Cast<TStructExprType>();
- const auto* expectedStruct = expectedItem ? expectedItem->Cast<TStructExprType>() : nullptr;
+ if (expectedItem && expectedItem->GetKind() != gotItem->GetKind()) {
+ REPORT("Expected " << expectedItem->GetKind() << ", but got " << gotItem->GetKind());
+ status = false;
+ }
- if (!CheckStruct(gotStruct, expectedStruct, ctx, typeCtx)) {
- status = false;
- }
+ if (gotItem->GetKind() != ETypeAnnotationKind::Struct) {
+ REPORT("Expected Struct, but got " << gotItem->GetKind());
+ status = false;
}
- return status;
- }
+ const auto* gotStruct = gotItem->Cast<TStructExprType>();
+ const auto* expectedStruct = expectedItem ? expectedItem->Cast<TStructExprType>() : nullptr;
- bool CheckVariant(const TVariantExprType* got, const TVariantExprType* expected, TExprContext& ctx,
- const TTypeAnnotationContext& typeCtx) {
- if (expected && expected->GetUnderlyingType()->GetKind() != got->GetUnderlyingType()->GetKind()) {
- REPORT("Expected Variant over " << expected->GetUnderlyingType()->GetKind() <<
- ", but got Variant over " << got->GetUnderlyingType()->GetKind());
- return false;
+ if (!CheckStruct(gotStruct, expectedStruct, ctx, typeCtx)) {
+ status = false;
}
+ }
- switch (got->GetUnderlyingType()->GetKind()) {
- case ETypeAnnotationKind::Struct:
- {
- const auto* gotStruct = got->GetUnderlyingType()->Cast<TStructExprType>();
- const auto* expectedStruct = expected ? expected->GetUnderlyingType()->Cast<TStructExprType>() : nullptr;
- return CheckVariantContent(gotStruct, expectedStruct, ctx, typeCtx);
- }
- case ETypeAnnotationKind::Tuple:
- {
- const auto* gotTuple = got->GetUnderlyingType()->Cast<TTupleExprType>();
- const auto* expectedTuple = expected ? expected->GetUnderlyingType()->Cast<TTupleExprType>() : nullptr;
- return CheckVariantContent(gotTuple, expectedTuple, ctx, typeCtx);
- }
- default:
- Y_UNREACHABLE();
- }
+ return status;
+}
+bool CheckVariant(const TVariantExprType* got, const TVariantExprType* expected, TExprContext& ctx,
+ const TTypeAnnotationContext& typeCtx) {
+ if (expected && expected->GetUnderlyingType()->GetKind() != got->GetUnderlyingType()->GetKind()) {
+ REPORT("Expected Variant over " << expected->GetUnderlyingType()->GetKind() << ", but got Variant over " << got->GetUnderlyingType()->GetKind());
return false;
}
- bool CheckSchema(const TTypeAnnotationNode* got, const TTypeAnnotationNode* expected, TExprContext& ctx, const TTypeAnnotationContext& typeCtx, bool allowVariant) {
- if (expected && expected->GetKind() != got->GetKind()) {
- REPORT("Expected " << expected->GetKind() << ", but got " << got->GetKind());
- return false;
+ switch (got->GetUnderlyingType()->GetKind()) {
+ case ETypeAnnotationKind::Struct: {
+ const auto* gotStruct = got->GetUnderlyingType()->Cast<TStructExprType>();
+ const auto* expectedStruct = expected ? expected->GetUnderlyingType()->Cast<TStructExprType>() : nullptr;
+ return CheckVariantContent(gotStruct, expectedStruct, ctx, typeCtx);
}
+ case ETypeAnnotationKind::Tuple: {
+ const auto* gotTuple = got->GetUnderlyingType()->Cast<TTupleExprType>();
+ const auto* expectedTuple = expected ? expected->GetUnderlyingType()->Cast<TTupleExprType>() : nullptr;
+ return CheckVariantContent(gotTuple, expectedTuple, ctx, typeCtx);
+ }
+ default:
+ Y_UNREACHABLE();
+ }
- switch (got->GetKind()) {
- case ETypeAnnotationKind::Struct:
- {
- TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Toplevel struct"); });
+ return false;
+}
- const auto* gotStruct = got->Cast<TStructExprType>();
- const auto* expectedStruct = expected ? expected->Cast<TStructExprType>() : nullptr;
+bool CheckSchema(const TTypeAnnotationNode* got, const TTypeAnnotationNode* expected, TExprContext& ctx, const TTypeAnnotationContext& typeCtx, bool allowVariant) {
+ if (expected && expected->GetKind() != got->GetKind()) {
+ REPORT("Expected " << expected->GetKind() << ", but got " << got->GetKind());
+ return false;
+ }
- if (!gotStruct->Validate(TPositionHandle(), ctx)) {
- return false;
- }
+ switch (got->GetKind()) {
+ case ETypeAnnotationKind::Struct: {
+ TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Toplevel struct"); });
+
+ const auto* gotStruct = got->Cast<TStructExprType>();
+ const auto* expectedStruct = expected ? expected->Cast<TStructExprType>() : nullptr;
- return CheckStruct(gotStruct, expectedStruct, ctx, typeCtx);
+ if (!gotStruct->Validate(TPositionHandle(), ctx)) {
+ return false;
}
- case ETypeAnnotationKind::Variant:
- if (allowVariant) {
- TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Toplevel variant"); });
- const auto* gotVariant = got->Cast<TVariantExprType>();
- const auto* expectedVariant = expected ? expected->Cast<TVariantExprType>() : nullptr;
+ return CheckStruct(gotStruct, expectedStruct, ctx, typeCtx);
+ }
+ case ETypeAnnotationKind::Variant:
+ if (allowVariant) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Toplevel variant"); });
- if (!gotVariant->Validate(TPositionHandle(), ctx)) {
- return false;
- }
+ const auto* gotVariant = got->Cast<TVariantExprType>();
+ const auto* expectedVariant = expected ? expected->Cast<TVariantExprType>() : nullptr;
- return CheckVariant(gotVariant, expectedVariant, ctx, typeCtx);
- }
- [[fallthrough]];
- default:
- if (allowVariant) {
- REPORT("Expected Struct or Variant, but got " << got->GetKind());
- } else {
- REPORT("Expected Struct, but got " << got->GetKind());
+ if (!gotVariant->Validate(TPositionHandle(), ctx)) {
+ return false;
}
- return false;
- }
+
+ return CheckVariant(gotVariant, expectedVariant, ctx, typeCtx);
+ }
+ [[fallthrough]];
+ default:
+ if (allowVariant) {
+ REPORT("Expected Struct or Variant, but got " << got->GetKind());
+ } else {
+ REPORT("Expected Struct, but got " << got->GetKind());
+ }
+ return false;
}
}
+} // namespace
namespace NYql::NPureCalc {
- const TTypeAnnotationNode* MakeTypeFromSchema(const NYT::TNode& yson, TExprContext& ctx) {
- const auto* type = NCommon::ParseTypeFromYson(yson, ctx);
-
- if (!type) {
- auto issues = ctx.IssueManager.GetIssues();
- CheckFatalIssues(issues);
- ythrow TCompileError("", issues.ToString())
- << "Incorrect schema: " << NYT::NodeToYsonString(yson, NYson::EYsonFormat::Text);
- }
-
- return type;
+const TTypeAnnotationNode* MakeTypeFromSchema(const NYT::TNode& yson, TExprContext& ctx) {
+ const auto* type = NCommon::ParseTypeFromYson(yson, ctx);
+
+ if (!type) {
+ auto issues = ctx.IssueManager.GetIssues();
+ CheckFatalIssues(issues);
+ ythrow TCompileError("", issues.ToString())
+ << "Incorrect schema: " << NYT::NodeToYsonString(yson, NYson::EYsonFormat::Text);
}
- const TStructExprType* ExtendStructType(
- const TStructExprType* type, const THashMap<TString, NYT::TNode>& extraColumns, TExprContext& ctx)
- {
- if (extraColumns.empty()) {
- return type;
- }
+ return type;
+}
- auto items = type->GetItems();
- for (const auto& pair : extraColumns) {
- items.push_back(ctx.MakeType<TItemExprType>(pair.first, MakeTypeFromSchema(pair.second, ctx)));
- }
+const TStructExprType* ExtendStructType(
+ const TStructExprType* type, const THashMap<TString, NYT::TNode>& extraColumns, TExprContext& ctx)
+{
+ if (extraColumns.empty()) {
+ return type;
+ }
- auto result = ctx.MakeType<TStructExprType>(items);
+ auto items = type->GetItems();
+ for (const auto& pair : extraColumns) {
+ items.push_back(ctx.MakeType<TItemExprType>(pair.first, MakeTypeFromSchema(pair.second, ctx)));
+ }
- if (!result->Validate(TPosition(), ctx)) {
- auto issues = ctx.IssueManager.GetIssues();
- CheckFatalIssues(issues);
- ythrow TCompileError("", issues.ToString()) << "Incorrect extended struct type";
- }
+ auto result = ctx.MakeType<TStructExprType>(items);
- return result;
+ if (!result->Validate(TPosition(), ctx)) {
+ auto issues = ctx.IssueManager.GetIssues();
+ CheckFatalIssues(issues);
+ ythrow TCompileError("", issues.ToString()) << "Incorrect extended struct type";
}
- bool ValidateInputSchema(const TTypeAnnotationNode* type, TExprContext& ctx, const TTypeAnnotationContext& typeCtx) {
- TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Input schema"); });
- return CheckSchema(type, nullptr, ctx, typeCtx, false);
- }
+ return result;
+}
- bool ValidateOutputSchema(const TTypeAnnotationNode* type, TExprContext& ctx, const TTypeAnnotationContext& typeCtx) {
- TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Output schema"); });
- return CheckSchema(type, nullptr, ctx, typeCtx, true);
- }
+bool ValidateInputSchema(const TTypeAnnotationNode* type, TExprContext& ctx, const TTypeAnnotationContext& typeCtx) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Input schema"); });
+ return CheckSchema(type, nullptr, ctx, typeCtx, false);
+}
- bool ValidateOutputType(const TTypeAnnotationNode* type, const TTypeAnnotationNode* expected, TExprContext& ctx, const TTypeAnnotationContext& typeCtx) {
- TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Program return type"); });
- return CheckSchema(type, expected, ctx, typeCtx, true);
- }
+bool ValidateOutputSchema(const TTypeAnnotationNode* type, TExprContext& ctx, const TTypeAnnotationContext& typeCtx) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Output schema"); });
+ return CheckSchema(type, nullptr, ctx, typeCtx, true);
+}
+
+bool ValidateOutputType(const TTypeAnnotationNode* type, const TTypeAnnotationNode* expected, TExprContext& ctx, const TTypeAnnotationContext& typeCtx) {
+ TIssueScopeGuard issueScope(ctx.IssueManager, []() { return new TIssue(TPosition(), "Program return type"); });
+ return CheckSchema(type, expected, ctx, typeCtx, true);
}
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/common/type_from_schema.h b/yql/essentials/public/purecalc/common/type_from_schema.h
index 18e6e8373f4..a34210b1bed 100644
--- a/yql/essentials/public/purecalc/common/type_from_schema.h
+++ b/yql/essentials/public/purecalc/common/type_from_schema.h
@@ -7,32 +7,32 @@
#include <library/cpp/yson/node/node.h>
namespace NYql {
- struct TTypeAnnotationContext;
-
- namespace NPureCalc {
- /**
- * Load struct type from yson. Use methods below to check returned type for correctness.
- */
- const TTypeAnnotationNode* MakeTypeFromSchema(const NYT::TNode&, TExprContext&);
-
- /**
- * Extend struct type with additional columns. Type of each extra column is loaded from yson.
- */
- const TStructExprType* ExtendStructType(const TStructExprType*, const THashMap<TString, NYT::TNode>&, TExprContext&);
-
- /**
- * Check if the given type can be used as an input schema, i.e. it is a struct.
- */
- bool ValidateInputSchema(const TTypeAnnotationNode* type, TExprContext& ctx, const TTypeAnnotationContext& typeCtx);
-
- /**
- * Check if the given type can be used as an output schema, i.e. it is a struct or a variant of structs.
- */
- bool ValidateOutputSchema(const TTypeAnnotationNode* type, TExprContext& ctx, const TTypeAnnotationContext& typeCtx);
-
- /**
- * Check if output type can be silently converted to the expected type.
- */
- bool ValidateOutputType(const TTypeAnnotationNode* type, const TTypeAnnotationNode* expected, TExprContext& ctx, const TTypeAnnotationContext& typeCtx);
- }
-}
+struct TTypeAnnotationContext;
+
+namespace NPureCalc {
+/**
+ * Load struct type from yson. Use methods below to check returned type for correctness.
+ */
+const TTypeAnnotationNode* MakeTypeFromSchema(const NYT::TNode&, TExprContext&);
+
+/**
+ * Extend struct type with additional columns. Type of each extra column is loaded from yson.
+ */
+const TStructExprType* ExtendStructType(const TStructExprType*, const THashMap<TString, NYT::TNode>&, TExprContext&);
+
+/**
+ * Check if the given type can be used as an input schema, i.e. it is a struct.
+ */
+bool ValidateInputSchema(const TTypeAnnotationNode* type, TExprContext& ctx, const TTypeAnnotationContext& typeCtx);
+
+/**
+ * Check if the given type can be used as an output schema, i.e. it is a struct or a variant of structs.
+ */
+bool ValidateOutputSchema(const TTypeAnnotationNode* type, TExprContext& ctx, const TTypeAnnotationContext& typeCtx);
+
+/**
+ * Check if output type can be silently converted to the expected type.
+ */
+bool ValidateOutputType(const TTypeAnnotationNode* type, const TTypeAnnotationNode* expected, TExprContext& ctx, const TTypeAnnotationContext& typeCtx);
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/worker.cpp b/yql/essentials/public/purecalc/common/worker.cpp
index d5561fc4f73..e6a32ff4118 100644
--- a/yql/essentials/public/purecalc/common/worker.cpp
+++ b/yql/essentials/public/purecalc/common/worker.cpp
@@ -46,15 +46,12 @@ TWorkerGraph::TWorkerGraph(
ui64 nativeYtTypeFlags,
TMaybe<ui64> deterministicTimeProviderSeed,
TLangVersion langver,
- bool insideEvaluation
-)
+ bool insideEvaluation)
: ScopedAlloc(__LOCATION__, NKikimr::TAlignedPagePoolCounters(), funcRegistry.SupportsSizedAllocators())
, Env(ScopedAlloc)
, FuncRegistry(funcRegistry)
, RandomProvider(CreateDefaultRandomProvider())
- , TimeProvider(deterministicTimeProviderSeed ?
- CreateDeterministicTimeProvider(*deterministicTimeProviderSeed) :
- CreateDefaultTimeProvider())
+ , TimeProvider(deterministicTimeProviderSeed ? CreateDeterministicTimeProvider(*deterministicTimeProviderSeed) : CreateDefaultTimeProvider())
, LLVMSettings(LLVMSettings)
, NativeYtTypeFlags(nativeYtTypeFlags)
{
@@ -124,19 +121,16 @@ TWorkerGraph::TWorkerGraph(
const THashSet<NKikimr::NMiniKQL::TInternName> selfCallableNames = {
Env.InternName(PurecalcInputCallableName),
- Env.InternName(PurecalcBlockInputCallableName)
- };
+ Env.InternName(PurecalcBlockInputCallableName)};
NKikimr::NMiniKQL::TExploringNodeVisitor explorer;
explorer.Walk(rootNode.GetNode(), Env.GetNodeStack());
auto compositeNodeFactory = NKikimr::NMiniKQL::GetCompositeWithBuiltinFactory(
- {NKikimr::NMiniKQL::GetYqlFactory(), NYql::GetPgFactory()}
- );
+ {NKikimr::NMiniKQL::GetYqlFactory(), NYql::GetPgFactory()});
auto nodeFactory = [&](
- NKikimr::NMiniKQL::TCallable& callable, const NKikimr::NMiniKQL::TComputationNodeFactoryContext& ctx
- ) -> NKikimr::NMiniKQL::IComputationNode* {
+ NKikimr::NMiniKQL::TCallable& callable, const NKikimr::NMiniKQL::TComputationNodeFactoryContext& ctx) -> NKikimr::NMiniKQL::IComputationNode* {
if (selfCallableNames.contains(callable.GetType()->GetNameStr())) {
if (insideEvaluation) {
throw TErrorException(0) << "Inputs aren't available during evaluation";
@@ -147,8 +141,7 @@ TWorkerGraph::TWorkerGraph(
YQL_ENSURE(inputIndex < inputsCount, "Self index is out of range");
YQL_ENSURE(!SelfNodes[inputIndex], "Self can be called at most once with each index");
return SelfNodes[inputIndex] = new NKikimr::NMiniKQL::TExternalComputationNode(ctx.Mutables);
- }
- else {
+ } else {
return compositeNodeFactory(callable, ctx);
}
};
@@ -171,7 +164,7 @@ TWorkerGraph::TWorkerGraph(
ComputationPattern = NKikimr::NMiniKQL::MakeComputationPattern(
explorer,
rootNode,
- { rootNode.GetNode() },
+ {rootNode.GetNode()},
computationPatternOpts);
ComputationGraph = ComputationPattern->Clone(
@@ -206,12 +199,11 @@ TWorker<TBase>::TWorker(
NKikimr::NUdf::ICountersProvider* countersProvider,
ui64 nativeYtTypeFlags,
TMaybe<ui64> deterministicTimeProviderSeed,
- TLangVersion langver
-)
+ TLangVersion langver)
: WorkerFactory_(std::move(factory))
, Graph_(exprRoot, exprCtx, serializedProgram, funcRegistry, userData,
- inputTypes, originalInputTypes, rawInputTypes, outputType, rawOutputType,
- LLVMSettings, countersProvider, nativeYtTypeFlags, deterministicTimeProviderSeed, langver, false)
+ inputTypes, originalInputTypes, rawInputTypes, outputType, rawOutputType,
+ LLVMSettings, countersProvider, nativeYtTypeFlags, deterministicTimeProviderSeed, langver, false)
{
}
@@ -404,9 +396,9 @@ NKikimr::NUdf::TUnboxedValue& TPullStreamWorker::GetOutput() {
}
void TPullStreamWorker::Release() {
- with_lock(GetScopedAlloc()) {
+ with_lock (GetScopedAlloc()) {
Output_ = NKikimr::NUdf::TUnboxedValue::Invalid();
- for (auto selfNode: Graph_.SelfNodes) {
+ for (auto selfNode : Graph_.SelfNodes) {
if (selfNode) {
selfNode->SetValue(Graph_.ComputationGraph->GetContext(), NKikimr::NUdf::TUnboxedValue::Invalid());
}
@@ -477,11 +469,11 @@ void TPullListWorker::ResetOutputIterator() {
}
void TPullListWorker::Release() {
- with_lock(GetScopedAlloc()) {
+ with_lock (GetScopedAlloc()) {
Output_ = NKikimr::NUdf::TUnboxedValue::Invalid();
OutputIterator_ = NKikimr::NUdf::TUnboxedValue::Invalid();
- for (auto selfNode: Graph_.SelfNodes) {
+ for (auto selfNode : Graph_.SelfNodes) {
if (selfNode) {
selfNode->SetValue(Graph_.ComputationGraph->GetContext(), NKikimr::NUdf::TUnboxedValue::Invalid());
}
@@ -492,45 +484,45 @@ void TPullListWorker::Release() {
}
namespace {
- class TPushStream final: public NKikimr::NMiniKQL::TCustomListValue {
- private:
- mutable bool HasIterator_ = false;
- bool HasValue_ = false;
- bool IsFinished_ = false;
- NKikimr::NUdf::TUnboxedValue Value_ = NKikimr::NUdf::TUnboxedValue::Invalid();
-
- public:
- using TCustomListValue::TCustomListValue;
-
- public:
- void SetValue(NKikimr::NUdf::TUnboxedValue&& value) {
- Value_ = std::move(value);
- HasValue_ = true;
- }
+class TPushStream final: public NKikimr::NMiniKQL::TCustomListValue {
+private:
+ mutable bool HasIterator_ = false;
+ bool HasValue_ = false;
+ bool IsFinished_ = false;
+ NKikimr::NUdf::TUnboxedValue Value_ = NKikimr::NUdf::TUnboxedValue::Invalid();
+
+public:
+ using TCustomListValue::TCustomListValue;
+
+public:
+ void SetValue(NKikimr::NUdf::TUnboxedValue&& value) {
+ Value_ = std::move(value);
+ HasValue_ = true;
+ }
- void SetFinished() {
- IsFinished_ = true;
- }
+ void SetFinished() {
+ IsFinished_ = true;
+ }
- NKikimr::NUdf::TUnboxedValue GetListIterator() const override {
- YQL_ENSURE(!HasIterator_, "only one pass over input is supported");
- HasIterator_ = true;
- return NKikimr::NUdf::TUnboxedValuePod(const_cast<TPushStream*>(this));
- }
+ NKikimr::NUdf::TUnboxedValue GetListIterator() const override {
+ YQL_ENSURE(!HasIterator_, "only one pass over input is supported");
+ HasIterator_ = true;
+ return NKikimr::NUdf::TUnboxedValuePod(const_cast<TPushStream*>(this));
+ }
- NKikimr::NUdf::EFetchStatus Fetch(NKikimr::NUdf::TUnboxedValue& result) override {
- if (IsFinished_) {
- return NKikimr::NUdf::EFetchStatus::Finish;
- } else if (!HasValue_) {
- return NKikimr::NUdf::EFetchStatus::Yield;
- } else {
- result = std::move(Value_);
- HasValue_ = false;
- return NKikimr::NUdf::EFetchStatus::Ok;
- }
+ NKikimr::NUdf::EFetchStatus Fetch(NKikimr::NUdf::TUnboxedValue& result) override {
+ if (IsFinished_) {
+ return NKikimr::NUdf::EFetchStatus::Finish;
+ } else if (!HasValue_) {
+ return NKikimr::NUdf::EFetchStatus::Yield;
+ } else {
+ result = std::move(Value_);
+ HasValue_ = false;
+ return NKikimr::NUdf::EFetchStatus::Ok;
}
- };
-}
+ }
+};
+} // namespace
void TPushStreamWorker::FeedToConsumer() {
auto value = Graph_.ComputationGraph->GetValue();
@@ -608,7 +600,7 @@ void TPushStreamWorker::OnFinish() {
}
void TPushStreamWorker::Release() {
- with_lock(GetScopedAlloc()) {
+ with_lock (GetScopedAlloc()) {
Consumer_.Destroy();
if (SelfNode_) {
SelfNode_->SetValue(Graph_.ComputationGraph->GetContext(), NKikimr::NUdf::TUnboxedValue::Invalid());
@@ -619,16 +611,12 @@ void TPushStreamWorker::Release() {
TWorker<IPushStreamWorker>::Release();
}
-
namespace NYql {
- namespace NPureCalc {
- template
- class TWorker<IPullStreamWorker>;
+namespace NPureCalc {
+template class TWorker<IPullStreamWorker>;
- template
- class TWorker<IPullListWorker>;
+template class TWorker<IPullListWorker>;
- template
- class TWorker<IPushStreamWorker>;
- }
-}
+template class TWorker<IPushStreamWorker>;
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/worker.h b/yql/essentials/public/purecalc/common/worker.h
index b032b15af15..415e57fcf5e 100644
--- a/yql/essentials/public/purecalc/common/worker.h
+++ b/yql/essentials/public/purecalc/common/worker.h
@@ -14,169 +14,169 @@
#include <memory>
namespace NYql {
- namespace NPureCalc {
- struct TWorkerGraph {
- TWorkerGraph(
- const TExprNode::TPtr& exprRoot,
- TExprContext& exprCtx,
- const TString& serializedProgram,
- const NKikimr::NMiniKQL::IFunctionRegistry& funcRegistry,
- const TUserDataTable& userData,
- const TVector<const TStructExprType*>& inputTypes,
- const TVector<const TStructExprType*>& originalInputTypes,
- const TVector<const TStructExprType*>& rawInputTypes,
- const TTypeAnnotationNode* outputType,
- const TTypeAnnotationNode* rawOutputType,
- const TString& LLVMSettings,
- NKikimr::NUdf::ICountersProvider* countersProvider,
- ui64 nativeYtTypeFlags,
- TMaybe<ui64> deterministicTimeProviderSeed,
- TLangVersion langver,
- bool insideEvaluation
- );
-
- ~TWorkerGraph();
-
- NKikimr::NMiniKQL::TScopedAlloc ScopedAlloc;
- NKikimr::NMiniKQL::TTypeEnvironment Env;
- const NKikimr::NMiniKQL::IFunctionRegistry& FuncRegistry;
- TIntrusivePtr<IRandomProvider> RandomProvider;
- TIntrusivePtr<ITimeProvider> TimeProvider;
- NKikimr::NMiniKQL::IComputationPattern::TPtr ComputationPattern;
- THolder<NKikimr::NMiniKQL::IComputationGraph> ComputationGraph;
- TString LLVMSettings;
- ui64 NativeYtTypeFlags;
- TMaybe<TString> TimestampColumn;
- const NKikimr::NMiniKQL::TType* OutputType;
- const NKikimr::NMiniKQL::TType* RawOutputType;
- TVector<NKikimr::NMiniKQL::IComputationExternalNode*> SelfNodes;
- TVector<const NKikimr::NMiniKQL::TStructType*> InputTypes;
- TVector<const NKikimr::NMiniKQL::TStructType*> OriginalInputTypes;
- TVector<const NKikimr::NMiniKQL::TStructType*> RawInputTypes;
- };
-
- template <typename TBase>
- class TWorker: public TBase {
- public:
- using TWorkerFactoryPtr = std::weak_ptr<IWorkerFactory>;
- private:
- // Worker factory implementation should stay alive for this worker to operate correctly.
- TWorkerFactoryPtr WorkerFactory_;
-
- protected:
- TWorkerGraph Graph_;
-
- public:
- TWorker(
- TWorkerFactoryPtr factory,
- const TExprNode::TPtr& exprRoot,
- TExprContext& exprCtx,
- const TString& serializedProgram,
- const NKikimr::NMiniKQL::IFunctionRegistry& funcRegistry,
- const TUserDataTable& userData,
- const TVector<const TStructExprType*>& inputTypes,
- const TVector<const TStructExprType*>& originalInputTypes,
- const TVector<const TStructExprType*>& rawInputTypes,
- const TTypeAnnotationNode* outputType,
- const TTypeAnnotationNode* rawOutputType,
- const TString& LLVMSettings,
- NKikimr::NUdf::ICountersProvider* countersProvider,
- ui64 nativeYtTypeFlags,
- TMaybe<ui64> deterministicTimeProviderSeed,
- TLangVersion langver
- );
-
- public:
- ui32 GetInputsCount() const override;
- const NKikimr::NMiniKQL::TStructType* GetInputType(ui32, bool) const override;
- const NKikimr::NMiniKQL::TStructType* GetInputType(bool) const override;
- const NKikimr::NMiniKQL::TStructType* GetRawInputType(ui32) const override;
- const NKikimr::NMiniKQL::TStructType* GetRawInputType() const override;
- const NKikimr::NMiniKQL::TType* GetOutputType() const override;
- const NKikimr::NMiniKQL::TType* GetRawOutputType() const override;
- NYT::TNode MakeInputSchema() const override;
- NYT::TNode MakeInputSchema(ui32) const override;
- NYT::TNode MakeOutputSchema() const override;
- NYT::TNode MakeOutputSchema(ui32) const override;
- NYT::TNode MakeOutputSchema(TStringBuf) const override;
- NYT::TNode MakeFullOutputSchema() const override;
- NKikimr::NMiniKQL::TScopedAlloc& GetScopedAlloc() override;
- NKikimr::NMiniKQL::IComputationGraph& GetGraph() override;
- const NKikimr::NMiniKQL::IFunctionRegistry& GetFunctionRegistry() const override;
- NKikimr::NMiniKQL::TTypeEnvironment& GetTypeEnvironment() override;
- const TString& GetLLVMSettings() const override;
- ui64 GetNativeYtTypeFlags() const override;
- ITimeProvider* GetTimeProvider() const override;
- void Invalidate() override;
- protected:
- void Release() override;
- };
-
- class TPullStreamWorker final: public TWorker<IPullStreamWorker> {
- private:
- NKikimr::NUdf::TUnboxedValue Output_ = NKikimr::NUdf::TUnboxedValue::Invalid();
- TVector<bool> HasInput_;
-
- inline bool CheckAllInputsSet() {
- return AllOf(HasInput_, [](bool x) { return x; });
- }
-
- public:
- using TWorker::TWorker;
- ~TPullStreamWorker();
-
- public:
- void SetInput(NKikimr::NUdf::TUnboxedValue&&, ui32) override;
- NKikimr::NUdf::TUnboxedValue& GetOutput() override;
-
- protected:
- void Release() override;
- };
-
- class TPullListWorker final: public TWorker<IPullListWorker> {
- private:
- NKikimr::NUdf::TUnboxedValue Output_ = NKikimr::NUdf::TUnboxedValue::Invalid();
- NKikimr::NUdf::TUnboxedValue OutputIterator_ = NKikimr::NUdf::TUnboxedValue::Invalid();
- TVector<bool> HasInput_;
-
- inline bool CheckAllInputsSet() {
- return AllOf(HasInput_, [](bool x) { return x; });
- }
-
- public:
- using TWorker::TWorker;
- ~TPullListWorker();
-
- public:
- void SetInput(NKikimr::NUdf::TUnboxedValue&&, ui32) override;
- NKikimr::NUdf::TUnboxedValue& GetOutput() override;
- NKikimr::NUdf::TUnboxedValue& GetOutputIterator() override;
- void ResetOutputIterator() override;
-
- protected:
- void Release() override;
- };
-
- class TPushStreamWorker final: public TWorker<IPushStreamWorker> {
- private:
- THolder<IConsumer<const NKikimr::NUdf::TUnboxedValue*>> Consumer_{};
- bool Finished_ = false;
- NKikimr::NMiniKQL::IComputationExternalNode* SelfNode_ = nullptr;
-
- public:
- using TWorker::TWorker;
-
- private:
- void FeedToConsumer();
- NYql::NUdf::IBoxedValue* GetPushStream() const;
-
- public:
- void SetConsumer(THolder<IConsumer<const NKikimr::NUdf::TUnboxedValue*>>) override;
- void Push(NKikimr::NUdf::TUnboxedValue&&) override;
- void OnFinish() override;
-
- protected:
- void Release() override;
- };
+namespace NPureCalc {
+struct TWorkerGraph {
+ TWorkerGraph(
+ const TExprNode::TPtr& exprRoot,
+ TExprContext& exprCtx,
+ const TString& serializedProgram,
+ const NKikimr::NMiniKQL::IFunctionRegistry& funcRegistry,
+ const TUserDataTable& userData,
+ const TVector<const TStructExprType*>& inputTypes,
+ const TVector<const TStructExprType*>& originalInputTypes,
+ const TVector<const TStructExprType*>& rawInputTypes,
+ const TTypeAnnotationNode* outputType,
+ const TTypeAnnotationNode* rawOutputType,
+ const TString& LLVMSettings,
+ NKikimr::NUdf::ICountersProvider* countersProvider,
+ ui64 nativeYtTypeFlags,
+ TMaybe<ui64> deterministicTimeProviderSeed,
+ TLangVersion langver,
+ bool insideEvaluation);
+
+ ~TWorkerGraph();
+
+ NKikimr::NMiniKQL::TScopedAlloc ScopedAlloc;
+ NKikimr::NMiniKQL::TTypeEnvironment Env;
+ const NKikimr::NMiniKQL::IFunctionRegistry& FuncRegistry;
+ TIntrusivePtr<IRandomProvider> RandomProvider;
+ TIntrusivePtr<ITimeProvider> TimeProvider;
+ NKikimr::NMiniKQL::IComputationPattern::TPtr ComputationPattern;
+ THolder<NKikimr::NMiniKQL::IComputationGraph> ComputationGraph;
+ TString LLVMSettings;
+ ui64 NativeYtTypeFlags;
+ TMaybe<TString> TimestampColumn;
+ const NKikimr::NMiniKQL::TType* OutputType;
+ const NKikimr::NMiniKQL::TType* RawOutputType;
+ TVector<NKikimr::NMiniKQL::IComputationExternalNode*> SelfNodes;
+ TVector<const NKikimr::NMiniKQL::TStructType*> InputTypes;
+ TVector<const NKikimr::NMiniKQL::TStructType*> OriginalInputTypes;
+ TVector<const NKikimr::NMiniKQL::TStructType*> RawInputTypes;
+};
+
+template <typename TBase>
+class TWorker: public TBase {
+public:
+ using TWorkerFactoryPtr = std::weak_ptr<IWorkerFactory>;
+
+private:
+ // Worker factory implementation should stay alive for this worker to operate correctly.
+ TWorkerFactoryPtr WorkerFactory_;
+
+protected:
+ TWorkerGraph Graph_;
+
+public:
+ TWorker(
+ TWorkerFactoryPtr factory,
+ const TExprNode::TPtr& exprRoot,
+ TExprContext& exprCtx,
+ const TString& serializedProgram,
+ const NKikimr::NMiniKQL::IFunctionRegistry& funcRegistry,
+ const TUserDataTable& userData,
+ const TVector<const TStructExprType*>& inputTypes,
+ const TVector<const TStructExprType*>& originalInputTypes,
+ const TVector<const TStructExprType*>& rawInputTypes,
+ const TTypeAnnotationNode* outputType,
+ const TTypeAnnotationNode* rawOutputType,
+ const TString& LLVMSettings,
+ NKikimr::NUdf::ICountersProvider* countersProvider,
+ ui64 nativeYtTypeFlags,
+ TMaybe<ui64> deterministicTimeProviderSeed,
+ TLangVersion langver);
+
+public:
+ ui32 GetInputsCount() const override;
+ const NKikimr::NMiniKQL::TStructType* GetInputType(ui32, bool) const override;
+ const NKikimr::NMiniKQL::TStructType* GetInputType(bool) const override;
+ const NKikimr::NMiniKQL::TStructType* GetRawInputType(ui32) const override;
+ const NKikimr::NMiniKQL::TStructType* GetRawInputType() const override;
+ const NKikimr::NMiniKQL::TType* GetOutputType() const override;
+ const NKikimr::NMiniKQL::TType* GetRawOutputType() const override;
+ NYT::TNode MakeInputSchema() const override;
+ NYT::TNode MakeInputSchema(ui32) const override;
+ NYT::TNode MakeOutputSchema() const override;
+ NYT::TNode MakeOutputSchema(ui32) const override;
+ NYT::TNode MakeOutputSchema(TStringBuf) const override;
+ NYT::TNode MakeFullOutputSchema() const override;
+ NKikimr::NMiniKQL::TScopedAlloc& GetScopedAlloc() override;
+ NKikimr::NMiniKQL::IComputationGraph& GetGraph() override;
+ const NKikimr::NMiniKQL::IFunctionRegistry& GetFunctionRegistry() const override;
+ NKikimr::NMiniKQL::TTypeEnvironment& GetTypeEnvironment() override;
+ const TString& GetLLVMSettings() const override;
+ ui64 GetNativeYtTypeFlags() const override;
+ ITimeProvider* GetTimeProvider() const override;
+ void Invalidate() override;
+
+protected:
+ void Release() override;
+};
+
+class TPullStreamWorker final: public TWorker<IPullStreamWorker> {
+private:
+ NKikimr::NUdf::TUnboxedValue Output_ = NKikimr::NUdf::TUnboxedValue::Invalid();
+ TVector<bool> HasInput_;
+
+ inline bool CheckAllInputsSet() {
+ return AllOf(HasInput_, [](bool x) { return x; });
}
-}
+
+public:
+ using TWorker::TWorker;
+ ~TPullStreamWorker();
+
+public:
+ void SetInput(NKikimr::NUdf::TUnboxedValue&&, ui32) override;
+ NKikimr::NUdf::TUnboxedValue& GetOutput() override;
+
+protected:
+ void Release() override;
+};
+
+class TPullListWorker final: public TWorker<IPullListWorker> {
+private:
+ NKikimr::NUdf::TUnboxedValue Output_ = NKikimr::NUdf::TUnboxedValue::Invalid();
+ NKikimr::NUdf::TUnboxedValue OutputIterator_ = NKikimr::NUdf::TUnboxedValue::Invalid();
+ TVector<bool> HasInput_;
+
+ inline bool CheckAllInputsSet() {
+ return AllOf(HasInput_, [](bool x) { return x; });
+ }
+
+public:
+ using TWorker::TWorker;
+ ~TPullListWorker();
+
+public:
+ void SetInput(NKikimr::NUdf::TUnboxedValue&&, ui32) override;
+ NKikimr::NUdf::TUnboxedValue& GetOutput() override;
+ NKikimr::NUdf::TUnboxedValue& GetOutputIterator() override;
+ void ResetOutputIterator() override;
+
+protected:
+ void Release() override;
+};
+
+class TPushStreamWorker final: public TWorker<IPushStreamWorker> {
+private:
+ THolder<IConsumer<const NKikimr::NUdf::TUnboxedValue*>> Consumer_{};
+ bool Finished_ = false;
+ NKikimr::NMiniKQL::IComputationExternalNode* SelfNode_ = nullptr;
+
+public:
+ using TWorker::TWorker;
+
+private:
+ void FeedToConsumer();
+ NYql::NUdf::IBoxedValue* GetPushStream() const;
+
+public:
+ void SetConsumer(THolder<IConsumer<const NKikimr::NUdf::TUnboxedValue*>>) override;
+ void Push(NKikimr::NUdf::TUnboxedValue&&) override;
+ void OnFinish() override;
+
+protected:
+ void Release() override;
+};
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/worker_factory.cpp b/yql/essentials/public/purecalc/common/worker_factory.cpp
index 8261528b237..347fbbe585a 100644
--- a/yql/essentials/public/purecalc/common/worker_factory.cpp
+++ b/yql/essentials/public/purecalc/common/worker_factory.cpp
@@ -113,8 +113,8 @@ TWorkerFactory<TBase>::TWorkerFactory(TWorkerFactoryOptions options, EProcessorM
SerializedProgram_ = TString{options.Query};
} else {
ExprRoot_ = Compile(options.Query, options.TranslationMode,
- options.SyntaxVersion, options.Modules,
- options.InputSpec, options.OutputSpec, options.UseAntlr4, processorMode, typeCtx.Get());
+ options.SyntaxVersion, options.Modules,
+ options.InputSpec, options.OutputSpec, options.UseAntlr4, processorMode, typeCtx.Get());
RawOutputType_ = GetSequenceItemType(ExprRoot_->Pos(), ExprRoot_->GetTypeAnn(), true, ExprContext_);
@@ -138,8 +138,7 @@ TWorkerFactory<TBase>::TWorkerFactory(TWorkerFactoryOptions options, EProcessorM
template <typename TBase>
TIntrusivePtr<TTypeAnnotationContext> TWorkerFactory<TBase>::PrepareTypeContext(
- IModuleResolver::TPtr factoryModuleResolver
-) {
+ IModuleResolver::TPtr factoryModuleResolver) {
// Prepare type annotation context
IModuleResolver::TPtr moduleResolver = factoryModuleResolver ? factoryModuleResolver->CreateMutableChild() : nullptr;
@@ -147,9 +146,7 @@ TIntrusivePtr<TTypeAnnotationContext> TWorkerFactory<TBase>::PrepareTypeContext(
typeContext->LangVer = LangVer_;
typeContext->UseTypeDiffForConvertToError = true;
typeContext->RandomProvider = CreateDefaultRandomProvider();
- typeContext->TimeProvider = DeterministicTimeProviderSeed_ ?
- CreateDeterministicTimeProvider(*DeterministicTimeProviderSeed_) :
- CreateDefaultTimeProvider();
+ typeContext->TimeProvider = DeterministicTimeProviderSeed_ ? CreateDeterministicTimeProvider(*DeterministicTimeProviderSeed_) : CreateDefaultTimeProvider();
typeContext->UdfResolver = NCommon::CreateSimpleUdfResolver(FuncRegistry_.Get());
typeContext->ArrowResolver = MakeSimpleArrowResolver(*FuncRegistry_.Get());
typeContext->UserDataStorage = MakeIntrusive<TUserDataStorage>(nullptr, UserData_, nullptr, nullptr);
@@ -176,8 +173,7 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile(
const TOutputSpecBase& outputSpec,
bool useAntlr4,
EProcessorMode processorMode,
- TTypeAnnotationContext* typeContext
-) {
+ TTypeAnnotationContext* typeContext) {
Y_ENSURE(useAntlr4, "Antlr3 support is dropped");
if (mode == ETranslationMode::PG && processorMode != EProcessorMode::PullList) {
ythrow TCompileError("", "") << "only PullList mode is compatible to PostgreSQL syntax";
@@ -219,8 +215,7 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile(
"DisableAnsiOptionalAs",
"DisableCoalesceJoinKeysOnQualifiedAll",
"DisableUnorderedSubqueries",
- "FlexibleTypes"
- };
+ "FlexibleTypes"};
if (BlockEngineMode_ != EBlockEngineMode::Disable) {
settings.Flags.insert("EmitAggApply");
}
@@ -242,8 +237,7 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile(
NSQLTranslation::TTranslators translators(
nullptr,
NSQLTranslationV1::MakeTranslator(lexers, parsers),
- NSQLTranslationPG::MakeTranslator()
- );
+ NSQLTranslationPG::MakeTranslator());
astRes = SqlToYql(translators, TString(query), settings);
} else {
@@ -273,11 +267,9 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile(
ythrow TCompileError(astStr.Str(), GetIssues().ToString()) << "failed to compile";
}
-
// Prepare transformation pipeline
THolder<IGraphTransformer> calcTransformer = CreateFunctorTransformer([&](TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx)
- -> IGraphTransformer::TStatus
- {
+ -> IGraphTransformer::TStatus {
output = input;
auto valueNode = input->HeadPtr();
@@ -309,8 +301,7 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile(
NativeYtTypeFlags_,
DeterministicTimeProviderSeed_,
LangVer_,
- true
- );
+ true);
with_lock (graph.ScopedAlloc) {
const auto value = graph.ComputationGraph->GetValue();
@@ -324,8 +315,8 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile(
});
const TString& selfName = TString(inputSpec.ProvidesBlocks()
- ? PurecalcBlockInputCallableName
- : PurecalcInputCallableName);
+ ? PurecalcBlockInputCallableName
+ : PurecalcInputCallableName);
TTypeAnnCallableFactory typeAnnCallableFactory = [&]() {
return MakeTypeAnnotationTransformer(typeContext, InputTypes_, RawInputTypes_, processorMode, selfName);
@@ -343,28 +334,26 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile(
pipeline.AddTypeAnnotationTransformer();
pipeline.AddPostTypeAnnotation();
pipeline.Add(CreateFunctorTransformer(
- [&](const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
- return OptimizeExpr(input, output, [](const TExprNode::TPtr& node, TExprContext&) -> TExprNode::TPtr {
- if (node->IsCallable("Unordered") && node->Child(0)->IsCallable({
- PurecalcInputCallableName, PurecalcBlockInputCallableName
- })) {
- return node->ChildPtr(0);
- }
- return node;
- }, ctx, TOptimizeExprSettings(nullptr));
- }), "Unordered", EYqlIssueCode::TIssuesIds_EIssueCode_DEFAULT_ERROR,
- "Unordered optimizations");
+ [&](const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
+ return OptimizeExpr(input, output, [](const TExprNode::TPtr& node, TExprContext&) -> TExprNode::TPtr {
+ if (node->IsCallable("Unordered") && node->Child(0)->IsCallable({PurecalcInputCallableName, PurecalcBlockInputCallableName})) {
+ return node->ChildPtr(0);
+ }
+ return node;
+ }, ctx, TOptimizeExprSettings(nullptr));
+ }), "Unordered", EYqlIssueCode::TIssuesIds_EIssueCode_DEFAULT_ERROR,
+ "Unordered optimizations");
pipeline.Add(CreateFunctorTransformer(
- [&](const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
- return OptimizeExpr(input, output, [](const TExprNode::TPtr& node, TExprContext&) -> TExprNode::TPtr {
- if (node->IsCallable("Right!") && node->Head().IsCallable("Cons!")) {
- return node->Head().ChildPtr(1);
- }
-
- return node;
- }, ctx, TOptimizeExprSettings(nullptr));
- }), "Cons", EYqlIssueCode::TIssuesIds_EIssueCode_DEFAULT_ERROR,
- "Cons optimizations");
+ [&](const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
+ return OptimizeExpr(input, output, [](const TExprNode::TPtr& node, TExprContext&) -> TExprNode::TPtr {
+ if (node->IsCallable("Right!") && node->Head().IsCallable("Cons!")) {
+ return node->Head().ChildPtr(1);
+ }
+
+ return node;
+ }, ctx, TOptimizeExprSettings(nullptr));
+ }), "Cons", EYqlIssueCode::TIssuesIds_EIssueCode_DEFAULT_ERROR,
+ "Cons optimizations");
pipeline.Add(MakeOutputColumnsFilter(outputSpec.GetOutputColumnsFilter()),
"Filter", EYqlIssueCode::TIssuesIds_EIssueCode_DEFAULT_ERROR,
"Filter output columns");
@@ -406,10 +395,7 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile(
if (exprOut) {
*exprOut << "After optimization:" << Endl;
- ConvertToAst(*exprRoot, ExprContext_, 0, true).Root
- ->PrettyPrintTo(*exprOut, TAstPrintFlags::PerLine
- | TAstPrintFlags::ShortQuote
- | TAstPrintFlags::AdaptArbitraryContent);
+ ConvertToAst(*exprRoot, ExprContext_, 0, true).Root->PrettyPrintTo(*exprOut, TAstPrintFlags::PerLine | TAstPrintFlags::ShortQuote | TAstPrintFlags::AdaptArbitraryContent);
}
return exprRoot;
}
@@ -523,7 +509,7 @@ template <typename TBase>
TString TWorkerFactory<TBase>::GetCompiledProgram() {
if (ExprRoot_) {
NKikimr::NMiniKQL::TScopedAlloc alloc(__LOCATION__, NKikimr::TAlignedPagePoolCounters(),
- FuncRegistry_->SupportsSizedAllocators());
+ FuncRegistry_->SupportsSizedAllocators());
NKikimr::NMiniKQL::TTypeEnvironment env(alloc);
auto rootNode = CompileMkql(ExprRoot_, ExprContext_, *FuncRegistry_, env, UserData_);
@@ -541,32 +527,30 @@ void TWorkerFactory<TBase>::ReturnWorker(IWorker* worker) {
}
}
-
-#define DEFINE_WORKER_MAKER(MODE) \
- TWorkerHolder<I##MODE##Worker> T##MODE##WorkerFactory::MakeWorker() { \
- if (!WorkerPool_.empty()) { \
- auto res = std::move(WorkerPool_.back()); \
- WorkerPool_.pop_back(); \
- return TWorkerHolder<I##MODE##Worker>((I##MODE##Worker *)res.Release()); \
- } \
- return TWorkerHolder<I##MODE##Worker>(new T##MODE##Worker( \
- weak_from_this(), \
- ExprRoot_, \
- ExprContext_, \
- SerializedProgram_, \
- *FuncRegistry_, \
- UserData_, \
- InputTypes_, \
- OriginalInputTypes_, \
- RawInputTypes_, \
- OutputType_, \
- RawOutputType_, \
- LLVMSettings_, \
- CountersProvider_, \
- NativeYtTypeFlags_, \
- DeterministicTimeProviderSeed_, \
- LangVer_ \
- )); \
+#define DEFINE_WORKER_MAKER(MODE) \
+ TWorkerHolder<I##MODE##Worker> T##MODE##WorkerFactory::MakeWorker() { \
+ if (!WorkerPool_.empty()) { \
+ auto res = std::move(WorkerPool_.back()); \
+ WorkerPool_.pop_back(); \
+ return TWorkerHolder<I##MODE##Worker>((I##MODE##Worker*)res.Release()); \
+ } \
+ return TWorkerHolder<I##MODE##Worker>(new T##MODE##Worker( \
+ weak_from_this(), \
+ ExprRoot_, \
+ ExprContext_, \
+ SerializedProgram_, \
+ *FuncRegistry_, \
+ UserData_, \
+ InputTypes_, \
+ OriginalInputTypes_, \
+ RawInputTypes_, \
+ OutputType_, \
+ RawOutputType_, \
+ LLVMSettings_, \
+ CountersProvider_, \
+ NativeYtTypeFlags_, \
+ DeterministicTimeProviderSeed_, \
+ LangVer_)); \
}
DEFINE_WORKER_MAKER(PullStream)
@@ -574,14 +558,11 @@ DEFINE_WORKER_MAKER(PullList)
DEFINE_WORKER_MAKER(PushStream)
namespace NYql {
- namespace NPureCalc {
- template
- class TWorkerFactory<IPullStreamWorkerFactory>;
+namespace NPureCalc {
+template class TWorkerFactory<IPullStreamWorkerFactory>;
- template
- class TWorkerFactory<IPullListWorkerFactory>;
+template class TWorkerFactory<IPullListWorkerFactory>;
- template
- class TWorkerFactory<IPushStreamWorkerFactory>;
- }
-}
+template class TWorkerFactory<IPushStreamWorkerFactory>;
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/worker_factory.h b/yql/essentials/public/purecalc/common/worker_factory.h
index 719a625f0b6..e50a1236c9f 100644
--- a/yql/essentials/public/purecalc/common/worker_factory.h
+++ b/yql/essentials/public/purecalc/common/worker_factory.h
@@ -12,169 +12,167 @@
#include <utility>
namespace NYql {
- namespace NPureCalc {
- struct TWorkerFactoryOptions {
- IProgramFactoryPtr Factory;
- const TInputSpecBase& InputSpec;
- const TOutputSpecBase& OutputSpec;
- TStringBuf Query;
- TIntrusivePtr<NKikimr::NMiniKQL::IMutableFunctionRegistry> FuncRegistry;
- IModuleResolver::TPtr ModuleResolver;
- const TUserDataTable& UserData;
- const THashMap<TString, TString>& Modules;
- TString LLVMSettings;
- EBlockEngineMode BlockEngineMode;
- IOutputStream* ExprOutputStream;
- NKikimr::NUdf::ICountersProvider* CountersProvider;
- ETranslationMode TranslationMode;
- ui16 SyntaxVersion;
- TLangVersion LangVer;
- ui64 NativeYtTypeFlags;
- TMaybe<ui64> DeterministicTimeProviderSeed;
- bool UseSystemColumns;
- bool UseWorkerPool;
- bool UseAntlr4;
-
- TWorkerFactoryOptions(
- IProgramFactoryPtr Factory,
- const TInputSpecBase& InputSpec,
- const TOutputSpecBase& OutputSpec,
- TStringBuf Query,
- TIntrusivePtr<NKikimr::NMiniKQL::IMutableFunctionRegistry> FuncRegistry,
- IModuleResolver::TPtr ModuleResolver,
- const TUserDataTable& UserData,
- const THashMap<TString, TString>& Modules,
- TString LLVMSettings,
- EBlockEngineMode BlockEngineMode,
- IOutputStream* ExprOutputStream,
- NKikimr::NUdf::ICountersProvider* CountersProvider,
- ETranslationMode translationMode,
- ui16 syntaxVersion,
- TLangVersion langver,
- ui64 nativeYtTypeFlags,
- TMaybe<ui64> deterministicTimeProviderSeed,
- bool useSystemColumns,
- bool useWorkerPool,
- bool useAntlr4
- )
- : Factory(std::move(Factory))
- , InputSpec(InputSpec)
- , OutputSpec(OutputSpec)
- , Query(Query)
- , FuncRegistry(std::move(FuncRegistry))
- , ModuleResolver(std::move(ModuleResolver))
- , UserData(UserData)
- , Modules(Modules)
- , LLVMSettings(std::move(LLVMSettings))
- , BlockEngineMode(BlockEngineMode)
- , ExprOutputStream(ExprOutputStream)
- , CountersProvider(CountersProvider)
- , TranslationMode(translationMode)
- , SyntaxVersion(syntaxVersion)
- , LangVer(langver)
- , NativeYtTypeFlags(nativeYtTypeFlags)
- , DeterministicTimeProviderSeed(deterministicTimeProviderSeed)
- , UseSystemColumns(useSystemColumns)
- , UseWorkerPool(useWorkerPool)
- , UseAntlr4(useAntlr4)
- {
- }
- };
-
- template <typename TBase>
- class TWorkerFactory: public TBase {
- private:
- IProgramFactoryPtr Factory_;
-
- protected:
- TIntrusivePtr<NKikimr::NMiniKQL::IMutableFunctionRegistry> FuncRegistry_;
- const TUserDataTable& UserData_;
- TExprContext ExprContext_;
- TExprNode::TPtr ExprRoot_;
- TString SerializedProgram_;
- TVector<const TStructExprType*> InputTypes_;
- TVector<const TStructExprType*> OriginalInputTypes_;
- TVector<const TStructExprType*> RawInputTypes_;
- const TTypeAnnotationNode* OutputType_;
- const TTypeAnnotationNode* RawOutputType_;
- TVector<THashSet<TString>> AllColumns_;
- TVector<THashSet<TString>> UsedColumns_;
- TString LLVMSettings_;
- EBlockEngineMode BlockEngineMode_;
- IOutputStream* ExprOutputStream_;
- NKikimr::NUdf::ICountersProvider* CountersProvider_;
- ui64 NativeYtTypeFlags_;
- TMaybe<ui64> DeterministicTimeProviderSeed_;
- bool UseSystemColumns_;
- bool UseWorkerPool_;
- TLangVersion LangVer_;
- TVector<THolder<IWorker>> WorkerPool_;
-
- public:
- TWorkerFactory(TWorkerFactoryOptions, EProcessorMode);
-
- public:
- NYT::TNode MakeInputSchema(ui32) const override;
- NYT::TNode MakeInputSchema() const override;
- NYT::TNode MakeOutputSchema() const override;
- NYT::TNode MakeOutputSchema(ui32) const override;
- NYT::TNode MakeOutputSchema(TStringBuf) const override;
- NYT::TNode MakeFullOutputSchema() const override;
- const THashSet<TString>& GetUsedColumns(ui32 inputIndex) const override;
- const THashSet<TString>& GetUsedColumns() const override;
- TIssues GetIssues() const override;
- TString GetCompiledProgram() override;
-
- protected:
- void ReturnWorker(IWorker* worker) override;
-
- private:
- TIntrusivePtr<TTypeAnnotationContext> PrepareTypeContext(
- IModuleResolver::TPtr factoryModuleResolver
- );
-
- TExprNode::TPtr Compile(TStringBuf query,
- ETranslationMode mode,
- ui16 syntaxVersion,
- const THashMap<TString, TString>& modules,
- const TInputSpecBase& inputSpec,
- const TOutputSpecBase& outputSpec,
- bool useAntlr4,
- EProcessorMode processorMode,
- TTypeAnnotationContext* typeContext);
- };
-
- class TPullStreamWorkerFactory final: public TWorkerFactory<IPullStreamWorkerFactory> {
- public:
- explicit TPullStreamWorkerFactory(TWorkerFactoryOptions options)
- : TWorkerFactory(std::move(options), EProcessorMode::PullStream)
- {
- }
-
- public:
- TWorkerHolder<IPullStreamWorker> MakeWorker() override;
- };
-
- class TPullListWorkerFactory final: public TWorkerFactory<IPullListWorkerFactory> {
- public:
- explicit TPullListWorkerFactory(TWorkerFactoryOptions options)
- : TWorkerFactory(std::move(options), EProcessorMode::PullList)
- {
- }
-
- public:
- TWorkerHolder<IPullListWorker> MakeWorker() override;
- };
-
- class TPushStreamWorkerFactory final: public TWorkerFactory<IPushStreamWorkerFactory> {
- public:
- explicit TPushStreamWorkerFactory(TWorkerFactoryOptions options)
- : TWorkerFactory(std::move(options), EProcessorMode::PushStream)
- {
- }
-
- public:
- TWorkerHolder<IPushStreamWorker> MakeWorker() override;
- };
+namespace NPureCalc {
+struct TWorkerFactoryOptions {
+ IProgramFactoryPtr Factory;
+ const TInputSpecBase& InputSpec;
+ const TOutputSpecBase& OutputSpec;
+ TStringBuf Query;
+ TIntrusivePtr<NKikimr::NMiniKQL::IMutableFunctionRegistry> FuncRegistry;
+ IModuleResolver::TPtr ModuleResolver;
+ const TUserDataTable& UserData;
+ const THashMap<TString, TString>& Modules;
+ TString LLVMSettings;
+ EBlockEngineMode BlockEngineMode;
+ IOutputStream* ExprOutputStream;
+ NKikimr::NUdf::ICountersProvider* CountersProvider;
+ ETranslationMode TranslationMode;
+ ui16 SyntaxVersion;
+ TLangVersion LangVer;
+ ui64 NativeYtTypeFlags;
+ TMaybe<ui64> DeterministicTimeProviderSeed;
+ bool UseSystemColumns;
+ bool UseWorkerPool;
+ bool UseAntlr4;
+
+ TWorkerFactoryOptions(
+ IProgramFactoryPtr Factory,
+ const TInputSpecBase& InputSpec,
+ const TOutputSpecBase& OutputSpec,
+ TStringBuf Query,
+ TIntrusivePtr<NKikimr::NMiniKQL::IMutableFunctionRegistry> FuncRegistry,
+ IModuleResolver::TPtr ModuleResolver,
+ const TUserDataTable& UserData,
+ const THashMap<TString, TString>& Modules,
+ TString LLVMSettings,
+ EBlockEngineMode BlockEngineMode,
+ IOutputStream* ExprOutputStream,
+ NKikimr::NUdf::ICountersProvider* CountersProvider,
+ ETranslationMode translationMode,
+ ui16 syntaxVersion,
+ TLangVersion langver,
+ ui64 nativeYtTypeFlags,
+ TMaybe<ui64> deterministicTimeProviderSeed,
+ bool useSystemColumns,
+ bool useWorkerPool,
+ bool useAntlr4)
+ : Factory(std::move(Factory))
+ , InputSpec(InputSpec)
+ , OutputSpec(OutputSpec)
+ , Query(Query)
+ , FuncRegistry(std::move(FuncRegistry))
+ , ModuleResolver(std::move(ModuleResolver))
+ , UserData(UserData)
+ , Modules(Modules)
+ , LLVMSettings(std::move(LLVMSettings))
+ , BlockEngineMode(BlockEngineMode)
+ , ExprOutputStream(ExprOutputStream)
+ , CountersProvider(CountersProvider)
+ , TranslationMode(translationMode)
+ , SyntaxVersion(syntaxVersion)
+ , LangVer(langver)
+ , NativeYtTypeFlags(nativeYtTypeFlags)
+ , DeterministicTimeProviderSeed(deterministicTimeProviderSeed)
+ , UseSystemColumns(useSystemColumns)
+ , UseWorkerPool(useWorkerPool)
+ , UseAntlr4(useAntlr4)
+ {
}
-}
+};
+
+template <typename TBase>
+class TWorkerFactory: public TBase {
+private:
+ IProgramFactoryPtr Factory_;
+
+protected:
+ TIntrusivePtr<NKikimr::NMiniKQL::IMutableFunctionRegistry> FuncRegistry_;
+ const TUserDataTable& UserData_;
+ TExprContext ExprContext_;
+ TExprNode::TPtr ExprRoot_;
+ TString SerializedProgram_;
+ TVector<const TStructExprType*> InputTypes_;
+ TVector<const TStructExprType*> OriginalInputTypes_;
+ TVector<const TStructExprType*> RawInputTypes_;
+ const TTypeAnnotationNode* OutputType_;
+ const TTypeAnnotationNode* RawOutputType_;
+ TVector<THashSet<TString>> AllColumns_;
+ TVector<THashSet<TString>> UsedColumns_;
+ TString LLVMSettings_;
+ EBlockEngineMode BlockEngineMode_;
+ IOutputStream* ExprOutputStream_;
+ NKikimr::NUdf::ICountersProvider* CountersProvider_;
+ ui64 NativeYtTypeFlags_;
+ TMaybe<ui64> DeterministicTimeProviderSeed_;
+ bool UseSystemColumns_;
+ bool UseWorkerPool_;
+ TLangVersion LangVer_;
+ TVector<THolder<IWorker>> WorkerPool_;
+
+public:
+ TWorkerFactory(TWorkerFactoryOptions, EProcessorMode);
+
+public:
+ NYT::TNode MakeInputSchema(ui32) const override;
+ NYT::TNode MakeInputSchema() const override;
+ NYT::TNode MakeOutputSchema() const override;
+ NYT::TNode MakeOutputSchema(ui32) const override;
+ NYT::TNode MakeOutputSchema(TStringBuf) const override;
+ NYT::TNode MakeFullOutputSchema() const override;
+ const THashSet<TString>& GetUsedColumns(ui32 inputIndex) const override;
+ const THashSet<TString>& GetUsedColumns() const override;
+ TIssues GetIssues() const override;
+ TString GetCompiledProgram() override;
+
+protected:
+ void ReturnWorker(IWorker* worker) override;
+
+private:
+ TIntrusivePtr<TTypeAnnotationContext> PrepareTypeContext(
+ IModuleResolver::TPtr factoryModuleResolver);
+
+ TExprNode::TPtr Compile(TStringBuf query,
+ ETranslationMode mode,
+ ui16 syntaxVersion,
+ const THashMap<TString, TString>& modules,
+ const TInputSpecBase& inputSpec,
+ const TOutputSpecBase& outputSpec,
+ bool useAntlr4,
+ EProcessorMode processorMode,
+ TTypeAnnotationContext* typeContext);
+};
+
+class TPullStreamWorkerFactory final: public TWorkerFactory<IPullStreamWorkerFactory> {
+public:
+ explicit TPullStreamWorkerFactory(TWorkerFactoryOptions options)
+ : TWorkerFactory(std::move(options), EProcessorMode::PullStream)
+ {
+ }
+
+public:
+ TWorkerHolder<IPullStreamWorker> MakeWorker() override;
+};
+
+class TPullListWorkerFactory final: public TWorkerFactory<IPullListWorkerFactory> {
+public:
+ explicit TPullListWorkerFactory(TWorkerFactoryOptions options)
+ : TWorkerFactory(std::move(options), EProcessorMode::PullList)
+ {
+ }
+
+public:
+ TWorkerHolder<IPullListWorker> MakeWorker() override;
+};
+
+class TPushStreamWorkerFactory final: public TWorkerFactory<IPushStreamWorkerFactory> {
+public:
+ explicit TPushStreamWorkerFactory(TWorkerFactoryOptions options)
+ : TWorkerFactory(std::move(options), EProcessorMode::PushStream)
+ {
+ }
+
+public:
+ TWorkerHolder<IPushStreamWorker> MakeWorker() override;
+};
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/common/wrappers.h b/yql/essentials/public/purecalc/common/wrappers.h
index 35edeb7398a..57be6315a43 100644
--- a/yql/essentials/public/purecalc/common/wrappers.h
+++ b/yql/essentials/public/purecalc/common/wrappers.h
@@ -5,66 +5,66 @@
#include <util/generic/ptr.h>
namespace NYql::NPureCalc::NPrivate {
- template <typename TNew, typename TOld, typename TFunctor>
- class TMappingStream final: public IStream<TNew> {
- private:
- THolder<IStream<TOld>> Old_;
- TFunctor Functor_;
+template <typename TNew, typename TOld, typename TFunctor>
+class TMappingStream final: public IStream<TNew> {
+private:
+ THolder<IStream<TOld>> Old_;
+ TFunctor Functor_;
- public:
- TMappingStream(THolder<IStream<TOld>> old, TFunctor functor)
- : Old_(std::move(old))
- , Functor_(std::move(functor))
- {
- }
+public:
+ TMappingStream(THolder<IStream<TOld>> old, TFunctor functor)
+ : Old_(std::move(old))
+ , Functor_(std::move(functor))
+ {
+ }
- public:
- TNew Fetch() override {
- return Functor_(Old_->Fetch());
- }
- };
+public:
+ TNew Fetch() override {
+ return Functor_(Old_->Fetch());
+ }
+};
- template <typename TNew, typename TOld, typename TFunctor>
- class TMappingConsumer final: public IConsumer<TNew> {
- private:
- THolder<IConsumer<TOld>> Old_;
- TFunctor Functor_;
+template <typename TNew, typename TOld, typename TFunctor>
+class TMappingConsumer final: public IConsumer<TNew> {
+private:
+ THolder<IConsumer<TOld>> Old_;
+ TFunctor Functor_;
- public:
- TMappingConsumer(THolder<IConsumer<TOld>> old, TFunctor functor)
- : Old_(std::move(old))
- , Functor_(std::move(functor))
+public:
+ TMappingConsumer(THolder<IConsumer<TOld>> old, TFunctor functor)
+ : Old_(std::move(old))
+ , Functor_(std::move(functor))
{
}
- public:
- void OnObject(TNew object) override {
- Old_->OnObject(Functor_(object));
- }
+public:
+ void OnObject(TNew object) override {
+ Old_->OnObject(Functor_(object));
+ }
- void OnFinish() override {
- Old_->OnFinish();
- }
- };
+ void OnFinish() override {
+ Old_->OnFinish();
+ }
+};
- template <typename T, typename C>
- class TNonOwningConsumer final: public IConsumer<T> {
- private:
- C Consumer_;
+template <typename T, typename C>
+class TNonOwningConsumer final: public IConsumer<T> {
+private:
+ C Consumer_;
- public:
- explicit TNonOwningConsumer(const C& consumer)
- : Consumer_(consumer)
- {
- }
+public:
+ explicit TNonOwningConsumer(const C& consumer)
+ : Consumer_(consumer)
+ {
+ }
- public:
- void OnObject(T t) override {
- Consumer_->OnObject(t);
- }
+public:
+ void OnObject(T t) override {
+ Consumer_->OnObject(t);
+ }
- void OnFinish() override {
- Consumer_->OnFinish();
- }
- };
-}
+ void OnFinish() override {
+ Consumer_->OnFinish();
+ }
+};
+} // namespace NYql::NPureCalc::NPrivate
diff --git a/yql/essentials/public/purecalc/common/ya.make.inc b/yql/essentials/public/purecalc/common/ya.make.inc
index 8aaf8e7c3f7..d5c4292d9b7 100644
--- a/yql/essentials/public/purecalc/common/ya.make.inc
+++ b/yql/essentials/public/purecalc/common/ya.make.inc
@@ -1,3 +1,5 @@
+ENABLE(YQL_STYLE_CPP)
+
SRCDIR(
yql/essentials/public/purecalc/common
)
diff --git a/yql/essentials/public/purecalc/examples/protobuf/main.cpp b/yql/essentials/public/purecalc/examples/protobuf/main.cpp
index 2cf9ff47360..4bcf19be0ae 100644
--- a/yql/essentials/public/purecalc/examples/protobuf/main.cpp
+++ b/yql/essentials/public/purecalc/examples/protobuf/main.cpp
@@ -97,10 +97,10 @@ void PrecompileExample(IProgramFactoryPtr factory) {
}
auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<TInput>(),
- TProtobufOutputSpec<TOutput>(),
- prg,
- ETranslationMode::Mkql);
+ TProtobufInputSpec<TInput>(),
+ TProtobufOutputSpec<TOutput>(),
+ prg,
+ ETranslationMode::Mkql);
auto result = program->Apply(MakeInput());
diff --git a/yql/essentials/public/purecalc/examples/protobuf/ya.make b/yql/essentials/public/purecalc/examples/protobuf/ya.make
index c50a3c4af25..9589ce28ccf 100644
--- a/yql/essentials/public/purecalc/examples/protobuf/ya.make
+++ b/yql/essentials/public/purecalc/examples/protobuf/ya.make
@@ -1,5 +1,7 @@
PROGRAM()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
main.proto
main.cpp
diff --git a/yql/essentials/public/purecalc/examples/protobuf_pull_list/main.cpp b/yql/essentials/public/purecalc/examples/protobuf_pull_list/main.cpp
index b3e27cec10f..793738a4336 100644
--- a/yql/essentials/public/purecalc/examples/protobuf_pull_list/main.cpp
+++ b/yql/essentials/public/purecalc/examples/protobuf_pull_list/main.cpp
@@ -29,8 +29,7 @@ int main() {
TProtobufInputSpec<TInput>(),
TProtobufOutputSpec<TOutput>(),
Query,
- ETranslationMode::SQL
- );
+ ETranslationMode::SQL);
auto result = program->Apply(MakeInput());
diff --git a/yql/essentials/public/purecalc/examples/protobuf_pull_list/ya.make b/yql/essentials/public/purecalc/examples/protobuf_pull_list/ya.make
index a102f5fb2ca..9eceb2893a9 100644
--- a/yql/essentials/public/purecalc/examples/protobuf_pull_list/ya.make
+++ b/yql/essentials/public/purecalc/examples/protobuf_pull_list/ya.make
@@ -1,5 +1,7 @@
PROGRAM()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
main.proto
main.cpp
diff --git a/yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.cpp b/yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.cpp
index e194e4f22c9..0d6c309f6cc 100644
--- a/yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.cpp
+++ b/yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.cpp
@@ -10,199 +10,193 @@
namespace pb = google::protobuf;
namespace NYql {
- namespace NPureCalc {
+namespace NPureCalc {
- TProtoSchemaOptions::TProtoSchemaOptions()
- : EnumPolicy(EEnumPolicy::Int32)
- , ListIsOptional(false)
- , EnableRecursiveRenaming(false)
- {
- }
+TProtoSchemaOptions::TProtoSchemaOptions()
+ : EnumPolicy(EEnumPolicy::Int32)
+ , ListIsOptional(false)
+ , EnableRecursiveRenaming(false)
+{
+}
- TProtoSchemaOptions& TProtoSchemaOptions::SetEnumPolicy(EEnumPolicy policy) {
- EnumPolicy = policy;
- return *this;
- }
+TProtoSchemaOptions& TProtoSchemaOptions::SetEnumPolicy(EEnumPolicy policy) {
+ EnumPolicy = policy;
+ return *this;
+}
- TProtoSchemaOptions& TProtoSchemaOptions::SetListIsOptional(bool value) {
- ListIsOptional = value;
- return *this;
- }
+TProtoSchemaOptions& TProtoSchemaOptions::SetListIsOptional(bool value) {
+ ListIsOptional = value;
+ return *this;
+}
- TProtoSchemaOptions& TProtoSchemaOptions::SetEnableRecursiveRenaming(bool value) {
- EnableRecursiveRenaming = value;
- return *this;
- }
+TProtoSchemaOptions& TProtoSchemaOptions::SetEnableRecursiveRenaming(bool value) {
+ EnableRecursiveRenaming = value;
+ return *this;
+}
- TProtoSchemaOptions& TProtoSchemaOptions::SetFieldRenames(
- THashMap<TString, TString> fieldRenames
- ) {
- FieldRenames = std::move(fieldRenames);
- return *this;
- }
+TProtoSchemaOptions& TProtoSchemaOptions::SetFieldRenames(
+ THashMap<TString, TString> fieldRenames) {
+ FieldRenames = std::move(fieldRenames);
+ return *this;
+}
- namespace {
- EEnumFormatType EnumFormatTypeWithYTFlag(const pb::FieldDescriptor& enumField, EEnumFormatType defaultEnumFormatType) {
- auto flags = enumField.options().GetRepeatedExtension(NYT::flags);
- for (auto flag : flags) {
- if (flag == NYT::EWrapperFieldFlag::ENUM_INT) {
- return EEnumFormatType::Int32;
- } else if (flag == NYT::EWrapperFieldFlag::ENUM_STRING) {
- return EEnumFormatType::String;
- }
- }
- return defaultEnumFormatType;
- }
+namespace {
+EEnumFormatType EnumFormatTypeWithYTFlag(const pb::FieldDescriptor& enumField, EEnumFormatType defaultEnumFormatType) {
+ auto flags = enumField.options().GetRepeatedExtension(NYT::flags);
+ for (auto flag : flags) {
+ if (flag == NYT::EWrapperFieldFlag::ENUM_INT) {
+ return EEnumFormatType::Int32;
+ } else if (flag == NYT::EWrapperFieldFlag::ENUM_STRING) {
+ return EEnumFormatType::String;
}
+ }
+ return defaultEnumFormatType;
+}
+} // namespace
+
+EEnumFormatType EnumFormatType(const pb::FieldDescriptor& enumField, EEnumPolicy enumPolicy) {
+ switch (enumPolicy) {
+ case EEnumPolicy::Int32:
+ return EEnumFormatType::Int32;
+ case EEnumPolicy::String:
+ return EEnumFormatType::String;
+ case EEnumPolicy::YTFlagDefaultInt32:
+ return EnumFormatTypeWithYTFlag(enumField, EEnumFormatType::Int32);
+ case EEnumPolicy::YTFlagDefaultString:
+ return EnumFormatTypeWithYTFlag(enumField, EEnumFormatType::String);
+ }
+}
- EEnumFormatType EnumFormatType(const pb::FieldDescriptor& enumField, EEnumPolicy enumPolicy) {
- switch (enumPolicy) {
- case EEnumPolicy::Int32:
- return EEnumFormatType::Int32;
- case EEnumPolicy::String:
- return EEnumFormatType::String;
- case EEnumPolicy::YTFlagDefaultInt32:
- return EnumFormatTypeWithYTFlag(enumField, EEnumFormatType::Int32);
- case EEnumPolicy::YTFlagDefaultString:
- return EnumFormatTypeWithYTFlag(enumField, EEnumFormatType::String);
+namespace {
+const char* FormatTypeName(const pb::FieldDescriptor* field, EEnumPolicy enumPolicy) {
+ switch (field->type()) {
+ case pb::FieldDescriptor::TYPE_DOUBLE:
+ return "Double";
+ case pb::FieldDescriptor::TYPE_FLOAT:
+ return "Float";
+ case pb::FieldDescriptor::TYPE_INT64:
+ case pb::FieldDescriptor::TYPE_SFIXED64:
+ case pb::FieldDescriptor::TYPE_SINT64:
+ return "Int64";
+ case pb::FieldDescriptor::TYPE_UINT64:
+ case pb::FieldDescriptor::TYPE_FIXED64:
+ return "Uint64";
+ case pb::FieldDescriptor::TYPE_INT32:
+ case pb::FieldDescriptor::TYPE_SFIXED32:
+ case pb::FieldDescriptor::TYPE_SINT32:
+ return "Int32";
+ case pb::FieldDescriptor::TYPE_UINT32:
+ case pb::FieldDescriptor::TYPE_FIXED32:
+ return "Uint32";
+ case pb::FieldDescriptor::TYPE_BOOL:
+ return "Bool";
+ case pb::FieldDescriptor::TYPE_STRING:
+ return "Utf8";
+ case pb::FieldDescriptor::TYPE_BYTES:
+ return "String";
+ case pb::FieldDescriptor::TYPE_ENUM:
+ switch (EnumFormatType(*field, enumPolicy)) {
+ case EEnumFormatType::Int32:
+ return "Int32";
+ case EEnumFormatType::String:
+ return "String";
}
- }
+ default:
+ ythrow yexception() << "Unsupported protobuf type: " << field->type_name()
+ << ", field: " << field->name() << ", " << int(field->type());
+ }
+}
+} // namespace
- namespace {
- const char* FormatTypeName(const pb::FieldDescriptor* field, EEnumPolicy enumPolicy) {
- switch (field->type()) {
- case pb::FieldDescriptor::TYPE_DOUBLE:
- return "Double";
- case pb::FieldDescriptor::TYPE_FLOAT:
- return "Float";
- case pb::FieldDescriptor::TYPE_INT64:
- case pb::FieldDescriptor::TYPE_SFIXED64:
- case pb::FieldDescriptor::TYPE_SINT64:
- return "Int64";
- case pb::FieldDescriptor::TYPE_UINT64:
- case pb::FieldDescriptor::TYPE_FIXED64:
- return "Uint64";
- case pb::FieldDescriptor::TYPE_INT32:
- case pb::FieldDescriptor::TYPE_SFIXED32:
- case pb::FieldDescriptor::TYPE_SINT32:
- return "Int32";
- case pb::FieldDescriptor::TYPE_UINT32:
- case pb::FieldDescriptor::TYPE_FIXED32:
- return "Uint32";
- case pb::FieldDescriptor::TYPE_BOOL:
- return "Bool";
- case pb::FieldDescriptor::TYPE_STRING:
- return "Utf8";
- case pb::FieldDescriptor::TYPE_BYTES:
- return "String";
- case pb::FieldDescriptor::TYPE_ENUM:
- switch (EnumFormatType(*field, enumPolicy)) {
- case EEnumFormatType::Int32:
- return "Int32";
- case EEnumFormatType::String:
- return "String";
- }
- default:
- ythrow yexception() << "Unsupported protobuf type: " << field->type_name()
- << ", field: " << field->name() << ", " << int(field->type());
- }
- }
+NYT::TNode MakeSchemaFromProto(const pb::Descriptor& descriptor, TVector<const pb::Descriptor*>& nested, const TProtoSchemaOptions& options) {
+ if (Find(nested, &descriptor) != nested.end()) {
+ TVector<TString> nestedNames;
+ for (const auto* d : nested) {
+ nestedNames.push_back(d->full_name());
}
+ nestedNames.push_back(descriptor.full_name());
+ ythrow yexception() << Sprintf("recursive messages are not supported (%s)",
+ JoinStrings(nestedNames, "->").c_str());
+ }
+ nested.push_back(&descriptor);
- NYT::TNode MakeSchemaFromProto(const pb::Descriptor& descriptor, TVector<const pb::Descriptor*>& nested, const TProtoSchemaOptions& options) {
- if (Find(nested, &descriptor) != nested.end()) {
- TVector<TString> nestedNames;
- for (const auto* d : nested) {
- nestedNames.push_back(d->full_name());
- }
- nestedNames.push_back(descriptor.full_name());
- ythrow yexception() << Sprintf("recursive messages are not supported (%s)",
- JoinStrings(nestedNames, "->").c_str());
- }
- nested.push_back(&descriptor);
-
- auto items = NYT::TNode::CreateList();
- for (int fieldNo = 0; fieldNo < descriptor.field_count(); ++fieldNo) {
- const auto& fieldDescriptor = *descriptor.field(fieldNo);
-
- auto name = fieldDescriptor.name();
- if (
- auto renamePtr = options.FieldRenames.FindPtr(name);
- (options.EnableRecursiveRenaming || nested.size() == 1) && renamePtr
- ) {
- name = *renamePtr;
- }
+ auto items = NYT::TNode::CreateList();
+ for (int fieldNo = 0; fieldNo < descriptor.field_count(); ++fieldNo) {
+ const auto& fieldDescriptor = *descriptor.field(fieldNo);
- NYT::TNode itemType;
- if (fieldDescriptor.type() == pb::FieldDescriptor::TYPE_MESSAGE) {
- itemType = MakeSchemaFromProto(*fieldDescriptor.message_type(), nested, options);
- } else {
- itemType = NYT::TNode::CreateList();
- itemType.Add("DataType");
- itemType.Add(FormatTypeName(&fieldDescriptor, options.EnumPolicy));
- }
- switch (fieldDescriptor.label()) {
- case pb::FieldDescriptor::LABEL_OPTIONAL:
- {
- auto optionalType = NYT::TNode::CreateList();
- optionalType.Add("OptionalType");
- optionalType.Add(std::move(itemType));
- itemType = std::move(optionalType);
- }
- break;
- case pb::FieldDescriptor::LABEL_REQUIRED:
- break;
- case pb::FieldDescriptor::LABEL_REPEATED:
- {
- auto listType = NYT::TNode::CreateList();
- listType.Add("ListType");
- listType.Add(std::move(itemType));
- itemType = std::move(listType);
- if (options.ListIsOptional) {
- itemType = NYT::TNode::CreateList().Add("OptionalType").Add(std::move(itemType));
- }
- }
- break;
- default:
- ythrow yexception() << "Unknown protobuf label: " << (ui32)fieldDescriptor.label() << ", field: " << name;
+ auto name = fieldDescriptor.name();
+ if (
+ auto renamePtr = options.FieldRenames.FindPtr(name);
+ (options.EnableRecursiveRenaming || nested.size() == 1) && renamePtr) {
+ name = *renamePtr;
+ }
+
+ NYT::TNode itemType;
+ if (fieldDescriptor.type() == pb::FieldDescriptor::TYPE_MESSAGE) {
+ itemType = MakeSchemaFromProto(*fieldDescriptor.message_type(), nested, options);
+ } else {
+ itemType = NYT::TNode::CreateList();
+ itemType.Add("DataType");
+ itemType.Add(FormatTypeName(&fieldDescriptor, options.EnumPolicy));
+ }
+ switch (fieldDescriptor.label()) {
+ case pb::FieldDescriptor::LABEL_OPTIONAL: {
+ auto optionalType = NYT::TNode::CreateList();
+ optionalType.Add("OptionalType");
+ optionalType.Add(std::move(itemType));
+ itemType = std::move(optionalType);
+ } break;
+ case pb::FieldDescriptor::LABEL_REQUIRED:
+ break;
+ case pb::FieldDescriptor::LABEL_REPEATED: {
+ auto listType = NYT::TNode::CreateList();
+ listType.Add("ListType");
+ listType.Add(std::move(itemType));
+ itemType = std::move(listType);
+ if (options.ListIsOptional) {
+ itemType = NYT::TNode::CreateList().Add("OptionalType").Add(std::move(itemType));
}
+ } break;
+ default:
+ ythrow yexception() << "Unknown protobuf label: " << (ui32)fieldDescriptor.label() << ", field: " << name;
+ }
- auto itemNode = NYT::TNode::CreateList();
- itemNode.Add(name);
- itemNode.Add(std::move(itemType));
+ auto itemNode = NYT::TNode::CreateList();
+ itemNode.Add(name);
+ itemNode.Add(std::move(itemType));
- items.Add(std::move(itemNode));
- }
- auto root = NYT::TNode::CreateList();
- root.Add("StructType");
- root.Add(std::move(items));
+ items.Add(std::move(itemNode));
+ }
+ auto root = NYT::TNode::CreateList();
+ root.Add("StructType");
+ root.Add(std::move(items));
- nested.pop_back();
- return root;
- }
+ nested.pop_back();
+ return root;
+}
- NYT::TNode MakeSchemaFromProto(const pb::Descriptor& descriptor, const TProtoSchemaOptions& options) {
- TVector<const pb::Descriptor*> nested;
- return MakeSchemaFromProto(descriptor, nested, options);
- }
+NYT::TNode MakeSchemaFromProto(const pb::Descriptor& descriptor, const TProtoSchemaOptions& options) {
+ TVector<const pb::Descriptor*> nested;
+ return MakeSchemaFromProto(descriptor, nested, options);
+}
- NYT::TNode MakeVariantSchemaFromProtos(const TVector<const pb::Descriptor*>& descriptors, const TProtoSchemaOptions& options) {
- Y_ENSURE(options.FieldRenames.empty(), "Renames are not supported in variant mode");
+NYT::TNode MakeVariantSchemaFromProtos(const TVector<const pb::Descriptor*>& descriptors, const TProtoSchemaOptions& options) {
+ Y_ENSURE(options.FieldRenames.empty(), "Renames are not supported in variant mode");
- auto tupleItems = NYT::TNode::CreateList();
- for (auto descriptor : descriptors) {
- tupleItems.Add(MakeSchemaFromProto(*descriptor, options));
- }
+ auto tupleItems = NYT::TNode::CreateList();
+ for (auto descriptor : descriptors) {
+ tupleItems.Add(MakeSchemaFromProto(*descriptor, options));
+ }
- auto tupleType = NYT::TNode::CreateList();
- tupleType.Add("TupleType");
- tupleType.Add(std::move(tupleItems));
+ auto tupleType = NYT::TNode::CreateList();
+ tupleType.Add("TupleType");
+ tupleType.Add(std::move(tupleItems));
- auto variantType = NYT::TNode::CreateList();
- variantType.Add("VariantType");
- variantType.Add(std::move(tupleType));
+ auto variantType = NYT::TNode::CreateList();
+ variantType.Add("VariantType");
+ variantType.Add(std::move(tupleType));
- return variantType;
- }
- }
+ return variantType;
}
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.h b/yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.h
index bf85fc5e33e..f1511d78b7a 100644
--- a/yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.h
+++ b/yql/essentials/public/purecalc/helpers/protobuf/schema_from_proto.h
@@ -7,55 +7,54 @@
#include <google/protobuf/descriptor.h>
-
namespace NYql {
- namespace NPureCalc {
- enum class EEnumPolicy {
- Int32,
- String,
- YTFlagDefaultInt32,
- YTFlagDefaultString
- };
-
- enum class EEnumFormatType {
- Int32,
- String
- };
-
- /**
- * Options that customize building of struct type from protobuf descriptor.
- */
- struct TProtoSchemaOptions {
- public:
- EEnumPolicy EnumPolicy;
- bool ListIsOptional;
- bool EnableRecursiveRenaming;
- THashMap<TString, TString> FieldRenames;
-
- public:
- TProtoSchemaOptions();
-
- public:
- TProtoSchemaOptions& SetEnumPolicy(EEnumPolicy);
-
- TProtoSchemaOptions& SetListIsOptional(bool);
-
- TProtoSchemaOptions& SetEnableRecursiveRenaming(bool);
-
- TProtoSchemaOptions& SetFieldRenames(THashMap<TString, TString>);
- };
-
- EEnumFormatType EnumFormatType(const google::protobuf::FieldDescriptor& enumField, EEnumPolicy enumPolicy);
-
- /**
- * Build struct type from a protobuf descriptor. The returned yson can be loaded into a struct annotation node
- * using the ParseTypeFromYson function.
- */
- NYT::TNode MakeSchemaFromProto(const google::protobuf::Descriptor&, const TProtoSchemaOptions& = {});
-
- /**
- * Build variant over tuple type from protobuf descriptors.
- */
- NYT::TNode MakeVariantSchemaFromProtos(const TVector<const google::protobuf::Descriptor*>&, const TProtoSchemaOptions& = {});
- }
-}
+namespace NPureCalc {
+enum class EEnumPolicy {
+ Int32,
+ String,
+ YTFlagDefaultInt32,
+ YTFlagDefaultString
+};
+
+enum class EEnumFormatType {
+ Int32,
+ String
+};
+
+/**
+ * Options that customize building of struct type from protobuf descriptor.
+ */
+struct TProtoSchemaOptions {
+public:
+ EEnumPolicy EnumPolicy;
+ bool ListIsOptional;
+ bool EnableRecursiveRenaming;
+ THashMap<TString, TString> FieldRenames;
+
+public:
+ TProtoSchemaOptions();
+
+public:
+ TProtoSchemaOptions& SetEnumPolicy(EEnumPolicy);
+
+ TProtoSchemaOptions& SetListIsOptional(bool);
+
+ TProtoSchemaOptions& SetEnableRecursiveRenaming(bool);
+
+ TProtoSchemaOptions& SetFieldRenames(THashMap<TString, TString>);
+};
+
+EEnumFormatType EnumFormatType(const google::protobuf::FieldDescriptor& enumField, EEnumPolicy enumPolicy);
+
+/**
+ * Build struct type from a protobuf descriptor. The returned yson can be loaded into a struct annotation node
+ * using the ParseTypeFromYson function.
+ */
+NYT::TNode MakeSchemaFromProto(const google::protobuf::Descriptor&, const TProtoSchemaOptions& = {});
+
+/**
+ * Build variant over tuple type from protobuf descriptors.
+ */
+NYT::TNode MakeVariantSchemaFromProtos(const TVector<const google::protobuf::Descriptor*>&, const TProtoSchemaOptions& = {});
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/helpers/protobuf/ya.make b/yql/essentials/public/purecalc/helpers/protobuf/ya.make
index 11300baba84..5e1b006bf92 100644
--- a/yql/essentials/public/purecalc/helpers/protobuf/ya.make
+++ b/yql/essentials/public/purecalc/helpers/protobuf/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
schema_from_proto.cpp
)
diff --git a/yql/essentials/public/purecalc/helpers/stream/stream_from_vector.h b/yql/essentials/public/purecalc/helpers/stream/stream_from_vector.h
index a2a50558003..69bcbb1f566 100644
--- a/yql/essentials/public/purecalc/helpers/stream/stream_from_vector.h
+++ b/yql/essentials/public/purecalc/helpers/stream/stream_from_vector.h
@@ -3,38 +3,38 @@
#include <yql/essentials/public/purecalc/common/interface.h>
namespace NYql {
- namespace NPureCalc {
- namespace NPrivate {
- template <typename T>
- class TVectorStream final: public IStream<T*> {
- private:
- size_t I_;
- TVector<T> Data_;
+namespace NPureCalc {
+namespace NPrivate {
+template <typename T>
+class TVectorStream final: public IStream<T*> {
+private:
+ size_t I_;
+ TVector<T> Data_;
- public:
- explicit TVectorStream(TVector<T> data)
- : I_(0)
- , Data_(std::move(data))
- {
- }
-
- public:
- T* Fetch() override {
- if (I_ >= Data_.size()) {
- return nullptr;
- } else {
- return &Data_[I_++];
- }
- }
- };
- }
+public:
+ explicit TVectorStream(TVector<T> data)
+ : I_(0)
+ , Data_(std::move(data))
+ {
+ }
- /**
- * Convert vector into a purecalc stream.
- */
- template <typename T>
- THolder<IStream<T*>> StreamFromVector(TVector<T> data) {
- return MakeHolder<NPrivate::TVectorStream<T>>(std::move(data));
+public:
+ T* Fetch() override {
+ if (I_ >= Data_.size()) {
+ return nullptr;
+ } else {
+ return &Data_[I_++];
}
}
+};
+} // namespace NPrivate
+
+/**
+ * Convert vector into a purecalc stream.
+ */
+template <typename T>
+THolder<IStream<T*>> StreamFromVector(TVector<T> data) {
+ return MakeHolder<NPrivate::TVectorStream<T>>(std::move(data));
}
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/helpers/stream/ya.make b/yql/essentials/public/purecalc/helpers/stream/ya.make
index f40bb9af559..c6aa839b803 100644
--- a/yql/essentials/public/purecalc/helpers/stream/ya.make
+++ b/yql/essentials/public/purecalc/helpers/stream/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
stream_from_vector.cpp
)
diff --git a/yql/essentials/public/purecalc/io_specs/arrow/spec.cpp b/yql/essentials/public/purecalc/io_specs/arrow/spec.cpp
index 84562ee82ce..3b717813794 100644
--- a/yql/essentials/public/purecalc/io_specs/arrow/spec.cpp
+++ b/yql/essentials/public/purecalc/io_specs/arrow/spec.cpp
@@ -28,8 +28,7 @@ inline TVector<THolder<T>> VectorFromHolder(THolder<T> holder) {
return result;
}
-
-class TArrowIStreamImpl : public IArrowIStream {
+class TArrowIStreamImpl: public IArrowIStream {
private:
IArrowIStream* Underlying_;
// If we own Underlying_, than Owned_ == Underlying_;
@@ -59,7 +58,6 @@ public:
}
};
-
/**
* Converts input Datums to unboxed values.
*/
@@ -73,16 +71,15 @@ public:
explicit TArrowInputConverter(
const TArrowInputSpec& inputSpec,
ui32 index,
- IWorker* worker
- )
+ IWorker* worker)
: Factory_(worker->GetGraph().GetHolderFactory())
{
const NYT::TNode& inputSchema = inputSpec.GetSchema(index);
// Deduce the schema from the input MKQL type, if no is
// provided by <inputSpec>.
const NYT::TNode& schema = inputSchema.IsEntity()
- ? worker->MakeInputSchema(index)
- : inputSchema;
+ ? worker->MakeInputSchema(index)
+ : inputSchema;
const auto* type = worker->GetRawInputType(index);
@@ -118,7 +115,6 @@ public:
}
};
-
/**
* Converts unboxed values to output Datums (single-output program case).
*/
@@ -132,8 +128,7 @@ protected:
public:
explicit TArrowOutputConverter(
const TArrowOutputSpec& outputSpec,
- IWorker* worker
- )
+ IWorker* worker)
: Factory_(worker->GetGraph().GetHolderFactory())
{
Batch_.Reset(new arrow::compute::ExecBatch);
@@ -142,8 +137,8 @@ public:
// Deduce the schema from the output MKQL type, if no is
// provided by <outputSpec>.
const NYT::TNode& schema = outputSchema.IsEntity()
- ? worker->MakeOutputSchema()
- : outputSchema;
+ ? worker->MakeOutputSchema()
+ : outputSchema;
const auto* type = worker->GetRawOutputType();
@@ -194,7 +189,6 @@ public:
}
};
-
/**
* List (or, better, stream) of unboxed values.
* Used as an input value in pull workers.
@@ -213,13 +207,12 @@ public:
const TArrowInputSpec& inputSpec,
ui32 index,
THolder<IArrowIStream> underlying,
- IWorker* worker
- )
- : TCustomListValue(memInfo)
- , Underlying_(std::move(underlying))
- , Worker_(worker)
- , Converter_(inputSpec, index, Worker_)
- , ScopedAlloc_(Worker_->GetScopedAlloc())
+ IWorker* worker)
+ : TCustomListValue(memInfo)
+ , Underlying_(std::move(underlying))
+ , Worker_(worker)
+ , Converter_(inputSpec, index, Worker_)
+ , ScopedAlloc_(Worker_->GetScopedAlloc())
{
}
@@ -273,7 +266,6 @@ public:
}
};
-
/**
* Arrow input stream for unboxed value lists.
*/
@@ -285,8 +277,7 @@ protected:
public:
explicit TArrowListImpl(
const TArrowOutputSpec& outputSpec,
- TWorkerHolder<IPullListWorker> worker
- )
+ TWorkerHolder<IPullListWorker> worker)
: WorkerHolder_(std::move(worker))
, Converter_(outputSpec, WorkerHolder_.Get())
{
@@ -295,7 +286,7 @@ public:
OutputItemType Fetch() override {
TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
- with_lock(WorkerHolder_->GetScopedAlloc()) {
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
TUnboxedValue value;
if (!WorkerHolder_->GetOutputIterator().Next(value)) {
@@ -307,7 +298,6 @@ public:
}
};
-
/**
* Arrow input stream for unboxed value streams.
*/
@@ -326,7 +316,7 @@ public:
OutputItemType Fetch() override {
TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
- with_lock(WorkerHolder_->GetScopedAlloc()) {
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
TUnboxedValue value;
auto status = WorkerHolder_->GetOutput().Fetch(value);
@@ -341,7 +331,6 @@ public:
}
};
-
/**
* Consumer which converts Datums to unboxed values and relays them to the
* worker. Used as a return value of the push processor's Process function.
@@ -354,8 +343,7 @@ private:
public:
explicit TArrowConsumerImpl(
const TArrowInputSpec& inputSpec,
- TWorkerHolder<IPushStreamWorker> worker
- )
+ TWorkerHolder<IPushStreamWorker> worker)
: TArrowConsumerImpl(inputSpec, 0, std::move(worker))
{
}
@@ -363,8 +351,7 @@ public:
explicit TArrowConsumerImpl(
const TArrowInputSpec& inputSpec,
ui32 index,
- TWorkerHolder<IPushStreamWorker> worker
- )
+ TWorkerHolder<IPushStreamWorker> worker)
: WorkerHolder_(std::move(worker))
, Converter_(inputSpec, index, WorkerHolder_.Get())
{
@@ -373,7 +360,7 @@ public:
void OnObject(arrow::compute::ExecBatch* batch) override {
TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
- with_lock(WorkerHolder_->GetScopedAlloc()) {
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
TUnboxedValue result;
Converter_.DoConvert(batch, result);
WorkerHolder_->Push(std::move(result));
@@ -383,13 +370,12 @@ public:
void OnFinish() override {
TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
- with_lock(WorkerHolder_->GetScopedAlloc()) {
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
WorkerHolder_->OnFinish();
}
}
};
-
/**
* Push relay used to convert generated unboxed value to a Datum and push it to
* the user's consumer.
@@ -404,8 +390,7 @@ public:
TArrowPushRelayImpl(
const TArrowOutputSpec& outputSpec,
IPushStreamWorker* worker,
- THolder<IConsumer<OutputItemType>> underlying
- )
+ THolder<IConsumer<OutputItemType>> underlying)
: Underlying_(std::move(underlying))
, Worker_(worker)
, Converter_(outputSpec, Worker_)
@@ -429,15 +414,13 @@ public:
}
};
-
template <typename TWorker>
void PrepareWorkerImpl(const TArrowInputSpec& inputSpec, TWorker* worker,
- TVector<THolder<TArrowIStreamImpl>>&& streams
-) {
+ TVector<THolder<TArrowIStreamImpl>>&& streams) {
YQL_ENSURE(worker->GetInputsCount() == streams.size(),
- "number of input streams should match number of inputs provided by spec");
+ "number of input streams should match number of inputs provided by spec");
- with_lock(worker->GetScopedAlloc()) {
+ with_lock (worker->GetScopedAlloc()) {
auto& holderFactory = worker->GetGraph().GetHolderFactory();
for (ui32 i = 0; i < streams.size(); i++) {
auto input = holderFactory.template Create<TArrowListValue>(
@@ -449,7 +432,6 @@ void PrepareWorkerImpl(const TArrowInputSpec& inputSpec, TWorker* worker,
} // namespace
-
TArrowInputSpec::TArrowInputSpec(const TVector<NYT::TNode>& schemas)
: Schemas_(schemas)
{
@@ -465,16 +447,14 @@ const NYT::TNode& TArrowInputSpec::GetSchema(ui32 index) const {
void TInputSpecTraits<TArrowInputSpec>::PreparePullListWorker(
const TArrowInputSpec& inputSpec, IPullListWorker* worker,
- IArrowIStream* stream
-) {
+ IArrowIStream* stream) {
TInputSpecTraits<TArrowInputSpec>::PreparePullListWorker(
inputSpec, worker, TVector<IArrowIStream*>({stream}));
}
void TInputSpecTraits<TArrowInputSpec>::PreparePullListWorker(
const TArrowInputSpec& inputSpec, IPullListWorker* worker,
- const TVector<IArrowIStream*>& streams
-) {
+ const TVector<IArrowIStream*>& streams) {
TVector<THolder<TArrowIStreamImpl>> wrappers;
for (ui32 i = 0; i < streams.size(); i++) {
wrappers.push_back(MakeHolder<TArrowIStreamImpl>(streams[i]));
@@ -484,16 +464,14 @@ void TInputSpecTraits<TArrowInputSpec>::PreparePullListWorker(
void TInputSpecTraits<TArrowInputSpec>::PreparePullListWorker(
const TArrowInputSpec& inputSpec, IPullListWorker* worker,
- THolder<IArrowIStream> stream
-) {
+ THolder<IArrowIStream> stream) {
TInputSpecTraits<TArrowInputSpec>::PreparePullListWorker(inputSpec, worker,
- VectorFromHolder<IArrowIStream>(std::move(stream)));
+ VectorFromHolder<IArrowIStream>(std::move(stream)));
}
void TInputSpecTraits<TArrowInputSpec>::PreparePullListWorker(
const TArrowInputSpec& inputSpec, IPullListWorker* worker,
- TVector<THolder<IArrowIStream>>&& streams
-) {
+ TVector<THolder<IArrowIStream>>&& streams) {
TVector<THolder<TArrowIStreamImpl>> wrappers;
for (ui32 i = 0; i < streams.size(); i++) {
wrappers.push_back(MakeHolder<TArrowIStreamImpl>(std::move(streams[i])));
@@ -501,19 +479,16 @@ void TInputSpecTraits<TArrowInputSpec>::PreparePullListWorker(
PrepareWorkerImpl(inputSpec, worker, std::move(wrappers));
}
-
void TInputSpecTraits<TArrowInputSpec>::PreparePullStreamWorker(
const TArrowInputSpec& inputSpec, IPullStreamWorker* worker,
- IArrowIStream* stream
-) {
+ IArrowIStream* stream) {
TInputSpecTraits<TArrowInputSpec>::PreparePullStreamWorker(
inputSpec, worker, TVector<IArrowIStream*>({stream}));
}
void TInputSpecTraits<TArrowInputSpec>::PreparePullStreamWorker(
const TArrowInputSpec& inputSpec, IPullStreamWorker* worker,
- const TVector<IArrowIStream*>& streams
-) {
+ const TVector<IArrowIStream*>& streams) {
TVector<THolder<TArrowIStreamImpl>> wrappers;
for (ui32 i = 0; i < streams.size(); i++) {
wrappers.push_back(MakeHolder<TArrowIStreamImpl>(streams[i]));
@@ -523,16 +498,14 @@ void TInputSpecTraits<TArrowInputSpec>::PreparePullStreamWorker(
void TInputSpecTraits<TArrowInputSpec>::PreparePullStreamWorker(
const TArrowInputSpec& inputSpec, IPullStreamWorker* worker,
- THolder<IArrowIStream> stream
-) {
+ THolder<IArrowIStream> stream) {
TInputSpecTraits<TArrowInputSpec>::PreparePullStreamWorker(
inputSpec, worker, VectorFromHolder<IArrowIStream>(std::move(stream)));
}
void TInputSpecTraits<TArrowInputSpec>::PreparePullStreamWorker(
const TArrowInputSpec& inputSpec, IPullStreamWorker* worker,
- TVector<THolder<IArrowIStream>>&& streams
-) {
+ TVector<THolder<IArrowIStream>>&& streams) {
TVector<THolder<TArrowIStreamImpl>> wrappers;
for (ui32 i = 0; i < streams.size(); i++) {
wrappers.push_back(MakeHolder<TArrowIStreamImpl>(std::move(streams[i])));
@@ -540,14 +513,11 @@ void TInputSpecTraits<TArrowInputSpec>::PreparePullStreamWorker(
PrepareWorkerImpl(inputSpec, worker, std::move(wrappers));
}
-
ConsumerType TInputSpecTraits<TArrowInputSpec>::MakeConsumer(
- const TArrowInputSpec& inputSpec, TWorkerHolder<IPushStreamWorker> worker
-) {
+ const TArrowInputSpec& inputSpec, TWorkerHolder<IPushStreamWorker> worker) {
return MakeHolder<TArrowConsumerImpl>(inputSpec, std::move(worker));
}
-
TArrowOutputSpec::TArrowOutputSpec(const NYT::TNode& schema)
: Schema_(schema)
{
@@ -557,22 +527,18 @@ const NYT::TNode& TArrowOutputSpec::GetSchema() const {
return Schema_;
}
-
PullListReturnType TOutputSpecTraits<TArrowOutputSpec>::ConvertPullListWorkerToOutputType(
- const TArrowOutputSpec& outputSpec, TWorkerHolder<IPullListWorker> worker
-) {
+ const TArrowOutputSpec& outputSpec, TWorkerHolder<IPullListWorker> worker) {
return MakeHolder<TArrowListImpl>(outputSpec, std::move(worker));
}
PullStreamReturnType TOutputSpecTraits<TArrowOutputSpec>::ConvertPullStreamWorkerToOutputType(
- const TArrowOutputSpec& outputSpec, TWorkerHolder<IPullStreamWorker> worker
-) {
+ const TArrowOutputSpec& outputSpec, TWorkerHolder<IPullStreamWorker> worker) {
return MakeHolder<TArrowStreamImpl>(outputSpec, std::move(worker));
}
void TOutputSpecTraits<TArrowOutputSpec>::SetConsumerToWorker(
const TArrowOutputSpec& outputSpec, IPushStreamWorker* worker,
- THolder<IConsumer<TOutputItemType>> consumer
-) {
+ THolder<IConsumer<TOutputItemType>> consumer) {
worker->SetConsumer(MakeHolder<TArrowPushRelayImpl>(outputSpec, worker, std::move(consumer)));
}
diff --git a/yql/essentials/public/purecalc/io_specs/arrow/spec.h b/yql/essentials/public/purecalc/io_specs/arrow/spec.h
index 42780b1a376..0b48321539d 100644
--- a/yql/essentials/public/purecalc/io_specs/arrow/spec.h
+++ b/yql/essentials/public/purecalc/io_specs/arrow/spec.h
@@ -37,7 +37,9 @@ public:
explicit TArrowInputSpec(const TVector<NYT::TNode>& schemas);
const TVector<NYT::TNode>& GetSchemas() const override;
const NYT::TNode& GetSchema(ui32 index) const;
- bool ProvidesBlocks() const override { return true; }
+ bool ProvidesBlocks() const override {
+ return true;
+ }
};
/**
@@ -70,7 +72,9 @@ private:
public:
explicit TArrowOutputSpec(const NYT::TNode& schema);
const NYT::TNode& GetSchema() const override;
- bool AcceptsBlocks() const override { return true; }
+ bool AcceptsBlocks() const override {
+ return true;
+ }
};
template <>
@@ -86,22 +90,22 @@ struct TInputSpecTraits<TArrowInputSpec> {
using TConsumerType = THolder<IConsumer<TInputItemType>>;
static void PreparePullListWorker(const TArrowInputSpec&, IPullListWorker*,
- IInputStream*);
+ IInputStream*);
static void PreparePullListWorker(const TArrowInputSpec&, IPullListWorker*,
- THolder<IInputStream>);
+ THolder<IInputStream>);
static void PreparePullListWorker(const TArrowInputSpec&, IPullListWorker*,
- const TVector<IInputStream*>&);
+ const TVector<IInputStream*>&);
static void PreparePullListWorker(const TArrowInputSpec&, IPullListWorker*,
- TVector<THolder<IInputStream>>&&);
+ TVector<THolder<IInputStream>>&&);
static void PreparePullStreamWorker(const TArrowInputSpec&, IPullStreamWorker*,
- IInputStream*);
+ IInputStream*);
static void PreparePullStreamWorker(const TArrowInputSpec&, IPullStreamWorker*,
- THolder<IInputStream>);
+ THolder<IInputStream>);
static void PreparePullStreamWorker(const TArrowInputSpec&, IPullStreamWorker*,
- const TVector<IInputStream*>&);
+ const TVector<IInputStream*>&);
static void PreparePullStreamWorker(const TArrowInputSpec&, IPullStreamWorker*,
- TVector<THolder<IInputStream>>&&);
+ TVector<THolder<IInputStream>>&&);
static TConsumerType MakeConsumer(const TArrowInputSpec&, TWorkerHolder<IPushStreamWorker>);
};
diff --git a/yql/essentials/public/purecalc/io_specs/arrow/ut/test_spec.cpp b/yql/essentials/public/purecalc/io_specs/arrow/ut/test_spec.cpp
index e9e0cb7072b..2d0d42ca21a 100644
--- a/yql/essentials/public/purecalc/io_specs/arrow/ut/test_spec.cpp
+++ b/yql/essentials/public/purecalc/io_specs/arrow/ut/test_spec.cpp
@@ -12,20 +12,20 @@ namespace {
#define Y_UNIT_TEST_ADD_BLOCK_TEST(N, MODE) \
TCurrentTest::AddTest(#N ":BlockEngineMode=" #MODE, \
- static_cast<void (*)(NUnitTest::TTestContext&)>(&N<NYql::EBlockEngineMode::MODE>), false);
-
-#define Y_UNIT_TEST_BLOCKS(N) \
- template<NYql::EBlockEngineMode BlockEngineMode> \
- void N(NUnitTest::TTestContext&); \
- struct TTestRegistration##N { \
- TTestRegistration##N() { \
- Y_UNIT_TEST_ADD_BLOCK_TEST(N, Disable) \
- Y_UNIT_TEST_ADD_BLOCK_TEST(N, Auto) \
- Y_UNIT_TEST_ADD_BLOCK_TEST(N, Force) \
- } \
- }; \
- static TTestRegistration##N testRegistration##N; \
- template<NYql::EBlockEngineMode BlockEngineMode> \
+ static_cast<void (*)(NUnitTest::TTestContext&)>(&N<NYql::EBlockEngineMode::MODE>), false);
+
+#define Y_UNIT_TEST_BLOCKS(N) \
+ template <NYql::EBlockEngineMode BlockEngineMode> \
+ void N(NUnitTest::TTestContext&); \
+ struct TTestRegistration##N { \
+ TTestRegistration##N() { \
+ Y_UNIT_TEST_ADD_BLOCK_TEST(N, Disable) \
+ Y_UNIT_TEST_ADD_BLOCK_TEST(N, Auto) \
+ Y_UNIT_TEST_ADD_BLOCK_TEST(N, Force) \
+ } \
+ }; \
+ static TTestRegistration##N testRegistration##N; \
+ template <NYql::EBlockEngineMode BlockEngineMode> \
void N(NUnitTest::TTestContext&)
NYql::NPureCalc::TProgramFactoryOptions TestOptions(NYql::EBlockEngineMode mode) {
@@ -39,7 +39,6 @@ NYql::NPureCalc::TProgramFactoryOptions TestOptions(NYql::EBlockEngineMode mode)
return options;
}
-
template <typename T>
struct TVectorStream: public NYql::NPureCalc::IStream<T*> {
TVector<T> Data;
@@ -56,8 +55,7 @@ public:
}
};
-
-template<typename T>
+template <typename T>
struct TVectorConsumer: public NYql::NPureCalc::IConsumer<T*> {
TVector<T>& Data;
size_t Index = 0;
@@ -78,15 +76,13 @@ public:
}
};
-
using ExecBatchStreamImpl = TVectorStream<arrow::compute::ExecBatch>;
using ExecBatchConsumerImpl = TVectorConsumer<arrow::compute::ExecBatch>;
template <typename TBuilder>
arrow::Datum MakeArrayDatumFromVector(
const TVector<typename TBuilder::value_type>& data,
- const TVector<bool>& valid
-) {
+ const TVector<bool>& valid) {
TBuilder builder;
ARROW_OK(builder.Reserve(data.size()));
ARROW_OK(builder.AppendValues(data, valid));
@@ -96,17 +92,16 @@ arrow::Datum MakeArrayDatumFromVector(
template <typename TValue>
TVector<TValue> MakeVectorFromArrayDatum(
const arrow::Datum& datum,
- const int64_t dsize
-) {
+ const int64_t dsize) {
Y_ENSURE(datum.is_array(), "ExecBatch layout doesn't respect the schema");
const auto& array = *datum.array();
Y_ENSURE(array.length == dsize,
- "Array Datum size differs from the given ExecBatch size");
+ "Array Datum size differs from the given ExecBatch size");
Y_ENSURE(array.GetNullCount() == 0,
- "Null values conversion is not supported");
+ "Null values conversion is not supported");
Y_ENSURE(array.buffers.size() == 2,
- "Array Datum layout doesn't respect the schema");
+ "Array Datum layout doesn't respect the schema");
const TValue* adata1 = array.GetValuesSafe<TValue>(1);
return TVector<TValue>(adata1, adata1 + dsize);
@@ -122,8 +117,7 @@ arrow::compute::ExecBatch MakeBatch(ui64 bsize, i64 value, ui64 init = 1) {
TVector<arrow::Datum> batchArgs = {
MakeArrayDatumFromVector<arrow::UInt64Builder>(data1, valid),
- MakeArrayDatumFromVector<arrow::Int64Builder>(data2, valid)
- };
+ MakeArrayDatumFromVector<arrow::Int64Builder>(data2, valid)};
return arrow::compute::ExecBatch(std::move(batchArgs), bsize);
}
@@ -146,274 +140,261 @@ TVector<std::tuple<ui64, i64>> CanonBatches(const TVector<arrow::compute::ExecBa
} // namespace
-
Y_UNIT_TEST_SUITE(TestSimplePullListArrowIO) {
- Y_UNIT_TEST_BLOCKS(TestSingleInput) {
- using namespace NYql::NPureCalc;
-
- TVector<TString> fields = {"uint64", "int64"};
- auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
-
- auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
-
- try {
- auto program = factory->MakePullListProgram(
- TArrowInputSpec({schema}),
- TArrowOutputSpec(schema),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
-
- const TVector<arrow::compute::ExecBatch> input({MakeBatch(9, 19)});
- const auto canonInput = CanonBatches(input);
- ExecBatchStreamImpl items(input);
-
- auto stream = program->Apply(&items);
-
- TVector<arrow::compute::ExecBatch> output;
- while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
- output.push_back(*batch);
- }
- const auto canonOutput = CanonBatches(output);
- UNIT_ASSERT_EQUAL(canonInput, canonOutput);
- } catch (const TCompileError& error) {
- UNIT_FAIL(error.GetIssues());
+Y_UNIT_TEST_BLOCKS(TestSingleInput) {
+ using namespace NYql::NPureCalc;
+
+ TVector<TString> fields = {"uint64", "int64"};
+ auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
+
+ auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
+
+ try {
+ auto program = factory->MakePullListProgram(
+ TArrowInputSpec({schema}),
+ TArrowOutputSpec(schema),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
+
+ const TVector<arrow::compute::ExecBatch> input({MakeBatch(9, 19)});
+ const auto canonInput = CanonBatches(input);
+ ExecBatchStreamImpl items(input);
+
+ auto stream = program->Apply(&items);
+
+ TVector<arrow::compute::ExecBatch> output;
+ while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
+ output.push_back(*batch);
}
+ const auto canonOutput = CanonBatches(output);
+ UNIT_ASSERT_EQUAL(canonInput, canonOutput);
+ } catch (const TCompileError& error) {
+ UNIT_FAIL(error.GetIssues());
}
+}
- Y_UNIT_TEST_BLOCKS(TestMultiInput) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST_BLOCKS(TestMultiInput) {
+ using namespace NYql::NPureCalc;
- TVector<TString> fields = {"uint64", "int64"};
- auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
+ TVector<TString> fields = {"uint64", "int64"};
+ auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
- auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
+ auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
- try {
- auto program = factory->MakePullListProgram(
- TArrowInputSpec({schema, schema}),
- TArrowOutputSpec(schema),
- R"(
+ try {
+ auto program = factory->MakePullListProgram(
+ TArrowInputSpec({schema, schema}),
+ TArrowOutputSpec(schema),
+ R"(
SELECT * FROM Input0
UNION ALL
SELECT * FROM Input1
)",
- ETranslationMode::SQL
- );
-
- TVector<arrow::compute::ExecBatch> inputs = {
- MakeBatch(9, 19),
- MakeBatch(7, 17)
- };
- const auto canonInputs = CanonBatches(inputs);
-
- ExecBatchStreamImpl items0({inputs[0]});
- ExecBatchStreamImpl items1({inputs[1]});
-
- const TVector<IStream<arrow::compute::ExecBatch*>*> items({&items0, &items1});
-
- auto stream = program->Apply(items);
-
- TVector<arrow::compute::ExecBatch> output;
- while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
- output.push_back(*batch);
- }
- const auto canonOutput = CanonBatches(output);
- UNIT_ASSERT_EQUAL(canonInputs, canonOutput);
- } catch (const TCompileError& error) {
- UNIT_FAIL(error.GetIssues());
+ ETranslationMode::SQL);
+
+ TVector<arrow::compute::ExecBatch> inputs = {
+ MakeBatch(9, 19),
+ MakeBatch(7, 17)};
+ const auto canonInputs = CanonBatches(inputs);
+
+ ExecBatchStreamImpl items0({inputs[0]});
+ ExecBatchStreamImpl items1({inputs[1]});
+
+ const TVector<IStream<arrow::compute::ExecBatch*>*> items({&items0, &items1});
+
+ auto stream = program->Apply(items);
+
+ TVector<arrow::compute::ExecBatch> output;
+ while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
+ output.push_back(*batch);
}
+ const auto canonOutput = CanonBatches(output);
+ UNIT_ASSERT_EQUAL(canonInputs, canonOutput);
+ } catch (const TCompileError& error) {
+ UNIT_FAIL(error.GetIssues());
}
}
-
+} // Y_UNIT_TEST_SUITE(TestSimplePullListArrowIO)
Y_UNIT_TEST_SUITE(TestMorePullListArrowIO) {
- Y_UNIT_TEST_BLOCKS(TestInc) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST_BLOCKS(TestInc) {
+ using namespace NYql::NPureCalc;
- TVector<TString> fields = {"uint64", "int64"};
- auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
+ TVector<TString> fields = {"uint64", "int64"};
+ auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
- auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
+ auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
- try {
- auto program = factory->MakePullListProgram(
- TArrowInputSpec({schema}),
- TArrowOutputSpec(schema),
- R"(SELECT
+ try {
+ auto program = factory->MakePullListProgram(
+ TArrowInputSpec({schema}),
+ TArrowOutputSpec(schema),
+ R"(SELECT
uint64 + 1 as uint64,
int64 - 2 as int64,
FROM Input)",
- ETranslationMode::SQL
- );
-
- const TVector<arrow::compute::ExecBatch> input({MakeBatch(9, 19)});
- const auto canonInput = CanonBatches(input);
- ExecBatchStreamImpl items(input);
-
- auto stream = program->Apply(&items);
-
- TVector<arrow::compute::ExecBatch> output;
- while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
- output.push_back(*batch);
- }
- const auto canonOutput = CanonBatches(output);
- const TVector<arrow::compute::ExecBatch> check({MakeBatch(9, 17, 2)});
- const auto canonCheck = CanonBatches(check);
- UNIT_ASSERT_EQUAL(canonCheck, canonOutput);
- } catch (const TCompileError& error) {
- UNIT_FAIL(error.GetIssues());
+ ETranslationMode::SQL);
+
+ const TVector<arrow::compute::ExecBatch> input({MakeBatch(9, 19)});
+ const auto canonInput = CanonBatches(input);
+ ExecBatchStreamImpl items(input);
+
+ auto stream = program->Apply(&items);
+
+ TVector<arrow::compute::ExecBatch> output;
+ while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
+ output.push_back(*batch);
}
+ const auto canonOutput = CanonBatches(output);
+ const TVector<arrow::compute::ExecBatch> check({MakeBatch(9, 17, 2)});
+ const auto canonCheck = CanonBatches(check);
+ UNIT_ASSERT_EQUAL(canonCheck, canonOutput);
+ } catch (const TCompileError& error) {
+ UNIT_FAIL(error.GetIssues());
}
}
-
+} // Y_UNIT_TEST_SUITE(TestMorePullListArrowIO)
Y_UNIT_TEST_SUITE(TestSimplePullStreamArrowIO) {
- Y_UNIT_TEST_BLOCKS(TestSingleInput) {
- using namespace NYql::NPureCalc;
-
- TVector<TString> fields = {"uint64", "int64"};
- auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
-
- auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
-
- try {
- auto program = factory->MakePullStreamProgram(
- TArrowInputSpec({schema}),
- TArrowOutputSpec(schema),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
-
- const TVector<arrow::compute::ExecBatch> input({MakeBatch(9, 19)});
- const auto canonInput = CanonBatches(input);
- ExecBatchStreamImpl items(input);
-
- auto stream = program->Apply(&items);
-
- TVector<arrow::compute::ExecBatch> output;
- while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
- output.push_back(*batch);
- }
- const auto canonOutput = CanonBatches(output);
- UNIT_ASSERT_EQUAL(canonInput, canonOutput);
- } catch (const TCompileError& error) {
- UNIT_FAIL(error.GetIssues());
+Y_UNIT_TEST_BLOCKS(TestSingleInput) {
+ using namespace NYql::NPureCalc;
+
+ TVector<TString> fields = {"uint64", "int64"};
+ auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
+
+ auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
+
+ try {
+ auto program = factory->MakePullStreamProgram(
+ TArrowInputSpec({schema}),
+ TArrowOutputSpec(schema),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
+
+ const TVector<arrow::compute::ExecBatch> input({MakeBatch(9, 19)});
+ const auto canonInput = CanonBatches(input);
+ ExecBatchStreamImpl items(input);
+
+ auto stream = program->Apply(&items);
+
+ TVector<arrow::compute::ExecBatch> output;
+ while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
+ output.push_back(*batch);
}
+ const auto canonOutput = CanonBatches(output);
+ UNIT_ASSERT_EQUAL(canonInput, canonOutput);
+ } catch (const TCompileError& error) {
+ UNIT_FAIL(error.GetIssues());
}
}
-
+} // Y_UNIT_TEST_SUITE(TestSimplePullStreamArrowIO)
Y_UNIT_TEST_SUITE(TestMorePullStreamArrowIO) {
- Y_UNIT_TEST_BLOCKS(TestInc) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST_BLOCKS(TestInc) {
+ using namespace NYql::NPureCalc;
- TVector<TString> fields = {"uint64", "int64"};
- auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
+ TVector<TString> fields = {"uint64", "int64"};
+ auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
- auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
+ auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
- try {
- auto program = factory->MakePullStreamProgram(
- TArrowInputSpec({schema}),
- TArrowOutputSpec(schema),
- R"(SELECT
+ try {
+ auto program = factory->MakePullStreamProgram(
+ TArrowInputSpec({schema}),
+ TArrowOutputSpec(schema),
+ R"(SELECT
uint64 + 1 as uint64,
int64 - 2 as int64,
FROM Input)",
- ETranslationMode::SQL
- );
-
- const TVector<arrow::compute::ExecBatch> input({MakeBatch(9, 19)});
- const auto canonInput = CanonBatches(input);
- ExecBatchStreamImpl items(input);
-
- auto stream = program->Apply(&items);
-
- TVector<arrow::compute::ExecBatch> output;
- while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
- output.push_back(*batch);
- }
- const auto canonOutput = CanonBatches(output);
- const TVector<arrow::compute::ExecBatch> check({MakeBatch(9, 17, 2)});
- const auto canonCheck = CanonBatches(check);
- UNIT_ASSERT_EQUAL(canonCheck, canonOutput);
- } catch (const TCompileError& error) {
- UNIT_FAIL(error.GetIssues());
+ ETranslationMode::SQL);
+
+ const TVector<arrow::compute::ExecBatch> input({MakeBatch(9, 19)});
+ const auto canonInput = CanonBatches(input);
+ ExecBatchStreamImpl items(input);
+
+ auto stream = program->Apply(&items);
+
+ TVector<arrow::compute::ExecBatch> output;
+ while (arrow::compute::ExecBatch* batch = stream->Fetch()) {
+ output.push_back(*batch);
}
+ const auto canonOutput = CanonBatches(output);
+ const TVector<arrow::compute::ExecBatch> check({MakeBatch(9, 17, 2)});
+ const auto canonCheck = CanonBatches(check);
+ UNIT_ASSERT_EQUAL(canonCheck, canonOutput);
+ } catch (const TCompileError& error) {
+ UNIT_FAIL(error.GetIssues());
}
}
-
+} // Y_UNIT_TEST_SUITE(TestMorePullStreamArrowIO)
Y_UNIT_TEST_SUITE(TestPushStreamArrowIO) {
- Y_UNIT_TEST_BLOCKS(TestAllColumns) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST_BLOCKS(TestAllColumns) {
+ using namespace NYql::NPureCalc;
- TVector<TString> fields = {"uint64", "int64"};
- auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
+ TVector<TString> fields = {"uint64", "int64"};
+ auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
- auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
+ auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
- try {
- auto program = factory->MakePushStreamProgram(
- TArrowInputSpec({schema}),
- TArrowOutputSpec(schema),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
+ try {
+ auto program = factory->MakePushStreamProgram(
+ TArrowInputSpec({schema}),
+ TArrowOutputSpec(schema),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
- arrow::compute::ExecBatch input = MakeBatch(9, 19);
- const auto canonInput = CanonBatches({input});
- TVector<arrow::compute::ExecBatch> output;
+ arrow::compute::ExecBatch input = MakeBatch(9, 19);
+ const auto canonInput = CanonBatches({input});
+ TVector<arrow::compute::ExecBatch> output;
- auto consumer = program->Apply(MakeHolder<ExecBatchConsumerImpl>(output));
+ auto consumer = program->Apply(MakeHolder<ExecBatchConsumerImpl>(output));
- UNIT_ASSERT_NO_EXCEPTION([&](){ consumer->OnObject(&input); }());
- UNIT_ASSERT_NO_EXCEPTION([&](){ consumer->OnFinish(); }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() { consumer->OnObject(&input); }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() { consumer->OnFinish(); }());
- const auto canonOutput = CanonBatches(output);
- UNIT_ASSERT_EQUAL(canonInput, canonOutput);
- } catch (const TCompileError& error) {
- UNIT_FAIL(error.GetIssues());
- }
+ const auto canonOutput = CanonBatches(output);
+ UNIT_ASSERT_EQUAL(canonInput, canonOutput);
+ } catch (const TCompileError& error) {
+ UNIT_FAIL(error.GetIssues());
}
}
+} // Y_UNIT_TEST_SUITE(TestPushStreamArrowIO)
Y_UNIT_TEST_SUITE(TestMorePushStreamArrowIO) {
- Y_UNIT_TEST_BLOCKS(TestInc) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST_BLOCKS(TestInc) {
+ using namespace NYql::NPureCalc;
- TVector<TString> fields = {"uint64", "int64"};
- auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
+ TVector<TString> fields = {"uint64", "int64"};
+ auto schema = NYql::NPureCalc::NPrivate::GetSchema(fields);
- auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
+ auto factory = MakeProgramFactory(TestOptions(BlockEngineMode));
- try {
- auto program = factory->MakePushStreamProgram(
- TArrowInputSpec({schema}),
- TArrowOutputSpec(schema),
- R"(SELECT
+ try {
+ auto program = factory->MakePushStreamProgram(
+ TArrowInputSpec({schema}),
+ TArrowOutputSpec(schema),
+ R"(SELECT
uint64 + 1 as uint64,
int64 - 2 as int64,
FROM Input)",
- ETranslationMode::SQL
- );
+ ETranslationMode::SQL);
- arrow::compute::ExecBatch input = MakeBatch(9, 19);
- const auto canonInput = CanonBatches({input});
- TVector<arrow::compute::ExecBatch> output;
+ arrow::compute::ExecBatch input = MakeBatch(9, 19);
+ const auto canonInput = CanonBatches({input});
+ TVector<arrow::compute::ExecBatch> output;
- auto consumer = program->Apply(MakeHolder<ExecBatchConsumerImpl>(output));
+ auto consumer = program->Apply(MakeHolder<ExecBatchConsumerImpl>(output));
- UNIT_ASSERT_NO_EXCEPTION([&](){ consumer->OnObject(&input); }());
- UNIT_ASSERT_NO_EXCEPTION([&](){ consumer->OnFinish(); }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() { consumer->OnObject(&input); }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() { consumer->OnFinish(); }());
- const auto canonOutput = CanonBatches(output);
- const TVector<arrow::compute::ExecBatch> check({MakeBatch(9, 17, 2)});
- const auto canonCheck = CanonBatches(check);
- UNIT_ASSERT_EQUAL(canonCheck, canonOutput);
- } catch (const TCompileError& error) {
- UNIT_FAIL(error.GetIssues());
- }
+ const auto canonOutput = CanonBatches(output);
+ const TVector<arrow::compute::ExecBatch> check({MakeBatch(9, 17, 2)});
+ const auto canonCheck = CanonBatches(check);
+ UNIT_ASSERT_EQUAL(canonCheck, canonOutput);
+ } catch (const TCompileError& error) {
+ UNIT_FAIL(error.GetIssues());
}
}
+} // Y_UNIT_TEST_SUITE(TestMorePushStreamArrowIO)
diff --git a/yql/essentials/public/purecalc/io_specs/arrow/ut/ya.make b/yql/essentials/public/purecalc/io_specs/arrow/ut/ya.make
index ad7eb5881f5..6e50cdd16d1 100644
--- a/yql/essentials/public/purecalc/io_specs/arrow/ut/ya.make
+++ b/yql/essentials/public/purecalc/io_specs/arrow/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST()
+ENABLE(YQL_STYLE_CPP)
+
SIZE(MEDIUM)
TIMEOUT(300)
diff --git a/yql/essentials/public/purecalc/io_specs/arrow/ya.make.inc b/yql/essentials/public/purecalc/io_specs/arrow/ya.make.inc
index 37ff3be849e..ef958d3a24a 100644
--- a/yql/essentials/public/purecalc/io_specs/arrow/ya.make.inc
+++ b/yql/essentials/public/purecalc/io_specs/arrow/ya.make.inc
@@ -1,3 +1,5 @@
+ENABLE(YQL_STYLE_CPP)
+
SRCDIR(
yql/essentials/public/purecalc/io_specs/arrow
)
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf/proto_variant.h b/yql/essentials/public/purecalc/io_specs/protobuf/proto_variant.h
index 0692440ca1c..6f1703f01b6 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf/proto_variant.h
+++ b/yql/essentials/public/purecalc/io_specs/protobuf/proto_variant.h
@@ -5,76 +5,76 @@
#include <array>
namespace NYql::NPureCalc::NPrivate {
- using TProtoRawMultiOutput = std::pair<ui32, google::protobuf::Message*>;
+using TProtoRawMultiOutput = std::pair<ui32, google::protobuf::Message*>;
- template <typename... T>
- using TProtoMultiOutput = std::variant<T*...>;
+template <typename... T>
+using TProtoMultiOutput = std::variant<T*...>;
- template <size_t I, typename... T>
- using TProtoOutput = std::add_pointer_t<typename TTypeList<T...>::template TGet<I>>;
+template <size_t I, typename... T>
+using TProtoOutput = std::add_pointer_t<typename TTypeList<T...>::template TGet<I>>;
- template <size_t I, typename... T>
- TProtoMultiOutput<T...> InitProtobufsVariant(google::protobuf::Message* ptr) {
- static_assert(std::conjunction_v<std::is_base_of<google::protobuf::Message, T>...>);
- return TProtoMultiOutput<T...>(std::in_place_index<I>, static_cast<TProtoOutput<I, T...>>(ptr));
+template <size_t I, typename... T>
+TProtoMultiOutput<T...> InitProtobufsVariant(google::protobuf::Message* ptr) {
+ static_assert(std::conjunction_v<std::is_base_of<google::protobuf::Message, T>...>);
+ return TProtoMultiOutput<T...>(std::in_place_index<I>, static_cast<TProtoOutput<I, T...>>(ptr));
+}
+
+template <typename... T>
+class TProtobufsMappingBase {
+public:
+ TProtobufsMappingBase()
+ : InitFuncs_(BuildInitFuncs(std::make_index_sequence<sizeof...(T)>()))
+ {
}
- template <typename... T>
- class TProtobufsMappingBase {
- public:
- TProtobufsMappingBase()
- : InitFuncs_(BuildInitFuncs(std::make_index_sequence<sizeof...(T)>()))
- {
- }
-
- private:
- typedef TProtoMultiOutput<T...> (*initfunc)(google::protobuf::Message*);
-
- template <size_t... I>
- inline std::array<initfunc, sizeof...(T)> BuildInitFuncs(std::index_sequence<I...>) {
- return {&InitProtobufsVariant<I, T...>...};
- }
-
- protected:
- const std::array<initfunc, sizeof...(T)> InitFuncs_;
- };
-
- template <typename... T>
- class TProtobufsMappingStream: public IStream<TProtoMultiOutput<T...>>, public TProtobufsMappingBase<T...> {
- public:
- TProtobufsMappingStream(THolder<IStream<TProtoRawMultiOutput>> oldStream)
- : OldStream_(std::move(oldStream))
- {
- }
-
- public:
- TProtoMultiOutput<T...> Fetch() override {
- auto&& oldItem = OldStream_->Fetch();
- return this->InitFuncs_[oldItem.first](oldItem.second);
- }
-
- private:
- THolder<IStream<TProtoRawMultiOutput>> OldStream_;
- };
-
- template <typename... T>
- class TProtobufsMappingConsumer: public IConsumer<TProtoRawMultiOutput>, public TProtobufsMappingBase<T...> {
- public:
- TProtobufsMappingConsumer(THolder<IConsumer<TProtoMultiOutput<T...>>> oldConsumer)
- : OldConsumer_(std::move(oldConsumer))
- {
- }
-
- public:
- void OnObject(TProtoRawMultiOutput oldItem) override {
- OldConsumer_->OnObject(this->InitFuncs_[oldItem.first](oldItem.second));
- }
-
- void OnFinish() override {
- OldConsumer_->OnFinish();
- }
-
- private:
- THolder<IConsumer<TProtoMultiOutput<T...>>> OldConsumer_;
- };
-}
+private:
+ typedef TProtoMultiOutput<T...> (*initfunc)(google::protobuf::Message*);
+
+ template <size_t... I>
+ inline std::array<initfunc, sizeof...(T)> BuildInitFuncs(std::index_sequence<I...>) {
+ return {&InitProtobufsVariant<I, T...>...};
+ }
+
+protected:
+ const std::array<initfunc, sizeof...(T)> InitFuncs_;
+};
+
+template <typename... T>
+class TProtobufsMappingStream: public IStream<TProtoMultiOutput<T...>>, public TProtobufsMappingBase<T...> {
+public:
+ TProtobufsMappingStream(THolder<IStream<TProtoRawMultiOutput>> oldStream)
+ : OldStream_(std::move(oldStream))
+ {
+ }
+
+public:
+ TProtoMultiOutput<T...> Fetch() override {
+ auto&& oldItem = OldStream_->Fetch();
+ return this->InitFuncs_[oldItem.first](oldItem.second);
+ }
+
+private:
+ THolder<IStream<TProtoRawMultiOutput>> OldStream_;
+};
+
+template <typename... T>
+class TProtobufsMappingConsumer: public IConsumer<TProtoRawMultiOutput>, public TProtobufsMappingBase<T...> {
+public:
+ TProtobufsMappingConsumer(THolder<IConsumer<TProtoMultiOutput<T...>>> oldConsumer)
+ : OldConsumer_(std::move(oldConsumer))
+ {
+ }
+
+public:
+ void OnObject(TProtoRawMultiOutput oldItem) override {
+ OldConsumer_->OnObject(this->InitFuncs_[oldItem.first](oldItem.second));
+ }
+
+ void OnFinish() override {
+ OldConsumer_->OnFinish();
+ }
+
+private:
+ THolder<IConsumer<TProtoMultiOutput<T...>>> OldConsumer_;
+};
+} // namespace NYql::NPureCalc::NPrivate
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf/spec.h b/yql/essentials/public/purecalc/io_specs/protobuf/spec.h
index 0e1a97f632a..f2e45fc8c74 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf/spec.h
+++ b/yql/essentials/public/purecalc/io_specs/protobuf/spec.h
@@ -5,143 +5,143 @@
#include <yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.h>
namespace NYql {
- namespace NPureCalc {
- /**
- * Processing mode for working with non-raw protobuf messages.
- *
- * @tparam T message type.
- */
- template <typename T>
- class TProtobufInputSpec: public TProtobufRawInputSpec {
- static_assert(std::is_base_of<google::protobuf::Message, T>::value,
- "should be derived from google::protobuf::Message");
- public:
- TProtobufInputSpec(
- const TMaybe<TString>& timestampColumn = Nothing(),
- const TProtoSchemaOptions& options = {}
- )
- : TProtobufRawInputSpec(*T::descriptor(), timestampColumn, options)
- {
- }
- };
-
- /**
- * Processing mode for working with non-raw protobuf messages.
- *
- * @tparam T message type.
- */
- template <typename T>
- class TProtobufOutputSpec: public TProtobufRawOutputSpec {
- static_assert(std::is_base_of<google::protobuf::Message, T>::value,
- "should be derived from google::protobuf::Message");
- public:
- TProtobufOutputSpec(
- const TProtoSchemaOptions& options = {},
- google::protobuf::Arena* arena = nullptr
- )
- : TProtobufRawOutputSpec(*T::descriptor(), nullptr, options, arena)
- {
- }
- };
-
- /**
- * Processing mode for working with non-raw protobuf messages and several outputs.
- */
- template <typename... T>
- class TProtobufMultiOutputSpec: public TProtobufRawMultiOutputSpec {
- static_assert(
- std::conjunction_v<std::is_base_of<google::protobuf::Message, T>...>,
- "all types should be derived from google::protobuf::Message");
- public:
- TProtobufMultiOutputSpec(
- const TProtoSchemaOptions& options = {},
- TMaybe<TVector<google::protobuf::Arena*>> arenas = {}
- )
- : TProtobufRawMultiOutputSpec({T::descriptor()...}, Nothing(), options, std::move(arenas))
- {
- }
- };
-
- template <typename T>
- struct TInputSpecTraits<TProtobufInputSpec<T>> {
- static const constexpr bool IsPartial = false;
-
- static const constexpr bool SupportPullStreamMode = true;
- static const constexpr bool SupportPullListMode = true;
- static const constexpr bool SupportPushStreamMode = true;
-
- using TConsumerType = THolder<IConsumer<T*>>;
-
- static void PreparePullStreamWorker(const TProtobufInputSpec<T>& inputSpec, IPullStreamWorker* worker, THolder<IStream<T*>> stream) {
- auto raw = ConvertStream<google::protobuf::Message*>(std::move(stream));
- TInputSpecTraits<TProtobufRawInputSpec>::PreparePullStreamWorker(inputSpec, worker, std::move(raw));
- }
-
- static void PreparePullListWorker(const TProtobufInputSpec<T>& inputSpec, IPullListWorker* worker, THolder<IStream<T*>> stream) {
- auto raw = ConvertStream<google::protobuf::Message*>(std::move(stream));
- TInputSpecTraits<TProtobufRawInputSpec>::PreparePullListWorker(inputSpec, worker, std::move(raw));
- }
-
- static TConsumerType MakeConsumer(const TProtobufInputSpec<T>& inputSpec, TWorkerHolder<IPushStreamWorker> worker) {
- auto raw = TInputSpecTraits<TProtobufRawInputSpec>::MakeConsumer(inputSpec, std::move(worker));
- return ConvertConsumer<T*>(std::move(raw));
- }
- };
-
- template <typename T>
- struct TOutputSpecTraits<TProtobufOutputSpec<T>> {
- static const constexpr bool IsPartial = false;
-
- static const constexpr bool SupportPullStreamMode = true;
- static const constexpr bool SupportPullListMode = true;
- static const constexpr bool SupportPushStreamMode = true;
-
- using TOutputItemType = T*;
- using TPullStreamReturnType = THolder<IStream<TOutputItemType>>;
- using TPullListReturnType = THolder<IStream<TOutputItemType>>;
-
- static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const TProtobufOutputSpec<T>& outputSpec, TWorkerHolder<IPullStreamWorker> worker) {
- auto raw = TOutputSpecTraits<TProtobufRawOutputSpec>::ConvertPullStreamWorkerToOutputType(outputSpec, std::move(worker));
- return ConvertStreamUnsafe<TOutputItemType>(std::move(raw));
- }
-
- static TPullListReturnType ConvertPullListWorkerToOutputType(const TProtobufOutputSpec<T>& outputSpec, TWorkerHolder<IPullListWorker> worker) {
- auto raw = TOutputSpecTraits<TProtobufRawOutputSpec>::ConvertPullListWorkerToOutputType(outputSpec, std::move(worker));
- return ConvertStreamUnsafe<TOutputItemType>(std::move(raw));
- }
-
- static void SetConsumerToWorker(const TProtobufOutputSpec<T>& outputSpec, IPushStreamWorker* worker, THolder<IConsumer<T*>> consumer) {
- auto raw = ConvertConsumerUnsafe<google::protobuf::Message*>(std::move(consumer));
- TOutputSpecTraits<TProtobufRawOutputSpec>::SetConsumerToWorker(outputSpec, worker, std::move(raw));
- }
- };
-
- template <typename... T>
- struct TOutputSpecTraits<TProtobufMultiOutputSpec<T...>> {
- static const constexpr bool IsPartial = false;
-
- static const constexpr bool SupportPullStreamMode = true;
- static const constexpr bool SupportPullListMode = true;
- static const constexpr bool SupportPushStreamMode = true;
-
- using TOutputItemType = std::variant<T*...>;
- using TPullStreamReturnType = THolder<IStream<TOutputItemType>>;
- using TPullListReturnType = THolder<IStream<TOutputItemType>>;
-
- static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const TProtobufMultiOutputSpec<T...>& outputSpec, TWorkerHolder<IPullStreamWorker> worker) {
- auto raw = TOutputSpecTraits<TProtobufRawMultiOutputSpec>::ConvertPullStreamWorkerToOutputType(outputSpec, std::move(worker));
- return THolder(new NPrivate::TProtobufsMappingStream<T...>(std::move(raw)));
- }
-
- static TPullListReturnType ConvertPullListWorkerToOutputType(const TProtobufMultiOutputSpec<T...>& outputSpec, TWorkerHolder<IPullListWorker> worker) {
- auto raw = TOutputSpecTraits<TProtobufRawMultiOutputSpec>::ConvertPullListWorkerToOutputType(outputSpec, std::move(worker));
- return THolder(new NPrivate::TProtobufsMappingStream<T...>(std::move(raw)));
- }
-
- static void SetConsumerToWorker(const TProtobufMultiOutputSpec<T...>& outputSpec, IPushStreamWorker* worker, THolder<IConsumer<TOutputItemType>> consumer) {
- auto wrapper = MakeHolder<NPrivate::TProtobufsMappingConsumer<T...>>(std::move(consumer));
- TOutputSpecTraits<TProtobufRawMultiOutputSpec>::SetConsumerToWorker(outputSpec, worker, std::move(wrapper));
- }
- };
+namespace NPureCalc {
+/**
+ * Processing mode for working with non-raw protobuf messages.
+ *
+ * @tparam T message type.
+ */
+template <typename T>
+class TProtobufInputSpec: public TProtobufRawInputSpec {
+ static_assert(std::is_base_of<google::protobuf::Message, T>::value,
+ "should be derived from google::protobuf::Message");
+
+public:
+ TProtobufInputSpec(
+ const TMaybe<TString>& timestampColumn = Nothing(),
+ const TProtoSchemaOptions& options = {})
+ : TProtobufRawInputSpec(*T::descriptor(), timestampColumn, options)
+ {
}
-}
+};
+
+/**
+ * Processing mode for working with non-raw protobuf messages.
+ *
+ * @tparam T message type.
+ */
+template <typename T>
+class TProtobufOutputSpec: public TProtobufRawOutputSpec {
+ static_assert(std::is_base_of<google::protobuf::Message, T>::value,
+ "should be derived from google::protobuf::Message");
+
+public:
+ TProtobufOutputSpec(
+ const TProtoSchemaOptions& options = {},
+ google::protobuf::Arena* arena = nullptr)
+ : TProtobufRawOutputSpec(*T::descriptor(), nullptr, options, arena)
+ {
+ }
+};
+
+/**
+ * Processing mode for working with non-raw protobuf messages and several outputs.
+ */
+template <typename... T>
+class TProtobufMultiOutputSpec: public TProtobufRawMultiOutputSpec {
+ static_assert(
+ std::conjunction_v<std::is_base_of<google::protobuf::Message, T>...>,
+ "all types should be derived from google::protobuf::Message");
+
+public:
+ TProtobufMultiOutputSpec(
+ const TProtoSchemaOptions& options = {},
+ TMaybe<TVector<google::protobuf::Arena*>> arenas = {})
+ : TProtobufRawMultiOutputSpec({T::descriptor()...}, Nothing(), options, std::move(arenas))
+ {
+ }
+};
+
+template <typename T>
+struct TInputSpecTraits<TProtobufInputSpec<T>> {
+ static const constexpr bool IsPartial = false;
+
+ static const constexpr bool SupportPullStreamMode = true;
+ static const constexpr bool SupportPullListMode = true;
+ static const constexpr bool SupportPushStreamMode = true;
+
+ using TConsumerType = THolder<IConsumer<T*>>;
+
+ static void PreparePullStreamWorker(const TProtobufInputSpec<T>& inputSpec, IPullStreamWorker* worker, THolder<IStream<T*>> stream) {
+ auto raw = ConvertStream<google::protobuf::Message*>(std::move(stream));
+ TInputSpecTraits<TProtobufRawInputSpec>::PreparePullStreamWorker(inputSpec, worker, std::move(raw));
+ }
+
+ static void PreparePullListWorker(const TProtobufInputSpec<T>& inputSpec, IPullListWorker* worker, THolder<IStream<T*>> stream) {
+ auto raw = ConvertStream<google::protobuf::Message*>(std::move(stream));
+ TInputSpecTraits<TProtobufRawInputSpec>::PreparePullListWorker(inputSpec, worker, std::move(raw));
+ }
+
+ static TConsumerType MakeConsumer(const TProtobufInputSpec<T>& inputSpec, TWorkerHolder<IPushStreamWorker> worker) {
+ auto raw = TInputSpecTraits<TProtobufRawInputSpec>::MakeConsumer(inputSpec, std::move(worker));
+ return ConvertConsumer<T*>(std::move(raw));
+ }
+};
+
+template <typename T>
+struct TOutputSpecTraits<TProtobufOutputSpec<T>> {
+ static const constexpr bool IsPartial = false;
+
+ static const constexpr bool SupportPullStreamMode = true;
+ static const constexpr bool SupportPullListMode = true;
+ static const constexpr bool SupportPushStreamMode = true;
+
+ using TOutputItemType = T*;
+ using TPullStreamReturnType = THolder<IStream<TOutputItemType>>;
+ using TPullListReturnType = THolder<IStream<TOutputItemType>>;
+
+ static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const TProtobufOutputSpec<T>& outputSpec, TWorkerHolder<IPullStreamWorker> worker) {
+ auto raw = TOutputSpecTraits<TProtobufRawOutputSpec>::ConvertPullStreamWorkerToOutputType(outputSpec, std::move(worker));
+ return ConvertStreamUnsafe<TOutputItemType>(std::move(raw));
+ }
+
+ static TPullListReturnType ConvertPullListWorkerToOutputType(const TProtobufOutputSpec<T>& outputSpec, TWorkerHolder<IPullListWorker> worker) {
+ auto raw = TOutputSpecTraits<TProtobufRawOutputSpec>::ConvertPullListWorkerToOutputType(outputSpec, std::move(worker));
+ return ConvertStreamUnsafe<TOutputItemType>(std::move(raw));
+ }
+
+ static void SetConsumerToWorker(const TProtobufOutputSpec<T>& outputSpec, IPushStreamWorker* worker, THolder<IConsumer<T*>> consumer) {
+ auto raw = ConvertConsumerUnsafe<google::protobuf::Message*>(std::move(consumer));
+ TOutputSpecTraits<TProtobufRawOutputSpec>::SetConsumerToWorker(outputSpec, worker, std::move(raw));
+ }
+};
+
+template <typename... T>
+struct TOutputSpecTraits<TProtobufMultiOutputSpec<T...>> {
+ static const constexpr bool IsPartial = false;
+
+ static const constexpr bool SupportPullStreamMode = true;
+ static const constexpr bool SupportPullListMode = true;
+ static const constexpr bool SupportPushStreamMode = true;
+
+ using TOutputItemType = std::variant<T*...>;
+ using TPullStreamReturnType = THolder<IStream<TOutputItemType>>;
+ using TPullListReturnType = THolder<IStream<TOutputItemType>>;
+
+ static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const TProtobufMultiOutputSpec<T...>& outputSpec, TWorkerHolder<IPullStreamWorker> worker) {
+ auto raw = TOutputSpecTraits<TProtobufRawMultiOutputSpec>::ConvertPullStreamWorkerToOutputType(outputSpec, std::move(worker));
+ return THolder(new NPrivate::TProtobufsMappingStream<T...>(std::move(raw)));
+ }
+
+ static TPullListReturnType ConvertPullListWorkerToOutputType(const TProtobufMultiOutputSpec<T...>& outputSpec, TWorkerHolder<IPullListWorker> worker) {
+ auto raw = TOutputSpecTraits<TProtobufRawMultiOutputSpec>::ConvertPullListWorkerToOutputType(outputSpec, std::move(worker));
+ return THolder(new NPrivate::TProtobufsMappingStream<T...>(std::move(raw)));
+ }
+
+ static void SetConsumerToWorker(const TProtobufMultiOutputSpec<T...>& outputSpec, IPushStreamWorker* worker, THolder<IConsumer<TOutputItemType>> consumer) {
+ auto wrapper = MakeHolder<NPrivate::TProtobufsMappingConsumer<T...>>(std::move(consumer));
+ TOutputSpecTraits<TProtobufRawMultiOutputSpec>::SetConsumerToWorker(outputSpec, worker, std::move(wrapper));
+ }
+};
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf/ut/test_spec.cpp b/yql/essentials/public/purecalc/io_specs/protobuf/ut/test_spec.cpp
index 5d479d2ef2c..981b8403754 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf/ut/test_spec.cpp
+++ b/yql/essentials/public/purecalc/io_specs/protobuf/ut/test_spec.cpp
@@ -7,71 +7,71 @@
#include <util/generic/xrange.h>
namespace {
- TMaybe<NPureCalcProto::TAllTypes> allTypesMessage;
-
- NPureCalcProto::TAllTypes& GetCanonicalMessage() {
- if (!allTypesMessage) {
- allTypesMessage = NPureCalcProto::TAllTypes();
-
- allTypesMessage->SetFDouble(1);
- allTypesMessage->SetFFloat(2);
- allTypesMessage->SetFInt64(3);
- allTypesMessage->SetFSfixed64(4);
- allTypesMessage->SetFSint64(5);
- allTypesMessage->SetFUint64(6);
- allTypesMessage->SetFFixed64(7);
- allTypesMessage->SetFInt32(8);
- allTypesMessage->SetFSfixed32(9);
- allTypesMessage->SetFSint32(10);
- allTypesMessage->SetFUint32(11);
- allTypesMessage->SetFFixed32(12);
- allTypesMessage->SetFBool(true);
- allTypesMessage->SetFString("asd");
- allTypesMessage->SetFBytes("dsa");
- }
-
- return allTypesMessage.GetRef();
+TMaybe<NPureCalcProto::TAllTypes> allTypesMessage;
+
+NPureCalcProto::TAllTypes& GetCanonicalMessage() {
+ if (!allTypesMessage) {
+ allTypesMessage = NPureCalcProto::TAllTypes();
+
+ allTypesMessage->SetFDouble(1);
+ allTypesMessage->SetFFloat(2);
+ allTypesMessage->SetFInt64(3);
+ allTypesMessage->SetFSfixed64(4);
+ allTypesMessage->SetFSint64(5);
+ allTypesMessage->SetFUint64(6);
+ allTypesMessage->SetFFixed64(7);
+ allTypesMessage->SetFInt32(8);
+ allTypesMessage->SetFSfixed32(9);
+ allTypesMessage->SetFSint32(10);
+ allTypesMessage->SetFUint32(11);
+ allTypesMessage->SetFFixed32(12);
+ allTypesMessage->SetFBool(true);
+ allTypesMessage->SetFString("asd");
+ allTypesMessage->SetFBytes("dsa");
}
- template <typename T1, typename T2>
- void AssertEqualToCanonical(const T1& got, const T2& expected) {
- UNIT_ASSERT_EQUAL(expected.GetFDouble(), got.GetFDouble());
- UNIT_ASSERT_EQUAL(expected.GetFFloat(), got.GetFFloat());
- UNIT_ASSERT_EQUAL(expected.GetFInt64(), got.GetFInt64());
- UNIT_ASSERT_EQUAL(expected.GetFSfixed64(), got.GetFSfixed64());
- UNIT_ASSERT_EQUAL(expected.GetFSint64(), got.GetFSint64());
- UNIT_ASSERT_EQUAL(expected.GetFUint64(), got.GetFUint64());
- UNIT_ASSERT_EQUAL(expected.GetFFixed64(), got.GetFFixed64());
- UNIT_ASSERT_EQUAL(expected.GetFInt32(), got.GetFInt32());
- UNIT_ASSERT_EQUAL(expected.GetFSfixed32(), got.GetFSfixed32());
- UNIT_ASSERT_EQUAL(expected.GetFSint32(), got.GetFSint32());
- UNIT_ASSERT_EQUAL(expected.GetFUint32(), got.GetFUint32());
- UNIT_ASSERT_EQUAL(expected.GetFFixed32(), got.GetFFixed32());
- UNIT_ASSERT_EQUAL(expected.GetFBool(), got.GetFBool());
- UNIT_ASSERT_EQUAL(expected.GetFString(), got.GetFString());
- UNIT_ASSERT_EQUAL(expected.GetFBytes(), got.GetFBytes());
- }
+ return allTypesMessage.GetRef();
+}
- template <typename T>
- void AssertEqualToCanonical(const T& got) {
- AssertEqualToCanonical(got, GetCanonicalMessage());
- }
+template <typename T1, typename T2>
+void AssertEqualToCanonical(const T1& got, const T2& expected) {
+ UNIT_ASSERT_EQUAL(expected.GetFDouble(), got.GetFDouble());
+ UNIT_ASSERT_EQUAL(expected.GetFFloat(), got.GetFFloat());
+ UNIT_ASSERT_EQUAL(expected.GetFInt64(), got.GetFInt64());
+ UNIT_ASSERT_EQUAL(expected.GetFSfixed64(), got.GetFSfixed64());
+ UNIT_ASSERT_EQUAL(expected.GetFSint64(), got.GetFSint64());
+ UNIT_ASSERT_EQUAL(expected.GetFUint64(), got.GetFUint64());
+ UNIT_ASSERT_EQUAL(expected.GetFFixed64(), got.GetFFixed64());
+ UNIT_ASSERT_EQUAL(expected.GetFInt32(), got.GetFInt32());
+ UNIT_ASSERT_EQUAL(expected.GetFSfixed32(), got.GetFSfixed32());
+ UNIT_ASSERT_EQUAL(expected.GetFSint32(), got.GetFSint32());
+ UNIT_ASSERT_EQUAL(expected.GetFUint32(), got.GetFUint32());
+ UNIT_ASSERT_EQUAL(expected.GetFFixed32(), got.GetFFixed32());
+ UNIT_ASSERT_EQUAL(expected.GetFBool(), got.GetFBool());
+ UNIT_ASSERT_EQUAL(expected.GetFString(), got.GetFString());
+ UNIT_ASSERT_EQUAL(expected.GetFBytes(), got.GetFBytes());
+}
- TString SerializeToTextFormatAsString(const google::protobuf::Message& message) {
- TString result;
- {
- TStringOutput output(result);
- SerializeToTextFormat(message, output);
- }
- return result;
- }
+template <typename T>
+void AssertEqualToCanonical(const T& got) {
+ AssertEqualToCanonical(got, GetCanonicalMessage());
+}
- template <typename T>
- void AssertProtoEqual(const T& actual, const T& expected) {
- UNIT_ASSERT_VALUES_EQUAL(SerializeToTextFormatAsString(actual), SerializeToTextFormatAsString(expected));
+TString SerializeToTextFormatAsString(const google::protobuf::Message& message) {
+ TString result;
+ {
+ TStringOutput output(result);
+ SerializeToTextFormat(message, output);
}
+ return result;
}
+template <typename T>
+void AssertProtoEqual(const T& actual, const T& expected) {
+ UNIT_ASSERT_VALUES_EQUAL(SerializeToTextFormatAsString(actual), SerializeToTextFormatAsString(expected));
+}
+} // namespace
+
class TAllTypesStreamImpl: public NYql::NPureCalc::IStream<NPureCalcProto::TAllTypes*> {
private:
int I_ = 0;
@@ -256,7 +256,7 @@ private:
ui32 I_ = 0;
};
-template<typename T>
+template <typename T>
struct TVectorConsumer: public NYql::NPureCalc::IConsumer<T*> {
TVector<T> Data;
@@ -280,494 +280,476 @@ public:
};
Y_UNIT_TEST_SUITE(TestProtoIO) {
- Y_UNIT_TEST(TestAllTypes) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestAllTypes) {
+ using namespace NYql::NPureCalc;
- auto factory = MakeProgramFactory();
+ auto factory = MakeProgramFactory();
- {
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
- TProtobufOutputSpec<NPureCalcProto::TAllTypes>(),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
+ {
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
+ TProtobufOutputSpec<NPureCalcProto::TAllTypes>(),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
- auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
+ auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
- NPureCalcProto::TAllTypes* message;
+ NPureCalcProto::TAllTypes* message;
- UNIT_ASSERT(message = stream->Fetch());
- AssertEqualToCanonical(*message);
- UNIT_ASSERT(!stream->Fetch());
- }
+ UNIT_ASSERT(message = stream->Fetch());
+ AssertEqualToCanonical(*message);
+ UNIT_ASSERT(!stream->Fetch());
+ }
- {
- auto program = factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
- TProtobufOutputSpec<NPureCalcProto::TAllTypes>(),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
+ {
+ auto program = factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
+ TProtobufOutputSpec<NPureCalcProto::TAllTypes>(),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
- auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
+ auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
- NPureCalcProto::TAllTypes* message;
+ NPureCalcProto::TAllTypes* message;
- UNIT_ASSERT(message = stream->Fetch());
- AssertEqualToCanonical(*message);
- UNIT_ASSERT(!stream->Fetch());
- }
+ UNIT_ASSERT(message = stream->Fetch());
+ AssertEqualToCanonical(*message);
+ UNIT_ASSERT(!stream->Fetch());
+ }
- {
- auto program = factory->MakePushStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
- TProtobufOutputSpec<NPureCalcProto::TAllTypes>(),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
+ {
+ auto program = factory->MakePushStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
+ TProtobufOutputSpec<NPureCalcProto::TAllTypes>(),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
- auto consumer = program->Apply(MakeHolder<TAllTypesConsumerImpl>());
+ auto consumer = program->Apply(MakeHolder<TAllTypesConsumerImpl>());
- UNIT_ASSERT_NO_EXCEPTION([&](){ consumer->OnObject(&GetCanonicalMessage()); }());
- UNIT_ASSERT_NO_EXCEPTION([&](){ consumer->OnFinish(); }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() { consumer->OnObject(&GetCanonicalMessage()); }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() { consumer->OnFinish(); }());
}
+}
- template <typename T>
- void CheckPassThroughYql(T& testInput, google::protobuf::Arena* arena = nullptr) {
- using namespace NYql::NPureCalc;
+template <typename T>
+void CheckPassThroughYql(T& testInput, google::protobuf::Arena* arena = nullptr) {
+ using namespace NYql::NPureCalc;
- auto resetArena = [arena]() {
- if (arena != nullptr) {
- arena->Reset();
- }
- };
+ auto resetArena = [arena]() {
+ if (arena != nullptr) {
+ arena->Reset();
+ }
+ };
- auto factory = MakeProgramFactory();
+ auto factory = MakeProgramFactory();
- {
- auto program = factory->MakePushStreamProgram(
- TProtobufInputSpec<T>(),
- TProtobufOutputSpec<T>({}, arena),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
-
- auto resultConsumer = MakeHolder<TVectorConsumer<T>>();
- auto* resultConsumerPtr = resultConsumer.Get();
- auto sourceConsumer = program->Apply(std::move(resultConsumer));
-
- sourceConsumer->OnObject(&testInput);
- UNIT_ASSERT_VALUES_EQUAL(1, resultConsumerPtr->Data.size());
- AssertProtoEqual(resultConsumerPtr->Data[0], testInput);
-
- resultConsumerPtr->Data.clear();
- sourceConsumer->OnObject(&testInput);
- UNIT_ASSERT_VALUES_EQUAL(1, resultConsumerPtr->Data.size());
- AssertProtoEqual(resultConsumerPtr->Data[0], testInput);
- }
- resetArena();
+ {
+ auto program = factory->MakePushStreamProgram(
+ TProtobufInputSpec<T>(),
+ TProtobufOutputSpec<T>({}, arena),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
+
+ auto resultConsumer = MakeHolder<TVectorConsumer<T>>();
+ auto* resultConsumerPtr = resultConsumer.Get();
+ auto sourceConsumer = program->Apply(std::move(resultConsumer));
+
+ sourceConsumer->OnObject(&testInput);
+ UNIT_ASSERT_VALUES_EQUAL(1, resultConsumerPtr->Data.size());
+ AssertProtoEqual(resultConsumerPtr->Data[0], testInput);
+
+ resultConsumerPtr->Data.clear();
+ sourceConsumer->OnObject(&testInput);
+ UNIT_ASSERT_VALUES_EQUAL(1, resultConsumerPtr->Data.size());
+ AssertProtoEqual(resultConsumerPtr->Data[0], testInput);
+ }
+ resetArena();
- {
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<T>(),
- TProtobufOutputSpec<T>({}, arena),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
-
- auto sourceStream = MakeHolder<TVectorStream<T>>();
- auto* sourceStreamPtr = sourceStream.Get();
- auto resultStream = program->Apply(std::move(sourceStream));
-
- sourceStreamPtr->Data.push_back(testInput);
- T* resultMessage;
- UNIT_ASSERT(resultMessage = resultStream->Fetch());
- AssertProtoEqual(*resultMessage, testInput);
- UNIT_ASSERT(!resultStream->Fetch());
-
- UNIT_ASSERT_VALUES_EQUAL(resultMessage->GetArena(), arena);
- }
- resetArena();
+ {
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<T>(),
+ TProtobufOutputSpec<T>({}, arena),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
+
+ auto sourceStream = MakeHolder<TVectorStream<T>>();
+ auto* sourceStreamPtr = sourceStream.Get();
+ auto resultStream = program->Apply(std::move(sourceStream));
+
+ sourceStreamPtr->Data.push_back(testInput);
+ T* resultMessage;
+ UNIT_ASSERT(resultMessage = resultStream->Fetch());
+ AssertProtoEqual(*resultMessage, testInput);
+ UNIT_ASSERT(!resultStream->Fetch());
+
+ UNIT_ASSERT_VALUES_EQUAL(resultMessage->GetArena(), arena);
+ }
+ resetArena();
- {
- auto program = factory->MakePullListProgram(
- TProtobufInputSpec<T>(),
- TProtobufOutputSpec<T>({}, arena),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
-
- auto sourceStream = MakeHolder<TVectorStream<T>>();
- auto* sourceStreamPtr = sourceStream.Get();
- auto resultStream = program->Apply(std::move(sourceStream));
-
- sourceStreamPtr->Data.push_back(testInput);
- T* resultMessage;
- UNIT_ASSERT(resultMessage = resultStream->Fetch());
- AssertProtoEqual(*resultMessage, testInput);
- UNIT_ASSERT(!resultStream->Fetch());
-
- UNIT_ASSERT_VALUES_EQUAL(resultMessage->GetArena(), arena);
- }
- resetArena();
+ {
+ auto program = factory->MakePullListProgram(
+ TProtobufInputSpec<T>(),
+ TProtobufOutputSpec<T>({}, arena),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
+
+ auto sourceStream = MakeHolder<TVectorStream<T>>();
+ auto* sourceStreamPtr = sourceStream.Get();
+ auto resultStream = program->Apply(std::move(sourceStream));
+
+ sourceStreamPtr->Data.push_back(testInput);
+ T* resultMessage;
+ UNIT_ASSERT(resultMessage = resultStream->Fetch());
+ AssertProtoEqual(*resultMessage, testInput);
+ UNIT_ASSERT(!resultStream->Fetch());
+
+ UNIT_ASSERT_VALUES_EQUAL(resultMessage->GetArena(), arena);
}
+ resetArena();
+}
- template <typename T>
- void CheckMessageIsInvalid(const TString& expectedExceptionMessage) {
- using namespace NYql::NPureCalc;
+template <typename T>
+void CheckMessageIsInvalid(const TString& expectedExceptionMessage) {
+ using namespace NYql::NPureCalc;
- auto factory = MakeProgramFactory();
+ auto factory = MakeProgramFactory();
- UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
- factory->MakePushStreamProgram(TProtobufInputSpec<T>(), TProtobufOutputSpec<T>(), "SELECT * FROM Input", ETranslationMode::SQL);
- }(), yexception, expectedExceptionMessage);
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePushStreamProgram(TProtobufInputSpec<T>(), TProtobufOutputSpec<T>(), "SELECT * FROM Input", ETranslationMode::SQL);
+ }(), yexception, expectedExceptionMessage);
- UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
- factory->MakePullStreamProgram(TProtobufInputSpec<T>(), TProtobufOutputSpec<T>(), "SELECT * FROM Input", ETranslationMode::SQL);
- }(), yexception, expectedExceptionMessage);
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(TProtobufInputSpec<T>(), TProtobufOutputSpec<T>(), "SELECT * FROM Input", ETranslationMode::SQL);
+ }(), yexception, expectedExceptionMessage);
- UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
- factory->MakePullListProgram(TProtobufInputSpec<T>(), TProtobufOutputSpec<T>(), "SELECT * FROM Input", ETranslationMode::SQL);
- }(), yexception, expectedExceptionMessage);
- }
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullListProgram(TProtobufInputSpec<T>(), TProtobufOutputSpec<T>(), "SELECT * FROM Input", ETranslationMode::SQL);
+ }(), yexception, expectedExceptionMessage);
+}
- Y_UNIT_TEST(TestSimpleNested) {
- NPureCalcProto::TSimpleNested input;
- input.SetX(10);
- {
- auto* item = input.MutableY();
- *item = GetCanonicalMessage();
- item->SetFUint64(100);
- }
- CheckPassThroughYql(input);
+Y_UNIT_TEST(TestSimpleNested) {
+ NPureCalcProto::TSimpleNested input;
+ input.SetX(10);
+ {
+ auto* item = input.MutableY();
+ *item = GetCanonicalMessage();
+ item->SetFUint64(100);
}
+ CheckPassThroughYql(input);
+}
- Y_UNIT_TEST(TestOptionalNested) {
- NPureCalcProto::TOptionalNested input;
- {
- auto* item = input.MutableX();
- *item = GetCanonicalMessage();
- item->SetFUint64(100);
- }
- CheckPassThroughYql(input);
+Y_UNIT_TEST(TestOptionalNested) {
+ NPureCalcProto::TOptionalNested input;
+ {
+ auto* item = input.MutableX();
+ *item = GetCanonicalMessage();
+ item->SetFUint64(100);
}
+ CheckPassThroughYql(input);
+}
- Y_UNIT_TEST(TestSimpleRepeated) {
- NPureCalcProto::TSimpleRepeated input;
- input.SetX(20);
- input.AddY(100);
- input.AddY(200);
- input.AddY(300);
- CheckPassThroughYql(input);
- }
+Y_UNIT_TEST(TestSimpleRepeated) {
+ NPureCalcProto::TSimpleRepeated input;
+ input.SetX(20);
+ input.AddY(100);
+ input.AddY(200);
+ input.AddY(300);
+ CheckPassThroughYql(input);
+}
- Y_UNIT_TEST(TestNestedRepeated) {
- NPureCalcProto::TNestedRepeated input;
- input.SetX(20);
+Y_UNIT_TEST(TestNestedRepeated) {
+ NPureCalcProto::TNestedRepeated input;
+ input.SetX(20);
+ {
+ auto* item = input.MutableY()->Add();
+ item->SetX(100);
{
- auto* item = input.MutableY()->Add();
- item->SetX(100);
- {
- auto* y = item->MutableY();
- *y = GetCanonicalMessage();
- y->SetFUint64(1000);
- }
+ auto* y = item->MutableY();
+ *y = GetCanonicalMessage();
+ y->SetFUint64(1000);
}
+ }
+ {
+ auto* item = input.MutableY()->Add();
+ item->SetX(200);
{
- auto* item = input.MutableY()->Add();
- item->SetX(200);
- {
- auto* y = item->MutableY();
- *y = GetCanonicalMessage();
- y->SetFUint64(2000);
- }
+ auto* y = item->MutableY();
+ *y = GetCanonicalMessage();
+ y->SetFUint64(2000);
}
- CheckPassThroughYql(input);
}
+ CheckPassThroughYql(input);
+}
- Y_UNIT_TEST(TestMessageWithEnum) {
- NPureCalcProto::TMessageWithEnum input;
- input.AddEnumValue(NPureCalcProto::TMessageWithEnum::VALUE1);
- input.AddEnumValue(NPureCalcProto::TMessageWithEnum::VALUE2);
- CheckPassThroughYql(input);
- }
+Y_UNIT_TEST(TestMessageWithEnum) {
+ NPureCalcProto::TMessageWithEnum input;
+ input.AddEnumValue(NPureCalcProto::TMessageWithEnum::VALUE1);
+ input.AddEnumValue(NPureCalcProto::TMessageWithEnum::VALUE2);
+ CheckPassThroughYql(input);
+}
- Y_UNIT_TEST(TestRecursive) {
- CheckMessageIsInvalid<NPureCalcProto::TRecursive>("NPureCalcProto.TRecursive->NPureCalcProto.TRecursive");
- }
+Y_UNIT_TEST(TestRecursive) {
+ CheckMessageIsInvalid<NPureCalcProto::TRecursive>("NPureCalcProto.TRecursive->NPureCalcProto.TRecursive");
+}
- Y_UNIT_TEST(TestRecursiveIndirectly) {
- CheckMessageIsInvalid<NPureCalcProto::TRecursiveIndirectly>(
- "NPureCalcProto.TRecursiveIndirectly->NPureCalcProto.TRecursiveIndirectly.TNested->NPureCalcProto.TRecursiveIndirectly");
- }
+Y_UNIT_TEST(TestRecursiveIndirectly) {
+ CheckMessageIsInvalid<NPureCalcProto::TRecursiveIndirectly>(
+ "NPureCalcProto.TRecursiveIndirectly->NPureCalcProto.TRecursiveIndirectly.TNested->NPureCalcProto.TRecursiveIndirectly");
+}
- Y_UNIT_TEST(TestColumnsFilter) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestColumnsFilter) {
+ using namespace NYql::NPureCalc;
- auto factory = MakeProgramFactory();
+ auto factory = MakeProgramFactory();
- auto filter = THashSet<TString>({"FFixed64", "FBool", "FBytes"});
+ auto filter = THashSet<TString>({"FFixed64", "FBool", "FBytes"});
- NPureCalcProto::TOptionalAllTypes canonicalMessage;
- canonicalMessage.SetFFixed64(GetCanonicalMessage().GetFFixed64());
- canonicalMessage.SetFBool(GetCanonicalMessage().GetFBool());
- canonicalMessage.SetFBytes(GetCanonicalMessage().GetFBytes());
+ NPureCalcProto::TOptionalAllTypes canonicalMessage;
+ canonicalMessage.SetFFixed64(GetCanonicalMessage().GetFFixed64());
+ canonicalMessage.SetFBool(GetCanonicalMessage().GetFBool());
+ canonicalMessage.SetFBytes(GetCanonicalMessage().GetFBytes());
- {
- auto inputSpec = TProtobufInputSpec<NPureCalcProto::TAllTypes>();
- auto outputSpec = TProtobufOutputSpec<NPureCalcProto::TOptionalAllTypes>();
- outputSpec.SetOutputColumnsFilter(filter);
+ {
+ auto inputSpec = TProtobufInputSpec<NPureCalcProto::TAllTypes>();
+ auto outputSpec = TProtobufOutputSpec<NPureCalcProto::TOptionalAllTypes>();
+ outputSpec.SetOutputColumnsFilter(filter);
- auto program = factory->MakePullStreamProgram(
- inputSpec,
- outputSpec,
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
+ auto program = factory->MakePullStreamProgram(
+ inputSpec,
+ outputSpec,
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
- UNIT_ASSERT_EQUAL(program->GetUsedColumns(), filter);
+ UNIT_ASSERT_EQUAL(program->GetUsedColumns(), filter);
- auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
+ auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
- NPureCalcProto::TOptionalAllTypes* message;
+ NPureCalcProto::TOptionalAllTypes* message;
- UNIT_ASSERT(message = stream->Fetch());
- AssertEqualToCanonical(*message, canonicalMessage);
- UNIT_ASSERT(!stream->Fetch());
- }
+ UNIT_ASSERT(message = stream->Fetch());
+ AssertEqualToCanonical(*message, canonicalMessage);
+ UNIT_ASSERT(!stream->Fetch());
}
+}
- Y_UNIT_TEST(TestColumnsFilterWithOptionalFields) {
- using namespace NYql::NPureCalc;
-
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestColumnsFilterWithOptionalFields) {
+ using namespace NYql::NPureCalc;
- auto fields = THashSet<TString>({"FFixed64", "FBool", "FBytes"});
+ auto factory = MakeProgramFactory();
- NPureCalcProto::TOptionalAllTypes canonicalMessage;
- canonicalMessage.SetFFixed64(GetCanonicalMessage().GetFFixed64());
- canonicalMessage.SetFBool(GetCanonicalMessage().GetFBool());
- canonicalMessage.SetFBytes(GetCanonicalMessage().GetFBytes());
+ auto fields = THashSet<TString>({"FFixed64", "FBool", "FBytes"});
- {
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
- TProtobufOutputSpec<NPureCalcProto::TOptionalAllTypes>(),
- "SELECT FFixed64, FBool, FBytes FROM Input",
- ETranslationMode::SQL
- );
+ NPureCalcProto::TOptionalAllTypes canonicalMessage;
+ canonicalMessage.SetFFixed64(GetCanonicalMessage().GetFFixed64());
+ canonicalMessage.SetFBool(GetCanonicalMessage().GetFBool());
+ canonicalMessage.SetFBytes(GetCanonicalMessage().GetFBytes());
- UNIT_ASSERT_EQUAL(program->GetUsedColumns(), fields);
+ {
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
+ TProtobufOutputSpec<NPureCalcProto::TOptionalAllTypes>(),
+ "SELECT FFixed64, FBool, FBytes FROM Input",
+ ETranslationMode::SQL);
- auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
+ UNIT_ASSERT_EQUAL(program->GetUsedColumns(), fields);
- NPureCalcProto::TOptionalAllTypes* message;
+ auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
- UNIT_ASSERT(message = stream->Fetch());
- AssertEqualToCanonical(*message, canonicalMessage);
- UNIT_ASSERT(!stream->Fetch());
- }
+ NPureCalcProto::TOptionalAllTypes* message;
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
- TProtobufOutputSpec<NPureCalcProto::TAllTypes>(),
- "SELECT FFixed64, FBool, FBytes FROM Input",
- ETranslationMode::SQL
- );
- }(), TCompileError, "Failed to optimize");
+ UNIT_ASSERT(message = stream->Fetch());
+ AssertEqualToCanonical(*message, canonicalMessage);
+ UNIT_ASSERT(!stream->Fetch());
}
- Y_UNIT_TEST(TestUsedColumns) {
- using namespace NYql::NPureCalc;
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
+ TProtobufOutputSpec<NPureCalcProto::TAllTypes>(),
+ "SELECT FFixed64, FBool, FBytes FROM Input",
+ ETranslationMode::SQL);
+ }(), TCompileError, "Failed to optimize");
+}
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestUsedColumns) {
+ using namespace NYql::NPureCalc;
- auto allFields = THashSet<TString>();
+ auto factory = MakeProgramFactory();
- for (auto i: xrange(NPureCalcProto::TOptionalAllTypes::descriptor()->field_count())) {
- allFields.emplace(NPureCalcProto::TOptionalAllTypes::descriptor()->field(i)->name());
- }
+ auto allFields = THashSet<TString>();
- {
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
- TProtobufOutputSpec<NPureCalcProto::TOptionalAllTypes>(),
- "SELECT * FROM Input",
- ETranslationMode::SQL
- );
-
- UNIT_ASSERT_EQUAL(program->GetUsedColumns(), allFields);
- }
+ for (auto i : xrange(NPureCalcProto::TOptionalAllTypes::descriptor()->field_count())) {
+ allFields.emplace(NPureCalcProto::TOptionalAllTypes::descriptor()->field(i)->name());
}
- Y_UNIT_TEST(TestChaining) {
- using namespace NYql::NPureCalc;
+ {
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TAllTypes>(),
+ TProtobufOutputSpec<NPureCalcProto::TOptionalAllTypes>(),
+ "SELECT * FROM Input",
+ ETranslationMode::SQL);
- auto factory = MakeProgramFactory();
+ UNIT_ASSERT_EQUAL(program->GetUsedColumns(), allFields);
+ }
+}
- TString sql1 = "SELECT UNWRAP(X || CAST(\"HI\" AS Utf8)) AS X FROM Input";
- TString sql2 = "SELECT LENGTH(X) AS X FROM Input";
+Y_UNIT_TEST(TestChaining) {
+ using namespace NYql::NPureCalc;
- {
- auto program1 = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- sql1,
- ETranslationMode::SQL
- );
-
- auto program2 = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TSimpleMessage>(),
- sql2,
- ETranslationMode::SQL
- );
-
- auto input = MakeHolder<TStringMessageStreamImpl>();
- auto intermediate = program1->Apply(std::move(input));
- auto output = program2->Apply(std::move(intermediate));
-
- TVector<int> expected = {2, 3, 4};
- TVector<int> actual{};
-
- while (auto *x = output->Fetch()) {
- actual.push_back(x->GetX());
- }
+ auto factory = MakeProgramFactory();
+
+ TString sql1 = "SELECT UNWRAP(X || CAST(\"HI\" AS Utf8)) AS X FROM Input";
+ TString sql2 = "SELECT LENGTH(X) AS X FROM Input";
- UNIT_ASSERT_EQUAL(expected, actual);
+ {
+ auto program1 = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ sql1,
+ ETranslationMode::SQL);
+
+ auto program2 = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TSimpleMessage>(),
+ sql2,
+ ETranslationMode::SQL);
+
+ auto input = MakeHolder<TStringMessageStreamImpl>();
+ auto intermediate = program1->Apply(std::move(input));
+ auto output = program2->Apply(std::move(intermediate));
+
+ TVector<int> expected = {2, 3, 4};
+ TVector<int> actual{};
+
+ while (auto* x = output->Fetch()) {
+ actual.push_back(x->GetX());
}
- {
- auto program1 = factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- sql1,
- ETranslationMode::SQL
- );
-
- auto program2 = factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TSimpleMessage>(),
- sql2,
- ETranslationMode::SQL
- );
-
- auto input = MakeHolder<TStringMessageStreamImpl>();
- auto intermediate = program1->Apply(std::move(input));
- auto output = program2->Apply(std::move(intermediate));
-
- TVector<int> expected = {2, 3, 4};
- TVector<int> actual{};
-
- while (auto *x = output->Fetch()) {
- actual.push_back(x->GetX());
- }
+ UNIT_ASSERT_EQUAL(expected, actual);
+ }
- UNIT_ASSERT_EQUAL(expected, actual);
+ {
+ auto program1 = factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ sql1,
+ ETranslationMode::SQL);
+
+ auto program2 = factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TSimpleMessage>(),
+ sql2,
+ ETranslationMode::SQL);
+
+ auto input = MakeHolder<TStringMessageStreamImpl>();
+ auto intermediate = program1->Apply(std::move(input));
+ auto output = program2->Apply(std::move(intermediate));
+
+ TVector<int> expected = {2, 3, 4};
+ TVector<int> actual{};
+
+ while (auto* x = output->Fetch()) {
+ actual.push_back(x->GetX());
}
- {
- auto program1 = factory->MakePushStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- sql1,
- ETranslationMode::SQL
- );
+ UNIT_ASSERT_EQUAL(expected, actual);
+ }
+
+ {
+ auto program1 = factory->MakePushStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ sql1,
+ ETranslationMode::SQL);
- auto program2 = factory->MakePushStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TSimpleMessage>(),
- sql2,
- ETranslationMode::SQL
- );
+ auto program2 = factory->MakePushStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TSimpleMessage>(),
+ sql2,
+ ETranslationMode::SQL);
- TVector<int> expected = {2, 3, 4, -100};
- TVector<int> actual{};
+ TVector<int> expected = {2, 3, 4, -100};
+ TVector<int> actual{};
- auto consumer = MakeHolder<TSimpleMessageConsumerImpl>(&actual);
- auto intermediate = program2->Apply(std::move(consumer));
- auto input = program1->Apply(std::move(intermediate));
+ auto consumer = MakeHolder<TSimpleMessageConsumerImpl>(&actual);
+ auto intermediate = program2->Apply(std::move(consumer));
+ auto input = program1->Apply(std::move(intermediate));
- NPureCalcProto::TStringMessage Message;
+ NPureCalcProto::TStringMessage Message;
- Message.SetX("");
- input->OnObject(&Message);
+ Message.SetX("");
+ input->OnObject(&Message);
- Message.SetX("1");
- input->OnObject(&Message);
+ Message.SetX("1");
+ input->OnObject(&Message);
- Message.SetX("22");
- input->OnObject(&Message);
+ Message.SetX("22");
+ input->OnObject(&Message);
- input->OnFinish();
+ input->OnFinish();
- UNIT_ASSERT_EQUAL(expected, actual);
- }
+ UNIT_ASSERT_EQUAL(expected, actual);
}
+}
- Y_UNIT_TEST(TestTimestampColumn) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestTimestampColumn) {
+ using namespace NYql::NPureCalc;
- auto factory = MakeProgramFactory(TProgramFactoryOptions()
- .SetDeterministicTimeProviderSeed(1)); // seconds
+ auto factory = MakeProgramFactory(TProgramFactoryOptions()
+ .SetDeterministicTimeProviderSeed(1)); // seconds
- NPureCalcProto::TOptionalAllTypes canonicalMessage;
+ NPureCalcProto::TOptionalAllTypes canonicalMessage;
- {
- auto inputSpec = TProtobufInputSpec<NPureCalcProto::TAllTypes>("MyTimestamp");
- auto outputSpec = TProtobufOutputSpec<NPureCalcProto::TOptionalAllTypes>();
+ {
+ auto inputSpec = TProtobufInputSpec<NPureCalcProto::TAllTypes>("MyTimestamp");
+ auto outputSpec = TProtobufOutputSpec<NPureCalcProto::TOptionalAllTypes>();
- auto program = factory->MakePullStreamProgram(
- inputSpec,
- outputSpec,
- "SELECT MyTimestamp AS FFixed64 FROM Input",
- ETranslationMode::SQL
- );
+ auto program = factory->MakePullStreamProgram(
+ inputSpec,
+ outputSpec,
+ "SELECT MyTimestamp AS FFixed64 FROM Input",
+ ETranslationMode::SQL);
- auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
+ auto stream = program->Apply(MakeHolder<TAllTypesStreamImpl>());
- NPureCalcProto::TOptionalAllTypes* message;
+ NPureCalcProto::TOptionalAllTypes* message;
- UNIT_ASSERT(message = stream->Fetch());
- UNIT_ASSERT_VALUES_EQUAL(message->GetFFixed64(), 1000000); // microseconds
- UNIT_ASSERT(!stream->Fetch());
- }
+ UNIT_ASSERT(message = stream->Fetch());
+ UNIT_ASSERT_VALUES_EQUAL(message->GetFFixed64(), 1000000); // microseconds
+ UNIT_ASSERT(!stream->Fetch());
}
+}
- Y_UNIT_TEST(TestTableNames) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestTableNames) {
+ using namespace NYql::NPureCalc;
- auto factory = MakeProgramFactory(TProgramFactoryOptions().SetUseSystemColumns(true));
+ auto factory = MakeProgramFactory(TProgramFactoryOptions().SetUseSystemColumns(true));
- auto runTest = [&](TStringBuf tableName, i32 value) {
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TSimpleMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TNamedSimpleMessage>(),
- TString::Join("SELECT TableName() AS Name, X FROM ", tableName),
- ETranslationMode::SQL
- );
+ auto runTest = [&](TStringBuf tableName, i32 value) {
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TSimpleMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TNamedSimpleMessage>(),
+ TString::Join("SELECT TableName() AS Name, X FROM ", tableName),
+ ETranslationMode::SQL);
- auto stream = program->Apply(MakeHolder<TSimpleMessageStreamImpl>(value));
- auto message = stream->Fetch();
+ auto stream = program->Apply(MakeHolder<TSimpleMessageStreamImpl>(value));
+ auto message = stream->Fetch();
- UNIT_ASSERT(message);
- UNIT_ASSERT_VALUES_EQUAL(message->GetX(), value);
- UNIT_ASSERT_VALUES_EQUAL(message->GetName(), tableName);
- UNIT_ASSERT(!stream->Fetch());
- };
+ UNIT_ASSERT(message);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetX(), value);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetName(), tableName);
+ UNIT_ASSERT(!stream->Fetch());
+ };
- runTest("Input", 37);
- runTest("Input0", -23);
- }
+ runTest("Input", 37);
+ runTest("Input0", -23);
+}
- void CheckMultiOutputs(TMaybe<TVector<google::protobuf::Arena*>> arenas) {
- using namespace NYql::NPureCalc;
+void CheckMultiOutputs(TMaybe<TVector<google::protobuf::Arena*>> arenas) {
+ using namespace NYql::NPureCalc;
- auto factory = MakeProgramFactory();
- TString sExpr = R"(
+ auto factory = MakeProgramFactory();
+ TString sExpr = R"(
(
(let $type (ParseType '"Variant<Struct<BInt:Int32,BString:Utf8>, Struct<CUint:Uint32,CString:Utf8>, Struct<X:Utf8>>"))
(let $stream (Self '0))
@@ -781,293 +763,276 @@ Y_UNIT_TEST_SUITE(TestProtoIO) {
)
)";
- {
- auto program = factory->MakePushStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TUnsplitted>(),
- TProtobufMultiOutputSpec<NPureCalcProto::TSplitted1, NPureCalcProto::TSplitted2, NPureCalcProto::TStringMessage>(
- {}, arenas
- ),
- sExpr,
- ETranslationMode::SExpr
- );
+ {
+ auto program = factory->MakePushStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TUnsplitted>(),
+ TProtobufMultiOutputSpec<NPureCalcProto::TSplitted1, NPureCalcProto::TSplitted2, NPureCalcProto::TStringMessage>(
+ {}, arenas),
+ sExpr,
+ ETranslationMode::SExpr);
- TVariantConsumerImpl::TType0 queue0;
- TVariantConsumerImpl::TType1 queue1;
- TVariantConsumerImpl::TType2 queue2;
- int finalValue = 0;
+ TVariantConsumerImpl::TType0 queue0;
+ TVariantConsumerImpl::TType1 queue1;
+ TVariantConsumerImpl::TType2 queue2;
+ int finalValue = 0;
- auto consumer = MakeHolder<TVariantConsumerImpl>(&queue0, &queue1, &queue2, &finalValue);
- auto input = program->Apply(std::move(consumer));
+ auto consumer = MakeHolder<TVariantConsumerImpl>(&queue0, &queue1, &queue2, &finalValue);
+ auto input = program->Apply(std::move(consumer));
- NPureCalcProto::TUnsplitted message;
- message.SetAInt(-13);
- message.SetAUint(47);
- message.SetAString("first message");
- message.SetABool(true);
+ NPureCalcProto::TUnsplitted message;
+ message.SetAInt(-13);
+ message.SetAUint(47);
+ message.SetAString("first message");
+ message.SetABool(true);
- input->OnObject(&message);
- UNIT_ASSERT(queue0.size() == 1 && queue1.empty() && queue2.empty() && finalValue == 0);
+ input->OnObject(&message);
+ UNIT_ASSERT(queue0.size() == 1 && queue1.empty() && queue2.empty() && finalValue == 0);
- message.SetABool(false);
- message.SetAString("second message");
+ message.SetABool(false);
+ message.SetAString("second message");
- input->OnObject(&message);
- UNIT_ASSERT(queue0.size() == 1 && queue1.size() == 1 && queue2.empty() && finalValue == 0);
+ input->OnObject(&message);
+ UNIT_ASSERT(queue0.size() == 1 && queue1.size() == 1 && queue2.empty() && finalValue == 0);
- message.ClearABool();
+ message.ClearABool();
- input->OnObject(&message);
- UNIT_ASSERT(queue0.size() == 1 && queue1.size() == 1 && queue2.size() == 1 && finalValue == 0);
+ input->OnObject(&message);
+ UNIT_ASSERT(queue0.size() == 1 && queue1.size() == 1 && queue2.size() == 1 && finalValue == 0);
- input->OnFinish();
- UNIT_ASSERT(queue0.size() == 1 && queue1.size() == 1 && queue2.size() == 1 && finalValue == 42);
+ input->OnFinish();
+ UNIT_ASSERT(queue0.size() == 1 && queue1.size() == 1 && queue2.size() == 1 && finalValue == 42);
- TVariantConsumerImpl::TType0 expected0 = {{-13, "first message"}};
- UNIT_ASSERT_EQUAL(queue0, expected0);
+ TVariantConsumerImpl::TType0 expected0 = {{-13, "first message"}};
+ UNIT_ASSERT_EQUAL(queue0, expected0);
- TVariantConsumerImpl::TType1 expected1 = {{47, "second message"}};
- UNIT_ASSERT_EQUAL(queue1, expected1);
+ TVariantConsumerImpl::TType1 expected1 = {{47, "second message"}};
+ UNIT_ASSERT_EQUAL(queue1, expected1);
- TVariantConsumerImpl::TType2 expected2 = {{"Error"}};
- UNIT_ASSERT_EQUAL(queue2, expected2);
- }
+ TVariantConsumerImpl::TType2 expected2 = {{"Error"}};
+ UNIT_ASSERT_EQUAL(queue2, expected2);
+ }
- {
- auto program1 = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TUnsplitted>(),
- TProtobufMultiOutputSpec<NPureCalcProto::TSplitted1, NPureCalcProto::TSplitted2, NPureCalcProto::TStringMessage>(
- {}, arenas
- ),
- sExpr,
- ETranslationMode::SExpr
- );
-
- auto program2 = factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TUnsplitted>(),
- TProtobufMultiOutputSpec<NPureCalcProto::TSplitted1, NPureCalcProto::TSplitted2, NPureCalcProto::TStringMessage>(
- {}, arenas
- ),
- sExpr,
- ETranslationMode::SExpr
- );
-
- auto input1 = MakeHolder<TUnsplittedStreamImpl>();
- auto output1 = program1->Apply(std::move(input1));
-
- auto input2 = MakeHolder<TUnsplittedStreamImpl>();
- auto output2 = program2->Apply(std::move(input2));
-
- decltype(output1->Fetch()) variant1;
- decltype(output2->Fetch()) variant2;
-
-#define ASSERT_EQUAL_FIELDS(X1, X2, I, F, E) \
- UNIT_ASSERT_EQUAL(X1.index(), I); \
- UNIT_ASSERT_EQUAL(X2.index(), I); \
- UNIT_ASSERT_EQUAL(std::get<I>(X1)->Get##F(), E); \
+ {
+ auto program1 = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TUnsplitted>(),
+ TProtobufMultiOutputSpec<NPureCalcProto::TSplitted1, NPureCalcProto::TSplitted2, NPureCalcProto::TStringMessage>(
+ {}, arenas),
+ sExpr,
+ ETranslationMode::SExpr);
+
+ auto program2 = factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TUnsplitted>(),
+ TProtobufMultiOutputSpec<NPureCalcProto::TSplitted1, NPureCalcProto::TSplitted2, NPureCalcProto::TStringMessage>(
+ {}, arenas),
+ sExpr,
+ ETranslationMode::SExpr);
+
+ auto input1 = MakeHolder<TUnsplittedStreamImpl>();
+ auto output1 = program1->Apply(std::move(input1));
+
+ auto input2 = MakeHolder<TUnsplittedStreamImpl>();
+ auto output2 = program2->Apply(std::move(input2));
+
+ decltype(output1->Fetch()) variant1;
+ decltype(output2->Fetch()) variant2;
+
+#define ASSERT_EQUAL_FIELDS(X1, X2, I, F, E) \
+ UNIT_ASSERT_EQUAL(X1.index(), I); \
+ UNIT_ASSERT_EQUAL(X2.index(), I); \
+ UNIT_ASSERT_EQUAL(std::get<I>(X1)->Get##F(), E); \
UNIT_ASSERT_EQUAL(std::get<I>(X2)->Get##F(), E)
- variant1 = output1->Fetch();
- variant2 = output2->Fetch();
- ASSERT_EQUAL_FIELDS(variant1, variant2, 2, X, "Error");
- ASSERT_EQUAL_FIELDS(variant1, variant2, 2, Arena, (arenas.Defined() ? arenas->at(2) : nullptr));
-
- variant1 = output1->Fetch();
- variant2 = output2->Fetch();
- ASSERT_EQUAL_FIELDS(variant1, variant2, 1, CUint, 111);
- ASSERT_EQUAL_FIELDS(variant1, variant2, 1, CString, "Hello!");
- ASSERT_EQUAL_FIELDS(variant1, variant2, 1, Arena, (arenas.Defined() ? arenas->at(1) : nullptr));
-
- variant1 = output1->Fetch();
- variant2 = output2->Fetch();
- ASSERT_EQUAL_FIELDS(variant1, variant2, 0, BInt, -23);
- ASSERT_EQUAL_FIELDS(variant1, variant2, 0, BString, "Hello!");
- ASSERT_EQUAL_FIELDS(variant1, variant2, 0, Arena, (arenas.Defined() ? arenas->at(0) : nullptr));
-
- variant1 = output1->Fetch();
- variant2 = output2->Fetch();
- UNIT_ASSERT_EQUAL(variant1.index(), 0);
- UNIT_ASSERT_EQUAL(variant2.index(), 0);
- UNIT_ASSERT_EQUAL(std::get<0>(variant1), nullptr);
- UNIT_ASSERT_EQUAL(std::get<0>(variant1), nullptr);
+ variant1 = output1->Fetch();
+ variant2 = output2->Fetch();
+ ASSERT_EQUAL_FIELDS(variant1, variant2, 2, X, "Error");
+ ASSERT_EQUAL_FIELDS(variant1, variant2, 2, Arena, (arenas.Defined() ? arenas->at(2) : nullptr));
+
+ variant1 = output1->Fetch();
+ variant2 = output2->Fetch();
+ ASSERT_EQUAL_FIELDS(variant1, variant2, 1, CUint, 111);
+ ASSERT_EQUAL_FIELDS(variant1, variant2, 1, CString, "Hello!");
+ ASSERT_EQUAL_FIELDS(variant1, variant2, 1, Arena, (arenas.Defined() ? arenas->at(1) : nullptr));
+
+ variant1 = output1->Fetch();
+ variant2 = output2->Fetch();
+ ASSERT_EQUAL_FIELDS(variant1, variant2, 0, BInt, -23);
+ ASSERT_EQUAL_FIELDS(variant1, variant2, 0, BString, "Hello!");
+ ASSERT_EQUAL_FIELDS(variant1, variant2, 0, Arena, (arenas.Defined() ? arenas->at(0) : nullptr));
+
+ variant1 = output1->Fetch();
+ variant2 = output2->Fetch();
+ UNIT_ASSERT_EQUAL(variant1.index(), 0);
+ UNIT_ASSERT_EQUAL(variant2.index(), 0);
+ UNIT_ASSERT_EQUAL(std::get<0>(variant1), nullptr);
+ UNIT_ASSERT_EQUAL(std::get<0>(variant1), nullptr);
#undef ASSERT_EQUAL_FIELDS
- }
- }
-
- Y_UNIT_TEST(TestMultiOutputs) {
- CheckMultiOutputs(Nothing());
}
+}
- Y_UNIT_TEST(TestSupportedTypes) {
+Y_UNIT_TEST(TestMultiOutputs) {
+ CheckMultiOutputs(Nothing());
+}
- }
+Y_UNIT_TEST(TestSupportedTypes) {
+}
- Y_UNIT_TEST(TestProtobufArena) {
+Y_UNIT_TEST(TestProtobufArena) {
+ {
+ NPureCalcProto::TNestedRepeated input;
+ input.SetX(20);
{
- NPureCalcProto::TNestedRepeated input;
- input.SetX(20);
+ auto* item = input.MutableY()->Add();
+ item->SetX(100);
{
- auto* item = input.MutableY()->Add();
- item->SetX(100);
- {
- auto* y = item->MutableY();
- *y = GetCanonicalMessage();
- y->SetFUint64(1000);
- }
+ auto* y = item->MutableY();
+ *y = GetCanonicalMessage();
+ y->SetFUint64(1000);
}
+ }
+ {
+ auto* item = input.MutableY()->Add();
+ item->SetX(200);
{
- auto* item = input.MutableY()->Add();
- item->SetX(200);
- {
- auto* y = item->MutableY();
- *y = GetCanonicalMessage();
- y->SetFUint64(2000);
- }
+ auto* y = item->MutableY();
+ *y = GetCanonicalMessage();
+ y->SetFUint64(2000);
}
-
- google::protobuf::Arena arena;
- CheckPassThroughYql(input, &arena);
}
- {
- google::protobuf::Arena arena1;
- google::protobuf::Arena arena2;
- TVector<google::protobuf::Arena*> arenas{&arena1, &arena2, &arena1};
- CheckMultiOutputs(arenas);
- }
+ google::protobuf::Arena arena;
+ CheckPassThroughYql(input, &arena);
}
- Y_UNIT_TEST(TestFieldRenames) {
- using namespace NYql::NPureCalc;
+ {
+ google::protobuf::Arena arena1;
+ google::protobuf::Arena arena2;
+ TVector<google::protobuf::Arena*> arenas{&arena1, &arena2, &arena1};
+ CheckMultiOutputs(arenas);
+ }
+}
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestFieldRenames) {
+ using namespace NYql::NPureCalc;
- TString query = "SELECT InputAlias AS OutputAlias FROM Input";
+ auto factory = MakeProgramFactory();
- auto inputProtoOptions = TProtoSchemaOptions();
- inputProtoOptions.SetFieldRenames({{"X", "InputAlias"}});
+ TString query = "SELECT InputAlias AS OutputAlias FROM Input";
- auto inputSpec = TProtobufInputSpec<NPureCalcProto::TSimpleMessage>(
- Nothing(), std::move(inputProtoOptions)
- );
+ auto inputProtoOptions = TProtoSchemaOptions();
+ inputProtoOptions.SetFieldRenames({{"X", "InputAlias"}});
- auto outputProtoOptions = TProtoSchemaOptions();
- outputProtoOptions.SetFieldRenames({{"X", "OutputAlias"}});
+ auto inputSpec = TProtobufInputSpec<NPureCalcProto::TSimpleMessage>(
+ Nothing(), std::move(inputProtoOptions));
- auto outputSpec = TProtobufOutputSpec<NPureCalcProto::TSimpleMessage>(
- std::move(outputProtoOptions)
- );
+ auto outputProtoOptions = TProtoSchemaOptions();
+ outputProtoOptions.SetFieldRenames({{"X", "OutputAlias"}});
- {
- auto program = factory->MakePullStreamProgram(
- inputSpec, outputSpec, query, ETranslationMode::SQL
- );
+ auto outputSpec = TProtobufOutputSpec<NPureCalcProto::TSimpleMessage>(
+ std::move(outputProtoOptions));
- auto input = MakeHolder<TSimpleMessageStreamImpl>(1);
- auto output = program->Apply(std::move(input));
+ {
+ auto program = factory->MakePullStreamProgram(
+ inputSpec, outputSpec, query, ETranslationMode::SQL);
- TVector<int> expected = {1};
- TVector<int> actual;
+ auto input = MakeHolder<TSimpleMessageStreamImpl>(1);
+ auto output = program->Apply(std::move(input));
- while (auto* x = output->Fetch()) {
- actual.push_back(x->GetX());
- }
+ TVector<int> expected = {1};
+ TVector<int> actual;
- UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ while (auto* x = output->Fetch()) {
+ actual.push_back(x->GetX());
}
- {
- auto program = factory->MakePullListProgram(
- inputSpec, outputSpec, query, ETranslationMode::SQL
- );
+ UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ }
- auto input = MakeHolder<TSimpleMessageStreamImpl>(1);
- auto output = program->Apply(std::move(input));
+ {
+ auto program = factory->MakePullListProgram(
+ inputSpec, outputSpec, query, ETranslationMode::SQL);
- TVector<int> expected = {1};
- TVector<int> actual;
+ auto input = MakeHolder<TSimpleMessageStreamImpl>(1);
+ auto output = program->Apply(std::move(input));
- while (auto* x = output->Fetch()) {
- actual.push_back(x->GetX());
- }
+ TVector<int> expected = {1};
+ TVector<int> actual;
- UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ while (auto* x = output->Fetch()) {
+ actual.push_back(x->GetX());
}
- {
- auto program = factory->MakePushStreamProgram(
- inputSpec, outputSpec, query, ETranslationMode::SQL
- );
+ UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ }
- TVector<int> expected = {1, -100};
- TVector<int> actual;
+ {
+ auto program = factory->MakePushStreamProgram(
+ inputSpec, outputSpec, query, ETranslationMode::SQL);
- auto consumer = MakeHolder<TSimpleMessageConsumerImpl>(&actual);
- auto input = program->Apply(std::move(consumer));
+ TVector<int> expected = {1, -100};
+ TVector<int> actual;
- NPureCalcProto::TSimpleMessage Message;
+ auto consumer = MakeHolder<TSimpleMessageConsumerImpl>(&actual);
+ auto input = program->Apply(std::move(consumer));
- Message.SetX(1);
- input->OnObject(&Message);
+ NPureCalcProto::TSimpleMessage Message;
- input->OnFinish();
+ Message.SetX(1);
+ input->OnObject(&Message);
- UNIT_ASSERT_VALUES_EQUAL(expected, actual);
- }
- }
+ input->OnFinish();
- Y_UNIT_TEST(TestNestedFieldRenames) {
- using namespace NYql::NPureCalc;
+ UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ }
+}
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestNestedFieldRenames) {
+ using namespace NYql::NPureCalc;
- TString query = "SELECT InputAlias AS OutputAlias, X FROM Input";
+ auto factory = MakeProgramFactory();
- auto inputProtoOptions = TProtoSchemaOptions();
- inputProtoOptions.SetFieldRenames({{"Y", "InputAlias"}, {"FInt64", "NestedField"}});
- inputProtoOptions.SetEnableRecursiveRenaming(true);
+ TString query = "SELECT InputAlias AS OutputAlias, X FROM Input";
- auto inputSpec = TProtobufInputSpec<NPureCalcProto::TSimpleNested>(
- Nothing(), std::move(inputProtoOptions)
- );
+ auto inputProtoOptions = TProtoSchemaOptions();
+ inputProtoOptions.SetFieldRenames({{"Y", "InputAlias"}, {"FInt64", "NestedField"}});
+ inputProtoOptions.SetEnableRecursiveRenaming(true);
- auto outputProtoOptions = TProtoSchemaOptions();
- outputProtoOptions.SetEnableRecursiveRenaming(true);
+ auto inputSpec = TProtobufInputSpec<NPureCalcProto::TSimpleNested>(
+ Nothing(), std::move(inputProtoOptions));
- outputProtoOptions.SetFieldRenames({{"Y", "OutputAlias"}, {"FInt64", "NestedField"}});
- auto outputSpecWithNestedRename = TProtobufOutputSpec<NPureCalcProto::TSimpleNested>(
- outputProtoOptions
- );
+ auto outputProtoOptions = TProtoSchemaOptions();
+ outputProtoOptions.SetEnableRecursiveRenaming(true);
- outputProtoOptions.SetFieldRenames({{"Y", "OutputAlias"}});
- auto outputSpecWithoutNestedRename = TProtobufOutputSpec<NPureCalcProto::TSimpleNested>(
- std::move(outputProtoOptions)
- );
+ outputProtoOptions.SetFieldRenames({{"Y", "OutputAlias"}, {"FInt64", "NestedField"}});
+ auto outputSpecWithNestedRename = TProtobufOutputSpec<NPureCalcProto::TSimpleNested>(
+ outputProtoOptions);
- {
- auto program = factory->MakePullStreamProgram(
- inputSpec, outputSpecWithNestedRename, query, ETranslationMode::SQL
- );
+ outputProtoOptions.SetFieldRenames({{"Y", "OutputAlias"}});
+ auto outputSpecWithoutNestedRename = TProtobufOutputSpec<NPureCalcProto::TSimpleNested>(
+ std::move(outputProtoOptions));
- auto input = MakeHolder<TTSimpleNestedStreamImpl>();
- auto output = program->Apply(std::move(input));
+ {
+ auto program = factory->MakePullStreamProgram(
+ inputSpec, outputSpecWithNestedRename, query, ETranslationMode::SQL);
- TVector<int> expected = {3};
- TVector<int> actual;
+ auto input = MakeHolder<TTSimpleNestedStreamImpl>();
+ auto output = program->Apply(std::move(input));
- while (auto* x = output->Fetch()) {
- actual.push_back(x->GetY().GetFInt64());
- }
+ TVector<int> expected = {3};
+ TVector<int> actual;
- UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ while (auto* x = output->Fetch()) {
+ actual.push_back(x->GetY().GetFInt64());
}
- {
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullStreamProgram(
- inputSpec, outputSpecWithoutNestedRename, query, ETranslationMode::SQL
- );
- }(), TCompileError, "Failed to optimize");
- }
+ UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ }
+
+ {
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(
+ inputSpec, outputSpecWithoutNestedRename, query, ETranslationMode::SQL);
+ }(), TCompileError, "Failed to optimize");
}
}
+} // Y_UNIT_TEST_SUITE(TestProtoIO)
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf/ut/ya.make b/yql/essentials/public/purecalc/io_specs/protobuf/ut/ya.make
index 2519816d02e..69e36132340 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf/ut/ya.make
+++ b/yql/essentials/public/purecalc/io_specs/protobuf/ut/ya.make
@@ -2,6 +2,8 @@ IF (NOT SANITIZER_TYPE)
UNITTEST()
+ENABLE(YQL_STYLE_CPP)
+
PEERDIR(
library/cpp/protobuf/util
yql/essentials/public/udf/service/exception_policy
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf/ya.make b/yql/essentials/public/purecalc/io_specs/protobuf/ya.make
index b9441ceecf4..600bf9df61d 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf/ya.make
+++ b/yql/essentials/public/purecalc/io_specs/protobuf/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
PEERDIR(
yql/essentials/public/purecalc/common
yql/essentials/public/purecalc/io_specs/protobuf_raw
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf_raw/proto_holder.h b/yql/essentials/public/purecalc/io_specs/protobuf_raw/proto_holder.h
index 7d4d843bfcf..6808a150945 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf_raw/proto_holder.h
+++ b/yql/essentials/public/purecalc/io_specs/protobuf_raw/proto_holder.h
@@ -7,25 +7,25 @@
#include <type_traits>
namespace NYql::NPureCalc {
- class TProtoDestroyer {
- public:
- template <typename T>
- static inline void Destroy(T* t) noexcept {
- if (t->GetArena() == nullptr) {
- CheckedDelete(t);
- }
+class TProtoDestroyer {
+public:
+ template <typename T>
+ static inline void Destroy(T* t) noexcept {
+ if (t->GetArena() == nullptr) {
+ CheckedDelete(t);
}
- };
+ }
+};
- template <typename TProto>
- concept IsProtoMessage = std::is_base_of_v<NProtoBuf::Message, TProto>;
+template <typename TProto>
+concept IsProtoMessage = std::is_base_of_v<NProtoBuf::Message, TProto>;
- template <IsProtoMessage TProto>
- using TProtoHolder = THolder<TProto, TProtoDestroyer>;
+template <IsProtoMessage TProto>
+using TProtoHolder = THolder<TProto, TProtoDestroyer>;
- template <IsProtoMessage TProto, typename... TArgs>
- TProtoHolder<TProto> MakeProtoHolder(NProtoBuf::Arena* arena, TArgs&&... args) {
- auto* ptr = NProtoBuf::Arena::CreateMessage<TProto>(arena, std::forward<TArgs>(args)...);
- return TProtoHolder<TProto>(ptr);
- }
+template <IsProtoMessage TProto, typename... TArgs>
+TProtoHolder<TProto> MakeProtoHolder(NProtoBuf::Arena* arena, TArgs&&... args) {
+ auto* ptr = NProtoBuf::Arena::CreateMessage<TProto>(arena, std::forward<TArgs>(args)...);
+ return TProtoHolder<TProto>(ptr);
}
+} // namespace NYql::NPureCalc
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.cpp b/yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.cpp
index 150ebfa80a8..af4561a49b8 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.cpp
+++ b/yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.cpp
@@ -17,8 +17,7 @@ using namespace NKikimr::NMiniKQL;
TProtobufRawInputSpec::TProtobufRawInputSpec(
const Descriptor& descriptor,
const TMaybe<TString>& timestampColumn,
- const TProtoSchemaOptions& options
-)
+ const TProtoSchemaOptions& options)
: Descriptor_(descriptor)
, TimestampColumn_(timestampColumn)
, SchemaOptions_(options)
@@ -58,8 +57,7 @@ TProtobufRawOutputSpec::TProtobufRawOutputSpec(
const Descriptor& descriptor,
MessageFactory* factory,
const TProtoSchemaOptions& options,
- Arena* arena
-)
+ Arena* arena)
: Descriptor_(descriptor)
, Factory_(factory)
, SchemaOptions_(options)
@@ -104,8 +102,7 @@ TProtobufRawMultiOutputSpec::TProtobufRawMultiOutputSpec(
TVector<const Descriptor*> descriptors,
TMaybe<TVector<MessageFactory*>> factories,
const TProtoSchemaOptions& options,
- TMaybe<TVector<Arena*>> arenas
-)
+ TMaybe<TVector<Arena*>> arenas)
: Descriptors_(std::move(descriptors))
, SchemaOptions_(options)
{
@@ -171,408 +168,325 @@ const TProtoSchemaOptions& TProtobufRawMultiOutputSpec::GetSchemaOptions() const
}
namespace {
- struct TFieldMapping {
- TString Name;
- const FieldDescriptor* Field;
- TVector<TFieldMapping> NestedFields;
- };
-
- void FillFieldMappingsImpl(
- const TStructType* fromType,
- const Descriptor& toType,
- TVector<TFieldMapping>& mappings,
- const TMaybe<TString>& timestampColumn,
- bool listIsOptional,
- bool enableRecursiveRenaming,
- const THashMap<TString, TString>& inverseFieldRenames
- ) {
- static const THashMap<TString, TString> emptyInverseFieldRenames;
- mappings.resize(fromType->GetMembersCount());
- for (ui32 i = 0; i < fromType->GetMembersCount(); ++i) {
- TString fieldName(fromType->GetMemberName(i));
- if (auto fieldRenamePtr = inverseFieldRenames.FindPtr(fieldName)) {
- fieldName = *fieldRenamePtr;
- }
+struct TFieldMapping {
+ TString Name;
+ const FieldDescriptor* Field;
+ TVector<TFieldMapping> NestedFields;
+};
+
+void FillFieldMappingsImpl(
+ const TStructType* fromType,
+ const Descriptor& toType,
+ TVector<TFieldMapping>& mappings,
+ const TMaybe<TString>& timestampColumn,
+ bool listIsOptional,
+ bool enableRecursiveRenaming,
+ const THashMap<TString, TString>& inverseFieldRenames) {
+ static const THashMap<TString, TString> emptyInverseFieldRenames;
+ mappings.resize(fromType->GetMembersCount());
+ for (ui32 i = 0; i < fromType->GetMembersCount(); ++i) {
+ TString fieldName(fromType->GetMemberName(i));
+ if (auto fieldRenamePtr = inverseFieldRenames.FindPtr(fieldName)) {
+ fieldName = *fieldRenamePtr;
+ }
- mappings[i].Name = fieldName;
- mappings[i].Field = toType.FindFieldByName(fieldName);
- YQL_ENSURE(
- mappings[i].Field || timestampColumn && *timestampColumn == fieldName,
- "Missing field: " << fieldName);
-
- const auto* fieldType = fromType->GetMemberType(i);
- if (fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::List) {
- const auto* listType = static_cast<const NKikimr::NMiniKQL::TListType*>(fieldType);
- fieldType = listType->GetItemType();
- } else if (fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::Optional) {
- const auto* optionalType = static_cast<const NKikimr::NMiniKQL::TOptionalType*>(fieldType);
- fieldType = optionalType->GetItemType();
-
- if (listIsOptional) {
- if (fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::List) {
- const auto* listType = static_cast<const NKikimr::NMiniKQL::TListType*>(fieldType);
- fieldType = listType->GetItemType();
- }
+ mappings[i].Name = fieldName;
+ mappings[i].Field = toType.FindFieldByName(fieldName);
+ YQL_ENSURE(
+ mappings[i].Field || timestampColumn && *timestampColumn == fieldName,
+ "Missing field: " << fieldName);
+
+ const auto* fieldType = fromType->GetMemberType(i);
+ if (fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::List) {
+ const auto* listType = static_cast<const NKikimr::NMiniKQL::TListType*>(fieldType);
+ fieldType = listType->GetItemType();
+ } else if (fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::Optional) {
+ const auto* optionalType = static_cast<const NKikimr::NMiniKQL::TOptionalType*>(fieldType);
+ fieldType = optionalType->GetItemType();
+
+ if (listIsOptional) {
+ if (fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::List) {
+ const auto* listType = static_cast<const NKikimr::NMiniKQL::TListType*>(fieldType);
+ fieldType = listType->GetItemType();
}
}
- YQL_ENSURE(fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::Struct ||
+ }
+ YQL_ENSURE(fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::Struct ||
fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::Data,
- "unsupported field kind [" << fieldType->GetKindAsStr() << "], field [" << fieldName << "]");
- if (fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::Struct) {
- FillFieldMappingsImpl(
- static_cast<const NKikimr::NMiniKQL::TStructType*>(fieldType),
- *mappings[i].Field->message_type(),
- mappings[i].NestedFields,
- Nothing(),
- listIsOptional,
- enableRecursiveRenaming,
- enableRecursiveRenaming ? inverseFieldRenames : emptyInverseFieldRenames
- );
- }
+ "unsupported field kind [" << fieldType->GetKindAsStr() << "], field [" << fieldName << "]");
+ if (fieldType->GetKind() == NKikimr::NMiniKQL::TType::EKind::Struct) {
+ FillFieldMappingsImpl(
+ static_cast<const NKikimr::NMiniKQL::TStructType*>(fieldType),
+ *mappings[i].Field->message_type(),
+ mappings[i].NestedFields,
+ Nothing(),
+ listIsOptional,
+ enableRecursiveRenaming,
+ enableRecursiveRenaming ? inverseFieldRenames : emptyInverseFieldRenames);
}
}
+}
- /**
- * Fills a tree of field mappings from the given yql struct type to protobuf message.
- *
- * @param fromType source yql type.
- * @param toType target protobuf message type.
- * @param mappings destination vector will be filled with field descriptors. Order of descriptors will match
- * the order of field names.
- */
- void FillFieldMappings(
- const TStructType* fromType,
- const Descriptor& toType,
- TVector<TFieldMapping>& mappings,
- const TMaybe<TString>& timestampColumn,
- bool listIsOptional,
- bool enableRecursiveRenaming,
- const THashMap<TString, TString>& fieldRenames
- ) {
- THashMap<TString, TString> inverseFieldRenames;
- for (const auto& [source, target]: fieldRenames) {
- auto [iterator, emplaced] = inverseFieldRenames.emplace(target, source);
- Y_ENSURE(emplaced, "Duplicate rename field found: " << source << " -> " << target);
- }
-
- FillFieldMappingsImpl(fromType, toType, mappings, timestampColumn, listIsOptional, enableRecursiveRenaming, inverseFieldRenames);
+/**
+ * Fills a tree of field mappings from the given yql struct type to protobuf message.
+ *
+ * @param fromType source yql type.
+ * @param toType target protobuf message type.
+ * @param mappings destination vector will be filled with field descriptors. Order of descriptors will match
+ * the order of field names.
+ */
+void FillFieldMappings(
+ const TStructType* fromType,
+ const Descriptor& toType,
+ TVector<TFieldMapping>& mappings,
+ const TMaybe<TString>& timestampColumn,
+ bool listIsOptional,
+ bool enableRecursiveRenaming,
+ const THashMap<TString, TString>& fieldRenames) {
+ THashMap<TString, TString> inverseFieldRenames;
+ for (const auto& [source, target] : fieldRenames) {
+ auto [iterator, emplaced] = inverseFieldRenames.emplace(target, source);
+ Y_ENSURE(emplaced, "Duplicate rename field found: " << source << " -> " << target);
}
- /**
- * Extract field values from the given protobuf message into an array of unboxed values.
- *
- * @param factory to create nested unboxed values.
- * @param source source protobuf message.
- * @param destination destination array of unboxed values. Each element in the array corresponds to a field
- * in the protobuf message.
- * @param mappings vector of protobuf field descriptors which denotes relation between fields of the
- * source message and elements of the destination array.
- * @param scratch temporary string which will be used during conversion.
- */
- void FillInputValue(
- const THolderFactory& factory,
- const Message* source,
- TUnboxedValue* destination,
- const TVector<TFieldMapping>& mappings,
- const TMaybe<TString>& timestampColumn,
- ITimeProvider* timeProvider,
- EEnumPolicy enumPolicy
- ) {
- TString scratch;
- auto reflection = source->GetReflection();
- for (ui32 i = 0; i < mappings.size(); ++i) {
- auto mapping = mappings[i];
- if (!mapping.Field) {
- YQL_ENSURE(timestampColumn && mapping.Name == *timestampColumn);
- destination[i] = TUnboxedValuePod(timeProvider->Now().MicroSeconds());
- continue;
- }
-
- const auto type = mapping.Field->type();
- if (mapping.Field->label() == FieldDescriptor::LABEL_REPEATED) {
- const auto size = static_cast<ui32>(reflection->FieldSize(*source, mapping.Field));
- if (size == 0) {
- destination[i] = factory.GetEmptyContainerLazy();
- } else {
- TUnboxedValue* inplace = nullptr;
- destination[i] = factory.CreateDirectArrayHolder(size, inplace);
- for (ui32 j = 0; j < size; ++j) {
- switch (type) {
- case FieldDescriptor::TYPE_DOUBLE:
- inplace[j] = TUnboxedValuePod(reflection->GetRepeatedDouble(*source, mapping.Field, j));
- break;
-
- case FieldDescriptor::TYPE_FLOAT:
- inplace[j] = TUnboxedValuePod(reflection->GetRepeatedFloat(*source, mapping.Field, j));
- break;
-
- case FieldDescriptor::TYPE_INT64:
- case FieldDescriptor::TYPE_SFIXED64:
- case FieldDescriptor::TYPE_SINT64:
- inplace[j] = TUnboxedValuePod(reflection->GetRepeatedInt64(*source, mapping.Field, j));
- break;
-
- case FieldDescriptor::TYPE_ENUM:
- switch (EnumFormatType(*mapping.Field, enumPolicy)) {
- case EEnumFormatType::Int32:
- inplace[j] = TUnboxedValuePod(reflection->GetRepeatedEnumValue(*source, mapping.Field, j));
- break;
- case EEnumFormatType::String:
- inplace[j] = MakeString(reflection->GetRepeatedEnum(*source, mapping.Field, j)->name());
- break;
- }
- break;
-
- case FieldDescriptor::TYPE_UINT64:
- case FieldDescriptor::TYPE_FIXED64:
- inplace[j] = TUnboxedValuePod(reflection->GetRepeatedUInt64(*source, mapping.Field, j));
- break;
-
- case FieldDescriptor::TYPE_INT32:
- case FieldDescriptor::TYPE_SFIXED32:
- case FieldDescriptor::TYPE_SINT32:
- inplace[j] = TUnboxedValuePod(reflection->GetRepeatedInt32(*source, mapping.Field, j));
- break;
-
- case FieldDescriptor::TYPE_UINT32:
- case FieldDescriptor::TYPE_FIXED32:
- inplace[j] = TUnboxedValuePod(reflection->GetRepeatedUInt32(*source, mapping.Field, j));
- break;
-
- case FieldDescriptor::TYPE_BOOL:
- inplace[j] = TUnboxedValuePod(reflection->GetRepeatedBool(*source, mapping.Field, j));
- break;
-
- case FieldDescriptor::TYPE_STRING:
- inplace[j] = MakeString(reflection->GetRepeatedStringReference(*source, mapping.Field, j, &scratch));
- break;
-
- case FieldDescriptor::TYPE_BYTES:
- inplace[j] = MakeString(reflection->GetRepeatedStringReference(*source, mapping.Field, j, &scratch));
- break;
-
- case FieldDescriptor::TYPE_MESSAGE:
- {
- const Message& nestedMessage = reflection->GetRepeatedMessage(*source, mapping.Field, j);
- TUnboxedValue* nestedValues = nullptr;
- inplace[j] = factory.CreateDirectArrayHolder(static_cast<ui32>(mapping.NestedFields.size()),
- nestedValues);
- FillInputValue(factory, &nestedMessage, nestedValues, mapping.NestedFields, Nothing(), timeProvider, enumPolicy);
- }
- break;
-
- default:
- ythrow yexception() << "Unsupported protobuf type: " << mapping.Field->type_name() << ", field: " << mapping.Field->name();
- }
- }
- }
- } else {
- if (!reflection->HasField(*source, mapping.Field)) {
- continue;
- }
-
- switch (type) {
- case FieldDescriptor::TYPE_DOUBLE:
- destination[i] = TUnboxedValuePod(reflection->GetDouble(*source, mapping.Field));
- break;
-
- case FieldDescriptor::TYPE_FLOAT:
- destination[i] = TUnboxedValuePod(reflection->GetFloat(*source, mapping.Field));
- break;
-
- case FieldDescriptor::TYPE_INT64:
- case FieldDescriptor::TYPE_SFIXED64:
- case FieldDescriptor::TYPE_SINT64:
- destination[i] = TUnboxedValuePod(reflection->GetInt64(*source, mapping.Field));
- break;
-
- case FieldDescriptor::TYPE_ENUM:
- switch (EnumFormatType(*mapping.Field, enumPolicy)) {
- case EEnumFormatType::Int32:
- destination[i] = TUnboxedValuePod(reflection->GetEnumValue(*source, mapping.Field));
- break;
- case EEnumFormatType::String:
- destination[i] = MakeString(reflection->GetEnum(*source, mapping.Field)->name());
- break;
- }
- break;
-
- case FieldDescriptor::TYPE_UINT64:
- case FieldDescriptor::TYPE_FIXED64:
- destination[i] = TUnboxedValuePod(reflection->GetUInt64(*source, mapping.Field));
- break;
-
- case FieldDescriptor::TYPE_INT32:
- case FieldDescriptor::TYPE_SFIXED32:
- case FieldDescriptor::TYPE_SINT32:
- destination[i] = TUnboxedValuePod(reflection->GetInt32(*source, mapping.Field));
- break;
-
- case FieldDescriptor::TYPE_UINT32:
- case FieldDescriptor::TYPE_FIXED32:
- destination[i] = TUnboxedValuePod(reflection->GetUInt32(*source, mapping.Field));
- break;
-
- case FieldDescriptor::TYPE_BOOL:
- destination[i] = TUnboxedValuePod(reflection->GetBool(*source, mapping.Field));
- break;
-
- case FieldDescriptor::TYPE_STRING:
- destination[i] = MakeString(reflection->GetStringReference(*source, mapping.Field, &scratch));
- break;
-
- case FieldDescriptor::TYPE_BYTES:
- destination[i] = MakeString(reflection->GetStringReference(*source, mapping.Field, &scratch));
- break;
- case FieldDescriptor::TYPE_MESSAGE:
- {
- const Message& nestedMessage = reflection->GetMessage(*source, mapping.Field);
- TUnboxedValue* nestedValues = nullptr;
- destination[i] = factory.CreateDirectArrayHolder(static_cast<ui32>(mapping.NestedFields.size()),
- nestedValues);
- FillInputValue(factory, &nestedMessage, nestedValues, mapping.NestedFields, Nothing(), timeProvider, enumPolicy);
- }
- break;
+ FillFieldMappingsImpl(fromType, toType, mappings, timestampColumn, listIsOptional, enableRecursiveRenaming, inverseFieldRenames);
+}
- default:
- ythrow yexception() << "Unsupported protobuf type: " << mapping.Field->type_name()
- << ", field: " << mapping.Field->name();
- }
- }
+/**
+ * Extract field values from the given protobuf message into an array of unboxed values.
+ *
+ * @param factory to create nested unboxed values.
+ * @param source source protobuf message.
+ * @param destination destination array of unboxed values. Each element in the array corresponds to a field
+ * in the protobuf message.
+ * @param mappings vector of protobuf field descriptors which denotes relation between fields of the
+ * source message and elements of the destination array.
+ * @param scratch temporary string which will be used during conversion.
+ */
+void FillInputValue(
+ const THolderFactory& factory,
+ const Message* source,
+ TUnboxedValue* destination,
+ const TVector<TFieldMapping>& mappings,
+ const TMaybe<TString>& timestampColumn,
+ ITimeProvider* timeProvider,
+ EEnumPolicy enumPolicy) {
+ TString scratch;
+ auto reflection = source->GetReflection();
+ for (ui32 i = 0; i < mappings.size(); ++i) {
+ auto mapping = mappings[i];
+ if (!mapping.Field) {
+ YQL_ENSURE(timestampColumn && mapping.Name == *timestampColumn);
+ destination[i] = TUnboxedValuePod(timeProvider->Now().MicroSeconds());
+ continue;
}
- }
-
- /**
- * Convert unboxed value to protobuf.
- *
- * @param source unboxed value to extract data from. Type of the value should be struct. It's UB to pass
- * a non-struct value here.
- * @param destination destination message. Data in this message will be overwritten
- * by data from unboxed value.
- * @param mappings vector of protobuf field descriptors which denotes relation between struct fields
- * and message fields. For any i-th element of this vector, type of the i-th element of
- * the unboxed structure must match type of the field pointed by descriptor. Size of this
- * vector should match the number of fields in the struct.
- */
- void FillOutputMessage(
- const TUnboxedValue& source,
- Message* destination,
- const TVector<TFieldMapping>& mappings,
- EEnumPolicy enumPolicy
- ) {
- auto reflection = destination->GetReflection();
- for (ui32 i = 0; i < mappings.size(); ++i) {
- const auto& mapping = mappings[i];
- const auto& cell = source.GetElement(i);
- if (!cell) {
- reflection->ClearField(destination, mapping.Field);
- continue;
- }
- const auto type = mapping.Field->type();
- if (mapping.Field->label() == FieldDescriptor::LABEL_REPEATED) {
- const auto iter = cell.GetListIterator();
- reflection->ClearField(destination, mapping.Field);
- for (TUnboxedValue item; iter.Next(item);) {
- switch (mapping.Field->type()) {
+ const auto type = mapping.Field->type();
+ if (mapping.Field->label() == FieldDescriptor::LABEL_REPEATED) {
+ const auto size = static_cast<ui32>(reflection->FieldSize(*source, mapping.Field));
+ if (size == 0) {
+ destination[i] = factory.GetEmptyContainerLazy();
+ } else {
+ TUnboxedValue* inplace = nullptr;
+ destination[i] = factory.CreateDirectArrayHolder(size, inplace);
+ for (ui32 j = 0; j < size; ++j) {
+ switch (type) {
case FieldDescriptor::TYPE_DOUBLE:
- reflection->AddDouble(destination, mapping.Field, item.Get<double>());
+ inplace[j] = TUnboxedValuePod(reflection->GetRepeatedDouble(*source, mapping.Field, j));
break;
case FieldDescriptor::TYPE_FLOAT:
- reflection->AddFloat(destination, mapping.Field, item.Get<float>());
+ inplace[j] = TUnboxedValuePod(reflection->GetRepeatedFloat(*source, mapping.Field, j));
break;
case FieldDescriptor::TYPE_INT64:
case FieldDescriptor::TYPE_SFIXED64:
case FieldDescriptor::TYPE_SINT64:
- reflection->AddInt64(destination, mapping.Field, item.Get<i64>());
+ inplace[j] = TUnboxedValuePod(reflection->GetRepeatedInt64(*source, mapping.Field, j));
break;
- case FieldDescriptor::TYPE_ENUM: {
+ case FieldDescriptor::TYPE_ENUM:
switch (EnumFormatType(*mapping.Field, enumPolicy)) {
case EEnumFormatType::Int32:
- reflection->AddEnumValue(destination, mapping.Field, item.Get<i32>());
+ inplace[j] = TUnboxedValuePod(reflection->GetRepeatedEnumValue(*source, mapping.Field, j));
break;
- case EEnumFormatType::String: {
- auto enumValueDescriptor = mapping.Field->enum_type()->FindValueByName(TString(item.AsStringRef()));
- if (!enumValueDescriptor) {
- enumValueDescriptor = mapping.Field->default_value_enum();
- }
- reflection->AddEnum(destination, mapping.Field, enumValueDescriptor);
+ case EEnumFormatType::String:
+ inplace[j] = MakeString(reflection->GetRepeatedEnum(*source, mapping.Field, j)->name());
break;
- }
}
break;
- }
case FieldDescriptor::TYPE_UINT64:
case FieldDescriptor::TYPE_FIXED64:
- reflection->AddUInt64(destination, mapping.Field, item.Get<ui64>());
+ inplace[j] = TUnboxedValuePod(reflection->GetRepeatedUInt64(*source, mapping.Field, j));
break;
case FieldDescriptor::TYPE_INT32:
case FieldDescriptor::TYPE_SFIXED32:
case FieldDescriptor::TYPE_SINT32:
- reflection->AddInt32(destination, mapping.Field, item.Get<i32>());
+ inplace[j] = TUnboxedValuePod(reflection->GetRepeatedInt32(*source, mapping.Field, j));
break;
case FieldDescriptor::TYPE_UINT32:
case FieldDescriptor::TYPE_FIXED32:
- reflection->AddUInt32(destination, mapping.Field, item.Get<ui32>());
+ inplace[j] = TUnboxedValuePod(reflection->GetRepeatedUInt32(*source, mapping.Field, j));
break;
case FieldDescriptor::TYPE_BOOL:
- reflection->AddBool(destination, mapping.Field, item.Get<bool>());
+ inplace[j] = TUnboxedValuePod(reflection->GetRepeatedBool(*source, mapping.Field, j));
break;
case FieldDescriptor::TYPE_STRING:
- reflection->AddString(destination, mapping.Field, TString(item.AsStringRef()));
+ inplace[j] = MakeString(reflection->GetRepeatedStringReference(*source, mapping.Field, j, &scratch));
break;
case FieldDescriptor::TYPE_BYTES:
- reflection->AddString(destination, mapping.Field, TString(item.AsStringRef()));
+ inplace[j] = MakeString(reflection->GetRepeatedStringReference(*source, mapping.Field, j, &scratch));
break;
- case FieldDescriptor::TYPE_MESSAGE:
- {
- auto* nestedMessage = reflection->AddMessage(destination, mapping.Field);
- FillOutputMessage(item, nestedMessage, mapping.NestedFields, enumPolicy);
- }
- break;
+ case FieldDescriptor::TYPE_MESSAGE: {
+ const Message& nestedMessage = reflection->GetRepeatedMessage(*source, mapping.Field, j);
+ TUnboxedValue* nestedValues = nullptr;
+ inplace[j] = factory.CreateDirectArrayHolder(static_cast<ui32>(mapping.NestedFields.size()),
+ nestedValues);
+ FillInputValue(factory, &nestedMessage, nestedValues, mapping.NestedFields, Nothing(), timeProvider, enumPolicy);
+ } break;
default:
- ythrow yexception() << "Unsupported protobuf type: "
- << mapping.Field->type_name() << ", field: " << mapping.Field->name();
+ ythrow yexception() << "Unsupported protobuf type: " << mapping.Field->type_name() << ", field: " << mapping.Field->name();
}
}
- } else {
- switch (type) {
+ }
+ } else {
+ if (!reflection->HasField(*source, mapping.Field)) {
+ continue;
+ }
+
+ switch (type) {
+ case FieldDescriptor::TYPE_DOUBLE:
+ destination[i] = TUnboxedValuePod(reflection->GetDouble(*source, mapping.Field));
+ break;
+
+ case FieldDescriptor::TYPE_FLOAT:
+ destination[i] = TUnboxedValuePod(reflection->GetFloat(*source, mapping.Field));
+ break;
+
+ case FieldDescriptor::TYPE_INT64:
+ case FieldDescriptor::TYPE_SFIXED64:
+ case FieldDescriptor::TYPE_SINT64:
+ destination[i] = TUnboxedValuePod(reflection->GetInt64(*source, mapping.Field));
+ break;
+
+ case FieldDescriptor::TYPE_ENUM:
+ switch (EnumFormatType(*mapping.Field, enumPolicy)) {
+ case EEnumFormatType::Int32:
+ destination[i] = TUnboxedValuePod(reflection->GetEnumValue(*source, mapping.Field));
+ break;
+ case EEnumFormatType::String:
+ destination[i] = MakeString(reflection->GetEnum(*source, mapping.Field)->name());
+ break;
+ }
+ break;
+
+ case FieldDescriptor::TYPE_UINT64:
+ case FieldDescriptor::TYPE_FIXED64:
+ destination[i] = TUnboxedValuePod(reflection->GetUInt64(*source, mapping.Field));
+ break;
+
+ case FieldDescriptor::TYPE_INT32:
+ case FieldDescriptor::TYPE_SFIXED32:
+ case FieldDescriptor::TYPE_SINT32:
+ destination[i] = TUnboxedValuePod(reflection->GetInt32(*source, mapping.Field));
+ break;
+
+ case FieldDescriptor::TYPE_UINT32:
+ case FieldDescriptor::TYPE_FIXED32:
+ destination[i] = TUnboxedValuePod(reflection->GetUInt32(*source, mapping.Field));
+ break;
+
+ case FieldDescriptor::TYPE_BOOL:
+ destination[i] = TUnboxedValuePod(reflection->GetBool(*source, mapping.Field));
+ break;
+
+ case FieldDescriptor::TYPE_STRING:
+ destination[i] = MakeString(reflection->GetStringReference(*source, mapping.Field, &scratch));
+ break;
+
+ case FieldDescriptor::TYPE_BYTES:
+ destination[i] = MakeString(reflection->GetStringReference(*source, mapping.Field, &scratch));
+ break;
+ case FieldDescriptor::TYPE_MESSAGE: {
+ const Message& nestedMessage = reflection->GetMessage(*source, mapping.Field);
+ TUnboxedValue* nestedValues = nullptr;
+ destination[i] = factory.CreateDirectArrayHolder(static_cast<ui32>(mapping.NestedFields.size()),
+ nestedValues);
+ FillInputValue(factory, &nestedMessage, nestedValues, mapping.NestedFields, Nothing(), timeProvider, enumPolicy);
+ } break;
+
+ default:
+ ythrow yexception() << "Unsupported protobuf type: " << mapping.Field->type_name()
+ << ", field: " << mapping.Field->name();
+ }
+ }
+ }
+}
+
+/**
+ * Convert unboxed value to protobuf.
+ *
+ * @param source unboxed value to extract data from. Type of the value should be struct. It's UB to pass
+ * a non-struct value here.
+ * @param destination destination message. Data in this message will be overwritten
+ * by data from unboxed value.
+ * @param mappings vector of protobuf field descriptors which denotes relation between struct fields
+ * and message fields. For any i-th element of this vector, type of the i-th element of
+ * the unboxed structure must match type of the field pointed by descriptor. Size of this
+ * vector should match the number of fields in the struct.
+ */
+void FillOutputMessage(
+ const TUnboxedValue& source,
+ Message* destination,
+ const TVector<TFieldMapping>& mappings,
+ EEnumPolicy enumPolicy) {
+ auto reflection = destination->GetReflection();
+ for (ui32 i = 0; i < mappings.size(); ++i) {
+ const auto& mapping = mappings[i];
+ const auto& cell = source.GetElement(i);
+ if (!cell) {
+ reflection->ClearField(destination, mapping.Field);
+ continue;
+ }
+ const auto type = mapping.Field->type();
+ if (mapping.Field->label() == FieldDescriptor::LABEL_REPEATED) {
+ const auto iter = cell.GetListIterator();
+ reflection->ClearField(destination, mapping.Field);
+ for (TUnboxedValue item; iter.Next(item);) {
+ switch (mapping.Field->type()) {
case FieldDescriptor::TYPE_DOUBLE:
- reflection->SetDouble(destination, mapping.Field, cell.Get<double>());
+ reflection->AddDouble(destination, mapping.Field, item.Get<double>());
break;
case FieldDescriptor::TYPE_FLOAT:
- reflection->SetFloat(destination, mapping.Field, cell.Get<float>());
+ reflection->AddFloat(destination, mapping.Field, item.Get<float>());
break;
case FieldDescriptor::TYPE_INT64:
case FieldDescriptor::TYPE_SFIXED64:
case FieldDescriptor::TYPE_SINT64:
- reflection->SetInt64(destination, mapping.Field, cell.Get<i64>());
+ reflection->AddInt64(destination, mapping.Field, item.Get<i64>());
break;
case FieldDescriptor::TYPE_ENUM: {
switch (EnumFormatType(*mapping.Field, enumPolicy)) {
case EEnumFormatType::Int32:
- reflection->SetEnumValue(destination, mapping.Field, cell.Get<i32>());
+ reflection->AddEnumValue(destination, mapping.Field, item.Get<i32>());
break;
case EEnumFormatType::String: {
- auto enumValueDescriptor = mapping.Field->enum_type()->FindValueByName(TString(cell.AsStringRef()));
+ auto enumValueDescriptor = mapping.Field->enum_type()->FindValueByName(TString(item.AsStringRef()));
if (!enumValueDescriptor) {
enumValueDescriptor = mapping.Field->default_value_enum();
}
- reflection->SetEnum(destination, mapping.Field, enumValueDescriptor);
+ reflection->AddEnum(destination, mapping.Field, enumValueDescriptor);
break;
}
}
@@ -581,438 +495,497 @@ namespace {
case FieldDescriptor::TYPE_UINT64:
case FieldDescriptor::TYPE_FIXED64:
- reflection->SetUInt64(destination, mapping.Field, cell.Get<ui64>());
+ reflection->AddUInt64(destination, mapping.Field, item.Get<ui64>());
break;
case FieldDescriptor::TYPE_INT32:
case FieldDescriptor::TYPE_SFIXED32:
case FieldDescriptor::TYPE_SINT32:
- reflection->SetInt32(destination, mapping.Field, cell.Get<i32>());
+ reflection->AddInt32(destination, mapping.Field, item.Get<i32>());
break;
case FieldDescriptor::TYPE_UINT32:
case FieldDescriptor::TYPE_FIXED32:
- reflection->SetUInt32(destination, mapping.Field, cell.Get<ui32>());
+ reflection->AddUInt32(destination, mapping.Field, item.Get<ui32>());
break;
case FieldDescriptor::TYPE_BOOL:
- reflection->SetBool(destination, mapping.Field, cell.Get<bool>());
+ reflection->AddBool(destination, mapping.Field, item.Get<bool>());
break;
case FieldDescriptor::TYPE_STRING:
- reflection->SetString(destination, mapping.Field, TString(cell.AsStringRef()));
+ reflection->AddString(destination, mapping.Field, TString(item.AsStringRef()));
break;
case FieldDescriptor::TYPE_BYTES:
- reflection->SetString(destination, mapping.Field, TString(cell.AsStringRef()));
+ reflection->AddString(destination, mapping.Field, TString(item.AsStringRef()));
break;
- case FieldDescriptor::TYPE_MESSAGE:
- {
- auto* nestedMessage = reflection->MutableMessage(destination, mapping.Field);
- FillOutputMessage(cell, nestedMessage, mapping.NestedFields, enumPolicy);
- }
- break;
+ case FieldDescriptor::TYPE_MESSAGE: {
+ auto* nestedMessage = reflection->AddMessage(destination, mapping.Field);
+ FillOutputMessage(item, nestedMessage, mapping.NestedFields, enumPolicy);
+ } break;
default:
ythrow yexception() << "Unsupported protobuf type: "
<< mapping.Field->type_name() << ", field: " << mapping.Field->name();
}
}
+ } else {
+ switch (type) {
+ case FieldDescriptor::TYPE_DOUBLE:
+ reflection->SetDouble(destination, mapping.Field, cell.Get<double>());
+ break;
+
+ case FieldDescriptor::TYPE_FLOAT:
+ reflection->SetFloat(destination, mapping.Field, cell.Get<float>());
+ break;
+
+ case FieldDescriptor::TYPE_INT64:
+ case FieldDescriptor::TYPE_SFIXED64:
+ case FieldDescriptor::TYPE_SINT64:
+ reflection->SetInt64(destination, mapping.Field, cell.Get<i64>());
+ break;
+
+ case FieldDescriptor::TYPE_ENUM: {
+ switch (EnumFormatType(*mapping.Field, enumPolicy)) {
+ case EEnumFormatType::Int32:
+ reflection->SetEnumValue(destination, mapping.Field, cell.Get<i32>());
+ break;
+ case EEnumFormatType::String: {
+ auto enumValueDescriptor = mapping.Field->enum_type()->FindValueByName(TString(cell.AsStringRef()));
+ if (!enumValueDescriptor) {
+ enumValueDescriptor = mapping.Field->default_value_enum();
+ }
+ reflection->SetEnum(destination, mapping.Field, enumValueDescriptor);
+ break;
+ }
+ }
+ break;
+ }
+
+ case FieldDescriptor::TYPE_UINT64:
+ case FieldDescriptor::TYPE_FIXED64:
+ reflection->SetUInt64(destination, mapping.Field, cell.Get<ui64>());
+ break;
+
+ case FieldDescriptor::TYPE_INT32:
+ case FieldDescriptor::TYPE_SFIXED32:
+ case FieldDescriptor::TYPE_SINT32:
+ reflection->SetInt32(destination, mapping.Field, cell.Get<i32>());
+ break;
+
+ case FieldDescriptor::TYPE_UINT32:
+ case FieldDescriptor::TYPE_FIXED32:
+ reflection->SetUInt32(destination, mapping.Field, cell.Get<ui32>());
+ break;
+
+ case FieldDescriptor::TYPE_BOOL:
+ reflection->SetBool(destination, mapping.Field, cell.Get<bool>());
+ break;
+
+ case FieldDescriptor::TYPE_STRING:
+ reflection->SetString(destination, mapping.Field, TString(cell.AsStringRef()));
+ break;
+
+ case FieldDescriptor::TYPE_BYTES:
+ reflection->SetString(destination, mapping.Field, TString(cell.AsStringRef()));
+ break;
+
+ case FieldDescriptor::TYPE_MESSAGE: {
+ auto* nestedMessage = reflection->MutableMessage(destination, mapping.Field);
+ FillOutputMessage(cell, nestedMessage, mapping.NestedFields, enumPolicy);
+ } break;
+
+ default:
+ ythrow yexception() << "Unsupported protobuf type: "
+ << mapping.Field->type_name() << ", field: " << mapping.Field->name();
+ }
}
}
+}
- /**
- * Converts input messages to unboxed values.
- */
- class TInputConverter {
- protected:
- IWorker* Worker_;
- TVector<TFieldMapping> Mappings_;
- TPlainContainerCache Cache_;
- TMaybe<TString> TimestampColumn_;
- EEnumPolicy EnumPolicy_ = EEnumPolicy::Int32;
-
- public:
- explicit TInputConverter(const TProtobufRawInputSpec& inputSpec, IWorker* worker)
- : Worker_(worker)
- , TimestampColumn_(inputSpec.GetTimestampColumn())
- , EnumPolicy_(inputSpec.GetSchemaOptions().EnumPolicy)
- {
- FillFieldMappings(
- Worker_->GetInputType(), inputSpec.GetDescriptor(),
- Mappings_, TimestampColumn_,
- inputSpec.GetSchemaOptions().ListIsOptional,
- inputSpec.GetSchemaOptions().EnableRecursiveRenaming,
- inputSpec.GetSchemaOptions().FieldRenames
- );
- }
+/**
+ * Converts input messages to unboxed values.
+ */
+class TInputConverter {
+protected:
+ IWorker* Worker_;
+ TVector<TFieldMapping> Mappings_;
+ TPlainContainerCache Cache_;
+ TMaybe<TString> TimestampColumn_;
+ EEnumPolicy EnumPolicy_ = EEnumPolicy::Int32;
+
+public:
+ explicit TInputConverter(const TProtobufRawInputSpec& inputSpec, IWorker* worker)
+ : Worker_(worker)
+ , TimestampColumn_(inputSpec.GetTimestampColumn())
+ , EnumPolicy_(inputSpec.GetSchemaOptions().EnumPolicy)
+ {
+ FillFieldMappings(
+ Worker_->GetInputType(), inputSpec.GetDescriptor(),
+ Mappings_, TimestampColumn_,
+ inputSpec.GetSchemaOptions().ListIsOptional,
+ inputSpec.GetSchemaOptions().EnableRecursiveRenaming,
+ inputSpec.GetSchemaOptions().FieldRenames);
+ }
+
+public:
+ void DoConvert(const Message* message, TUnboxedValue& result) {
+ auto& holderFactory = Worker_->GetGraph().GetHolderFactory();
+ TUnboxedValue* items = nullptr;
+ result = Cache_.NewArray(holderFactory, static_cast<ui32>(Mappings_.size()), items);
+ FillInputValue(holderFactory, message, items, Mappings_, TimestampColumn_, Worker_->GetTimeProvider(), EnumPolicy_);
+ }
- public:
- void DoConvert(const Message* message, TUnboxedValue& result) {
- auto& holderFactory = Worker_->GetGraph().GetHolderFactory();
- TUnboxedValue* items = nullptr;
- result = Cache_.NewArray(holderFactory, static_cast<ui32>(Mappings_.size()), items);
- FillInputValue(holderFactory, message, items, Mappings_, TimestampColumn_, Worker_->GetTimeProvider(), EnumPolicy_);
+ void ClearCache() {
+ Cache_.Clear();
+ }
+};
+
+template <typename TOutputSpec>
+using OutputItemType = typename TOutputSpecTraits<TOutputSpec>::TOutputItemType;
+
+template <typename TOutputSpec>
+class TOutputConverter;
+
+/**
+ * Converts unboxed values to output messages (single-output program case).
+ */
+template <>
+class TOutputConverter<TProtobufRawOutputSpec> {
+protected:
+ IWorker* Worker_;
+ TVector<TFieldMapping> OutputColumns_;
+ TProtoHolder<Message> Message_;
+ EEnumPolicy EnumPolicy_ = EEnumPolicy::Int32;
+
+public:
+ explicit TOutputConverter(const TProtobufRawOutputSpec& outputSpec, IWorker* worker)
+ : Worker_(worker)
+ , EnumPolicy_(outputSpec.GetSchemaOptions().EnumPolicy)
+ {
+ if (!Worker_->GetOutputType()->IsStruct()) {
+ ythrow yexception() << "protobuf output spec does not support multiple outputs";
}
- void ClearCache() {
- Cache_.Clear();
+ FillFieldMappings(
+ static_cast<const NKikimr::NMiniKQL::TStructType*>(Worker_->GetOutputType()),
+ outputSpec.GetDescriptor(),
+ OutputColumns_,
+ Nothing(),
+ outputSpec.GetSchemaOptions().ListIsOptional,
+ outputSpec.GetSchemaOptions().EnableRecursiveRenaming,
+ outputSpec.GetSchemaOptions().FieldRenames);
+
+ auto* factory = outputSpec.GetFactory();
+
+ if (!factory) {
+ factory = MessageFactory::generated_factory();
}
- };
-
- template <typename TOutputSpec>
- using OutputItemType = typename TOutputSpecTraits<TOutputSpec>::TOutputItemType;
-
- template <typename TOutputSpec>
- class TOutputConverter;
-
- /**
- * Converts unboxed values to output messages (single-output program case).
- */
- template <>
- class TOutputConverter<TProtobufRawOutputSpec> {
- protected:
- IWorker* Worker_;
- TVector<TFieldMapping> OutputColumns_;
- TProtoHolder<Message> Message_;
- EEnumPolicy EnumPolicy_ = EEnumPolicy::Int32;
-
- public:
- explicit TOutputConverter(const TProtobufRawOutputSpec& outputSpec, IWorker* worker)
- : Worker_(worker)
- , EnumPolicy_(outputSpec.GetSchemaOptions().EnumPolicy)
- {
- if (!Worker_->GetOutputType()->IsStruct()) {
- ythrow yexception() << "protobuf output spec does not support multiple outputs";
- }
+
+ Message_.Reset(factory->GetPrototype(&outputSpec.GetDescriptor())->New(outputSpec.GetArena()));
+ }
+
+ OutputItemType<TProtobufRawOutputSpec> DoConvert(TUnboxedValue value) {
+ FillOutputMessage(value, Message_.Get(), OutputColumns_, EnumPolicy_);
+ return Message_.Get();
+ }
+};
+
+/*
+ * Converts unboxed values to output type (multi-output programs case).
+ */
+template <>
+class TOutputConverter<TProtobufRawMultiOutputSpec> {
+protected:
+ IWorker* Worker_;
+ TVector<TVector<TFieldMapping>> OutputColumns_;
+ TVector<TProtoHolder<Message>> Messages_;
+ EEnumPolicy EnumPolicy_ = EEnumPolicy::Int32;
+
+public:
+ explicit TOutputConverter(const TProtobufRawMultiOutputSpec& outputSpec, IWorker* worker)
+ : Worker_(worker)
+ , EnumPolicy_(outputSpec.GetSchemaOptions().EnumPolicy)
+ {
+ const auto* outputType = Worker_->GetOutputType();
+ Y_ENSURE(outputType->IsVariant(), "protobuf multi-output spec requires multi-output program");
+ const auto* variantType = static_cast<const NKikimr::NMiniKQL::TVariantType*>(outputType);
+ Y_ENSURE(
+ variantType->GetUnderlyingType()->IsTuple(),
+ "protobuf multi-output spec requires variant over tuple as program output type");
+ Y_ENSURE(
+ outputSpec.GetOutputsNumber() == variantType->GetAlternativesCount(),
+ "number of outputs provided by spec does not match number of variant alternatives");
+
+ auto defaultFactory = MessageFactory::generated_factory();
+
+ for (ui32 i = 0; i < variantType->GetAlternativesCount(); ++i) {
+ const auto* type = variantType->GetAlternativeType(i);
+ Y_ASSERT(type->IsStruct());
+ Y_ASSERT(OutputColumns_.size() == i && Messages_.size() == i);
+
+ OutputColumns_.push_back({});
FillFieldMappings(
- static_cast<const NKikimr::NMiniKQL::TStructType*>(Worker_->GetOutputType()),
- outputSpec.GetDescriptor(),
- OutputColumns_,
+ static_cast<const NKikimr::NMiniKQL::TStructType*>(type),
+ outputSpec.GetDescriptor(i),
+ OutputColumns_.back(),
Nothing(),
outputSpec.GetSchemaOptions().ListIsOptional,
- outputSpec.GetSchemaOptions().EnableRecursiveRenaming,
- outputSpec.GetSchemaOptions().FieldRenames
- );
-
- auto* factory = outputSpec.GetFactory();
+ false,
+ {});
+ auto factory = outputSpec.GetFactory(i);
if (!factory) {
- factory = MessageFactory::generated_factory();
+ factory = defaultFactory;
}
- Message_.Reset(factory->GetPrototype(&outputSpec.GetDescriptor())->New(outputSpec.GetArena()));
- }
-
- OutputItemType<TProtobufRawOutputSpec> DoConvert(TUnboxedValue value) {
- FillOutputMessage(value, Message_.Get(), OutputColumns_, EnumPolicy_);
- return Message_.Get();
+ Messages_.push_back(TProtoHolder<Message>(
+ factory->GetPrototype(&outputSpec.GetDescriptor(i))->New(outputSpec.GetArena(i))));
}
- };
-
- /*
- * Converts unboxed values to output type (multi-output programs case).
- */
- template <>
- class TOutputConverter<TProtobufRawMultiOutputSpec> {
- protected:
- IWorker* Worker_;
- TVector<TVector<TFieldMapping>> OutputColumns_;
- TVector<TProtoHolder<Message>> Messages_;
- EEnumPolicy EnumPolicy_ = EEnumPolicy::Int32;
-
- public:
- explicit TOutputConverter(const TProtobufRawMultiOutputSpec& outputSpec, IWorker* worker)
- : Worker_(worker)
- , EnumPolicy_(outputSpec.GetSchemaOptions().EnumPolicy)
- {
- const auto* outputType = Worker_->GetOutputType();
- Y_ENSURE(outputType->IsVariant(), "protobuf multi-output spec requires multi-output program");
- const auto* variantType = static_cast<const NKikimr::NMiniKQL::TVariantType*>(outputType);
- Y_ENSURE(
- variantType->GetUnderlyingType()->IsTuple(),
- "protobuf multi-output spec requires variant over tuple as program output type"
- );
- Y_ENSURE(
- outputSpec.GetOutputsNumber() == variantType->GetAlternativesCount(),
- "number of outputs provided by spec does not match number of variant alternatives"
- );
-
- auto defaultFactory = MessageFactory::generated_factory();
-
- for (ui32 i = 0; i < variantType->GetAlternativesCount(); ++i) {
- const auto* type = variantType->GetAlternativeType(i);
- Y_ASSERT(type->IsStruct());
- Y_ASSERT(OutputColumns_.size() == i && Messages_.size() == i);
-
- OutputColumns_.push_back({});
-
- FillFieldMappings(
- static_cast<const NKikimr::NMiniKQL::TStructType*>(type),
- outputSpec.GetDescriptor(i),
- OutputColumns_.back(),
- Nothing(),
- outputSpec.GetSchemaOptions().ListIsOptional,
- false,
- {}
- );
-
- auto factory = outputSpec.GetFactory(i);
- if (!factory) {
- factory = defaultFactory;
- }
+ }
- Messages_.push_back(TProtoHolder<Message>(
- factory->GetPrototype(&outputSpec.GetDescriptor(i))->New(outputSpec.GetArena(i))
- ));
- }
- }
+ OutputItemType<TProtobufRawMultiOutputSpec> DoConvert(TUnboxedValue value) {
+ auto index = value.GetVariantIndex();
+ auto msgPtr = Messages_[index].Get();
+ FillOutputMessage(value.GetVariantItem(), msgPtr, OutputColumns_[index], EnumPolicy_);
+ return {index, msgPtr};
+ }
+};
+
+/**
+ * List (or, better, stream) of unboxed values. Used as an input value in pull workers.
+ */
+class TProtoListValue final: public TCustomListValue {
+private:
+ mutable bool HasIterator_ = false;
+ THolder<IStream<Message*>> Underlying_;
+ TInputConverter Converter_;
+ IWorker* Worker_;
+ TScopedAlloc& ScopedAlloc_;
+
+public:
+ TProtoListValue(
+ TMemoryUsageInfo* memInfo,
+ const TProtobufRawInputSpec& inputSpec,
+ THolder<IStream<Message*>> underlying,
+ IWorker* worker)
+ : TCustomListValue(memInfo)
+ , Underlying_(std::move(underlying))
+ , Converter_(inputSpec, worker)
+ , Worker_(worker)
+ , ScopedAlloc_(Worker_->GetScopedAlloc())
+ {
+ }
- OutputItemType<TProtobufRawMultiOutputSpec> DoConvert(TUnboxedValue value) {
- auto index = value.GetVariantIndex();
- auto msgPtr = Messages_[index].Get();
- FillOutputMessage(value.GetVariantItem(), msgPtr, OutputColumns_[index], EnumPolicy_);
- return {index, msgPtr};
- }
- };
-
- /**
- * List (or, better, stream) of unboxed values. Used as an input value in pull workers.
- */
- class TProtoListValue final: public TCustomListValue {
- private:
- mutable bool HasIterator_ = false;
- THolder<IStream<Message*>> Underlying_;
- TInputConverter Converter_;
- IWorker* Worker_;
- TScopedAlloc& ScopedAlloc_;
-
- public:
- TProtoListValue(
- TMemoryUsageInfo* memInfo,
- const TProtobufRawInputSpec& inputSpec,
- THolder<IStream<Message*>> underlying,
- IWorker* worker
- )
- : TCustomListValue(memInfo)
- , Underlying_(std::move(underlying))
- , Converter_(inputSpec, worker)
- , Worker_(worker)
- , ScopedAlloc_(Worker_->GetScopedAlloc())
+ ~TProtoListValue() override {
{
+ // This list value stored in the worker's computation graph and destroyed upon the computation
+ // graph's destruction. This brings us to an interesting situation: scoped alloc is acquired,
+ // worker and computation graph are half-way destroyed, and now it's our turn to die. The problem is,
+ // the underlying stream may own another worker. This happens when chaining programs. Now, to destroy
+ // that worker correctly, we need to release our scoped alloc (because that worker has its own
+ // computation graph and scoped alloc).
+ // By the way, note that we shouldn't interact with the worker here because worker is in the middle of
+ // its own destruction. So we're using our own reference to the scoped alloc. That reference is alive
+ // because scoped alloc destroyed after computation graph.
+ auto unguard = Unguard(ScopedAlloc_);
+ Underlying_.Destroy();
}
+ }
- ~TProtoListValue() override {
- {
- // This list value stored in the worker's computation graph and destroyed upon the computation
- // graph's destruction. This brings us to an interesting situation: scoped alloc is acquired,
- // worker and computation graph are half-way destroyed, and now it's our turn to die. The problem is,
- // the underlying stream may own another worker. This happens when chaining programs. Now, to destroy
- // that worker correctly, we need to release our scoped alloc (because that worker has its own
- // computation graph and scoped alloc).
- // By the way, note that we shouldn't interact with the worker here because worker is in the middle of
- // its own destruction. So we're using our own reference to the scoped alloc. That reference is alive
- // because scoped alloc destroyed after computation graph.
- auto unguard = Unguard(ScopedAlloc_);
- Underlying_.Destroy();
- }
- }
+public:
+ TUnboxedValue GetListIterator() const override {
+ YQL_ENSURE(!HasIterator_, "Only one pass over input is supported");
+ HasIterator_ = true;
+ return TUnboxedValuePod(const_cast<TProtoListValue*>(this));
+ }
- public:
- TUnboxedValue GetListIterator() const override {
- YQL_ENSURE(!HasIterator_, "Only one pass over input is supported");
- HasIterator_ = true;
- return TUnboxedValuePod(const_cast<TProtoListValue*>(this));
+ bool Next(TUnboxedValue& result) override {
+ const Message* message;
+ {
+ auto unguard = Unguard(ScopedAlloc_);
+ message = Underlying_->Fetch();
}
- bool Next(TUnboxedValue& result) override {
- const Message* message;
- {
- auto unguard = Unguard(ScopedAlloc_);
- message = Underlying_->Fetch();
- }
-
- if (!message) {
- return false;
- }
+ if (!message) {
+ return false;
+ }
- Converter_.DoConvert(message, result);
+ Converter_.DoConvert(message, result);
- return true;
- }
+ return true;
+ }
- EFetchStatus Fetch(TUnboxedValue& result) override {
- if (Next(result)) {
- return EFetchStatus::Ok;
- } else {
- return EFetchStatus::Finish;
- }
- }
- };
-
- /**
- * Consumer which converts messages to unboxed values and relays them to the worker. Used as a return value
- * of the push processor's Process function.
- */
- class TProtoConsumerImpl final: public IConsumer<Message*> {
- private:
- TWorkerHolder<IPushStreamWorker> WorkerHolder_;
- TInputConverter Converter_;
-
- public:
- explicit TProtoConsumerImpl(
- const TProtobufRawInputSpec& inputSpec,
- TWorkerHolder<IPushStreamWorker> worker
- )
- : WorkerHolder_(std::move(worker))
- , Converter_(inputSpec, WorkerHolder_.Get())
- {
+ EFetchStatus Fetch(TUnboxedValue& result) override {
+ if (Next(result)) {
+ return EFetchStatus::Ok;
+ } else {
+ return EFetchStatus::Finish;
}
+ }
+};
+
+/**
+ * Consumer which converts messages to unboxed values and relays them to the worker. Used as a return value
+ * of the push processor's Process function.
+ */
+class TProtoConsumerImpl final: public IConsumer<Message*> {
+private:
+ TWorkerHolder<IPushStreamWorker> WorkerHolder_;
+ TInputConverter Converter_;
+
+public:
+ explicit TProtoConsumerImpl(
+ const TProtobufRawInputSpec& inputSpec,
+ TWorkerHolder<IPushStreamWorker> worker)
+ : WorkerHolder_(std::move(worker))
+ , Converter_(inputSpec, WorkerHolder_.Get())
+ {
+ }
- ~TProtoConsumerImpl() override {
- with_lock(WorkerHolder_->GetScopedAlloc()) {
- Converter_.ClearCache();
- }
+ ~TProtoConsumerImpl() override {
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
+ Converter_.ClearCache();
}
+ }
- public:
- void OnObject(Message* message) override {
- TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
+public:
+ void OnObject(Message* message) override {
+ TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
- with_lock(WorkerHolder_->GetScopedAlloc()) {
- TUnboxedValue result;
- Converter_.DoConvert(message, result);
- WorkerHolder_->Push(std::move(result));
- }
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
+ TUnboxedValue result;
+ Converter_.DoConvert(message, result);
+ WorkerHolder_->Push(std::move(result));
}
+ }
- void OnFinish() override {
- TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
+ void OnFinish() override {
+ TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
- with_lock(WorkerHolder_->GetScopedAlloc()) {
- WorkerHolder_->OnFinish();
- }
- }
- };
-
- /**
- * Protobuf input stream for unboxed value streams.
- */
- template <typename TOutputSpec>
- class TRawProtoStreamImpl final: public IStream<OutputItemType<TOutputSpec>> {
- protected:
- TWorkerHolder<IPullStreamWorker> WorkerHolder_;
- TOutputConverter<TOutputSpec> Converter_;
-
- public:
- explicit TRawProtoStreamImpl(const TOutputSpec& outputSpec, TWorkerHolder<IPullStreamWorker> worker)
- : WorkerHolder_(std::move(worker))
- , Converter_(outputSpec, WorkerHolder_.Get())
- {
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
+ WorkerHolder_->OnFinish();
}
+ }
+};
- public:
- OutputItemType<TOutputSpec> Fetch() override {
- TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
+/**
+ * Protobuf input stream for unboxed value streams.
+ */
+template <typename TOutputSpec>
+class TRawProtoStreamImpl final: public IStream<OutputItemType<TOutputSpec>> {
+protected:
+ TWorkerHolder<IPullStreamWorker> WorkerHolder_;
+ TOutputConverter<TOutputSpec> Converter_;
+
+public:
+ explicit TRawProtoStreamImpl(const TOutputSpec& outputSpec, TWorkerHolder<IPullStreamWorker> worker)
+ : WorkerHolder_(std::move(worker))
+ , Converter_(outputSpec, WorkerHolder_.Get())
+ {
+ }
- with_lock(WorkerHolder_->GetScopedAlloc()) {
- TUnboxedValue value;
+public:
+ OutputItemType<TOutputSpec> Fetch() override {
+ TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
- auto status = WorkerHolder_->GetOutput().Fetch(value);
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
+ TUnboxedValue value;
- YQL_ENSURE(status != EFetchStatus::Yield, "Yield is not supported in pull mode");
+ auto status = WorkerHolder_->GetOutput().Fetch(value);
- if (status == EFetchStatus::Finish) {
- return TOutputSpecTraits<TOutputSpec>::StreamSentinel;
- }
+ YQL_ENSURE(status != EFetchStatus::Yield, "Yield is not supported in pull mode");
- return Converter_.DoConvert(value);
+ if (status == EFetchStatus::Finish) {
+ return TOutputSpecTraits<TOutputSpec>::StreamSentinel;
}
+
+ return Converter_.DoConvert(value);
}
- };
-
- /**
- * Protobuf input stream for unboxed value lists.
- */
- template <typename TOutputSpec>
- class TRawProtoListImpl final: public IStream<OutputItemType<TOutputSpec>> {
- protected:
- TWorkerHolder<IPullListWorker> WorkerHolder_;
- TOutputConverter<TOutputSpec> Converter_;
-
- public:
- explicit TRawProtoListImpl(const TOutputSpec& outputSpec, TWorkerHolder<IPullListWorker> worker)
- : WorkerHolder_(std::move(worker))
- , Converter_(outputSpec, WorkerHolder_.Get())
- {
- }
+ }
+};
- public:
- OutputItemType<TOutputSpec> Fetch() override {
- TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
+/**
+ * Protobuf input stream for unboxed value lists.
+ */
+template <typename TOutputSpec>
+class TRawProtoListImpl final: public IStream<OutputItemType<TOutputSpec>> {
+protected:
+ TWorkerHolder<IPullListWorker> WorkerHolder_;
+ TOutputConverter<TOutputSpec> Converter_;
+
+public:
+ explicit TRawProtoListImpl(const TOutputSpec& outputSpec, TWorkerHolder<IPullListWorker> worker)
+ : WorkerHolder_(std::move(worker))
+ , Converter_(outputSpec, WorkerHolder_.Get())
+ {
+ }
- with_lock(WorkerHolder_->GetScopedAlloc()) {
- TUnboxedValue value;
+public:
+ OutputItemType<TOutputSpec> Fetch() override {
+ TBindTerminator bind(WorkerHolder_->GetGraph().GetTerminator());
- if (!WorkerHolder_->GetOutputIterator().Next(value)) {
- return TOutputSpecTraits<TOutputSpec>::StreamSentinel;
- }
+ with_lock (WorkerHolder_->GetScopedAlloc()) {
+ TUnboxedValue value;
- return Converter_.DoConvert(value);
+ if (!WorkerHolder_->GetOutputIterator().Next(value)) {
+ return TOutputSpecTraits<TOutputSpec>::StreamSentinel;
}
+
+ return Converter_.DoConvert(value);
}
- };
-
- /**
- * Push relay used to convert generated unboxed value to a message and push it to the user's consumer.
- */
- template <typename TOutputSpec>
- class TPushRelayImpl: public IConsumer<const TUnboxedValue*> {
- private:
- THolder<IConsumer<OutputItemType<TOutputSpec>>> Underlying_;
- TOutputConverter<TOutputSpec> Converter_;
- IWorker* Worker_;
-
- public:
- TPushRelayImpl(
- const TOutputSpec& outputSpec,
- IPushStreamWorker* worker,
- THolder<IConsumer<OutputItemType<TOutputSpec>>> underlying
- )
- : Underlying_(std::move(underlying))
- , Converter_(outputSpec, worker)
- , Worker_(worker)
- {
- }
+ }
+};
+
+/**
+ * Push relay used to convert generated unboxed value to a message and push it to the user's consumer.
+ */
+template <typename TOutputSpec>
+class TPushRelayImpl: public IConsumer<const TUnboxedValue*> {
+private:
+ THolder<IConsumer<OutputItemType<TOutputSpec>>> Underlying_;
+ TOutputConverter<TOutputSpec> Converter_;
+ IWorker* Worker_;
+
+public:
+ TPushRelayImpl(
+ const TOutputSpec& outputSpec,
+ IPushStreamWorker* worker,
+ THolder<IConsumer<OutputItemType<TOutputSpec>>> underlying)
+ : Underlying_(std::move(underlying))
+ , Converter_(outputSpec, worker)
+ , Worker_(worker)
+ {
+ }
- // If you've read a comment in the TProtoListValue's destructor, you may be wondering why don't we do the
- // same trick here. Well, that's because in push mode, consumer is destroyed before acquiring scoped alloc and
- // destroying computation graph.
+ // If you've read a comment in the TProtoListValue's destructor, you may be wondering why don't we do the
+ // same trick here. Well, that's because in push mode, consumer is destroyed before acquiring scoped alloc and
+ // destroying computation graph.
- public:
- void OnObject(const TUnboxedValue* value) override {
- OutputItemType<TOutputSpec> message = Converter_.DoConvert(*value);
- auto unguard = Unguard(Worker_->GetScopedAlloc());
- Underlying_->OnObject(message);
- }
+public:
+ void OnObject(const TUnboxedValue* value) override {
+ OutputItemType<TOutputSpec> message = Converter_.DoConvert(*value);
+ auto unguard = Unguard(Worker_->GetScopedAlloc());
+ Underlying_->OnObject(message);
+ }
- void OnFinish() override {
- auto unguard = Unguard(Worker_->GetScopedAlloc());
- Underlying_->OnFinish();
- }
- };
-}
+ void OnFinish() override {
+ auto unguard = Unguard(Worker_->GetScopedAlloc());
+ Underlying_->OnFinish();
+ }
+};
+} // namespace
using ConsumerType = TInputSpecTraits<TProtobufRawInputSpec>::TConsumerType;
void TInputSpecTraits<TProtobufRawInputSpec>::PreparePullStreamWorker(
const TProtobufRawInputSpec& inputSpec,
IPullStreamWorker* worker,
- THolder<IStream<Message*>> stream
-) {
- with_lock(worker->GetScopedAlloc()) {
+ THolder<IStream<Message*>> stream) {
+ with_lock (worker->GetScopedAlloc()) {
worker->SetInput(
worker->GetGraph().GetHolderFactory().Create<TProtoListValue>(inputSpec, std::move(stream), worker), 0);
}
@@ -1021,9 +994,8 @@ void TInputSpecTraits<TProtobufRawInputSpec>::PreparePullStreamWorker(
void TInputSpecTraits<TProtobufRawInputSpec>::PreparePullListWorker(
const TProtobufRawInputSpec& inputSpec,
IPullListWorker* worker,
- THolder<IStream<Message*>> stream
-) {
- with_lock(worker->GetScopedAlloc()) {
+ THolder<IStream<Message*>> stream) {
+ with_lock (worker->GetScopedAlloc()) {
worker->SetInput(
worker->GetGraph().GetHolderFactory().Create<TProtoListValue>(inputSpec, std::move(stream), worker), 0);
}
@@ -1031,8 +1003,7 @@ void TInputSpecTraits<TProtobufRawInputSpec>::PreparePullListWorker(
ConsumerType TInputSpecTraits<TProtobufRawInputSpec>::MakeConsumer(
const TProtobufRawInputSpec& inputSpec,
- TWorkerHolder<IPushStreamWorker> worker
-) {
+ TWorkerHolder<IPushStreamWorker> worker) {
return MakeHolder<TProtoConsumerImpl>(inputSpec, std::move(worker));
}
@@ -1043,44 +1014,38 @@ using PullListReturnType = typename TOutputSpecTraits<TOutputSpec>::TPullListRet
PullStreamReturnType<TProtobufRawOutputSpec> TOutputSpecTraits<TProtobufRawOutputSpec>::ConvertPullStreamWorkerToOutputType(
const TProtobufRawOutputSpec& outputSpec,
- TWorkerHolder<IPullStreamWorker> worker
-) {
+ TWorkerHolder<IPullStreamWorker> worker) {
return MakeHolder<TRawProtoStreamImpl<TProtobufRawOutputSpec>>(outputSpec, std::move(worker));
}
PullListReturnType<TProtobufRawOutputSpec> TOutputSpecTraits<TProtobufRawOutputSpec>::ConvertPullListWorkerToOutputType(
const TProtobufRawOutputSpec& outputSpec,
- TWorkerHolder<IPullListWorker> worker
-) {
+ TWorkerHolder<IPullListWorker> worker) {
return MakeHolder<TRawProtoListImpl<TProtobufRawOutputSpec>>(outputSpec, std::move(worker));
}
void TOutputSpecTraits<TProtobufRawOutputSpec>::SetConsumerToWorker(
const TProtobufRawOutputSpec& outputSpec,
IPushStreamWorker* worker,
- THolder<IConsumer<TOutputItemType>> consumer
-) {
+ THolder<IConsumer<TOutputItemType>> consumer) {
worker->SetConsumer(MakeHolder<TPushRelayImpl<TProtobufRawOutputSpec>>(outputSpec, worker, std::move(consumer)));
}
PullStreamReturnType<TProtobufRawMultiOutputSpec> TOutputSpecTraits<TProtobufRawMultiOutputSpec>::ConvertPullStreamWorkerToOutputType(
const TProtobufRawMultiOutputSpec& outputSpec,
- TWorkerHolder<IPullStreamWorker> worker
-) {
+ TWorkerHolder<IPullStreamWorker> worker) {
return MakeHolder<TRawProtoStreamImpl<TProtobufRawMultiOutputSpec>>(outputSpec, std::move(worker));
}
PullListReturnType<TProtobufRawMultiOutputSpec> TOutputSpecTraits<TProtobufRawMultiOutputSpec>::ConvertPullListWorkerToOutputType(
const TProtobufRawMultiOutputSpec& outputSpec,
- TWorkerHolder<IPullListWorker> worker
-) {
+ TWorkerHolder<IPullListWorker> worker) {
return MakeHolder<TRawProtoListImpl<TProtobufRawMultiOutputSpec>>(outputSpec, std::move(worker));
}
void TOutputSpecTraits<TProtobufRawMultiOutputSpec>::SetConsumerToWorker(
const TProtobufRawMultiOutputSpec& outputSpec,
IPushStreamWorker* worker,
- THolder<IConsumer<TOutputItemType>> consumer
-) {
+ THolder<IConsumer<TOutputItemType>> consumer) {
worker->SetConsumer(MakeHolder<TPushRelayImpl<TProtobufRawMultiOutputSpec>>(outputSpec, worker, std::move(consumer)));
}
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.h b/yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.h
index 436b243bffd..a2ef2829a10 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.h
+++ b/yql/essentials/public/purecalc/io_specs/protobuf_raw/spec.h
@@ -8,250 +8,247 @@
#include <util/generic/maybe.h>
namespace NYql {
- namespace NPureCalc {
- /**
- * Processing mode for working with raw protobuf message inputs.
- *
- * In this mode purecalc accept pointers to abstract protobuf messages and processes them using the reflection
- * mechanism. All passed messages should have the same descriptor (the one you pass to the constructor
- * of the input spec).
- *
- * All working modes are implemented. In pull stream and pull list modes a program would accept a single object
- * stream of const protobuf messages. In push mode, a program will return a consumer of const protobuf messages.
- *
- * The program synopsis follows:
- *
- * @code
- * ... TPullStreamProgram::Apply(IStream<google::protobuf::Message*>);
- * ... TPullListProgram::Apply(IStream<google::protobuf::Message*>);
- * TConsumer<google::protobuf::Message*> TPushStreamProgram::Apply(...);
- * @endcode
- */
- class TProtobufRawInputSpec: public TInputSpecBase {
- private:
- const google::protobuf::Descriptor& Descriptor_;
- const TMaybe<TString> TimestampColumn_;
- const TProtoSchemaOptions SchemaOptions_;
- mutable TVector<NYT::TNode> SavedSchemas_;
-
- public:
- /**
- * Build input spec and associate the given message descriptor.
- */
- explicit TProtobufRawInputSpec(
- const google::protobuf::Descriptor& descriptor,
- const TMaybe<TString>& timestampColumn = Nothing(),
- const TProtoSchemaOptions& options = {}
- );
-
- public:
- const TVector<NYT::TNode>& GetSchemas() const override;
-
- /**
- * Get the descriptor associated with this spec.
- */
- const google::protobuf::Descriptor& GetDescriptor() const;
-
- const TMaybe<TString>& GetTimestampColumn() const;
-
- /*
- * Get options that customize input struct type building.
- */
- const TProtoSchemaOptions& GetSchemaOptions() const;
- };
-
- /**
- * Processing mode for working with raw protobuf message outputs.
- *
- * In this mode purecalc yields pointers to abstract protobuf messages. All generated messages share the same
- * descriptor so they can be safely converted into an appropriate message type.
- *
- * Note that one should not expect that the returned pointer will be valid forever; in can (and will) become
- * outdated once a new output is requested/pushed.
- *
- * All working modes are implemented. In pull stream and pull list modes a program will return an object
- * stream of non-const protobuf messages. In push mode, it will accept a single consumer of non-const
- * messages.
- *
- * The program synopsis follows:
- *
- * @code
- * IStream<google::protobuf::Message*> TPullStreamProgram::Apply(...);
- * IStream<google::protobuf::Message*> TPullListProgram::Apply(...);
- * ... TPushStreamProgram::Apply(TConsumer<google::protobuf::Message*>);
- * @endcode
- */
- class TProtobufRawOutputSpec: public TOutputSpecBase {
- private:
- const google::protobuf::Descriptor& Descriptor_;
- google::protobuf::MessageFactory* Factory_;
- TProtoSchemaOptions SchemaOptions_;
- google::protobuf::Arena* Arena_;
- mutable TMaybe<NYT::TNode> SavedSchema_;
-
- public:
- /**
- * Build output spec and associate the given message descriptor and maybe the given message factory.
- */
- explicit TProtobufRawOutputSpec(
- const google::protobuf::Descriptor& descriptor,
- google::protobuf::MessageFactory* = nullptr,
- const TProtoSchemaOptions& options = {},
- google::protobuf::Arena* arena = nullptr
- );
-
- public:
- const NYT::TNode& GetSchema() const override;
-
- /**
- * Get the descriptor associated with this spec.
- */
- const google::protobuf::Descriptor& GetDescriptor() const;
-
- /**
- * Set a new message factory which will be used to generate messages. Pass a null pointer to use the
- * default factory.
- */
- void SetFactory(google::protobuf::MessageFactory*);
-
- /**
- * Get the message factory which is currently associated with this spec.
- */
- google::protobuf::MessageFactory* GetFactory() const;
-
- /**
- * Set a new arena which will be used to generate messages. Pass a null pointer to create on the heap.
- */
- void SetArena(google::protobuf::Arena*);
-
- /**
- * Get the arena which is currently associated with this spec.
- */
- google::protobuf::Arena* GetArena() const;
-
- /**
- * Get options that customize output struct type building.
- */
- const TProtoSchemaOptions& GetSchemaOptions() const;
- };
-
- /**
- * Processing mode for working with raw protobuf messages and several outputs.
- *
- * The program synopsis follows:
- *
- * @code
- * IStream<std::pair<ui32, google::protobuf::Message*>> TPullStreamProgram::Apply(...);
- * IStream<std::pair<ui32, google::protobuf::Message*>> TPullListProgram::Apply(...);
- * ... TPushStreamProgram::Apply(TConsumer<std::pair<ui32, google::protobuf::Message*>>);
- * @endcode
- */
- class TProtobufRawMultiOutputSpec: public TOutputSpecBase {
- private:
- TVector<const google::protobuf::Descriptor*> Descriptors_;
- TVector<google::protobuf::MessageFactory*> Factories_;
- const TProtoSchemaOptions SchemaOptions_;
- TVector<google::protobuf::Arena*> Arenas_;
- mutable NYT::TNode SavedSchema_;
-
- public:
- TProtobufRawMultiOutputSpec(
- TVector<const google::protobuf::Descriptor*>,
- TMaybe<TVector<google::protobuf::MessageFactory*>> = {},
- const TProtoSchemaOptions& options = {},
- TMaybe<TVector<google::protobuf::Arena*>> arenas = {}
- );
-
- public:
- const NYT::TNode& GetSchema() const override;
-
- /**
- * Get the descriptor associated with given output.
- */
- const google::protobuf::Descriptor& GetDescriptor(ui32) const;
-
- /**
- * Set a new message factory for given output. It will be used to generate messages for this output.
- */
- void SetFactory(ui32, google::protobuf::MessageFactory*);
-
- /**
- * Get the message factory which is currently associated with given output.
- */
- google::protobuf::MessageFactory* GetFactory(ui32) const;
-
- /**
- * Set a new arena for given output. It will be used to generate messages for this output.
- */
- void SetArena(ui32, google::protobuf::Arena*);
-
- /**
- * Get the arena which is currently associated with given output.
- */
- google::protobuf::Arena* GetArena(ui32) const;
-
- /**
- * Get number of outputs for this spec.
- */
- ui32 GetOutputsNumber() const;
-
- /**
- * Get options that customize output struct type building.
- */
- const TProtoSchemaOptions& GetSchemaOptions() const;
- };
-
- template <>
- struct TInputSpecTraits<TProtobufRawInputSpec> {
- static const constexpr bool IsPartial = false;
-
- static const constexpr bool SupportPullStreamMode = true;
- static const constexpr bool SupportPullListMode = true;
- static const constexpr bool SupportPushStreamMode = true;
-
- using TConsumerType = THolder<IConsumer<google::protobuf::Message*>>;
-
- static void PreparePullStreamWorker(const TProtobufRawInputSpec&, IPullStreamWorker*, THolder<IStream<google::protobuf::Message*>>);
- static void PreparePullListWorker(const TProtobufRawInputSpec&, IPullListWorker*, THolder<IStream<google::protobuf::Message*>>);
- static TConsumerType MakeConsumer(const TProtobufRawInputSpec&, TWorkerHolder<IPushStreamWorker>);
- };
-
- template <>
- struct TOutputSpecTraits<TProtobufRawOutputSpec> {
- static const constexpr bool IsPartial = false;
-
- static const constexpr bool SupportPullStreamMode = true;
- static const constexpr bool SupportPullListMode = true;
- static const constexpr bool SupportPushStreamMode = true;
-
- using TOutputItemType = google::protobuf::Message*;
- using TPullStreamReturnType = THolder<IStream<TOutputItemType>>;
- using TPullListReturnType = THolder<IStream<TOutputItemType>>;
-
- static const constexpr TOutputItemType StreamSentinel = nullptr;
-
- static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const TProtobufRawOutputSpec&, TWorkerHolder<IPullStreamWorker>);
- static TPullListReturnType ConvertPullListWorkerToOutputType(const TProtobufRawOutputSpec&, TWorkerHolder<IPullListWorker>);
- static void SetConsumerToWorker(const TProtobufRawOutputSpec&, IPushStreamWorker*, THolder<IConsumer<TOutputItemType>>);
- };
-
- template <>
- struct TOutputSpecTraits<TProtobufRawMultiOutputSpec> {
- static const constexpr bool IsPartial = false;
-
- static const constexpr bool SupportPullStreamMode = true;
- static const constexpr bool SupportPullListMode = true;
- static const constexpr bool SupportPushStreamMode = true;
-
- using TOutputItemType = std::pair<ui32, google::protobuf::Message*>;
- using TPullStreamReturnType = THolder<IStream<TOutputItemType>>;
- using TPullListReturnType = THolder<IStream<TOutputItemType>>;
-
- static const constexpr TOutputItemType StreamSentinel = {0, nullptr};
-
- static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const TProtobufRawMultiOutputSpec&, TWorkerHolder<IPullStreamWorker>);
- static TPullListReturnType ConvertPullListWorkerToOutputType(const TProtobufRawMultiOutputSpec&, TWorkerHolder<IPullListWorker>);
- static void SetConsumerToWorker(const TProtobufRawMultiOutputSpec&, IPushStreamWorker*, THolder<IConsumer<TOutputItemType>>);
- };
- }
-}
+namespace NPureCalc {
+/**
+ * Processing mode for working with raw protobuf message inputs.
+ *
+ * In this mode purecalc accept pointers to abstract protobuf messages and processes them using the reflection
+ * mechanism. All passed messages should have the same descriptor (the one you pass to the constructor
+ * of the input spec).
+ *
+ * All working modes are implemented. In pull stream and pull list modes a program would accept a single object
+ * stream of const protobuf messages. In push mode, a program will return a consumer of const protobuf messages.
+ *
+ * The program synopsis follows:
+ *
+ * @code
+ * ... TPullStreamProgram::Apply(IStream<google::protobuf::Message*>);
+ * ... TPullListProgram::Apply(IStream<google::protobuf::Message*>);
+ * TConsumer<google::protobuf::Message*> TPushStreamProgram::Apply(...);
+ * @endcode
+ */
+class TProtobufRawInputSpec: public TInputSpecBase {
+private:
+ const google::protobuf::Descriptor& Descriptor_;
+ const TMaybe<TString> TimestampColumn_;
+ const TProtoSchemaOptions SchemaOptions_;
+ mutable TVector<NYT::TNode> SavedSchemas_;
+
+public:
+ /**
+ * Build input spec and associate the given message descriptor.
+ */
+ explicit TProtobufRawInputSpec(
+ const google::protobuf::Descriptor& descriptor,
+ const TMaybe<TString>& timestampColumn = Nothing(),
+ const TProtoSchemaOptions& options = {});
+
+public:
+ const TVector<NYT::TNode>& GetSchemas() const override;
+
+ /**
+ * Get the descriptor associated with this spec.
+ */
+ const google::protobuf::Descriptor& GetDescriptor() const;
+
+ const TMaybe<TString>& GetTimestampColumn() const;
+
+ /*
+ * Get options that customize input struct type building.
+ */
+ const TProtoSchemaOptions& GetSchemaOptions() const;
+};
+
+/**
+ * Processing mode for working with raw protobuf message outputs.
+ *
+ * In this mode purecalc yields pointers to abstract protobuf messages. All generated messages share the same
+ * descriptor so they can be safely converted into an appropriate message type.
+ *
+ * Note that one should not expect that the returned pointer will be valid forever; in can (and will) become
+ * outdated once a new output is requested/pushed.
+ *
+ * All working modes are implemented. In pull stream and pull list modes a program will return an object
+ * stream of non-const protobuf messages. In push mode, it will accept a single consumer of non-const
+ * messages.
+ *
+ * The program synopsis follows:
+ *
+ * @code
+ * IStream<google::protobuf::Message*> TPullStreamProgram::Apply(...);
+ * IStream<google::protobuf::Message*> TPullListProgram::Apply(...);
+ * ... TPushStreamProgram::Apply(TConsumer<google::protobuf::Message*>);
+ * @endcode
+ */
+class TProtobufRawOutputSpec: public TOutputSpecBase {
+private:
+ const google::protobuf::Descriptor& Descriptor_;
+ google::protobuf::MessageFactory* Factory_;
+ TProtoSchemaOptions SchemaOptions_;
+ google::protobuf::Arena* Arena_;
+ mutable TMaybe<NYT::TNode> SavedSchema_;
+
+public:
+ /**
+ * Build output spec and associate the given message descriptor and maybe the given message factory.
+ */
+ explicit TProtobufRawOutputSpec(
+ const google::protobuf::Descriptor& descriptor,
+ google::protobuf::MessageFactory* = nullptr,
+ const TProtoSchemaOptions& options = {},
+ google::protobuf::Arena* arena = nullptr);
+
+public:
+ const NYT::TNode& GetSchema() const override;
+
+ /**
+ * Get the descriptor associated with this spec.
+ */
+ const google::protobuf::Descriptor& GetDescriptor() const;
+
+ /**
+ * Set a new message factory which will be used to generate messages. Pass a null pointer to use the
+ * default factory.
+ */
+ void SetFactory(google::protobuf::MessageFactory*);
+
+ /**
+ * Get the message factory which is currently associated with this spec.
+ */
+ google::protobuf::MessageFactory* GetFactory() const;
+
+ /**
+ * Set a new arena which will be used to generate messages. Pass a null pointer to create on the heap.
+ */
+ void SetArena(google::protobuf::Arena*);
+
+ /**
+ * Get the arena which is currently associated with this spec.
+ */
+ google::protobuf::Arena* GetArena() const;
+
+ /**
+ * Get options that customize output struct type building.
+ */
+ const TProtoSchemaOptions& GetSchemaOptions() const;
+};
+
+/**
+ * Processing mode for working with raw protobuf messages and several outputs.
+ *
+ * The program synopsis follows:
+ *
+ * @code
+ * IStream<std::pair<ui32, google::protobuf::Message*>> TPullStreamProgram::Apply(...);
+ * IStream<std::pair<ui32, google::protobuf::Message*>> TPullListProgram::Apply(...);
+ * ... TPushStreamProgram::Apply(TConsumer<std::pair<ui32, google::protobuf::Message*>>);
+ * @endcode
+ */
+class TProtobufRawMultiOutputSpec: public TOutputSpecBase {
+private:
+ TVector<const google::protobuf::Descriptor*> Descriptors_;
+ TVector<google::protobuf::MessageFactory*> Factories_;
+ const TProtoSchemaOptions SchemaOptions_;
+ TVector<google::protobuf::Arena*> Arenas_;
+ mutable NYT::TNode SavedSchema_;
+
+public:
+ TProtobufRawMultiOutputSpec(
+ TVector<const google::protobuf::Descriptor*>,
+ TMaybe<TVector<google::protobuf::MessageFactory*>> = {},
+ const TProtoSchemaOptions& options = {},
+ TMaybe<TVector<google::protobuf::Arena*>> arenas = {});
+
+public:
+ const NYT::TNode& GetSchema() const override;
+
+ /**
+ * Get the descriptor associated with given output.
+ */
+ const google::protobuf::Descriptor& GetDescriptor(ui32) const;
+
+ /**
+ * Set a new message factory for given output. It will be used to generate messages for this output.
+ */
+ void SetFactory(ui32, google::protobuf::MessageFactory*);
+
+ /**
+ * Get the message factory which is currently associated with given output.
+ */
+ google::protobuf::MessageFactory* GetFactory(ui32) const;
+
+ /**
+ * Set a new arena for given output. It will be used to generate messages for this output.
+ */
+ void SetArena(ui32, google::protobuf::Arena*);
+
+ /**
+ * Get the arena which is currently associated with given output.
+ */
+ google::protobuf::Arena* GetArena(ui32) const;
+
+ /**
+ * Get number of outputs for this spec.
+ */
+ ui32 GetOutputsNumber() const;
+
+ /**
+ * Get options that customize output struct type building.
+ */
+ const TProtoSchemaOptions& GetSchemaOptions() const;
+};
+
+template <>
+struct TInputSpecTraits<TProtobufRawInputSpec> {
+ static const constexpr bool IsPartial = false;
+
+ static const constexpr bool SupportPullStreamMode = true;
+ static const constexpr bool SupportPullListMode = true;
+ static const constexpr bool SupportPushStreamMode = true;
+
+ using TConsumerType = THolder<IConsumer<google::protobuf::Message*>>;
+
+ static void PreparePullStreamWorker(const TProtobufRawInputSpec&, IPullStreamWorker*, THolder<IStream<google::protobuf::Message*>>);
+ static void PreparePullListWorker(const TProtobufRawInputSpec&, IPullListWorker*, THolder<IStream<google::protobuf::Message*>>);
+ static TConsumerType MakeConsumer(const TProtobufRawInputSpec&, TWorkerHolder<IPushStreamWorker>);
+};
+
+template <>
+struct TOutputSpecTraits<TProtobufRawOutputSpec> {
+ static const constexpr bool IsPartial = false;
+
+ static const constexpr bool SupportPullStreamMode = true;
+ static const constexpr bool SupportPullListMode = true;
+ static const constexpr bool SupportPushStreamMode = true;
+
+ using TOutputItemType = google::protobuf::Message*;
+ using TPullStreamReturnType = THolder<IStream<TOutputItemType>>;
+ using TPullListReturnType = THolder<IStream<TOutputItemType>>;
+
+ static const constexpr TOutputItemType StreamSentinel = nullptr;
+
+ static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const TProtobufRawOutputSpec&, TWorkerHolder<IPullStreamWorker>);
+ static TPullListReturnType ConvertPullListWorkerToOutputType(const TProtobufRawOutputSpec&, TWorkerHolder<IPullListWorker>);
+ static void SetConsumerToWorker(const TProtobufRawOutputSpec&, IPushStreamWorker*, THolder<IConsumer<TOutputItemType>>);
+};
+
+template <>
+struct TOutputSpecTraits<TProtobufRawMultiOutputSpec> {
+ static const constexpr bool IsPartial = false;
+
+ static const constexpr bool SupportPullStreamMode = true;
+ static const constexpr bool SupportPullListMode = true;
+ static const constexpr bool SupportPushStreamMode = true;
+
+ using TOutputItemType = std::pair<ui32, google::protobuf::Message*>;
+ using TPullStreamReturnType = THolder<IStream<TOutputItemType>>;
+ using TPullListReturnType = THolder<IStream<TOutputItemType>>;
+
+ static const constexpr TOutputItemType StreamSentinel = {0, nullptr};
+
+ static TPullStreamReturnType ConvertPullStreamWorkerToOutputType(const TProtobufRawMultiOutputSpec&, TWorkerHolder<IPullStreamWorker>);
+ static TPullListReturnType ConvertPullListWorkerToOutputType(const TProtobufRawMultiOutputSpec&, TWorkerHolder<IPullListWorker>);
+ static void SetConsumerToWorker(const TProtobufRawMultiOutputSpec&, IPushStreamWorker*, THolder<IConsumer<TOutputItemType>>);
+};
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/io_specs/protobuf_raw/ya.make b/yql/essentials/public/purecalc/io_specs/protobuf_raw/ya.make
index db3fab7e7a5..7b917148e2e 100644
--- a/yql/essentials/public/purecalc/io_specs/protobuf_raw/ya.make
+++ b/yql/essentials/public/purecalc/io_specs/protobuf_raw/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
PEERDIR(
yql/essentials/public/purecalc/common
yql/essentials/public/purecalc/helpers/protobuf
diff --git a/yql/essentials/public/purecalc/no_llvm/purecalc.h b/yql/essentials/public/purecalc/no_llvm/purecalc.h
index 9b281a7caa7..83bd8a7b842 100644
--- a/yql/essentials/public/purecalc/no_llvm/purecalc.h
+++ b/yql/essentials/public/purecalc/no_llvm/purecalc.h
@@ -1,4 +1,3 @@
#pragma once
#include "common/interface.h"
-
diff --git a/yql/essentials/public/purecalc/no_llvm/ya.make b/yql/essentials/public/purecalc/no_llvm/ya.make
index 1cff51e09eb..84a73440c5c 100644
--- a/yql/essentials/public/purecalc/no_llvm/ya.make
+++ b/yql/essentials/public/purecalc/no_llvm/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
ADDINCL(
yql/essentials/public/purecalc
)
diff --git a/yql/essentials/public/purecalc/ut/empty_stream.h b/yql/essentials/public/purecalc/ut/empty_stream.h
index 8d10e647aee..64c3954f8e7 100644
--- a/yql/essentials/public/purecalc/ut/empty_stream.h
+++ b/yql/essentials/public/purecalc/ut/empty_stream.h
@@ -3,18 +3,18 @@
#include <yql/essentials/public/purecalc/purecalc.h>
namespace NYql {
- namespace NPureCalc {
- template <typename T>
- class TEmptyStreamImpl: public IStream<T> {
- public:
- T Fetch() override {
- return nullptr;
- }
- };
-
- template <typename T>
- THolder<IStream<T>> EmptyStream() {
- return MakeHolder<TEmptyStreamImpl<T>>();
- }
+namespace NPureCalc {
+template <typename T>
+class TEmptyStreamImpl: public IStream<T> {
+public:
+ T Fetch() override {
+ return nullptr;
}
+};
+
+template <typename T>
+THolder<IStream<T>> EmptyStream() {
+ return MakeHolder<TEmptyStreamImpl<T>>();
}
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/ut/fake_spec.cpp b/yql/essentials/public/purecalc/ut/fake_spec.cpp
index 8acdbcfb347..12bbeb51340 100644
--- a/yql/essentials/public/purecalc/ut/fake_spec.cpp
+++ b/yql/essentials/public/purecalc/ut/fake_spec.cpp
@@ -1,82 +1,80 @@
#include "fake_spec.h"
namespace NYql {
- namespace NPureCalc {
- NYT::TNode MakeFakeSchema(bool pg) {
- auto itemType = NYT::TNode::CreateList();
- itemType.Add(pg ? "PgType" : "DataType");
- itemType.Add(pg ? "int4" : "Int32");
+namespace NPureCalc {
+NYT::TNode MakeFakeSchema(bool pg) {
+ auto itemType = NYT::TNode::CreateList();
+ itemType.Add(pg ? "PgType" : "DataType");
+ itemType.Add(pg ? "int4" : "Int32");
- auto itemNode = NYT::TNode::CreateList();
- itemNode.Add("Name");
- itemNode.Add(std::move(itemType));
+ auto itemNode = NYT::TNode::CreateList();
+ itemNode.Add("Name");
+ itemNode.Add(std::move(itemType));
- auto items = NYT::TNode::CreateList();
- items.Add(std::move(itemNode));
+ auto items = NYT::TNode::CreateList();
+ items.Add(std::move(itemNode));
- auto schema = NYT::TNode::CreateList();
- schema.Add("StructType");
- schema.Add(std::move(items));
+ auto schema = NYT::TNode::CreateList();
+ schema.Add("StructType");
+ schema.Add(std::move(items));
- return schema;
- }
+ return schema;
+}
- TFakeInputSpec FakeIS(ui32 inputsNumber, bool pg) {
- auto spec = TFakeInputSpec();
- spec.Schemas = TVector<NYT::TNode>(inputsNumber, MakeFakeSchema(pg));
- return spec;
- }
+TFakeInputSpec FakeIS(ui32 inputsNumber, bool pg) {
+ auto spec = TFakeInputSpec();
+ spec.Schemas = TVector<NYT::TNode>(inputsNumber, MakeFakeSchema(pg));
+ return spec;
+}
- TFakeOutputSpec FakeOS(bool pg) {
- auto spec = TFakeOutputSpec();
- spec.Schema = MakeFakeSchema(pg);
- return spec;
- }
+TFakeOutputSpec FakeOS(bool pg) {
+ auto spec = TFakeOutputSpec();
+ spec.Schema = MakeFakeSchema(pg);
+ return spec;
+}
- NYT::TNode CreateTypeNode(const TString& fieldType) {
- return NYT::TNode::CreateList()
- .Add("DataType")
- .Add(fieldType);
- }
+NYT::TNode CreateTypeNode(const TString& fieldType) {
+ return NYT::TNode::CreateList()
+ .Add("DataType")
+ .Add(fieldType);
+}
- NYT::TNode CreateOptionalTypeNode(const TString& fieldType) {
- return NYT::TNode::CreateList()
- .Add("OptionalType")
- .Add(CreateTypeNode(fieldType));
- }
+NYT::TNode CreateOptionalTypeNode(const TString& fieldType) {
+ return NYT::TNode::CreateList()
+ .Add("OptionalType")
+ .Add(CreateTypeNode(fieldType));
+}
- void AddField(NYT::TNode& node, const TString& fieldName, const TString& fieldType) {
- node.Add(
- NYT::TNode::CreateList()
- .Add(fieldName)
- .Add(CreateOptionalTypeNode(fieldType))
- );
- }
+void AddField(NYT::TNode& node, const TString& fieldName, const TString& fieldType) {
+ node.Add(
+ NYT::TNode::CreateList()
+ .Add(fieldName)
+ .Add(CreateOptionalTypeNode(fieldType)));
+}
- NYT::TNode MakeFakeStructSchema() {
- auto structMembers = NYT::TNode::CreateList();
- AddField(structMembers, "Id", "Uint32");
- AddField(structMembers, "Name", "Utf8");
- AddField(structMembers, "Body", "String");
+NYT::TNode MakeFakeStructSchema() {
+ auto structMembers = NYT::TNode::CreateList();
+ AddField(structMembers, "Id", "Uint32");
+ AddField(structMembers, "Name", "Utf8");
+ AddField(structMembers, "Body", "String");
- auto rootMembers = NYT::TNode::CreateList();
- rootMembers.Add(
- NYT::TNode::CreateList()
- .Add("_r")
- .Add(NYT::TNode::CreateList()
- .Add("StructType")
- .Add(std::move(structMembers)))
- );
+ auto rootMembers = NYT::TNode::CreateList();
+ rootMembers.Add(
+ NYT::TNode::CreateList()
+ .Add("_r")
+ .Add(NYT::TNode::CreateList()
+ .Add("StructType")
+ .Add(std::move(structMembers))));
- return NYT::TNode::CreateList()
- .Add("StructType")
- .Add(std::move(rootMembers));
- }
+ return NYT::TNode::CreateList()
+ .Add("StructType")
+ .Add(std::move(rootMembers));
+}
- TFakeOutputSpec FakeStructOS() {
- auto spec = TFakeOutputSpec();
- spec.Schema = MakeFakeStructSchema();
- return spec;
- }
- }
+TFakeOutputSpec FakeStructOS() {
+ auto spec = TFakeOutputSpec();
+ spec.Schema = MakeFakeStructSchema();
+ return spec;
}
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/ut/fake_spec.h b/yql/essentials/public/purecalc/ut/fake_spec.h
index 5f2ea310821..9e54c6a4139 100644
--- a/yql/essentials/public/purecalc/ut/fake_spec.h
+++ b/yql/essentials/public/purecalc/ut/fake_spec.h
@@ -3,53 +3,53 @@
#include <yql/essentials/public/purecalc/purecalc.h>
namespace NYql {
- namespace NPureCalc {
- class TFakeInputSpec: public TInputSpecBase {
- public:
- TVector<NYT::TNode> Schemas = {NYT::TNode::CreateList()};
-
- public:
- const TVector<NYT::TNode>& GetSchemas() const override {
- return Schemas;
- }
- };
-
- class TFakeOutputSpec: public TOutputSpecBase {
- public:
- NYT::TNode Schema = NYT::TNode::CreateList();
-
- public:
- const NYT::TNode& GetSchema() const override {
- return Schema;
- }
- };
-
- template <>
- struct TInputSpecTraits<TFakeInputSpec> {
- static const constexpr bool IsPartial = false;
-
- static const constexpr bool SupportPullStreamMode = false;
- static const constexpr bool SupportPullListMode = false;
- static const constexpr bool SupportPushStreamMode = false;
-
- using TConsumerType = void;
- };
-
- template <>
- struct TOutputSpecTraits<TFakeOutputSpec> {
- static const constexpr bool IsPartial = false;
-
- static const constexpr bool SupportPullStreamMode = false;
- static const constexpr bool SupportPullListMode = false;
- static const constexpr bool SupportPushStreamMode = false;
-
- using TPullStreamReturnType = void;
- using TPullListReturnType = void;
- };
-
- NYT::TNode MakeFakeSchema(bool pg = false);
- TFakeInputSpec FakeIS(ui32 inputsNumber = 1, bool pg = false);
- TFakeOutputSpec FakeOS(bool pg = false);
- TFakeOutputSpec FakeStructOS();
+namespace NPureCalc {
+class TFakeInputSpec: public TInputSpecBase {
+public:
+ TVector<NYT::TNode> Schemas = {NYT::TNode::CreateList()};
+
+public:
+ const TVector<NYT::TNode>& GetSchemas() const override {
+ return Schemas;
}
-}
+};
+
+class TFakeOutputSpec: public TOutputSpecBase {
+public:
+ NYT::TNode Schema = NYT::TNode::CreateList();
+
+public:
+ const NYT::TNode& GetSchema() const override {
+ return Schema;
+ }
+};
+
+template <>
+struct TInputSpecTraits<TFakeInputSpec> {
+ static const constexpr bool IsPartial = false;
+
+ static const constexpr bool SupportPullStreamMode = false;
+ static const constexpr bool SupportPullListMode = false;
+ static const constexpr bool SupportPushStreamMode = false;
+
+ using TConsumerType = void;
+};
+
+template <>
+struct TOutputSpecTraits<TFakeOutputSpec> {
+ static const constexpr bool IsPartial = false;
+
+ static const constexpr bool SupportPullStreamMode = false;
+ static const constexpr bool SupportPullListMode = false;
+ static const constexpr bool SupportPushStreamMode = false;
+
+ using TPullStreamReturnType = void;
+ using TPullListReturnType = void;
+};
+
+NYT::TNode MakeFakeSchema(bool pg = false);
+TFakeInputSpec FakeIS(ui32 inputsNumber = 1, bool pg = false);
+TFakeOutputSpec FakeOS(bool pg = false);
+TFakeOutputSpec FakeStructOS();
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/ut/lib/helpers.cpp b/yql/essentials/public/purecalc/ut/lib/helpers.cpp
index cef9a995235..59383454e67 100644
--- a/yql/essentials/public/purecalc/ut/lib/helpers.cpp
+++ b/yql/essentials/public/purecalc/ut/lib/helpers.cpp
@@ -7,49 +7,45 @@
#include <util/string/ascii.h>
#include <util/generic/hash_set.h>
-
namespace NYql {
- namespace NPureCalc {
- namespace NPrivate {
- NYT::TNode GetSchema(
- const TVector<TString>& fields,
- const TVector<TString>& optionalFields
- ) {
- THashSet<TString> optionalFilter {
- optionalFields.begin(), optionalFields.end()
- };
-
- NYT::TNode members {NYT::TNode::CreateList()};
-
- auto addField = [&] (const TString& name, const TString& type) {
- auto typeNode = NYT::TNode::CreateList()
- .Add("DataType")
- .Add(type);
-
- if (optionalFilter.contains(name)) {
- typeNode = NYT::TNode::CreateList()
- .Add("OptionalType")
- .Add(typeNode);
- }
-
- members.Add(NYT::TNode::CreateList()
- .Add(name)
- .Add(typeNode)
- );
- };
-
- for (const auto& field: fields) {
- TString type {field};
- type[0] = AsciiToUpper(type[0]);
- addField(field, type);
- }
-
- NYT::TNode schema = NYT::TNode::CreateList()
- .Add("StructType")
- .Add(members);
-
- return schema;
- }
+namespace NPureCalc {
+namespace NPrivate {
+NYT::TNode GetSchema(
+ const TVector<TString>& fields,
+ const TVector<TString>& optionalFields) {
+ THashSet<TString> optionalFilter{
+ optionalFields.begin(), optionalFields.end()};
+
+ NYT::TNode members{NYT::TNode::CreateList()};
+
+ auto addField = [&](const TString& name, const TString& type) {
+ auto typeNode = NYT::TNode::CreateList()
+ .Add("DataType")
+ .Add(type);
+
+ if (optionalFilter.contains(name)) {
+ typeNode = NYT::TNode::CreateList()
+ .Add("OptionalType")
+ .Add(typeNode);
}
+
+ members.Add(NYT::TNode::CreateList()
+ .Add(name)
+ .Add(typeNode));
+ };
+
+ for (const auto& field : fields) {
+ TString type{field};
+ type[0] = AsciiToUpper(type[0]);
+ addField(field, type);
}
+
+ NYT::TNode schema = NYT::TNode::CreateList()
+ .Add("StructType")
+ .Add(members);
+
+ return schema;
}
+} // namespace NPrivate
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/ut/lib/helpers.h b/yql/essentials/public/purecalc/ut/lib/helpers.h
index 53a22661ec3..b6fd110ae46 100644
--- a/yql/essentials/public/purecalc/ut/lib/helpers.h
+++ b/yql/essentials/public/purecalc/ut/lib/helpers.h
@@ -5,14 +5,12 @@
#include <util/generic/vector.h>
#include <util/stream/str.h>
-
namespace NYql {
- namespace NPureCalc {
- namespace NPrivate {
- NYT::TNode GetSchema(
- const TVector<TString>& fields,
- const TVector<TString>& optionalFields = {}
- );
- }
- }
-}
+namespace NPureCalc {
+namespace NPrivate {
+NYT::TNode GetSchema(
+ const TVector<TString>& fields,
+ const TVector<TString>& optionalFields = {});
+} // namespace NPrivate
+} // namespace NPureCalc
+} // namespace NYql
diff --git a/yql/essentials/public/purecalc/ut/lib/ya.make b/yql/essentials/public/purecalc/ut/lib/ya.make
index 36134a2940b..bff80e2cb97 100644
--- a/yql/essentials/public/purecalc/ut/lib/ya.make
+++ b/yql/essentials/public/purecalc/ut/lib/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
PEERDIR(
contrib/libs/apache/arrow
library/cpp/yson
diff --git a/yql/essentials/public/purecalc/ut/test_eval.cpp b/yql/essentials/public/purecalc/ut/test_eval.cpp
index 9ca2579301b..0c2cdc10808 100644
--- a/yql/essentials/public/purecalc/ut/test_eval.cpp
+++ b/yql/essentials/public/purecalc/ut/test_eval.cpp
@@ -6,72 +6,69 @@
#include <library/cpp/testing/unittest/registar.h>
Y_UNIT_TEST_SUITE(TestEval) {
- Y_UNIT_TEST(TestEvalExpr) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestEvalExpr) {
+ using namespace NYql::NPureCalc;
- auto options = TProgramFactoryOptions();
- auto factory = MakeProgramFactory(options);
+ auto options = TProgramFactoryOptions();
+ auto factory = MakeProgramFactory(options);
+ auto program = factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ "SELECT Unwrap(cast(EvaluateExpr('foo' || 'bar') as Utf8)) AS X",
+ ETranslationMode::SQL);
+
+ auto stream = program->Apply(EmptyStream<NPureCalcProto::TStringMessage*>());
+
+ NPureCalcProto::TStringMessage* message;
+
+ UNIT_ASSERT(message = stream->Fetch());
+ UNIT_ASSERT_EQUAL(message->GetX(), "foobar");
+ UNIT_ASSERT(!stream->Fetch());
+}
+
+Y_UNIT_TEST(TestSelfType) {
+ using namespace NYql::NPureCalc;
+
+ auto options = TProgramFactoryOptions();
+ auto factory = MakeProgramFactory(options);
+
+ try {
auto program = factory->MakePullListProgram(
TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- "SELECT Unwrap(cast(EvaluateExpr('foo' || 'bar') as Utf8)) AS X",
- ETranslationMode::SQL
- );
+ "$input = PROCESS Input;select unwrap(cast(FormatType(EvaluateType(TypeHandle(TypeOf($input)))) AS Utf8)) AS X",
+ ETranslationMode::SQL);
auto stream = program->Apply(EmptyStream<NPureCalcProto::TStringMessage*>());
NPureCalcProto::TStringMessage* message;
UNIT_ASSERT(message = stream->Fetch());
- UNIT_ASSERT_EQUAL(message->GetX(), "foobar");
+ UNIT_ASSERT_VALUES_EQUAL(message->GetX(), "List<Struct<'X':Utf8>>");
UNIT_ASSERT(!stream->Fetch());
+ } catch (const TCompileError& e) {
+ UNIT_FAIL(e.GetIssues());
}
+}
- Y_UNIT_TEST(TestSelfType) {
- using namespace NYql::NPureCalc;
-
- auto options = TProgramFactoryOptions();
- auto factory = MakeProgramFactory(options);
-
- try {
- auto program = factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- "$input = PROCESS Input;select unwrap(cast(FormatType(EvaluateType(TypeHandle(TypeOf($input)))) AS Utf8)) AS X",
- ETranslationMode::SQL
- );
-
- auto stream = program->Apply(EmptyStream<NPureCalcProto::TStringMessage*>());
+Y_UNIT_TEST(CantUseSelfInsideEvaluation) {
+ using namespace NYql::NPureCalc;
- NPureCalcProto::TStringMessage* message;
+ auto options = TProgramFactoryOptions();
+ auto factory = MakeProgramFactory(options);
- UNIT_ASSERT(message = stream->Fetch());
- UNIT_ASSERT_VALUES_EQUAL(message->GetX(), "List<Struct<'X':Utf8>>");
- UNIT_ASSERT(!stream->Fetch());
- } catch (const TCompileError& e) {
- UNIT_FAIL(e.GetIssues());
- }
- }
+ try {
+ auto program = factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ "$x = SELECT count(*) FROM Input;select unwrap(cast(EvaluateExpr($x) AS Utf8)) AS X",
+ ETranslationMode::SQL);
- Y_UNIT_TEST(CantUseSelfInsideEvaluation) {
- using namespace NYql::NPureCalc;
-
- auto options = TProgramFactoryOptions();
- auto factory = MakeProgramFactory(options);
-
- try {
- auto program = factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- "$x = SELECT count(*) FROM Input;select unwrap(cast(EvaluateExpr($x) AS Utf8)) AS X",
- ETranslationMode::SQL
- );
-
- program->Apply(EmptyStream<NPureCalcProto::TStringMessage*>());
- UNIT_FAIL("Exception is expected");
- } catch (const TCompileError& e) {
- UNIT_ASSERT_C(TString(e.GetIssues()).Contains("Inputs aren't available during evaluation"), e.GetIssues());
- }
+ program->Apply(EmptyStream<NPureCalcProto::TStringMessage*>());
+ UNIT_FAIL("Exception is expected");
+ } catch (const TCompileError& e) {
+ UNIT_ASSERT_C(TString(e.GetIssues()).Contains("Inputs aren't available during evaluation"), e.GetIssues());
}
}
+} // Y_UNIT_TEST_SUITE(TestEval)
diff --git a/yql/essentials/public/purecalc/ut/test_fatal_err.cpp b/yql/essentials/public/purecalc/ut/test_fatal_err.cpp
index bb1452b16e3..54cac5b5874 100644
--- a/yql/essentials/public/purecalc/ut/test_fatal_err.cpp
+++ b/yql/essentials/public/purecalc/ut/test_fatal_err.cpp
@@ -6,22 +6,21 @@
#include <library/cpp/testing/unittest/registar.h>
Y_UNIT_TEST_SUITE(TestFatalError) {
- Y_UNIT_TEST(TestFailType) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestFailType) {
+ using namespace NYql::NPureCalc;
- auto options = TProgramFactoryOptions();
- auto factory = MakeProgramFactory(options);
+ auto options = TProgramFactoryOptions();
+ auto factory = MakeProgramFactory(options);
- try {
- factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- "pragma warning(\"disable\",\"4510\");select unwrap(cast(Yql::FailMe(AsAtom('type')) as Utf8)) as X;",
- ETranslationMode::SQL
- );
- UNIT_FAIL("Exception is expected");
- } catch (const TCompileError& e) {
- UNIT_ASSERT_C(e.GetIssues().Contains("abnormal"), e.GetIssues());
- }
+ try {
+ factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ "pragma warning(\"disable\",\"4510\");select unwrap(cast(Yql::FailMe(AsAtom('type')) as Utf8)) as X;",
+ ETranslationMode::SQL);
+ UNIT_FAIL("Exception is expected");
+ } catch (const TCompileError& e) {
+ UNIT_ASSERT_C(e.GetIssues().Contains("abnormal"), e.GetIssues());
}
}
+} // Y_UNIT_TEST_SUITE(TestFatalError)
diff --git a/yql/essentials/public/purecalc/ut/test_langver.cpp b/yql/essentials/public/purecalc/ut/test_langver.cpp
index 1b3cfa2ff46..3fe55b862f6 100644
--- a/yql/essentials/public/purecalc/ut/test_langver.cpp
+++ b/yql/essentials/public/purecalc/ut/test_langver.cpp
@@ -8,22 +8,22 @@
#include "fake_spec.h"
Y_UNIT_TEST_SUITE(TestLangVer) {
- Y_UNIT_TEST(TooHighLangVer) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TooHighLangVer) {
+ using namespace NYql::NPureCalc;
- auto options = TProgramFactoryOptions();
- options.SetLanguageVersion(NYql::GetMaxLangVersion());
- auto factory = MakeProgramFactory(options);
+ auto options = TProgramFactoryOptions();
+ options.SetLanguageVersion(NYql::GetMaxLangVersion());
+ auto factory = MakeProgramFactory(options);
- try {
- auto sql = TString(R"(
+ try {
+ auto sql = TString(R"(
SELECT * FROM Input;
)");
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- UNIT_FAIL("Exception is expected");
- } catch (const TCompileError& e) {
- UNIT_ASSERT_C(e.GetIssues().Contains("version"), e.GetIssues());
- }
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ UNIT_FAIL("Exception is expected");
+ } catch (const TCompileError& e) {
+ UNIT_ASSERT_C(e.GetIssues().Contains("version"), e.GetIssues());
}
}
+} // Y_UNIT_TEST_SUITE(TestLangVer)
diff --git a/yql/essentials/public/purecalc/ut/test_mixed_allocators.cpp b/yql/essentials/public/purecalc/ut/test_mixed_allocators.cpp
index 2932538f78f..3dad746a045 100644
--- a/yql/essentials/public/purecalc/ut/test_mixed_allocators.cpp
+++ b/yql/essentials/public/purecalc/ut/test_mixed_allocators.cpp
@@ -9,83 +9,81 @@
using namespace NYql::NPureCalc;
namespace {
- class TStatelessInputSpec : public TInputSpecBase {
- public:
- TStatelessInputSpec()
- : Schemas_({NYT::TNode::CreateList()
- .Add("StructType")
- .Add(NYT::TNode::CreateList()
- .Add(NYT::TNode::CreateList()
- .Add("InputValue")
+class TStatelessInputSpec: public TInputSpecBase {
+public:
+ TStatelessInputSpec()
+ : Schemas_({NYT::TNode::CreateList()
+ .Add("StructType")
.Add(NYT::TNode::CreateList()
- .Add("DataType")
- .Add("Utf8")
- )
- )
- )
- })
- {};
-
- const TVector<NYT::TNode>& GetSchemas() const override {
- return Schemas_;
- }
+ .Add(NYT::TNode::CreateList()
+ .Add("InputValue")
+ .Add(NYT::TNode::CreateList()
+ .Add("DataType")
+ .Add("Utf8"))))})
+ {};
+
+ const TVector<NYT::TNode>& GetSchemas() const override {
+ return Schemas_;
+ }
- private:
- const TVector<NYT::TNode> Schemas_;
- };
+private:
+ const TVector<NYT::TNode> Schemas_;
+};
- class TStatelessInputConsumer : public IConsumer<const NYql::NUdf::TUnboxedValue&> {
- public:
- TStatelessInputConsumer(TWorkerHolder<IPushStreamWorker> worker)
- : Worker_(std::move(worker))
- {}
+class TStatelessInputConsumer: public IConsumer<const NYql::NUdf::TUnboxedValue&> {
+public:
+ TStatelessInputConsumer(TWorkerHolder<IPushStreamWorker> worker)
+ : Worker_(std::move(worker))
+ {
+ }
- void OnObject(const NYql::NUdf::TUnboxedValue& value) override {
- with_lock (Worker_->GetScopedAlloc()) {
- NYql::NUdf::TUnboxedValue* items = nullptr;
- NYql::NUdf::TUnboxedValue result = Worker_->GetGraph().GetHolderFactory().CreateDirectArrayHolder(1, items);
+ void OnObject(const NYql::NUdf::TUnboxedValue& value) override {
+ with_lock (Worker_->GetScopedAlloc()) {
+ NYql::NUdf::TUnboxedValue* items = nullptr;
+ NYql::NUdf::TUnboxedValue result = Worker_->GetGraph().GetHolderFactory().CreateDirectArrayHolder(1, items);
- items[0] = value;
+ items[0] = value;
- Worker_->Push(std::move(result));
+ Worker_->Push(std::move(result));
- // Clear graph after each object because
- // values allocated on another allocator and should be released
- Worker_->Invalidate();
- }
+ // Clear graph after each object because
+ // values allocated on another allocator and should be released
+ Worker_->Invalidate();
}
+ }
- void OnFinish() override {
- with_lock(Worker_->GetScopedAlloc()) {
- Worker_->OnFinish();
- }
+ void OnFinish() override {
+ with_lock (Worker_->GetScopedAlloc()) {
+ Worker_->OnFinish();
}
+ }
- private:
- TWorkerHolder<IPushStreamWorker> Worker_;
- };
+private:
+ TWorkerHolder<IPushStreamWorker> Worker_;
+};
- class TStatelessConsumer : public IConsumer<NPureCalcProto::TStringMessage*> {
- const TString ExpectedData_;
- const ui64 ExpectedRows_;
- ui64 RowId_ = 0;
+class TStatelessConsumer: public IConsumer<NPureCalcProto::TStringMessage*> {
+ const TString ExpectedData_;
+ const ui64 ExpectedRows_;
+ ui64 RowId_ = 0;
- public:
- TStatelessConsumer(const TString& expectedData, ui64 expectedRows)
- : ExpectedData_(expectedData)
- , ExpectedRows_(expectedRows)
- {}
+public:
+ TStatelessConsumer(const TString& expectedData, ui64 expectedRows)
+ : ExpectedData_(expectedData)
+ , ExpectedRows_(expectedRows)
+ {
+ }
- void OnObject(NPureCalcProto::TStringMessage* message) override {
- UNIT_ASSERT_VALUES_EQUAL_C(ExpectedData_, message->GetX(), RowId_);
- RowId_++;
- }
+ void OnObject(NPureCalcProto::TStringMessage* message) override {
+ UNIT_ASSERT_VALUES_EQUAL_C(ExpectedData_, message->GetX(), RowId_);
+ RowId_++;
+ }
- void OnFinish() override {
- UNIT_ASSERT_VALUES_EQUAL(ExpectedRows_, RowId_);
- }
- };
-}
+ void OnFinish() override {
+ UNIT_ASSERT_VALUES_EQUAL(ExpectedRows_, RowId_);
+ }
+};
+} // namespace
template <>
struct TInputSpecTraits<TStatelessInputSpec> {
@@ -100,40 +98,39 @@ struct TInputSpecTraits<TStatelessInputSpec> {
};
Y_UNIT_TEST_SUITE(TestMixedAllocators) {
- Y_UNIT_TEST(TestPushStream) {
- const auto targetString = "large string >= 14 bytes";
- const auto factory = MakeProgramFactory();
- const auto sql = TStringBuilder() << "SELECT InputValue AS X FROM Input WHERE InputValue = \"" << targetString << "\";";
-
- const auto program = factory->MakePushStreamProgram(
- TStatelessInputSpec(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- sql
- );
-
- const ui64 numberRows = 5;
- const auto inputConsumer = program->Apply(MakeHolder<TStatelessConsumer>(targetString, numberRows));
- NKikimr::NMiniKQL::TScopedAlloc alloc(__LOCATION__, NKikimr::TAlignedPagePoolCounters(), true, false);
-
- const auto pushString = [&](TString inputValue) {
- NYql::NUdf::TUnboxedValue stringValue;
- with_lock(alloc) {
- stringValue = NKikimr::NMiniKQL::MakeString(inputValue);
- alloc.Ref().LockObject(stringValue);
- }
-
- inputConsumer->OnObject(stringValue);
-
- with_lock(alloc) {
- alloc.Ref().UnlockObject(stringValue);
- stringValue.Clear();
- }
- };
-
- for (ui64 i = 0; i < numberRows; ++i) {
- pushString(targetString);
- pushString("another large string >= 14 bytes");
+Y_UNIT_TEST(TestPushStream) {
+ const auto targetString = "large string >= 14 bytes";
+ const auto factory = MakeProgramFactory();
+ const auto sql = TStringBuilder() << "SELECT InputValue AS X FROM Input WHERE InputValue = \"" << targetString << "\";";
+
+ const auto program = factory->MakePushStreamProgram(
+ TStatelessInputSpec(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ sql);
+
+ const ui64 numberRows = 5;
+ const auto inputConsumer = program->Apply(MakeHolder<TStatelessConsumer>(targetString, numberRows));
+ NKikimr::NMiniKQL::TScopedAlloc alloc(__LOCATION__, NKikimr::TAlignedPagePoolCounters(), true, false);
+
+ const auto pushString = [&](TString inputValue) {
+ NYql::NUdf::TUnboxedValue stringValue;
+ with_lock (alloc) {
+ stringValue = NKikimr::NMiniKQL::MakeString(inputValue);
+ alloc.Ref().LockObject(stringValue);
}
- inputConsumer->OnFinish();
+
+ inputConsumer->OnObject(stringValue);
+
+ with_lock (alloc) {
+ alloc.Ref().UnlockObject(stringValue);
+ stringValue.Clear();
+ }
+ };
+
+ for (ui64 i = 0; i < numberRows; ++i) {
+ pushString(targetString);
+ pushString("another large string >= 14 bytes");
}
+ inputConsumer->OnFinish();
}
+} // Y_UNIT_TEST_SUITE(TestMixedAllocators)
diff --git a/yql/essentials/public/purecalc/ut/test_pg.cpp b/yql/essentials/public/purecalc/ut/test_pg.cpp
index 3d26cfbd1be..c45e2ed569d 100644
--- a/yql/essentials/public/purecalc/ut/test_pg.cpp
+++ b/yql/essentials/public/purecalc/ut/test_pg.cpp
@@ -7,65 +7,65 @@
#include <library/cpp/testing/unittest/registar.h>
Y_UNIT_TEST_SUITE(TestPg) {
- using namespace NYql::NPureCalc;
+using namespace NYql::NPureCalc;
- Y_UNIT_TEST(TestPgCompile) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestPgCompile) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
SELECT * FROM "Input";
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(1,true), FakeOS(true), sql, ETranslationMode::PG);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }());
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullStreamProgram(FakeIS(1,true), FakeOS(true), sql, ETranslationMode::PG);
- }(), TCompileError, "PullList mode");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }(), TCompileError, "PullList mode");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePushStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
- }(), TCompileError, "PullList mode");
- }
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePushStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }(), TCompileError, "PullList mode");
+}
- Y_UNIT_TEST(TestSqlWrongTableName) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestSqlWrongTableName) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
SELECT * FROM WrongTable;
)");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullListProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
- }(), TCompileError, "Failed to optimize");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullListProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }(), TCompileError, "Failed to optimize");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
- }(), TCompileError, "PullList mode");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }(), TCompileError, "PullList mode");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePushStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
- }(), TCompileError, "PullList mode");
- }
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePushStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }(), TCompileError, "PullList mode");
+}
- Y_UNIT_TEST(TestInvalidSql) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestInvalidSql) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
Just some invalid SQL;
)");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullListProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
- }(), TCompileError, "failed to parse PG");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullListProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }(), TCompileError, "failed to parse PG");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
- }(), TCompileError, "PullList mode");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }(), TCompileError, "PullList mode");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePushStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
- }(), TCompileError, "PullList mode");
- }
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePushStreamProgram(FakeIS(1, true), FakeOS(true), sql, ETranslationMode::PG);
+ }(), TCompileError, "PullList mode");
}
+} // Y_UNIT_TEST_SUITE(TestPg)
diff --git a/yql/essentials/public/purecalc/ut/test_pool.cpp b/yql/essentials/public/purecalc/ut/test_pool.cpp
index b3de36cbf5f..90ae69b8bc2 100644
--- a/yql/essentials/public/purecalc/ut/test_pool.cpp
+++ b/yql/essentials/public/purecalc/ut/test_pool.cpp
@@ -10,175 +10,172 @@
using namespace NYql::NPureCalc;
namespace {
- class TStringMessageStreamImpl: public IStream<NPureCalcProto::TStringMessage*> {
- private:
- ui32 I_ = 0;
- NPureCalcProto::TStringMessage Message_{};
-
- public:
- NPureCalcProto::TStringMessage* Fetch() override {
- if (I_ >= 3) {
- return nullptr;
- } else {
- Message_.SetX(ToString(I_));
- ++I_;
- return &Message_;
- }
+class TStringMessageStreamImpl: public IStream<NPureCalcProto::TStringMessage*> {
+private:
+ ui32 I_ = 0;
+ NPureCalcProto::TStringMessage Message_{};
+
+public:
+ NPureCalcProto::TStringMessage* Fetch() override {
+ if (I_ >= 3) {
+ return nullptr;
+ } else {
+ Message_.SetX(ToString(I_));
+ ++I_;
+ return &Message_;
}
- };
+ }
+};
- class TStringMessageConsumerImpl: public IConsumer<NPureCalcProto::TStringMessage*> {
- private:
- TVector<TString>* Buf_;
+class TStringMessageConsumerImpl: public IConsumer<NPureCalcProto::TStringMessage*> {
+private:
+ TVector<TString>* Buf_;
- public:
- TStringMessageConsumerImpl(TVector<TString>* buf)
- : Buf_(buf)
- {
- }
+public:
+ TStringMessageConsumerImpl(TVector<TString>* buf)
+ : Buf_(buf)
+ {
+ }
- public:
- void OnObject(NPureCalcProto::TStringMessage* t) override {
- Buf_->push_back(t->GetX());
- }
+public:
+ void OnObject(NPureCalcProto::TStringMessage* t) override {
+ Buf_->push_back(t->GetX());
+ }
- void OnFinish() override {
- }
- };
+ void OnFinish() override {
+ }
+};
-}
+} // namespace
Y_UNIT_TEST_SUITE(TestWorkerPool) {
- static TString sql = "SELECT 'abc'u || X AS X FROM Input";
+static TString sql = "SELECT 'abc'u || X AS X FROM Input";
- static TVector<TString> expected{"abc0", "abc1", "abc2"};
+static TVector<TString> expected{"abc0", "abc1", "abc2"};
- void TestPullStreamImpl(bool useWorkerPool) {
- auto factory = MakeProgramFactory(TProgramFactoryOptions().SetUseWorkerPool(useWorkerPool));
+void TestPullStreamImpl(bool useWorkerPool) {
+ auto factory = MakeProgramFactory(TProgramFactoryOptions().SetUseWorkerPool(useWorkerPool));
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- sql,
- ETranslationMode::SQL
- );
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ sql,
+ ETranslationMode::SQL);
- auto check = [](IStream<NPureCalcProto::TStringMessage*>* output) {
- TVector<TString> actual;
- while (auto *x = output->Fetch()) {
- actual.push_back(x->GetX());
- }
+ auto check = [](IStream<NPureCalcProto::TStringMessage*>* output) {
+ TVector<TString> actual;
+ while (auto* x = output->Fetch()) {
+ actual.push_back(x->GetX());
+ }
- UNIT_ASSERT_VALUES_EQUAL(expected, actual);
- };
+ UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ };
- // Sequential use
- for (size_t i = 0; i < 2; ++i) {
- auto output = program->Apply(MakeHolder<TStringMessageStreamImpl>());
- check(output.Get());
- }
- // Parallel use
- {
- auto output1 = program->Apply(MakeHolder<TStringMessageStreamImpl>());
- auto output2 = program->Apply(MakeHolder<TStringMessageStreamImpl>());
- check(output1.Get());
- check(output2.Get());
- }
+ // Sequential use
+ for (size_t i = 0; i < 2; ++i) {
+ auto output = program->Apply(MakeHolder<TStringMessageStreamImpl>());
+ check(output.Get());
}
-
- Y_UNIT_TEST(TestPullStreamUseWorkerPool) {
- TestPullStreamImpl(true);
+ // Parallel use
+ {
+ auto output1 = program->Apply(MakeHolder<TStringMessageStreamImpl>());
+ auto output2 = program->Apply(MakeHolder<TStringMessageStreamImpl>());
+ check(output1.Get());
+ check(output2.Get());
}
+}
- Y_UNIT_TEST(TestPullStreamNoWorkerPool) {
- TestPullStreamImpl(false);
- }
+Y_UNIT_TEST(TestPullStreamUseWorkerPool) {
+ TestPullStreamImpl(true);
+}
- void TestPullListImpl(bool useWorkerPool) {
- auto factory = MakeProgramFactory(TProgramFactoryOptions().SetUseWorkerPool(useWorkerPool));
-
- auto program = factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- sql,
- ETranslationMode::SQL
- );
-
- auto check = [](IStream<NPureCalcProto::TStringMessage*>* output) {
- TVector<TString> actual;
- while (auto *x = output->Fetch()) {
- actual.push_back(x->GetX());
- }
-
- UNIT_ASSERT_VALUES_EQUAL(expected, actual);
- };
-
- // Sequential use
- for (size_t i = 0; i < 2; ++i) {
- auto output = program->Apply(MakeHolder<TStringMessageStreamImpl>());
- check(output.Get());
- }
- // Parallel use
- {
- auto output1 = program->Apply(MakeHolder<TStringMessageStreamImpl>());
- auto output2 = program->Apply(MakeHolder<TStringMessageStreamImpl>());
- check(output1.Get());
- check(output2.Get());
+Y_UNIT_TEST(TestPullStreamNoWorkerPool) {
+ TestPullStreamImpl(false);
+}
+
+void TestPullListImpl(bool useWorkerPool) {
+ auto factory = MakeProgramFactory(TProgramFactoryOptions().SetUseWorkerPool(useWorkerPool));
+
+ auto program = factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ sql,
+ ETranslationMode::SQL);
+
+ auto check = [](IStream<NPureCalcProto::TStringMessage*>* output) {
+ TVector<TString> actual;
+ while (auto* x = output->Fetch()) {
+ actual.push_back(x->GetX());
}
- }
- Y_UNIT_TEST(TestPullListUseWorkerPool) {
- TestPullListImpl(true);
- }
+ UNIT_ASSERT_VALUES_EQUAL(expected, actual);
+ };
- Y_UNIT_TEST(TestPullListNoWorkerPool) {
- TestPullListImpl(false);
+ // Sequential use
+ for (size_t i = 0; i < 2; ++i) {
+ auto output = program->Apply(MakeHolder<TStringMessageStreamImpl>());
+ check(output.Get());
}
+ // Parallel use
+ {
+ auto output1 = program->Apply(MakeHolder<TStringMessageStreamImpl>());
+ auto output2 = program->Apply(MakeHolder<TStringMessageStreamImpl>());
+ check(output1.Get());
+ check(output2.Get());
+ }
+}
- void TestPushStreamImpl(bool useWorkerPool) {
- auto factory = MakeProgramFactory(TProgramFactoryOptions().SetUseWorkerPool(useWorkerPool));
-
- auto program = factory->MakePushStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- sql,
- ETranslationMode::SQL
- );
-
- auto check = [](IConsumer<NPureCalcProto::TStringMessage*>* input, const TVector<TString>& result) {
- NPureCalcProto::TStringMessage message;
- for (auto s: {"0", "1", "2"}) {
- message.SetX(s);
- input->OnObject(&message);
- }
- input->OnFinish();
-
- UNIT_ASSERT_VALUES_EQUAL(expected, result);
- };
-
- // Sequential use
- for (size_t i = 0; i < 2; ++i) {
- TVector<TString> actual;
- auto input = program->Apply(MakeHolder<TStringMessageConsumerImpl>(&actual));
- check(input.Get(), actual);
- }
+Y_UNIT_TEST(TestPullListUseWorkerPool) {
+ TestPullListImpl(true);
+}
+
+Y_UNIT_TEST(TestPullListNoWorkerPool) {
+ TestPullListImpl(false);
+}
+
+void TestPushStreamImpl(bool useWorkerPool) {
+ auto factory = MakeProgramFactory(TProgramFactoryOptions().SetUseWorkerPool(useWorkerPool));
+
+ auto program = factory->MakePushStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ sql,
+ ETranslationMode::SQL);
- // Parallel use
- {
- TVector<TString> actual1;
- auto input1 = program->Apply(MakeHolder<TStringMessageConsumerImpl>(&actual1));
- TVector<TString> actual2;
- auto input2 = program->Apply(MakeHolder<TStringMessageConsumerImpl>(&actual2));
- check(input1.Get(), actual1);
- check(input2.Get(), actual2);
+ auto check = [](IConsumer<NPureCalcProto::TStringMessage*>* input, const TVector<TString>& result) {
+ NPureCalcProto::TStringMessage message;
+ for (auto s : {"0", "1", "2"}) {
+ message.SetX(s);
+ input->OnObject(&message);
}
- }
+ input->OnFinish();
+
+ UNIT_ASSERT_VALUES_EQUAL(expected, result);
+ };
- Y_UNIT_TEST(TestPushStreamUseWorkerPool) {
- TestPushStreamImpl(true);
+ // Sequential use
+ for (size_t i = 0; i < 2; ++i) {
+ TVector<TString> actual;
+ auto input = program->Apply(MakeHolder<TStringMessageConsumerImpl>(&actual));
+ check(input.Get(), actual);
}
- Y_UNIT_TEST(TestPushStreamNoWorkerPool) {
- TestPushStreamImpl(false);
+ // Parallel use
+ {
+ TVector<TString> actual1;
+ auto input1 = program->Apply(MakeHolder<TStringMessageConsumerImpl>(&actual1));
+ TVector<TString> actual2;
+ auto input2 = program->Apply(MakeHolder<TStringMessageConsumerImpl>(&actual2));
+ check(input1.Get(), actual1);
+ check(input2.Get(), actual2);
}
}
+
+Y_UNIT_TEST(TestPushStreamUseWorkerPool) {
+ TestPushStreamImpl(true);
+}
+
+Y_UNIT_TEST(TestPushStreamNoWorkerPool) {
+ TestPushStreamImpl(false);
+}
+} // Y_UNIT_TEST_SUITE(TestWorkerPool)
diff --git a/yql/essentials/public/purecalc/ut/test_sexpr.cpp b/yql/essentials/public/purecalc/ut/test_sexpr.cpp
index 9c50dd1f291..5b46f685148 100644
--- a/yql/essentials/public/purecalc/ut/test_sexpr.cpp
+++ b/yql/essentials/public/purecalc/ut/test_sexpr.cpp
@@ -7,49 +7,49 @@
#include <library/cpp/testing/unittest/registar.h>
Y_UNIT_TEST_SUITE(TestSExpr) {
- Y_UNIT_TEST(TestSExprCompile) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestSExprCompile) {
+ using namespace NYql::NPureCalc;
- auto factory = MakeProgramFactory();
+ auto factory = MakeProgramFactory();
- auto expr = TString(R"(
+ auto expr = TString(R"(
(
(return (Self '0))
)
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), expr, ETranslationMode::SExpr);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), expr, ETranslationMode::SExpr);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), expr, ETranslationMode::SExpr);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), expr, ETranslationMode::SExpr);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePushStreamProgram(FakeIS(), FakeOS(), expr, ETranslationMode::SExpr);
- }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePushStreamProgram(FakeIS(), FakeOS(), expr, ETranslationMode::SExpr);
+ }());
+}
- Y_UNIT_TEST(TestInvalidSExpr) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestInvalidSExpr) {
+ using namespace NYql::NPureCalc;
- auto factory = MakeProgramFactory();
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
Some totally invalid SExpr
)");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SExpr);
- }(), TCompileError, "failed to parse s-expression");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SExpr);
+ }(), TCompileError, "failed to parse s-expression");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SExpr);
- }(), TCompileError, "failed to parse s-expression");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SExpr);
+ }(), TCompileError, "failed to parse s-expression");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SExpr);
- }(), TCompileError, "failed to parse s-expression");
- }
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SExpr);
+ }(), TCompileError, "failed to parse s-expression");
}
+} // Y_UNIT_TEST_SUITE(TestSExpr)
diff --git a/yql/essentials/public/purecalc/ut/test_sql.cpp b/yql/essentials/public/purecalc/ut/test_sql.cpp
index 1b6b69279a8..7b7917751a4 100644
--- a/yql/essentials/public/purecalc/ut/test_sql.cpp
+++ b/yql/essentials/public/purecalc/ut/test_sql.cpp
@@ -7,36 +7,36 @@
#include <library/cpp/testing/unittest/registar.h>
Y_UNIT_TEST_SUITE(TestSql) {
- using namespace NYql::NPureCalc;
+using namespace NYql::NPureCalc;
- Y_UNIT_TEST(TestSqlCompile) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestSqlCompile) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
SELECT * FROM Input;
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
- auto program = factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- auto expectedIssues = TString(R"(<main>: Warning: Type annotation, code: 1030
+ auto program = factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ auto expectedIssues = TString(R"(<main>: Warning: Type annotation, code: 1030
generated.sql:2:13: Warning: At function: PersistableRepr
generated.sql:2:13: Warning: Persistable required. Atom, key, world, datasink, datasource, callable, resource, stream and lambda are not persistable, code: 1104
)");
- UNIT_ASSERT_VALUES_EQUAL(expectedIssues, program->GetIssues().ToString());
- }
+ UNIT_ASSERT_VALUES_EQUAL(expectedIssues, program->GetIssues().ToString());
+}
- Y_UNIT_TEST(TestStructCastMessage) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestStructCastMessage) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
$l = ($x) -> {
return <| Id: $x.Name, Name: CAST($x.Name AS String), Body: Just('foo') |>;
};
@@ -44,54 +44,54 @@ Y_UNIT_TEST_SUITE(TestSql) {
SELECT $l(TableRow()) AS _r FROM Input
)");
- try {
- factory->MakePullListProgram(FakeIS(), FakeStructOS(), sql, ETranslationMode::SQL);
- UNIT_ASSERT_C(false, "Unreachable");
- } catch (const NYql::NPureCalc::TCompileError& error) {
- auto issue = error.GetIssues();
- UNIT_ASSERT_C(issue.Contains("Failed to convert 'Id': Int32 to Optional<Uint32>"), issue);
- UNIT_ASSERT_C(!issue.Contains("Body"), issue);
- }
+ try {
+ factory->MakePullListProgram(FakeIS(), FakeStructOS(), sql, ETranslationMode::SQL);
+ UNIT_ASSERT_C(false, "Unreachable");
+ } catch (const NYql::NPureCalc::TCompileError& error) {
+ auto issue = error.GetIssues();
+ UNIT_ASSERT_C(issue.Contains("Failed to convert 'Id': Int32 to Optional<Uint32>"), issue);
+ UNIT_ASSERT_C(!issue.Contains("Body"), issue);
}
+}
- Y_UNIT_TEST(TestSqlCompileSingleUnnamedInput) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestSqlCompileSingleUnnamedInput) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
SELECT * FROM TABLES()
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
+}
- Y_UNIT_TEST(TestSqlCompileNamedMultiinputs) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestSqlCompileNamedMultiinputs) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
SELECT * FROM Input0
UNION ALL
SELECT * FROM Input1
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(2), FakeOS(), sql, ETranslationMode::SQL);
- }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(2), FakeOS(), sql, ETranslationMode::SQL);
+ }());
+}
- Y_UNIT_TEST(TestSqlCompileUnnamedMultiinputs) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestSqlCompileUnnamedMultiinputs) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
$t0, $t1, $t2 = PROCESS TABLES();
SELECT * FROM $t0
UNION ALL
@@ -100,117 +100,117 @@ Y_UNIT_TEST_SUITE(TestSql) {
SELECT * FROM $t2
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(3), FakeOS(), sql, ETranslationMode::SQL);
- }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(3), FakeOS(), sql, ETranslationMode::SQL);
+ }());
+}
- Y_UNIT_TEST(TestSqlCompileWithWarning) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestSqlCompileWithWarning) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
$x = 1;
$y = 2;
SELECT $x as Name FROM Input;
)");
- auto expectedIssues = TString(R"(generated.sql:3:13: Warning: Symbol $y is not used, code: 4527
+ auto expectedIssues = TString(R"(generated.sql:3:13: Warning: Symbol $y is not used, code: 4527
<main>: Warning: Type annotation, code: 1030
generated.sql:4:13: Warning: At function: PersistableRepr
generated.sql:4:13: Warning: Persistable required. Atom, key, world, datasink, datasource, callable, resource, stream and lambda are not persistable, code: 1104
)");
- auto program = factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- UNIT_ASSERT_VALUES_EQUAL(expectedIssues, program->GetIssues().ToString());
- }
+ auto program = factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ UNIT_ASSERT_VALUES_EQUAL(expectedIssues, program->GetIssues().ToString());
+}
- Y_UNIT_TEST(TestSqlWrongTableName) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestSqlWrongTableName) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
SELECT * FROM WrongTable;
)");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }(), TCompileError, "Failed to optimize");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }(), TCompileError, "Failed to optimize");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }(), TCompileError, "Failed to optimize");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }(), TCompileError, "Failed to optimize");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }(), TCompileError, "Failed to optimize");
- }
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }(), TCompileError, "Failed to optimize");
+}
- Y_UNIT_TEST(TestAllocateLargeStringOnEvaluate) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestAllocateLargeStringOnEvaluate) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
$data = Length(EvaluateExpr("long string" || " very loooong string"));
SELECT $data as Name FROM Input;
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
+}
- Y_UNIT_TEST(TestInvalidSql) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestInvalidSql) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
Just some invalid SQL;
)");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }(), TCompileError, "failed to parse SQL");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }(), TCompileError, "failed to parse SQL");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }(), TCompileError, "failed to parse SQL");
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }(), TCompileError, "failed to parse SQL");
- UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
- factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }(), TCompileError, "failed to parse SQL");
- }
+ UNIT_ASSERT_EXCEPTION_CONTAINS([&]() {
+ factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }(), TCompileError, "failed to parse SQL");
+}
- Y_UNIT_TEST(TestUseProcess) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestUseProcess) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
$processor = ($row) -> ($row);
PROCESS Input using $processor(TableRow());
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
+}
- Y_UNIT_TEST(TestUseCodegen) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestUseCodegen) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
$processor = ($row) -> {
$lambda = EvaluateCode(LambdaCode(($row) -> ($row)));
return $lambda($row);
@@ -219,15 +219,15 @@ Y_UNIT_TEST_SUITE(TestSql) {
PROCESS Input using $processor(TableRow());
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
+}
- Y_UNIT_TEST(TestUseDefineSubquery) {
- auto factory = MakeProgramFactory();
+Y_UNIT_TEST(TestUseDefineSubquery) {
+ auto factory = MakeProgramFactory();
- auto sql = TString(R"(
+ auto sql = TString(R"(
DEFINE SUBQUERY $source() AS
PROCESS Input;
END DEFINE;
@@ -239,8 +239,8 @@ Y_UNIT_TEST_SUITE(TestSql) {
PROCESS $handler($source);
)");
- UNIT_ASSERT_NO_EXCEPTION([&](){
- factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
- }());
- }
+ UNIT_ASSERT_NO_EXCEPTION([&]() {
+ factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
+ }());
}
+} // Y_UNIT_TEST_SUITE(TestSql)
diff --git a/yql/essentials/public/purecalc/ut/test_udf.cpp b/yql/essentials/public/purecalc/ut/test_udf.cpp
index 732917739e7..702225c656e 100644
--- a/yql/essentials/public/purecalc/ut/test_udf.cpp
+++ b/yql/essentials/public/purecalc/ut/test_udf.cpp
@@ -7,18 +7,19 @@
#include <yql/essentials/public/udf/udf_type_builder.h>
#include <library/cpp/testing/unittest/registar.h>
-class TMyModule : public NKikimr::NUdf::IUdfModule {
+class TMyModule: public NKikimr::NUdf::IUdfModule {
public:
- class TFunc : public NKikimr::NUdf::TBoxedValue {
+ class TFunc: public NKikimr::NUdf::TBoxedValue {
public:
TFunc(NKikimr::NUdf::TCounter counter, NKikimr::NUdf::TScopedProbe scopedProbe)
: Counter_(counter)
, ScopedProbe_(scopedProbe)
- {}
+ {
+ }
NKikimr::NUdf::TUnboxedValue Run(const NKikimr::NUdf::IValueBuilder* valueBuilder, const NKikimr::NUdf::TUnboxedValuePod* args) const override {
Y_UNUSED(valueBuilder);
- with_lock(ScopedProbe_) {
+ with_lock (ScopedProbe_) {
Counter_.Inc();
return NKikimr::NUdf::TUnboxedValuePod(args[0].Get<i32>());
}
@@ -45,9 +46,8 @@ public:
if (name == NKikimr::NUdf::TStringRef::Of("Func")) {
builder.SimpleSignature<i32(i32)>();
builder.Implementation(new TFunc(
- builder.GetCounter("FuncCalls",true),
- builder.GetScopedProbe("FuncTime")
- ));
+ builder.GetCounter("FuncCalls", true),
+ builder.GetScopedProbe("FuncTime")));
}
}
@@ -55,12 +55,13 @@ public:
}
};
-class TMyCountersProvider : public NKikimr::NUdf::ICountersProvider, public NKikimr::NUdf::IScopedProbeHost {
+class TMyCountersProvider: public NKikimr::NUdf::ICountersProvider, public NKikimr::NUdf::IScopedProbeHost {
public:
TMyCountersProvider(i64* calls, TString* log)
: Calls_(calls)
, Log_(log)
- {}
+ {
+ }
NKikimr::NUdf::TCounter GetCounter(const NKikimr::NUdf::TStringRef& module, const NKikimr::NUdf::TStringRef& name, bool deriv) override {
UNIT_ASSERT_VALUES_EQUAL(module, "MyModule");
@@ -91,11 +92,11 @@ private:
};
namespace NPureCalcProto {
- class TUnparsed;
- class TParsed;
-}
+class TUnparsed;
+class TParsed;
+} // namespace NPureCalcProto
-class TDocInput : public NYql::NPureCalc::IStream<NPureCalcProto::TUnparsed*> {
+class TDocInput: public NYql::NPureCalc::IStream<NPureCalcProto::TUnparsed*> {
public:
NPureCalcProto::TUnparsed* Fetch() override {
if (Extracted) {
@@ -113,83 +114,83 @@ public:
};
Y_UNIT_TEST_SUITE(TestUdf) {
- Y_UNIT_TEST(TestCounters) {
- using namespace NYql::NPureCalc;
-
- auto factory = MakeProgramFactory();
-
- i64 callCounter = 0;
- TMyCountersProvider myCountersProvider(&callCounter, nullptr);
- factory->AddUdfModule("MyModule", new TMyModule);
- factory->SetCountersProvider(&myCountersProvider);
-
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TUnparsed>(),
- TProtobufOutputSpec<NPureCalcProto::TParsed>(),
- "select MyModule::Func(1) as A, 2 as B, 3 as C from Input",
- ETranslationMode::SQL);
-
- auto out = program->Apply(MakeHolder<TDocInput>());
- auto* message = out->Fetch();
- UNIT_ASSERT(message);
- UNIT_ASSERT_VALUES_EQUAL(message->GetA(), 1);
- UNIT_ASSERT_VALUES_EQUAL(message->GetB(), 2);
- UNIT_ASSERT_VALUES_EQUAL(message->GetC(), 3);
- UNIT_ASSERT_VALUES_EQUAL(callCounter, 1);
- UNIT_ASSERT(!out->Fetch());
- }
+Y_UNIT_TEST(TestCounters) {
+ using namespace NYql::NPureCalc;
+
+ auto factory = MakeProgramFactory();
+
+ i64 callCounter = 0;
+ TMyCountersProvider myCountersProvider(&callCounter, nullptr);
+ factory->AddUdfModule("MyModule", new TMyModule);
+ factory->SetCountersProvider(&myCountersProvider);
+
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TUnparsed>(),
+ TProtobufOutputSpec<NPureCalcProto::TParsed>(),
+ "select MyModule::Func(1) as A, 2 as B, 3 as C from Input",
+ ETranslationMode::SQL);
+
+ auto out = program->Apply(MakeHolder<TDocInput>());
+ auto* message = out->Fetch();
+ UNIT_ASSERT(message);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetA(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetB(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetC(), 3);
+ UNIT_ASSERT_VALUES_EQUAL(callCounter, 1);
+ UNIT_ASSERT(!out->Fetch());
+}
- Y_UNIT_TEST(TestCountersFilteredColumns) {
- using namespace NYql::NPureCalc;
-
- auto factory = MakeProgramFactory();
-
- i64 callCounter = 0;
- TMyCountersProvider myCountersProvider(&callCounter, nullptr);
- factory->AddUdfModule("MyModule", new TMyModule);
- factory->SetCountersProvider(&myCountersProvider);
-
- auto ospec = TProtobufOutputSpec<NPureCalcProto::TParsed>();
- ospec.SetOutputColumnsFilter(THashSet<TString>({"B", "C"}));
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TUnparsed>(),
- ospec,
- "select MyModule::Func(1) as A, 2 as B, 3 as C from Input",
- ETranslationMode::SQL);
-
- auto out = program->Apply(MakeHolder<TDocInput>());
- auto* message = out->Fetch();
- UNIT_ASSERT(message);
- UNIT_ASSERT_VALUES_EQUAL(message->GetA(), 0);
- UNIT_ASSERT_VALUES_EQUAL(message->GetB(), 2);
- UNIT_ASSERT_VALUES_EQUAL(message->GetC(), 3);
- UNIT_ASSERT_VALUES_EQUAL(callCounter, 0);
- UNIT_ASSERT(!out->Fetch());
- }
+Y_UNIT_TEST(TestCountersFilteredColumns) {
+ using namespace NYql::NPureCalc;
+
+ auto factory = MakeProgramFactory();
+
+ i64 callCounter = 0;
+ TMyCountersProvider myCountersProvider(&callCounter, nullptr);
+ factory->AddUdfModule("MyModule", new TMyModule);
+ factory->SetCountersProvider(&myCountersProvider);
+
+ auto ospec = TProtobufOutputSpec<NPureCalcProto::TParsed>();
+ ospec.SetOutputColumnsFilter(THashSet<TString>({"B", "C"}));
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TUnparsed>(),
+ ospec,
+ "select MyModule::Func(1) as A, 2 as B, 3 as C from Input",
+ ETranslationMode::SQL);
+
+ auto out = program->Apply(MakeHolder<TDocInput>());
+ auto* message = out->Fetch();
+ UNIT_ASSERT(message);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetA(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetB(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetC(), 3);
+ UNIT_ASSERT_VALUES_EQUAL(callCounter, 0);
+ UNIT_ASSERT(!out->Fetch());
+}
- Y_UNIT_TEST(TestScopedProbes) {
- using namespace NYql::NPureCalc;
-
- auto factory = MakeProgramFactory();
-
- TString log;
- TMyCountersProvider myCountersProvider(nullptr, &log);
- factory->AddUdfModule("MyModule", new TMyModule);
- factory->SetCountersProvider(&myCountersProvider);
-
- auto program = factory->MakePullStreamProgram(
- TProtobufInputSpec<NPureCalcProto::TUnparsed>(),
- TProtobufOutputSpec<NPureCalcProto::TParsed>(),
- "select MyModule::Func(1) as A, 2 as B, 3 as C from Input",
- ETranslationMode::SQL);
-
- auto out = program->Apply(MakeHolder<TDocInput>());
- auto* message = out->Fetch();
- UNIT_ASSERT(message);
- UNIT_ASSERT_VALUES_EQUAL(message->GetA(), 1);
- UNIT_ASSERT_VALUES_EQUAL(message->GetB(), 2);
- UNIT_ASSERT_VALUES_EQUAL(message->GetC(), 3);
- UNIT_ASSERT_VALUES_EQUAL(log, "Enter\nExit\n");
- UNIT_ASSERT(!out->Fetch());
- }
+Y_UNIT_TEST(TestScopedProbes) {
+ using namespace NYql::NPureCalc;
+
+ auto factory = MakeProgramFactory();
+
+ TString log;
+ TMyCountersProvider myCountersProvider(nullptr, &log);
+ factory->AddUdfModule("MyModule", new TMyModule);
+ factory->SetCountersProvider(&myCountersProvider);
+
+ auto program = factory->MakePullStreamProgram(
+ TProtobufInputSpec<NPureCalcProto::TUnparsed>(),
+ TProtobufOutputSpec<NPureCalcProto::TParsed>(),
+ "select MyModule::Func(1) as A, 2 as B, 3 as C from Input",
+ ETranslationMode::SQL);
+
+ auto out = program->Apply(MakeHolder<TDocInput>());
+ auto* message = out->Fetch();
+ UNIT_ASSERT(message);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetA(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetB(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(message->GetC(), 3);
+ UNIT_ASSERT_VALUES_EQUAL(log, "Enter\nExit\n");
+ UNIT_ASSERT(!out->Fetch());
}
+} // Y_UNIT_TEST_SUITE(TestUdf)
diff --git a/yql/essentials/public/purecalc/ut/test_user_data.cpp b/yql/essentials/public/purecalc/ut/test_user_data.cpp
index b87940ab6b2..164a3b4de33 100644
--- a/yql/essentials/public/purecalc/ut/test_user_data.cpp
+++ b/yql/essentials/public/purecalc/ut/test_user_data.cpp
@@ -6,57 +6,55 @@
#include <library/cpp/testing/unittest/registar.h>
Y_UNIT_TEST_SUITE(TestUserData) {
- Y_UNIT_TEST(TestUserData) {
- using namespace NYql::NPureCalc;
+Y_UNIT_TEST(TestUserData) {
+ using namespace NYql::NPureCalc;
+ auto options = TProgramFactoryOptions()
+ .AddFile(NYql::NUserData::EDisposition::INLINE, "my_file.txt", "my content!");
+
+ auto factory = MakeProgramFactory(options);
+
+ auto program = factory->MakePullListProgram(
+ TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
+ TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
+ "SELECT UNWRAP(CAST(FileContent(\"my_file.txt\") AS Utf8)) AS X",
+ ETranslationMode::SQL);
+
+ auto stream = program->Apply(EmptyStream<NPureCalcProto::TStringMessage*>());
+
+ NPureCalcProto::TStringMessage* message;
+
+ UNIT_ASSERT(message = stream->Fetch());
+ UNIT_ASSERT_EQUAL(message->GetX(), "my content!");
+ UNIT_ASSERT(!stream->Fetch());
+}
+
+Y_UNIT_TEST(TestUserDataLibrary) {
+ using namespace NYql::NPureCalc;
+
+ try {
auto options = TProgramFactoryOptions()
- .AddFile(NYql::NUserData::EDisposition::INLINE, "my_file.txt", "my content!");
+ .AddLibrary(NYql::NUserData::EDisposition::INLINE, "a.sql", "$x = 1; EXPORT $x;")
+ .AddLibrary(NYql::NUserData::EDisposition::INLINE, "b.sql", "IMPORT a SYMBOLS $x; $y = CAST($x + 1 AS String); EXPORT $y;");
auto factory = MakeProgramFactory(options);
auto program = factory->MakePullListProgram(
TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- "SELECT UNWRAP(CAST(FileContent(\"my_file.txt\") AS Utf8)) AS X",
- ETranslationMode::SQL
- );
+ "IMPORT b SYMBOLS $y; SELECT CAST($y AS Utf8) ?? '' AS X;",
+ ETranslationMode::SQL);
auto stream = program->Apply(EmptyStream<NPureCalcProto::TStringMessage*>());
NPureCalcProto::TStringMessage* message;
UNIT_ASSERT(message = stream->Fetch());
- UNIT_ASSERT_EQUAL(message->GetX(), "my content!");
+ UNIT_ASSERT_EQUAL(message->GetX(), "2");
UNIT_ASSERT(!stream->Fetch());
- }
-
- Y_UNIT_TEST(TestUserDataLibrary) {
- using namespace NYql::NPureCalc;
-
- try {
- auto options = TProgramFactoryOptions()
- .AddLibrary(NYql::NUserData::EDisposition::INLINE, "a.sql", "$x = 1; EXPORT $x;")
- .AddLibrary(NYql::NUserData::EDisposition::INLINE, "b.sql", "IMPORT a SYMBOLS $x; $y = CAST($x + 1 AS String); EXPORT $y;");
-
- auto factory = MakeProgramFactory(options);
-
- auto program = factory->MakePullListProgram(
- TProtobufInputSpec<NPureCalcProto::TStringMessage>(),
- TProtobufOutputSpec<NPureCalcProto::TStringMessage>(),
- "IMPORT b SYMBOLS $y; SELECT CAST($y AS Utf8) ?? '' AS X;",
- ETranslationMode::SQL
- );
-
- auto stream = program->Apply(EmptyStream<NPureCalcProto::TStringMessage*>());
-
- NPureCalcProto::TStringMessage* message;
-
- UNIT_ASSERT(message = stream->Fetch());
- UNIT_ASSERT_EQUAL(message->GetX(), "2");
- UNIT_ASSERT(!stream->Fetch());
- } catch (const TCompileError& e) {
- Cerr << e;
- throw e;
- }
+ } catch (const TCompileError& e) {
+ Cerr << e;
+ throw e;
}
}
+} // Y_UNIT_TEST_SUITE(TestUserData)
diff --git a/yql/essentials/public/purecalc/ut/ya.make b/yql/essentials/public/purecalc/ut/ya.make
index 2f4882c1291..a9fbe4dd9ab 100644
--- a/yql/essentials/public/purecalc/ut/ya.make
+++ b/yql/essentials/public/purecalc/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
empty_stream.h
fake_spec.cpp
diff --git a/yql/essentials/public/purecalc/ya.make b/yql/essentials/public/purecalc/ya.make
index e7f3ff8818f..0d820f08348 100644
--- a/yql/essentials/public/purecalc/ya.make
+++ b/yql/essentials/public/purecalc/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
purecalc.cpp
)
diff --git a/yql/essentials/public/result_format/ut/ya.make b/yql/essentials/public/result_format/ut/ya.make
index 6230085e7dc..22655955c78 100644
--- a/yql/essentials/public/result_format/ut/ya.make
+++ b/yql/essentials/public/result_format/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST_FOR(yql/essentials/public/result_format)
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
yql_result_format_response_ut.cpp
yql_result_format_type_ut.cpp
diff --git a/yql/essentials/public/result_format/ut/yql_restricted_yson_ut.cpp b/yql/essentials/public/result_format/ut/yql_restricted_yson_ut.cpp
index 2175ce63f70..fcf3d7211f6 100644
--- a/yql/essentials/public/result_format/ut/yql_restricted_yson_ut.cpp
+++ b/yql/essentials/public/result_format/ut/yql_restricted_yson_ut.cpp
@@ -22,74 +22,69 @@ TString Normalize(const TString& yson) {
return FormatNode(NYT::NodeFromYsonString(yson));
}
-}
+} // namespace
Y_UNIT_TEST_SUITE(TRestrictedYson) {
- void RunTest(const NYT::TNode& node, const TString& expectedNodeStr, const TString& expectedEncodedStr) {
- UNIT_ASSERT_VALUES_EQUAL(FormatNode(node), expectedNodeStr);
- TString encoded = NResult::EncodeRestrictedYson(node, NYson::EYsonFormat::Text);
- UNIT_ASSERT_VALUES_EQUAL(Normalize(encoded), expectedEncodedStr);
- TString decoded = NResult::DecodeRestrictedYson(TStringBuf(encoded), NYson::EYsonFormat::Text);
- UNIT_ASSERT_VALUES_EQUAL(FormatNode(node), Normalize(decoded));
- }
-
- Y_UNIT_TEST(MapScalars) {
- NYT::TNode node = NYT::TNode::CreateMap();
- node["a"] = NYT::TNode("abc");
- node["b"] = NYT::TNode::CreateEntity();
- node["c"] = NYT::TNode(true);
- node["d"] = NYT::TNode(1);
- node["e"] = NYT::TNode(1u);
- node["f"] = NYT::TNode(1.25);
-
- RunTest(node,
+void RunTest(const NYT::TNode& node, const TString& expectedNodeStr, const TString& expectedEncodedStr) {
+ UNIT_ASSERT_VALUES_EQUAL(FormatNode(node), expectedNodeStr);
+ TString encoded = NResult::EncodeRestrictedYson(node, NYson::EYsonFormat::Text);
+ UNIT_ASSERT_VALUES_EQUAL(Normalize(encoded), expectedEncodedStr);
+ TString decoded = NResult::DecodeRestrictedYson(TStringBuf(encoded), NYson::EYsonFormat::Text);
+ UNIT_ASSERT_VALUES_EQUAL(FormatNode(node), Normalize(decoded));
+}
+
+Y_UNIT_TEST(MapScalars) {
+ NYT::TNode node = NYT::TNode::CreateMap();
+ node["a"] = NYT::TNode("abc");
+ node["b"] = NYT::TNode::CreateEntity();
+ node["c"] = NYT::TNode(true);
+ node["d"] = NYT::TNode(1);
+ node["e"] = NYT::TNode(1u);
+ node["f"] = NYT::TNode(1.25);
+
+ RunTest(node,
R"({"a"="abc";"b"=#;"c"=%true;"d"=1;"e"=1u;"f"=1.25})",
- R"({"a"={"$type"="string";"$value"="abc"};"b"=#;"c"={"$type"="boolean";"$value"="true"};"d"={"$type"="int64";"$value"="1"};"e"={"$type"="uint64";"$value"="1"};"f"={"$type"="double";"$value"="1.25"}})"
- );
- }
+ R"({"a"={"$type"="string";"$value"="abc"};"b"=#;"c"={"$type"="boolean";"$value"="true"};"d"={"$type"="int64";"$value"="1"};"e"={"$type"="uint64";"$value"="1"};"f"={"$type"="double";"$value"="1.25"}})");
+}
- Y_UNIT_TEST(ScalarWithAttributes) {
- NYT::TNode node("abc");
- node.Attributes()["d"] = NYT::TNode(true);
+Y_UNIT_TEST(ScalarWithAttributes) {
+ NYT::TNode node("abc");
+ node.Attributes()["d"] = NYT::TNode(true);
- RunTest(node,
+ RunTest(node,
R"(<"d"=%true>"abc")",
- R"({"$attributes"={"d"={"$type"="boolean";"$value"="true"}};"$type"="string";"$value"="abc"})"
- );
- }
+ R"({"$attributes"={"d"={"$type"="boolean";"$value"="true"}};"$type"="string";"$value"="abc"})");
+}
- Y_UNIT_TEST(MapWithAttributes) {
- NYT::TNode node = NYT::TNode::CreateMap();
- node["b"] = NYT::TNode::CreateEntity();
- node["c"] = NYT::TNode(false);
- node.Attributes()["d"] = NYT::TNode(true);
+Y_UNIT_TEST(MapWithAttributes) {
+ NYT::TNode node = NYT::TNode::CreateMap();
+ node["b"] = NYT::TNode::CreateEntity();
+ node["c"] = NYT::TNode(false);
+ node.Attributes()["d"] = NYT::TNode(true);
- RunTest(node,
+ RunTest(node,
R"(<"d"=%true>{"b"=#;"c"=%false})",
- R"({"$attributes"={"d"={"$type"="boolean";"$value"="true"}};"$value"={"b"=#;"c"={"$type"="boolean";"$value"="false"}}})"
- );
- }
+ R"({"$attributes"={"d"={"$type"="boolean";"$value"="true"}};"$value"={"b"=#;"c"={"$type"="boolean";"$value"="false"}}})");
+}
- Y_UNIT_TEST(ListWithAttributes) {
- NYT::TNode node = NYT::TNode::CreateList();
- node.Add(NYT::TNode::CreateEntity());
- node.Add(NYT::TNode(false));
- node.Attributes()["d"] = NYT::TNode(true);
+Y_UNIT_TEST(ListWithAttributes) {
+ NYT::TNode node = NYT::TNode::CreateList();
+ node.Add(NYT::TNode::CreateEntity());
+ node.Add(NYT::TNode(false));
+ node.Attributes()["d"] = NYT::TNode(true);
- RunTest(node,
+ RunTest(node,
R"(<"d"=%true>[#;%false])",
- R"({"$attributes"={"d"={"$type"="boolean";"$value"="true"}};"$value"=[#;{"$type"="boolean";"$value"="false"}]})"
- );
- }
+ R"({"$attributes"={"d"={"$type"="boolean";"$value"="true"}};"$value"=[#;{"$type"="boolean";"$value"="false"}]})");
+}
- Y_UNIT_TEST(EntityWithAttributes) {
- NYT::TNode node = NYT::TNode::CreateEntity();
- node.Attributes()["d"] = NYT::TNode(true);
+Y_UNIT_TEST(EntityWithAttributes) {
+ NYT::TNode node = NYT::TNode::CreateEntity();
+ node.Attributes()["d"] = NYT::TNode(true);
- RunTest(node,
+ RunTest(node,
R"(<"d"=%true>#)",
- R"({"$attributes"={"d"={"$type"="boolean";"$value"="true"}};"$value"=#})"
- );
- }
-}
+ R"({"$attributes"={"d"={"$type"="boolean";"$value"="true"}};"$value"=#})");
}
+} // Y_UNIT_TEST_SUITE(TRestrictedYson)
+} // namespace NYql
diff --git a/yql/essentials/public/result_format/ut/yql_result_format_data_ut.cpp b/yql/essentials/public/result_format/ut/yql_result_format_data_ut.cpp
index 642065b3b15..50a6a8ad49e 100644
--- a/yql/essentials/public/result_format/ut/yql_result_format_data_ut.cpp
+++ b/yql/essentials/public/result_format/ut/yql_result_format_data_ut.cpp
@@ -22,224 +22,224 @@ void Test(const TString& inputType, const TString& inputData, const TMaybe<TStri
}
Y_UNIT_TEST_SUITE(ParseData) {
- Y_UNIT_TEST(EmptyVisitor) {
- TEmptyDataVisitor v;
- v.OnVoid();
- v.OnNull();
- v.OnEmptyList();
- v.OnEmptyDict();
- v.OnBool(true);
- v.OnInt8(1);
- v.OnUint8(1);
- v.OnInt16(1);
- v.OnUint16(1);
- v.OnInt32(1);
- v.OnUint32(1);
- v.OnInt64(1);
- v.OnUint64(1);
- v.OnFloat(1.2f);
- v.OnDouble(1.2f);
- v.OnString("foo", true);
- v.OnUtf8("foo");
- v.OnYson("foo", true);
- v.OnJson("foo");
- v.OnJsonDocument("foo");
- v.OnUuid("foo", true);
- v.OnDyNumber("foo", true);
- v.OnDate(1);
- v.OnDatetime(1);
- v.OnTimestamp(1);
- v.OnTzDate("foo");
- v.OnTzDatetime("foo");
- v.OnTzTimestamp("foo");
- v.OnInterval(1);
- v.OnDate32(1);
- v.OnDatetime64(1);
- v.OnTimestamp64(1);
- v.OnTzDate32("foo");
- v.OnTzDatetime64("foo");
- v.OnTzTimestamp64("foo");
- v.OnInterval64(1);
- v.OnDecimal("1.2");
- v.OnBeginOptional();
- v.OnBeforeOptionalItem();
- v.OnAfterOptionalItem();
- v.OnEmptyOptional();
- v.OnEndOptional();
- v.OnBeginList();
- v.OnBeforeListItem();
- v.OnAfterListItem();
- v.OnEndList();
- v.OnBeginTuple();
- v.OnBeforeTupleItem();
- v.OnAfterTupleItem();
- v.OnEndTuple();
- v.OnBeginStruct();
- v.OnBeforeStructItem();
- v.OnAfterStructItem();
- v.OnEndStruct();
- v.OnBeginDict();
- v.OnBeforeDictItem();
- v.OnBeforeDictKey();
- v.OnAfterDictKey();
- v.OnBeforeDictPayload();
- v.OnAfterDictPayload();
- v.OnAfterDictItem();
- v.OnEndDict();
- v.OnBeginVariant(0);
- v.OnEndVariant();
- v.OnPg("foo",true);
- }
+Y_UNIT_TEST(EmptyVisitor) {
+ TEmptyDataVisitor v;
+ v.OnVoid();
+ v.OnNull();
+ v.OnEmptyList();
+ v.OnEmptyDict();
+ v.OnBool(true);
+ v.OnInt8(1);
+ v.OnUint8(1);
+ v.OnInt16(1);
+ v.OnUint16(1);
+ v.OnInt32(1);
+ v.OnUint32(1);
+ v.OnInt64(1);
+ v.OnUint64(1);
+ v.OnFloat(1.2f);
+ v.OnDouble(1.2f);
+ v.OnString("foo", true);
+ v.OnUtf8("foo");
+ v.OnYson("foo", true);
+ v.OnJson("foo");
+ v.OnJsonDocument("foo");
+ v.OnUuid("foo", true);
+ v.OnDyNumber("foo", true);
+ v.OnDate(1);
+ v.OnDatetime(1);
+ v.OnTimestamp(1);
+ v.OnTzDate("foo");
+ v.OnTzDatetime("foo");
+ v.OnTzTimestamp("foo");
+ v.OnInterval(1);
+ v.OnDate32(1);
+ v.OnDatetime64(1);
+ v.OnTimestamp64(1);
+ v.OnTzDate32("foo");
+ v.OnTzDatetime64("foo");
+ v.OnTzTimestamp64("foo");
+ v.OnInterval64(1);
+ v.OnDecimal("1.2");
+ v.OnBeginOptional();
+ v.OnBeforeOptionalItem();
+ v.OnAfterOptionalItem();
+ v.OnEmptyOptional();
+ v.OnEndOptional();
+ v.OnBeginList();
+ v.OnBeforeListItem();
+ v.OnAfterListItem();
+ v.OnEndList();
+ v.OnBeginTuple();
+ v.OnBeforeTupleItem();
+ v.OnAfterTupleItem();
+ v.OnEndTuple();
+ v.OnBeginStruct();
+ v.OnBeforeStructItem();
+ v.OnAfterStructItem();
+ v.OnEndStruct();
+ v.OnBeginDict();
+ v.OnBeforeDictItem();
+ v.OnBeforeDictKey();
+ v.OnAfterDictKey();
+ v.OnBeforeDictPayload();
+ v.OnAfterDictPayload();
+ v.OnAfterDictItem();
+ v.OnEndDict();
+ v.OnBeginVariant(0);
+ v.OnEndVariant();
+ v.OnPg("foo", true);
+}
- Y_UNIT_TEST(ThrowingVisitor) {
- TThrowingDataVisitor v;
- UNIT_ASSERT_EXCEPTION(v.OnVoid(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnNull(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEmptyList(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEmptyDict(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBool(true), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInt8(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUint8(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInt16(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUint16(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInt32(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUint32(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInt64(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUint64(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnFloat(1.2f), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDouble(1.2f), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnString("foo", true), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUtf8("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnYson("foo", true), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnJson("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnJsonDocument("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUuid("foo", true), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDyNumber("foo", true), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDate(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDatetime(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTimestamp(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzDate("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzDatetime("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzTimestamp("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInterval(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDate32(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDatetime64(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTimestamp64(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzDate32("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzDatetime64("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzTimestamp64("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInterval64(1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDecimal("1.2"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginOptional(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeforeOptionalItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnAfterOptionalItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEmptyOptional(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndOptional(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginList(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeforeListItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnAfterListItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndList(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginTuple(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeforeTupleItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnAfterTupleItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndTuple(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginStruct(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeforeStructItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnAfterStructItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndStruct(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginDict(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeforeDictItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeforeDictKey(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnAfterDictKey(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeforeDictPayload(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnAfterDictPayload(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnAfterDictItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndDict(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginVariant(0), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndVariant(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnPg("foo",true), TUnsupportedException);
- }
+Y_UNIT_TEST(ThrowingVisitor) {
+ TThrowingDataVisitor v;
+ UNIT_ASSERT_EXCEPTION(v.OnVoid(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnNull(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEmptyList(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEmptyDict(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBool(true), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInt8(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUint8(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInt16(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUint16(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInt32(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUint32(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInt64(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUint64(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnFloat(1.2f), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDouble(1.2f), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnString("foo", true), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUtf8("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnYson("foo", true), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnJson("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnJsonDocument("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUuid("foo", true), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDyNumber("foo", true), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDate(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDatetime(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTimestamp(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzDate("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzDatetime("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzTimestamp("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInterval(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDate32(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDatetime64(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTimestamp64(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzDate32("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzDatetime64("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzTimestamp64("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInterval64(1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDecimal("1.2"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginOptional(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeforeOptionalItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnAfterOptionalItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEmptyOptional(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndOptional(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginList(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeforeListItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnAfterListItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndList(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginTuple(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeforeTupleItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnAfterTupleItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndTuple(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginStruct(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeforeStructItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnAfterStructItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndStruct(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginDict(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeforeDictItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeforeDictKey(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnAfterDictKey(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeforeDictPayload(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnAfterDictPayload(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnAfterDictItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndDict(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginVariant(0), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndVariant(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnPg("foo", true), TUnsupportedException);
+}
- Y_UNIT_TEST(Void) {
- Test("[VoidType]","Void");
- }
+Y_UNIT_TEST(Void) {
+ Test("[VoidType]", "Void");
+}
- Y_UNIT_TEST(Null) {
- Test("[NullType]","#");
- }
+Y_UNIT_TEST(Null) {
+ Test("[NullType]", "#");
+}
- Y_UNIT_TEST(EmptyList) {
- Test("[EmptyListType]","[]");
- }
+Y_UNIT_TEST(EmptyList) {
+ Test("[EmptyListType]", "[]");
+}
- Y_UNIT_TEST(EmptyDict) {
- Test("[EmptyDictType]","[]");
- }
+Y_UNIT_TEST(EmptyDict) {
+ Test("[EmptyDictType]", "[]");
+}
- Y_UNIT_TEST(Bool) {
- Test("[DataType;Bool]","%true");
- Test("[DataType;Bool]","%false");
- }
+Y_UNIT_TEST(Bool) {
+ Test("[DataType;Bool]", "%true");
+ Test("[DataType;Bool]", "%false");
+}
- Y_UNIT_TEST(Int8) {
- Test("[DataType;Int8]","\"1\"");
- }
+Y_UNIT_TEST(Int8) {
+ Test("[DataType;Int8]", "\"1\"");
+}
- Y_UNIT_TEST(Uint8) {
- Test("[DataType;Uint8]","\"1\"");
- }
+Y_UNIT_TEST(Uint8) {
+ Test("[DataType;Uint8]", "\"1\"");
+}
- Y_UNIT_TEST(Int16) {
- Test("[DataType;Int16]","\"1\"");
- }
+Y_UNIT_TEST(Int16) {
+ Test("[DataType;Int16]", "\"1\"");
+}
- Y_UNIT_TEST(Uint16) {
- Test("[DataType;Uint16]","\"1\"");
- }
+Y_UNIT_TEST(Uint16) {
+ Test("[DataType;Uint16]", "\"1\"");
+}
- Y_UNIT_TEST(Int32) {
- Test("[DataType;Int32]","\"1\"");
- }
+Y_UNIT_TEST(Int32) {
+ Test("[DataType;Int32]", "\"1\"");
+}
- Y_UNIT_TEST(Uint32) {
- Test("[DataType;Uint32]","\"1\"");
- }
+Y_UNIT_TEST(Uint32) {
+ Test("[DataType;Uint32]", "\"1\"");
+}
- Y_UNIT_TEST(Int64) {
- Test("[DataType;Int64]","\"1\"");
- }
+Y_UNIT_TEST(Int64) {
+ Test("[DataType;Int64]", "\"1\"");
+}
- Y_UNIT_TEST(Uint64) {
- Test("[DataType;Uint64]","\"1\"");
- }
+Y_UNIT_TEST(Uint64) {
+ Test("[DataType;Uint64]", "\"1\"");
+}
- Y_UNIT_TEST(Float) {
- Test("[DataType;Float]","\"1.2\"");
- Test("[DataType;Float]","\"-inf\"");
- Test("[DataType;Float]","\"nan\"");
- }
+Y_UNIT_TEST(Float) {
+ Test("[DataType;Float]", "\"1.2\"");
+ Test("[DataType;Float]", "\"-inf\"");
+ Test("[DataType;Float]", "\"nan\"");
+}
- Y_UNIT_TEST(Double) {
- Test("[DataType;Double]","\"1.2\"");
- Test("[DataType;Double]","\"-inf\"");
- Test("[DataType;Double]","\"nan\"");
- }
+Y_UNIT_TEST(Double) {
+ Test("[DataType;Double]", "\"1.2\"");
+ Test("[DataType;Double]", "\"-inf\"");
+ Test("[DataType;Double]", "\"nan\"");
+}
- Y_UNIT_TEST(String) {
- Test("[DataType;String]","\"foo\"");
- Test("[DataType;String]","[\"/w==\"]");
- }
+Y_UNIT_TEST(String) {
+ Test("[DataType;String]", "\"foo\"");
+ Test("[DataType;String]", "[\"/w==\"]");
+}
- Y_UNIT_TEST(Utf8) {
- Test("[DataType;Utf8]","\"foo\"");
- }
+Y_UNIT_TEST(Utf8) {
+ Test("[DataType;Utf8]", "\"foo\"");
+}
- Y_UNIT_TEST(Json) {
- Test("[DataType;Json]","\"[]\"");
- }
+Y_UNIT_TEST(Json) {
+ Test("[DataType;Json]", "\"[]\"");
+}
- Y_UNIT_TEST(Yson) {
- Test("[DataType;Yson]",R"(
+Y_UNIT_TEST(Yson) {
+ Test("[DataType;Yson]", R"(
{
"$attributes" = {
"a" = {
@@ -254,143 +254,143 @@ Y_UNIT_TEST_SUITE(ParseData) {
}
}
})");
- }
-
- Y_UNIT_TEST(JsonDocument) {
- Test("[DataType;JsonDocument]","\"[]\"");
- }
+}
- Y_UNIT_TEST(Uuid) {
- Test("[DataType;Uuid]","[\"AIQOVZvi1EGnFkRmVUQAAA==\"]");
- }
+Y_UNIT_TEST(JsonDocument) {
+ Test("[DataType;JsonDocument]", "\"[]\"");
+}
- Y_UNIT_TEST(DyNumber) {
- Test("[DataType;DyNumber]","[\"AoIS\"]");
- }
+Y_UNIT_TEST(Uuid) {
+ Test("[DataType;Uuid]", "[\"AIQOVZvi1EGnFkRmVUQAAA==\"]");
+}
- Y_UNIT_TEST(Date) {
- Test("[DataType;Date]","\"1\"");
- }
+Y_UNIT_TEST(DyNumber) {
+ Test("[DataType;DyNumber]", "[\"AoIS\"]");
+}
- Y_UNIT_TEST(Datetime) {
- Test("[DataType;Datetime]","\"1\"");
- }
+Y_UNIT_TEST(Date) {
+ Test("[DataType;Date]", "\"1\"");
+}
- Y_UNIT_TEST(Timestamp) {
- Test("[DataType;Timestamp]","\"1\"");
- }
+Y_UNIT_TEST(Datetime) {
+ Test("[DataType;Datetime]", "\"1\"");
+}
- Y_UNIT_TEST(TzDate) {
- Test("[DataType;TzDate]","\"2011-04-27,Europe/Moscow\"");
- }
+Y_UNIT_TEST(Timestamp) {
+ Test("[DataType;Timestamp]", "\"1\"");
+}
- Y_UNIT_TEST(TzDatetime) {
- Test("[DataType;TzDatetime]","\"2011-04-27T01:02:03,Europe/Moscow\"");
- }
+Y_UNIT_TEST(TzDate) {
+ Test("[DataType;TzDate]", "\"2011-04-27,Europe/Moscow\"");
+}
- Y_UNIT_TEST(TzTimestamp) {
- Test("[DataType;TzTimestamp]","\"2011-04-27T01:02:03.456789,Europe/Moscow\"");
- }
+Y_UNIT_TEST(TzDatetime) {
+ Test("[DataType;TzDatetime]", "\"2011-04-27T01:02:03,Europe/Moscow\"");
+}
- Y_UNIT_TEST(Interval) {
- Test("[DataType;Interval]","\"1\"");
- }
+Y_UNIT_TEST(TzTimestamp) {
+ Test("[DataType;TzTimestamp]", "\"2011-04-27T01:02:03.456789,Europe/Moscow\"");
+}
- Y_UNIT_TEST(Date32) {
- Test("[DataType;Date32]","\"1\"");
- }
+Y_UNIT_TEST(Interval) {
+ Test("[DataType;Interval]", "\"1\"");
+}
- Y_UNIT_TEST(Datetime64) {
- Test("[DataType;Datetime64]","\"1\"");
- }
+Y_UNIT_TEST(Date32) {
+ Test("[DataType;Date32]", "\"1\"");
+}
- Y_UNIT_TEST(Timestamp64) {
- Test("[DataType;Timestamp64]","\"1\"");
- }
+Y_UNIT_TEST(Datetime64) {
+ Test("[DataType;Datetime64]", "\"1\"");
+}
- Y_UNIT_TEST(TzDate32) {
- Test("[DataType;TzDate32]","\"2011-04-27,Europe/Moscow\"");
- }
+Y_UNIT_TEST(Timestamp64) {
+ Test("[DataType;Timestamp64]", "\"1\"");
+}
- Y_UNIT_TEST(TzDatetime64) {
- Test("[DataType;TzDatetime64]","\"2011-04-27T01:02:03,Europe/Moscow\"");
- }
+Y_UNIT_TEST(TzDate32) {
+ Test("[DataType;TzDate32]", "\"2011-04-27,Europe/Moscow\"");
+}
- Y_UNIT_TEST(TzTimestamp64) {
- Test("[DataType;TzTimestamp64]","\"2011-04-27T01:02:03.456789,Europe/Moscow\"");
- }
+Y_UNIT_TEST(TzDatetime64) {
+ Test("[DataType;TzDatetime64]", "\"2011-04-27T01:02:03,Europe/Moscow\"");
+}
- Y_UNIT_TEST(Interval64) {
- Test("[DataType;Interval64]","\"1\"");
- }
+Y_UNIT_TEST(TzTimestamp64) {
+ Test("[DataType;TzTimestamp64]", "\"2011-04-27T01:02:03.456789,Europe/Moscow\"");
+}
- Y_UNIT_TEST(Decimal) {
- Test("[DataType;Decimal;\"10\";\"1\"]","\"1.2\"");
- Test("[DataType;Decimal;\"10\";\"1\"]","\"-inf\"");
- Test("[DataType;Decimal;\"10\";\"1\"]","\"nan\"");
- }
+Y_UNIT_TEST(Interval64) {
+ Test("[DataType;Interval64]", "\"1\"");
+}
- Y_UNIT_TEST(Optional1) {
- Test("[OptionalType;[DataType;Int32]]","[]");
- Test("[OptionalType;[DataType;Int32]]","[\"1\"]");
- }
+Y_UNIT_TEST(Decimal) {
+ Test("[DataType;Decimal;\"10\";\"1\"]", "\"1.2\"");
+ Test("[DataType;Decimal;\"10\";\"1\"]", "\"-inf\"");
+ Test("[DataType;Decimal;\"10\";\"1\"]", "\"nan\"");
+}
- Y_UNIT_TEST(Optional2) {
- Test("[OptionalType;[OptionalType;[DataType;Int32]]]","[]", "#");
- Test("[OptionalType;[OptionalType;[DataType;Int32]]]","[[]]", "[#]");
- Test("[OptionalType;[OptionalType;[DataType;Int32]]]","[[\"1\"]]");
- }
+Y_UNIT_TEST(Optional1) {
+ Test("[OptionalType;[DataType;Int32]]", "[]");
+ Test("[OptionalType;[DataType;Int32]]", "[\"1\"]");
+}
- Y_UNIT_TEST(List1) {
- Test("[ListType;[DataType;Int32]]","[]");
- Test("[ListType;[DataType;Int32]]","[\"1\"]");
- Test("[ListType;[DataType;Int32]]","[\"1\";\"2\"]");
- }
+Y_UNIT_TEST(Optional2) {
+ Test("[OptionalType;[OptionalType;[DataType;Int32]]]", "[]", "#");
+ Test("[OptionalType;[OptionalType;[DataType;Int32]]]", "[[]]", "[#]");
+ Test("[OptionalType;[OptionalType;[DataType;Int32]]]", "[[\"1\"]]");
+}
- Y_UNIT_TEST(List2) {
- Test("[ListType;[ListType;[DataType;Int32]]]","[]");
- Test("[ListType;[ListType;[DataType;Int32]]]","[[];[\"1\"]]");
- Test("[ListType;[ListType;[DataType;Int32]]]","[[\"1\";\"2\";\"3\"];[\"4\";\"5\";\"6\"]]");
- }
+Y_UNIT_TEST(List1) {
+ Test("[ListType;[DataType;Int32]]", "[]");
+ Test("[ListType;[DataType;Int32]]", "[\"1\"]");
+ Test("[ListType;[DataType;Int32]]", "[\"1\";\"2\"]");
+}
- Y_UNIT_TEST(EmptyTuple) {
- Test("[TupleType;[]]","[]");
- }
+Y_UNIT_TEST(List2) {
+ Test("[ListType;[ListType;[DataType;Int32]]]", "[]");
+ Test("[ListType;[ListType;[DataType;Int32]]]", "[[];[\"1\"]]");
+ Test("[ListType;[ListType;[DataType;Int32]]]", "[[\"1\";\"2\";\"3\"];[\"4\";\"5\";\"6\"]]");
+}
- Y_UNIT_TEST(Tuple) {
- Test("[TupleType;[[DataType;Int32];[DataType;String]]]","[\"1\";\"foo\"]");
- }
+Y_UNIT_TEST(EmptyTuple) {
+ Test("[TupleType;[]]", "[]");
+}
- Y_UNIT_TEST(EmptyStruct) {
- Test("[StructType;[]]","[]");
- }
+Y_UNIT_TEST(Tuple) {
+ Test("[TupleType;[[DataType;Int32];[DataType;String]]]", "[\"1\";\"foo\"]");
+}
- Y_UNIT_TEST(Struct) {
- Test("[StructType;[[foo;[DataType;Int32]];[bar;[DataType;String]]]]","[\"1\";\"foo\"]");
- }
+Y_UNIT_TEST(EmptyStruct) {
+ Test("[StructType;[]]", "[]");
+}
- Y_UNIT_TEST(Dict) {
- Test("[DictType;[DataType;Int32];[DataType;String]]","[]");
- Test("[DictType;[DataType;Int32];[DataType;String]]","[[\"1\";\"foo\"]]");
- Test("[DictType;[DataType;Int32];[DataType;String]]","[[\"1\";\"foo\"];[\"2\";\"bar\"]]");
- }
+Y_UNIT_TEST(Struct) {
+ Test("[StructType;[[foo;[DataType;Int32]];[bar;[DataType;String]]]]", "[\"1\";\"foo\"]");
+}
- Y_UNIT_TEST(Variant) {
- Test("[VariantType;[TupleType;[[DataType;Int32];[DataType;String]]]]","[\"0\";\"7\"]");
- Test("[VariantType;[TupleType;[[DataType;Int32];[DataType;String]]]]","[\"1\";\"foo\"]");
- Test("[VariantType;[StructType;[[foo;[DataType;Int32]];[bar;[DataType;String]]]]]","[\"0\";\"7\"]");
- Test("[VariantType;[StructType;[[foo;[DataType;Int32]];[bar;[DataType;String]]]]]","[\"1\";\"foo\"]");
- }
+Y_UNIT_TEST(Dict) {
+ Test("[DictType;[DataType;Int32];[DataType;String]]", "[]");
+ Test("[DictType;[DataType;Int32];[DataType;String]]", "[[\"1\";\"foo\"]]");
+ Test("[DictType;[DataType;Int32];[DataType;String]]", "[[\"1\";\"foo\"];[\"2\";\"bar\"]]");
+}
- Y_UNIT_TEST(Tagged) {
- Test("[TaggedType;foo;[DataType;Int32]]","\"1\"");
- }
+Y_UNIT_TEST(Variant) {
+ Test("[VariantType;[TupleType;[[DataType;Int32];[DataType;String]]]]", "[\"0\";\"7\"]");
+ Test("[VariantType;[TupleType;[[DataType;Int32];[DataType;String]]]]", "[\"1\";\"foo\"]");
+ Test("[VariantType;[StructType;[[foo;[DataType;Int32]];[bar;[DataType;String]]]]]", "[\"0\";\"7\"]");
+ Test("[VariantType;[StructType;[[foo;[DataType;Int32]];[bar;[DataType;String]]]]]", "[\"1\";\"foo\"]");
+}
- Y_UNIT_TEST(Pg) {
- Test("[PgType;\"text\";\"S\"]","#");
- Test("[PgType;\"text\";\"S\"]","\"foo\"");
- Test("[PgType;\"bytea\";\"U\"]","[\"EjRWeJoAvN4=\"]");
- }
+Y_UNIT_TEST(Tagged) {
+ Test("[TaggedType;foo;[DataType;Int32]]", "\"1\"");
}
+Y_UNIT_TEST(Pg) {
+ Test("[PgType;\"text\";\"S\"]", "#");
+ Test("[PgType;\"text\";\"S\"]", "\"foo\"");
+ Test("[PgType;\"bytea\";\"U\"]", "[\"EjRWeJoAvN4=\"]");
}
+} // Y_UNIT_TEST_SUITE(ParseData)
+
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/ut/yql_result_format_response_ut.cpp b/yql/essentials/public/result_format/ut/yql_result_format_response_ut.cpp
index 04d05bbc5a8..1675842bdce 100644
--- a/yql/essentials/public/result_format/ut/yql_result_format_response_ut.cpp
+++ b/yql/essentials/public/result_format/ut/yql_result_format_response_ut.cpp
@@ -7,26 +7,26 @@
namespace NYql::NResult {
Y_UNIT_TEST_SUITE(ParseResponse) {
- Y_UNIT_TEST(Empty) {
- auto response = NYT::NodeFromYsonString("[]");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 0);
- }
-
- Y_UNIT_TEST(One) {
- auto response = NYT::NodeFromYsonString(R"([
+Y_UNIT_TEST(Empty) {
+ auto response = NYT::NodeFromYsonString("[]");
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 0);
+}
+
+Y_UNIT_TEST(One) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
]
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- }
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+}
- Y_UNIT_TEST(Two) {
- auto response = NYT::NodeFromYsonString(R"([
+Y_UNIT_TEST(Two) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
]
@@ -37,12 +37,12 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 2);
- }
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 2);
+}
- Y_UNIT_TEST(Label) {
- auto response = NYT::NodeFromYsonString(R"([
+Y_UNIT_TEST(Label) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Label = foo;
Write = [
@@ -50,15 +50,15 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT(res.Label.Defined());
- UNIT_ASSERT_VALUES_EQUAL(*res.Label, "foo");
- }
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT(res.Label.Defined());
+ UNIT_ASSERT_VALUES_EQUAL(*res.Label, "foo");
+}
- Y_UNIT_TEST(Position) {
- auto response = NYT::NodeFromYsonString(R"([
+Y_UNIT_TEST(Position) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Position = {
File = "<main>";
@@ -70,17 +70,17 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT(res.Position.Defined());
- UNIT_ASSERT_VALUES_EQUAL(res.Position->File, "<main>");
- UNIT_ASSERT_VALUES_EQUAL(res.Position->Row, 1);
- UNIT_ASSERT_VALUES_EQUAL(res.Position->Column, 7);
- }
-
- Y_UNIT_TEST(Truncated) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT(res.Position.Defined());
+ UNIT_ASSERT_VALUES_EQUAL(res.Position->File, "<main>");
+ UNIT_ASSERT_VALUES_EQUAL(res.Position->Row, 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.Position->Column, 7);
+}
+
+Y_UNIT_TEST(Truncated) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Truncated = %true;
Write = [
@@ -88,14 +88,14 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT(res.IsTruncated);
- }
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT(res.IsTruncated);
+}
- Y_UNIT_TEST(Unordered) {
- auto response = NYT::NodeFromYsonString(R"([
+Y_UNIT_TEST(Unordered) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Unordered = %true;
Write = [
@@ -103,14 +103,14 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT(res.IsUnordered);
- }
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT(res.IsUnordered);
+}
- Y_UNIT_TEST(WriteOne) {
- auto response = NYT::NodeFromYsonString(R"([
+Y_UNIT_TEST(WriteOne) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -121,17 +121,17 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Data), "\"data\"");
- UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Type), "\"type\"");
- }
-
- Y_UNIT_TEST(WriteTwo) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Data), "\"data\"");
+ UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Type), "\"type\"");
+}
+
+Y_UNIT_TEST(WriteTwo) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -146,20 +146,20 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 2);
- const auto& write1 = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write1.Data), "\"data1\"");
- UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write1.Type), "\"type1\"");
- const auto& write2 = res.Writes[1];
- UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write2.Data), "\"data2\"");
- UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write2.Type), "\"type2\"");
- }
-
- Y_UNIT_TEST(WriteTruncated) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 2);
+ const auto& write1 = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write1.Data), "\"data1\"");
+ UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write1.Type), "\"type1\"");
+ const auto& write2 = res.Writes[1];
+ UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write2.Data), "\"data2\"");
+ UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write2.Type), "\"type2\"");
+}
+
+Y_UNIT_TEST(WriteTruncated) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -171,17 +171,17 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT(write.IsTruncated);
- UNIT_ASSERT(!res.IsTruncated);
- }
-
- Y_UNIT_TEST(WriteNoType) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT(write.IsTruncated);
+ UNIT_ASSERT(!res.IsTruncated);
+}
+
+Y_UNIT_TEST(WriteNoType) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -192,17 +192,17 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Data), "\"data\"");
- UNIT_ASSERT(!write.Type);
- }
-
- Y_UNIT_TEST(WriteNoData) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Data), "\"data\"");
+ UNIT_ASSERT(!write.Type);
+}
+
+Y_UNIT_TEST(WriteNoData) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -213,17 +213,17 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Type), "\"type\"");
- UNIT_ASSERT(!write.Data);
- }
-
- Y_UNIT_TEST(RefsEmpty) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Type), "\"type\"");
+ UNIT_ASSERT(!write.Data);
+}
+
+Y_UNIT_TEST(RefsEmpty) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -235,16 +235,16 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 0);
- }
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 0);
+}
- Y_UNIT_TEST(RefsOne) {
- auto response = NYT::NodeFromYsonString(R"([
+Y_UNIT_TEST(RefsOne) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -261,19 +261,19 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
- const auto& ref = write.Refs[0];
- UNIT_ASSERT_VALUES_EQUAL(ref.Reference.size(), 0);
- UNIT_ASSERT(ref.Remove);
- }
-
- Y_UNIT_TEST(RefsTwo) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
+ const auto& ref = write.Refs[0];
+ UNIT_ASSERT_VALUES_EQUAL(ref.Reference.size(), 0);
+ UNIT_ASSERT(ref.Remove);
+}
+
+Y_UNIT_TEST(RefsTwo) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -294,22 +294,22 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 2);
- const auto& ref1 = write.Refs[0];
- UNIT_ASSERT_VALUES_EQUAL(ref1.Reference.size(), 0);
- UNIT_ASSERT(ref1.Remove);
- const auto& ref2 = write.Refs[1];
- UNIT_ASSERT_VALUES_EQUAL(ref2.Reference.size(), 0);
- UNIT_ASSERT(ref2.Remove);
- }
-
- Y_UNIT_TEST(RefsComponents) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 2);
+ const auto& ref1 = write.Refs[0];
+ UNIT_ASSERT_VALUES_EQUAL(ref1.Reference.size(), 0);
+ UNIT_ASSERT(ref1.Remove);
+ const auto& ref2 = write.Refs[1];
+ UNIT_ASSERT_VALUES_EQUAL(ref2.Reference.size(), 0);
+ UNIT_ASSERT(ref2.Remove);
+}
+
+Y_UNIT_TEST(RefsComponents) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -326,21 +326,21 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
- const auto& ref = write.Refs[0];
- UNIT_ASSERT_VALUES_EQUAL(ref.Reference.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(ref.Reference[0], "foo");
- UNIT_ASSERT_VALUES_EQUAL(ref.Reference[1], "bar");
- UNIT_ASSERT(!ref.Remove);
- }
-
- Y_UNIT_TEST(RefsColumns) {
- auto response = NYT::NodeFromYsonString(R"([
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
+ const auto& ref = write.Refs[0];
+ UNIT_ASSERT_VALUES_EQUAL(ref.Reference.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(ref.Reference[0], "foo");
+ UNIT_ASSERT_VALUES_EQUAL(ref.Reference[1], "bar");
+ UNIT_ASSERT(!ref.Remove);
+}
+
+Y_UNIT_TEST(RefsColumns) {
+ auto response = NYT::NodeFromYsonString(R"([
{
Write = [
{
@@ -358,20 +358,18 @@ Y_UNIT_TEST_SUITE(ParseResponse) {
};
])");
- auto resList = ParseResponse(response);
- UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
- const auto& res = resList[0];
- UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
- const auto& write = res.Writes[0];
- UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
- const auto& ref = write.Refs[0];
- UNIT_ASSERT(ref.Columns.Defined());
- UNIT_ASSERT_VALUES_EQUAL(ref.Columns->size(), 2);
- UNIT_ASSERT_VALUES_EQUAL((*ref.Columns)[0], "col1");
- UNIT_ASSERT_VALUES_EQUAL((*ref.Columns)[1], "col2");
- }
+ auto resList = ParseResponse(response);
+ UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
+ const auto& res = resList[0];
+ UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
+ const auto& write = res.Writes[0];
+ UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
+ const auto& ref = write.Refs[0];
+ UNIT_ASSERT(ref.Columns.Defined());
+ UNIT_ASSERT_VALUES_EQUAL(ref.Columns->size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL((*ref.Columns)[0], "col1");
+ UNIT_ASSERT_VALUES_EQUAL((*ref.Columns)[1], "col2");
}
+} // Y_UNIT_TEST_SUITE(ParseResponse)
-}
-
-
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/ut/yql_result_format_type_ut.cpp b/yql/essentials/public/result_format/ut/yql_result_format_type_ut.cpp
index 70a34fb39d6..394d6a31515 100644
--- a/yql/essentials/public/result_format/ut/yql_result_format_type_ut.cpp
+++ b/yql/essentials/public/result_format/ut/yql_result_format_type_ut.cpp
@@ -14,339 +14,337 @@ void Test(const TString& input) {
}
Y_UNIT_TEST_SUITE(ParseType) {
- Y_UNIT_TEST(EmptyVisitor) {
- TEmptyTypeVisitor v;
- v.OnNull();
- v.OnVoid();
- v.OnEmptyList();
- v.OnEmptyDict();
- v.OnBool();
- v.OnInt8();
- v.OnUint8();
- v.OnInt16();
- v.OnUint16();
- v.OnInt32();
- v.OnUint32();
- v.OnInt64();
- v.OnUint64();
- v.OnFloat();
- v.OnDouble();
- v.OnString();
- v.OnUtf8();
- v.OnYson();
- v.OnJson();
- v.OnJsonDocument();
- v.OnUuid();
- v.OnDyNumber();
- v.OnDate();
- v.OnDatetime();
- v.OnTimestamp();
- v.OnTzDate();
- v.OnTzDatetime();
- v.OnTzTimestamp();
- v.OnInterval();
- v.OnDate32();
- v.OnDatetime64();
- v.OnTimestamp64();
- v.OnTzDate32();
- v.OnTzDatetime64();
- v.OnTzTimestamp64();
- v.OnInterval64();
- v.OnDecimal(10, 1);
- v.OnBeginOptional();
- v.OnEndOptional();
- v.OnBeginList();
- v.OnEndList();
- v.OnBeginTuple();
- v.OnTupleItem();
- v.OnEndTuple();
- v.OnBeginStruct();
- v.OnStructItem("foo");
- v.OnEndStruct();
- v.OnBeginDict();
- v.OnDictKey();
- v.OnDictPayload();
- v.OnEndDict();
- v.OnBeginVariant();
- v.OnEndVariant();
- v.OnBeginTagged("foo");
- v.OnEndTagged();
- v.OnPg("int4", "N");
- }
-
- Y_UNIT_TEST(ThrowingVisitor) {
- TThrowingTypeVisitor v;
- UNIT_ASSERT_EXCEPTION(v.OnNull(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnVoid(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEmptyList(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEmptyDict(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBool(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInt8(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUint8(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInt16(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUint16(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInt32(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUint32(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInt64(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUint64(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnFloat(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDouble(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnString(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUtf8(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnYson(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnJson(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnJsonDocument(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnUuid(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDyNumber(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDate(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDatetime(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTimestamp(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzDate(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzDatetime(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzTimestamp(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInterval(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDate32(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDatetime64(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTimestamp64(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzDate32(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzDatetime64(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTzTimestamp64(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnInterval64(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDecimal(10, 1), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginOptional(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndOptional(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginList(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndList(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginTuple(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnTupleItem(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndTuple(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginStruct(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnStructItem("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndStruct(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginDict(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDictKey(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnDictPayload(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndDict(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginVariant(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndVariant(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnBeginTagged("foo"), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnEndTagged(), TUnsupportedException);
- UNIT_ASSERT_EXCEPTION(v.OnPg("int4", "N"), TUnsupportedException);
- }
-
- Y_UNIT_TEST(BadNotList) {
- UNIT_ASSERT_EXCEPTION(Test("foo"), TUnsupportedException);
- }
-
- Y_UNIT_TEST(BadEmptyList) {
- UNIT_ASSERT_EXCEPTION(Test("[]"), TUnsupportedException);
- }
-
- Y_UNIT_TEST(BadNotStringName) {
- UNIT_ASSERT_EXCEPTION(Test("[#]"), TUnsupportedException);
- }
-
- Y_UNIT_TEST(BadUnknownName) {
- UNIT_ASSERT_EXCEPTION(Test("[unknown]"), TUnsupportedException);
- }
-
- Y_UNIT_TEST(Void) {
- Test("[VoidType]");
- }
-
- Y_UNIT_TEST(Null) {
- Test("[NullType]");
- }
-
- Y_UNIT_TEST(EmptyList) {
- Test("[EmptyListType]");
- }
-
- Y_UNIT_TEST(EmptyDict) {
- Test("[EmptyDictType]");
- }
-
- Y_UNIT_TEST(BadUnknownDataName) {
- UNIT_ASSERT_EXCEPTION(Test("[DataType;unknown]"), TUnsupportedException);
- }
-
- Y_UNIT_TEST(Bool) {
- Test("[DataType;Bool]");
- }
-
- Y_UNIT_TEST(Int8) {
- Test("[DataType;Int8]");
- }
-
- Y_UNIT_TEST(Uint8) {
- Test("[DataType;Uint8]");
- }
-
- Y_UNIT_TEST(Int16) {
- Test("[DataType;Int16]");
- }
-
- Y_UNIT_TEST(Uint16) {
- Test("[DataType;Uint16]");
- }
-
- Y_UNIT_TEST(Int32) {
- Test("[DataType;Int32]");
- }
-
- Y_UNIT_TEST(Uint32) {
- Test("[DataType;Uint32]");
- }
-
- Y_UNIT_TEST(Int64) {
- Test("[DataType;Int64]");
- }
-
- Y_UNIT_TEST(Uint64) {
- Test("[DataType;Uint64]");
- }
-
- Y_UNIT_TEST(Float) {
- Test("[DataType;Float]");
- }
-
- Y_UNIT_TEST(Double) {
- Test("[DataType;Double]");
- }
-
- Y_UNIT_TEST(String) {
- Test("[DataType;String]");
- }
-
- Y_UNIT_TEST(Utf8) {
- Test("[DataType;Utf8]");
- }
-
- Y_UNIT_TEST(Yson) {
- Test("[DataType;Yson]");
- }
-
- Y_UNIT_TEST(Json) {
- Test("[DataType;Json]");
- }
+Y_UNIT_TEST(EmptyVisitor) {
+ TEmptyTypeVisitor v;
+ v.OnNull();
+ v.OnVoid();
+ v.OnEmptyList();
+ v.OnEmptyDict();
+ v.OnBool();
+ v.OnInt8();
+ v.OnUint8();
+ v.OnInt16();
+ v.OnUint16();
+ v.OnInt32();
+ v.OnUint32();
+ v.OnInt64();
+ v.OnUint64();
+ v.OnFloat();
+ v.OnDouble();
+ v.OnString();
+ v.OnUtf8();
+ v.OnYson();
+ v.OnJson();
+ v.OnJsonDocument();
+ v.OnUuid();
+ v.OnDyNumber();
+ v.OnDate();
+ v.OnDatetime();
+ v.OnTimestamp();
+ v.OnTzDate();
+ v.OnTzDatetime();
+ v.OnTzTimestamp();
+ v.OnInterval();
+ v.OnDate32();
+ v.OnDatetime64();
+ v.OnTimestamp64();
+ v.OnTzDate32();
+ v.OnTzDatetime64();
+ v.OnTzTimestamp64();
+ v.OnInterval64();
+ v.OnDecimal(10, 1);
+ v.OnBeginOptional();
+ v.OnEndOptional();
+ v.OnBeginList();
+ v.OnEndList();
+ v.OnBeginTuple();
+ v.OnTupleItem();
+ v.OnEndTuple();
+ v.OnBeginStruct();
+ v.OnStructItem("foo");
+ v.OnEndStruct();
+ v.OnBeginDict();
+ v.OnDictKey();
+ v.OnDictPayload();
+ v.OnEndDict();
+ v.OnBeginVariant();
+ v.OnEndVariant();
+ v.OnBeginTagged("foo");
+ v.OnEndTagged();
+ v.OnPg("int4", "N");
+}
+
+Y_UNIT_TEST(ThrowingVisitor) {
+ TThrowingTypeVisitor v;
+ UNIT_ASSERT_EXCEPTION(v.OnNull(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnVoid(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEmptyList(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEmptyDict(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBool(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInt8(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUint8(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInt16(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUint16(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInt32(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUint32(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInt64(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUint64(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnFloat(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDouble(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnString(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUtf8(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnYson(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnJson(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnJsonDocument(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnUuid(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDyNumber(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDate(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDatetime(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTimestamp(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzDate(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzDatetime(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzTimestamp(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInterval(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDate32(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDatetime64(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTimestamp64(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzDate32(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzDatetime64(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTzTimestamp64(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnInterval64(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDecimal(10, 1), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginOptional(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndOptional(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginList(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndList(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginTuple(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnTupleItem(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndTuple(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginStruct(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnStructItem("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndStruct(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginDict(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDictKey(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnDictPayload(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndDict(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginVariant(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndVariant(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnBeginTagged("foo"), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnEndTagged(), TUnsupportedException);
+ UNIT_ASSERT_EXCEPTION(v.OnPg("int4", "N"), TUnsupportedException);
+}
+
+Y_UNIT_TEST(BadNotList) {
+ UNIT_ASSERT_EXCEPTION(Test("foo"), TUnsupportedException);
+}
+
+Y_UNIT_TEST(BadEmptyList) {
+ UNIT_ASSERT_EXCEPTION(Test("[]"), TUnsupportedException);
+}
+
+Y_UNIT_TEST(BadNotStringName) {
+ UNIT_ASSERT_EXCEPTION(Test("[#]"), TUnsupportedException);
+}
+
+Y_UNIT_TEST(BadUnknownName) {
+ UNIT_ASSERT_EXCEPTION(Test("[unknown]"), TUnsupportedException);
+}
+
+Y_UNIT_TEST(Void) {
+ Test("[VoidType]");
+}
+
+Y_UNIT_TEST(Null) {
+ Test("[NullType]");
+}
+
+Y_UNIT_TEST(EmptyList) {
+ Test("[EmptyListType]");
+}
+
+Y_UNIT_TEST(EmptyDict) {
+ Test("[EmptyDictType]");
+}
+
+Y_UNIT_TEST(BadUnknownDataName) {
+ UNIT_ASSERT_EXCEPTION(Test("[DataType;unknown]"), TUnsupportedException);
+}
+
+Y_UNIT_TEST(Bool) {
+ Test("[DataType;Bool]");
+}
+
+Y_UNIT_TEST(Int8) {
+ Test("[DataType;Int8]");
+}
+
+Y_UNIT_TEST(Uint8) {
+ Test("[DataType;Uint8]");
+}
+
+Y_UNIT_TEST(Int16) {
+ Test("[DataType;Int16]");
+}
+
+Y_UNIT_TEST(Uint16) {
+ Test("[DataType;Uint16]");
+}
+
+Y_UNIT_TEST(Int32) {
+ Test("[DataType;Int32]");
+}
+
+Y_UNIT_TEST(Uint32) {
+ Test("[DataType;Uint32]");
+}
+
+Y_UNIT_TEST(Int64) {
+ Test("[DataType;Int64]");
+}
+
+Y_UNIT_TEST(Uint64) {
+ Test("[DataType;Uint64]");
+}
- Y_UNIT_TEST(JsonDocument) {
- Test("[DataType;JsonDocument]");
- }
+Y_UNIT_TEST(Float) {
+ Test("[DataType;Float]");
+}
- Y_UNIT_TEST(Uuid) {
- Test("[DataType;Uuid]");
- }
+Y_UNIT_TEST(Double) {
+ Test("[DataType;Double]");
+}
- Y_UNIT_TEST(DyNumber) {
- Test("[DataType;DyNumber]");
- }
+Y_UNIT_TEST(String) {
+ Test("[DataType;String]");
+}
- Y_UNIT_TEST(Date) {
- Test("[DataType;Date]");
- }
+Y_UNIT_TEST(Utf8) {
+ Test("[DataType;Utf8]");
+}
- Y_UNIT_TEST(Datetime) {
- Test("[DataType;Datetime]");
- }
+Y_UNIT_TEST(Yson) {
+ Test("[DataType;Yson]");
+}
- Y_UNIT_TEST(Timestamp) {
- Test("[DataType;Timestamp]");
- }
+Y_UNIT_TEST(Json) {
+ Test("[DataType;Json]");
+}
- Y_UNIT_TEST(TzDate) {
- Test("[DataType;TzDate]");
- }
+Y_UNIT_TEST(JsonDocument) {
+ Test("[DataType;JsonDocument]");
+}
- Y_UNIT_TEST(TzDatetime) {
- Test("[DataType;TzDatetime]");
- }
+Y_UNIT_TEST(Uuid) {
+ Test("[DataType;Uuid]");
+}
- Y_UNIT_TEST(TzTimestamp) {
- Test("[DataType;TzTimestamp]");
- }
+Y_UNIT_TEST(DyNumber) {
+ Test("[DataType;DyNumber]");
+}
- Y_UNIT_TEST(Interval) {
- Test("[DataType;Interval]");
- }
+Y_UNIT_TEST(Date) {
+ Test("[DataType;Date]");
+}
+
+Y_UNIT_TEST(Datetime) {
+ Test("[DataType;Datetime]");
+}
+
+Y_UNIT_TEST(Timestamp) {
+ Test("[DataType;Timestamp]");
+}
+
+Y_UNIT_TEST(TzDate) {
+ Test("[DataType;TzDate]");
+}
+
+Y_UNIT_TEST(TzDatetime) {
+ Test("[DataType;TzDatetime]");
+}
- Y_UNIT_TEST(Date32) {
- Test("[DataType;Date32]");
- }
+Y_UNIT_TEST(TzTimestamp) {
+ Test("[DataType;TzTimestamp]");
+}
- Y_UNIT_TEST(Datetime64) {
- Test("[DataType;Datetime64]");
- }
+Y_UNIT_TEST(Interval) {
+ Test("[DataType;Interval]");
+}
- Y_UNIT_TEST(Timestamp64) {
- Test("[DataType;Timestamp64]");
- }
+Y_UNIT_TEST(Date32) {
+ Test("[DataType;Date32]");
+}
- Y_UNIT_TEST(TzDate32) {
- Test("[DataType;TzDate32]");
- }
+Y_UNIT_TEST(Datetime64) {
+ Test("[DataType;Datetime64]");
+}
- Y_UNIT_TEST(TzDatetime64) {
- Test("[DataType;TzDatetime64]");
- }
+Y_UNIT_TEST(Timestamp64) {
+ Test("[DataType;Timestamp64]");
+}
- Y_UNIT_TEST(TzTimestamp64) {
- Test("[DataType;TzTimestamp64]");
- }
+Y_UNIT_TEST(TzDate32) {
+ Test("[DataType;TzDate32]");
+}
- Y_UNIT_TEST(Interval64) {
- Test("[DataType;Interval64]");
- }
+Y_UNIT_TEST(TzDatetime64) {
+ Test("[DataType;TzDatetime64]");
+}
- Y_UNIT_TEST(Decimal) {
- Test("[DataType;Decimal;\"10\";\"1\"]");
- }
+Y_UNIT_TEST(TzTimestamp64) {
+ Test("[DataType;TzTimestamp64]");
+}
- Y_UNIT_TEST(OptionalInt32) {
- Test("[OptionalType;[DataType;Int32]]");
- }
+Y_UNIT_TEST(Interval64) {
+ Test("[DataType;Interval64]");
+}
- Y_UNIT_TEST(ListInt32) {
- Test("[ListType;[DataType;Int32]]");
- }
+Y_UNIT_TEST(Decimal) {
+ Test("[DataType;Decimal;\"10\";\"1\"]");
+}
- Y_UNIT_TEST(ListListInt32) {
- Test("[ListType;[ListType;[DataType;Int32]]]");
- }
+Y_UNIT_TEST(OptionalInt32) {
+ Test("[OptionalType;[DataType;Int32]]");
+}
- Y_UNIT_TEST(TupleInt32String) {
- Test("[TupleType;[[DataType;Int32];[DataType;String]]]");
- }
+Y_UNIT_TEST(ListInt32) {
+ Test("[ListType;[DataType;Int32]]");
+}
- Y_UNIT_TEST(EmptyTuple) {
- Test("[TupleType;[]]");
- }
+Y_UNIT_TEST(ListListInt32) {
+ Test("[ListType;[ListType;[DataType;Int32]]]");
+}
- Y_UNIT_TEST(StructInt32String) {
- Test("[StructType;[[foo;[DataType;Int32]];[bar;[DataType;String]]]]");
- }
+Y_UNIT_TEST(TupleInt32String) {
+ Test("[TupleType;[[DataType;Int32];[DataType;String]]]");
+}
- Y_UNIT_TEST(EmptyStruct) {
- Test("[StructType;[]]");
- }
+Y_UNIT_TEST(EmptyTuple) {
+ Test("[TupleType;[]]");
+}
- Y_UNIT_TEST(DictInt32String) {
- Test("[DictType;[DataType;Int32];[DataType;String]]");
- }
+Y_UNIT_TEST(StructInt32String) {
+ Test("[StructType;[[foo;[DataType;Int32]];[bar;[DataType;String]]]]");
+}
- Y_UNIT_TEST(VariantTupleInt32String) {
- Test("[VariantType;[TupleType;[[DataType;Int32];[DataType;String]]]]");
- }
+Y_UNIT_TEST(EmptyStruct) {
+ Test("[StructType;[]]");
+}
- Y_UNIT_TEST(TaggedInt32) {
- Test("[TaggedType;foo;[DataType;Int32]]");
- }
+Y_UNIT_TEST(DictInt32String) {
+ Test("[DictType;[DataType;Int32];[DataType;String]]");
+}
- Y_UNIT_TEST(Pg) {
- Test("[PgType;int4;N]");
- }
+Y_UNIT_TEST(VariantTupleInt32String) {
+ Test("[VariantType;[TupleType;[[DataType;Int32];[DataType;String]]]]");
}
+Y_UNIT_TEST(TaggedInt32) {
+ Test("[TaggedType;foo;[DataType;Int32]]");
}
+Y_UNIT_TEST(Pg) {
+ Test("[PgType;int4;N]");
+}
+} // Y_UNIT_TEST_SUITE(ParseType)
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/ya.make b/yql/essentials/public/result_format/ya.make
index 3181d30365b..1dfc2382739 100644
--- a/yql/essentials/public/result_format/ya.make
+++ b/yql/essentials/public/result_format/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
yql_result_format_response.cpp
yql_result_format_type.cpp
diff --git a/yql/essentials/public/result_format/yql_codec_results.cpp b/yql/essentials/public/result_format/yql_codec_results.cpp
index ac961cb3927..ee7723ccbbc 100644
--- a/yql/essentials/public/result_format/yql_codec_results.cpp
+++ b/yql/essentials/public/result_format/yql_codec_results.cpp
@@ -21,5 +21,5 @@ void TYsonResultWriter::OnStringScalar(TStringBuf value) {
}
}
-}
-}
+} // namespace NResult
+} // namespace NYql
diff --git a/yql/essentials/public/result_format/yql_codec_results.h b/yql/essentials/public/result_format/yql_codec_results.h
index f4822b5d8c3..b42eb34c4f6 100644
--- a/yql/essentials/public/result_format/yql_codec_results.h
+++ b/yql/essentials/public/result_format/yql_codec_results.h
@@ -96,5 +96,5 @@ private:
private:
NYson::TYsonConsumerBase& Writer_;
};
-}
-}
+} // namespace NResult
+} // namespace NYql
diff --git a/yql/essentials/public/result_format/yql_restricted_yson.cpp b/yql/essentials/public/result_format/yql_restricted_yson.cpp
index dec45b2c2b0..893fe812d24 100644
--- a/yql/essentials/public/result_format/yql_restricted_yson.cpp
+++ b/yql/essentials/public/result_format/yql_restricted_yson.cpp
@@ -16,10 +16,11 @@ namespace NYql {
namespace NResult {
namespace {
-class TRestrictedYsonFormatter : public NYson::TYsonConsumerBase {
+class TRestrictedYsonFormatter: public NYson::TYsonConsumerBase {
public:
TRestrictedYsonFormatter(TYsonResultWriter& writer)
- : Writer_(writer) {
+ : Writer_(writer)
+ {
}
void OnStringScalar(TStringBuf value) override {
@@ -199,47 +200,47 @@ TString DecodeRestrictedBinaryString(const TString& data) {
void DecodeRestrictedYson(const NYT::TNode& node, NYson::TYsonConsumerBase& writer) {
switch (node.GetType()) {
- case NYT::TNode::String:
- writer.OnStringScalar(node.AsString());
- return;
-
- case NYT::TNode::Int64:
- writer.OnInt64Scalar(node.AsInt64());
- return;
-
- case NYT::TNode::Uint64:
- writer.OnUint64Scalar(node.AsUint64());
- return;
-
- case NYT::TNode::Bool:
- writer.OnBooleanScalar(node.AsBool());
- return;
-
- case NYT::TNode::Double:
- writer.OnDoubleScalar(node.AsDouble());
- return;
-
- case NYT::TNode::Null:
- writer.OnEntity();
- return;
-
- case NYT::TNode::List:
- // just a list without attributes
- writer.OnBeginList();
- for (const auto& item : node.AsList()) {
- writer.OnListItem();
- DecodeRestrictedYson(item, writer);
- }
+ case NYT::TNode::String:
+ writer.OnStringScalar(node.AsString());
+ return;
+
+ case NYT::TNode::Int64:
+ writer.OnInt64Scalar(node.AsInt64());
+ return;
+
+ case NYT::TNode::Uint64:
+ writer.OnUint64Scalar(node.AsUint64());
+ return;
+
+ case NYT::TNode::Bool:
+ writer.OnBooleanScalar(node.AsBool());
+ return;
+
+ case NYT::TNode::Double:
+ writer.OnDoubleScalar(node.AsDouble());
+ return;
+
+ case NYT::TNode::Null:
+ writer.OnEntity();
+ return;
+
+ case NYT::TNode::List:
+ // just a list without attributes
+ writer.OnBeginList();
+ for (const auto& item : node.AsList()) {
+ writer.OnListItem();
+ DecodeRestrictedYson(item, writer);
+ }
- writer.OnEndList();
- return;
+ writer.OnEndList();
+ return;
- case NYT::TNode::Map:
- // process below
- break;
+ case NYT::TNode::Map:
+ // process below
+ break;
- default:
- YQL_ENSURE(false, "Unsupported node type: " << static_cast<int>(node.GetType()));
+ default:
+ YQL_ENSURE(false, "Unsupported node type: " << static_cast<int>(node.GetType()));
}
YQL_ENSURE(node.IsMap());
@@ -325,5 +326,5 @@ TString DecodeRestrictedYson(const TStringBuf& yson, NYson::EYsonFormat format)
return DecodeRestrictedYson(NYT::NodeFromYsonString(yson), format);
}
-}
-}
+} // namespace NResult
+} // namespace NYql
diff --git a/yql/essentials/public/result_format/yql_restricted_yson.h b/yql/essentials/public/result_format/yql_restricted_yson.h
index ba88c4121a7..e5abae6588c 100644
--- a/yql/essentials/public/result_format/yql_restricted_yson.h
+++ b/yql/essentials/public/result_format/yql_restricted_yson.h
@@ -6,8 +6,8 @@
#include <library/cpp/yson/public.h>
namespace NYT {
- class TNode;
-}
+class TNode;
+} // namespace NYT
namespace NYql {
namespace NResult {
@@ -28,5 +28,5 @@ TString DecodeRestrictedYson(
const NYT::TNode& node,
NYson::EYsonFormat format = NYson::EYsonFormat::Binary);
-}
-}
+} // namespace NResult
+} // namespace NYql
diff --git a/yql/essentials/public/result_format/yql_result_format_common.h b/yql/essentials/public/result_format/yql_result_format_common.h
index 875104d93ff..cd82e3cec12 100644
--- a/yql/essentials/public/result_format/yql_result_format_common.h
+++ b/yql/essentials/public/result_format/yql_result_format_common.h
@@ -3,6 +3,6 @@
namespace NYql::NResult {
-class TUnsupportedException : public yexception {};
+class TUnsupportedException: public yexception {};
-}
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/yql_result_format_data.cpp b/yql/essentials/public/result_format/yql_result_format_data.cpp
index df6f553750d..3330d5ce3f5 100644
--- a/yql/essentials/public/result_format/yql_result_format_data.cpp
+++ b/yql/essentials/public/result_format/yql_result_format_data.cpp
@@ -10,7 +10,6 @@
#include <library/cpp/string_utils/base64/base64.h>
#include <util/string/cast.h>
-
namespace NYql::NResult {
class IDataProcessor {
@@ -19,7 +18,7 @@ public:
virtual void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) = 0;
};
-class TVoidProcessor : public IDataProcessor {
+class TVoidProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsString());
@@ -28,7 +27,7 @@ public:
}
};
-class TNullProcessor : public IDataProcessor {
+class TNullProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsEntity());
@@ -36,7 +35,7 @@ public:
}
};
-class TEmptyListProcessor : public IDataProcessor {
+class TEmptyListProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsList() && dataNode.AsList().size() == 0);
@@ -44,7 +43,7 @@ public:
}
};
-class TEmptyDictProcessor : public IDataProcessor {
+class TEmptyDictProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsList() && dataNode.AsList().size() == 0);
@@ -53,7 +52,7 @@ public:
};
template <typename T, void (IDataVisitor::*Func)(T)>
-class TIntegerProcessor : public IDataProcessor {
+class TIntegerProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsString());
@@ -62,7 +61,7 @@ public:
};
template <typename T, T (*Conv)(TStringBuf), void (IDataVisitor::*Func)(T)>
-class TFloatingProcessor : public IDataProcessor {
+class TFloatingProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsString());
@@ -70,7 +69,7 @@ public:
}
};
-class TBoolProcessor : public IDataProcessor {
+class TBoolProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsBool());
@@ -79,11 +78,11 @@ public:
};
template <void (IDataVisitor::*Func)(TStringBuf, bool)>
-class TStringProcessor : public IDataProcessor {
+class TStringProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsString() ||
- dataNode.IsList() && dataNode.AsList().size() == 1 && dataNode.AsList()[0].IsString());
+ dataNode.IsList() && dataNode.AsList().size() == 1 && dataNode.AsList()[0].IsString());
if (dataNode.IsString()) {
(visitor.*Func)(dataNode.AsString(), true);
} else {
@@ -93,7 +92,7 @@ public:
};
template <void (IDataVisitor::*Func)(TStringBuf)>
-class TUtf8Processor : public IDataProcessor {
+class TUtf8Processor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsString());
@@ -101,7 +100,7 @@ public:
}
};
-class TYsonProcessor : public IDataProcessor {
+class TYsonProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
auto str = DecodeRestrictedYson(dataNode);
@@ -109,11 +108,12 @@ public:
}
};
-class TOptionalProcessor : public IDataProcessor {
+class TOptionalProcessor: public IDataProcessor {
public:
TOptionalProcessor(std::unique_ptr<IDataProcessor>&& inner)
: Inner_(std::move(inner))
- {}
+ {
+ }
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsEntity() || dataNode.IsList() && dataNode.AsList().size() <= 1);
@@ -133,11 +133,12 @@ private:
const std::unique_ptr<IDataProcessor> Inner_;
};
-class TListProcessor : public IDataProcessor {
+class TListProcessor: public IDataProcessor {
public:
TListProcessor(std::unique_ptr<IDataProcessor>&& inner)
: Inner_(std::move(inner))
- {}
+ {
+ }
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsList());
@@ -155,11 +156,12 @@ private:
const std::unique_ptr<IDataProcessor> Inner_;
};
-class TTupleProcessor : public IDataProcessor {
+class TTupleProcessor: public IDataProcessor {
public:
TTupleProcessor(TVector<std::unique_ptr<IDataProcessor>>&& inners)
: Inners_(std::move(inners))
- {}
+ {
+ }
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsList());
@@ -178,11 +180,12 @@ private:
const TVector<std::unique_ptr<IDataProcessor>> Inners_;
};
-class TStructProcessor : public IDataProcessor {
+class TStructProcessor: public IDataProcessor {
public:
TStructProcessor(TVector<std::unique_ptr<IDataProcessor>>&& inners)
: Inners_(std::move(inners))
- {}
+ {
+ }
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsList());
@@ -201,12 +204,13 @@ private:
const TVector<std::unique_ptr<IDataProcessor>> Inners_;
};
-class TDictProcessor : public IDataProcessor {
+class TDictProcessor: public IDataProcessor {
public:
TDictProcessor(std::unique_ptr<IDataProcessor>&& innerKey, std::unique_ptr<IDataProcessor>&& innerPayload)
: InnerKey_(std::move(innerKey))
, InnerPayload_(std::move(innerPayload))
- {}
+ {
+ }
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsList());
@@ -231,11 +235,12 @@ private:
const std::unique_ptr<IDataProcessor> InnerPayload_;
};
-class TVariantProcessor : public IDataProcessor {
+class TVariantProcessor: public IDataProcessor {
public:
TVariantProcessor(TVector<std::unique_ptr<IDataProcessor>>&& inners)
: Inners_(std::move(inners))
- {}
+ {
+ }
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsList() && dataNode.AsList().size() == 2);
@@ -251,11 +256,11 @@ private:
const TVector<std::unique_ptr<IDataProcessor>> Inners_;
};
-class TPgProcessor : public IDataProcessor {
+class TPgProcessor: public IDataProcessor {
public:
void Process(const NYT::TNode& dataNode, IDataVisitor& visitor) final {
CHECK(dataNode.IsEntity() || dataNode.IsString() ||
- dataNode.IsList() && dataNode.AsList().size() == 1 && dataNode.AsList()[0].IsString());
+ dataNode.IsList() && dataNode.AsList().size() == 1 && dataNode.AsList()[0].IsString());
if (dataNode.IsEntity()) {
visitor.OnPg(Nothing(), true);
} else if (dataNode.IsString()) {
@@ -266,7 +271,7 @@ public:
}
};
-class TDataProcessorBuilder : public TThrowingTypeVisitor {
+class TDataProcessorBuilder: public TThrowingTypeVisitor {
public:
TDataProcessorBuilder() {
IsVariant_.push_back(false);
@@ -1161,4 +1166,4 @@ void TThrowingDataVisitor::Do() {
void TEmptyDataVisitor::Do() {
}
-}
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/yql_result_format_data.h b/yql/essentials/public/result_format/yql_result_format_data.h
index 5c03716d6e1..4919b7cb8e4 100644
--- a/yql/essentials/public/result_format/yql_result_format_data.h
+++ b/yql/essentials/public/result_format/yql_result_format_data.h
@@ -77,7 +77,7 @@ public:
virtual void OnPg(TMaybe<TStringBuf> value, bool isUtf8) = 0;
};
-class TSameActionDataVisitor : public IDataVisitor {
+class TSameActionDataVisitor: public IDataVisitor {
public:
void OnVoid() override;
void OnNull() override;
@@ -149,19 +149,19 @@ public:
virtual void Do() = 0;
};
-class TThrowingDataVisitor : public TSameActionDataVisitor {
+class TThrowingDataVisitor: public TSameActionDataVisitor {
public:
void Do() final;
};
-class TEmptyDataVisitor : public TSameActionDataVisitor {
+class TEmptyDataVisitor: public TSameActionDataVisitor {
public:
void Do() final;
};
void ParseData(const NYT::TNode& typeNode, const NYT::TNode& dataNode, IDataVisitor& visitor);
-class TDataBuilder : public IDataVisitor {
+class TDataBuilder: public IDataVisitor {
public:
TDataBuilder();
const NYT::TNode& GetResult() const;
@@ -242,4 +242,4 @@ private:
TVector<NYT::TNode*> Stack_;
};
-}
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/yql_result_format_impl.h b/yql/essentials/public/result_format/yql_result_format_impl.h
index 6a56c350033..aa6a04be8b7 100644
--- a/yql/essentials/public/result_format/yql_result_format_impl.h
+++ b/yql/essentials/public/result_format/yql_result_format_impl.h
@@ -12,4 +12,4 @@ inline void Check(bool value, const TSourceLocation& location) {
#define CHECK(value) Check(value, __LOCATION__)
#define UNEXPECTED ythrow TUnsupportedException() << "Unhandled case"
-}
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/yql_result_format_response.cpp b/yql/essentials/public/result_format/yql_result_format_response.cpp
index b70b3d931ef..35623f83a62 100644
--- a/yql/essentials/public/result_format/yql_result_format_response.cpp
+++ b/yql/essentials/public/result_format/yql_result_format_response.cpp
@@ -108,4 +108,4 @@ TVector<TResult> ParseResponse(const NYT::TNode& responseNode) {
return v;
}
-}
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/yql_result_format_response.h b/yql/essentials/public/result_format/yql_result_format_response.h
index 25e144c597c..3d45ffa054a 100644
--- a/yql/essentials/public/result_format/yql_result_format_response.h
+++ b/yql/essentials/public/result_format/yql_result_format_response.h
@@ -31,4 +31,4 @@ struct TResult {
TVector<TResult> ParseResponse(const NYT::TNode& responseNode);
-}
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/yql_result_format_type.cpp b/yql/essentials/public/result_format/yql_result_format_type.cpp
index 39ce7334cde..29ead21ddd8 100644
--- a/yql/essentials/public/result_format/yql_result_format_type.cpp
+++ b/yql/essentials/public/result_format/yql_result_format_type.cpp
@@ -4,10 +4,10 @@
namespace NYql::NResult {
namespace {
- NYT::TNode MakeDataType(const TString& name) {
- return NYT::TNode().Add("DataType").Add(name);
- }
+NYT::TNode MakeDataType(const TString& name) {
+ return NYT::TNode().Add("DataType").Add(name);
}
+} // namespace
void ParseType(const NYT::TNode& typeNode, ITypeVisitor& visitor) {
CHECK(typeNode.IsList());
@@ -196,7 +196,7 @@ void ParseType(const NYT::TNode& typeNode, ITypeVisitor& visitor) {
CHECK(typeNode.AsList()[1].IsString());
CHECK(typeNode.AsList()[2].IsString());
visitor.OnPg(typeNode.AsList()[1].AsString(), typeNode.AsList()[2].AsString());
- } else {
+ } else {
ythrow TUnsupportedException() << "Unexpected type name: " << name;
}
}
@@ -355,8 +355,7 @@ void TTypeBuilder::OnInterval64() {
}
void TTypeBuilder::OnDecimal(ui32 precision, ui32 scale) {
- Top() = NYT::TNode().Add("DataType").Add("Decimal")
- .Add(ToString(precision)).Add(ToString(scale));
+ Top() = NYT::TNode().Add("DataType").Add("Decimal").Add(ToString(precision)).Add(ToString(scale));
}
NYT::TNode& TTypeBuilder::Top() {
@@ -432,7 +431,6 @@ void TTypeBuilder::OnBeginDict() {
Stack_.push_back(&Top());
}
-
void TTypeBuilder::OnDictKey() {
Push();
}
@@ -715,4 +713,4 @@ void TThrowingTypeVisitor::Do() {
void TEmptyTypeVisitor::Do() {
}
-}
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/result_format/yql_result_format_type.h b/yql/essentials/public/result_format/yql_result_format_type.h
index 360f88a4063..fb7783e0740 100644
--- a/yql/essentials/public/result_format/yql_result_format_type.h
+++ b/yql/essentials/public/result_format/yql_result_format_type.h
@@ -68,7 +68,7 @@ public:
virtual void OnPg(TStringBuf name, TStringBuf category) = 0;
};
-class TSameActionTypeVisitor : public ITypeVisitor {
+class TSameActionTypeVisitor: public ITypeVisitor {
public:
void OnVoid() override;
void OnNull() override;
@@ -131,19 +131,19 @@ public:
virtual void Do() = 0;
};
-class TThrowingTypeVisitor : public TSameActionTypeVisitor {
+class TThrowingTypeVisitor: public TSameActionTypeVisitor {
public:
void Do() final;
};
-class TEmptyTypeVisitor : public TSameActionTypeVisitor {
+class TEmptyTypeVisitor: public TSameActionTypeVisitor {
public:
void Do() final;
};
void ParseType(const NYT::TNode& typeNode, ITypeVisitor& visitor);
-class TTypeBuilder : public ITypeVisitor {
+class TTypeBuilder: public ITypeVisitor {
public:
TTypeBuilder();
const NYT::TNode& GetResult() const;
@@ -215,4 +215,4 @@ private:
TVector<NYT::TNode*> Stack_;
};
-}
+} // namespace NYql::NResult
diff --git a/yql/essentials/public/sql_format/sql_format.cpp b/yql/essentials/public/sql_format/sql_format.cpp
index 2fe769e5fc7..230beae42a1 100644
--- a/yql/essentials/public/sql_format/sql_format.cpp
+++ b/yql/essentials/public/sql_format/sql_format.cpp
@@ -18,4 +18,4 @@ bool SqlFormatSimple(const TString& query, TString& formattedQuery, TString& err
return SqlFormatSimple(lexers, parsers, query, formattedQuery, error);
}
-}
+} // namespace NSQLFormat
diff --git a/yql/essentials/public/sql_format/sql_format.h b/yql/essentials/public/sql_format/sql_format.h
index afde5204e69..ecf00f0ace2 100644
--- a/yql/essentials/public/sql_format/sql_format.h
+++ b/yql/essentials/public/sql_format/sql_format.h
@@ -5,4 +5,4 @@ namespace NSQLFormat {
bool SqlFormatSimple(const TString& query, TString& formattedQuery, TString& error);
-}
+} // namespace NSQLFormat
diff --git a/yql/essentials/public/sql_format/ya.make b/yql/essentials/public/sql_format/ya.make
index d775025e54e..fdd164a3c6b 100644
--- a/yql/essentials/public/sql_format/ya.make
+++ b/yql/essentials/public/sql_format/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
sql_format.cpp
)
diff --git a/yql/essentials/public/udf/arrow/args_dechunker.cpp b/yql/essentials/public/udf/arrow/args_dechunker.cpp
index f52e1839836..48be9f21889 100644
--- a/yql/essentials/public/udf/arrow/args_dechunker.cpp
+++ b/yql/essentials/public/udf/arrow/args_dechunker.cpp
@@ -65,6 +65,5 @@ bool TArgsDechunker::Next(std::vector<arrow::Datum>& chunk, ui64& chunkLen) {
return true;
}
-
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/args_dechunker.h b/yql/essentials/public/udf/arrow/args_dechunker.h
index 6aed9491b41..9b3e288692c 100644
--- a/yql/essentials/public/udf/arrow/args_dechunker.h
+++ b/yql/essentials/public/udf/arrow/args_dechunker.h
@@ -22,5 +22,5 @@ private:
bool Finish_ = false;
};
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/bit_util.cpp b/yql/essentials/public/udf/arrow/bit_util.cpp
index 569e207167f..c6d8ea9ebdb 100644
--- a/yql/essentials/public/udf/arrow/bit_util.cpp
+++ b/yql/essentials/public/udf/arrow/bit_util.cpp
@@ -4,4 +4,4 @@ namespace NYql {
namespace NUdf {
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/bit_util.h b/yql/essentials/public/udf/arrow/bit_util.h
index d8911d4a881..de2507d1c66 100644
--- a/yql/essentials/public/udf/arrow/bit_util.h
+++ b/yql/essentials/public/udf/arrow/bit_util.h
@@ -48,7 +48,7 @@ inline ui8* DecompressToSparseBitmap(ui8* dstSparse, const ui8* src, size_t srcO
return dstSparse;
}
-template<bool Negate>
+template <bool Negate>
inline void CompressSparseImpl(ui8* dst, const ui8* srcSparse, size_t len) {
while (len >= 8) {
ui8 result = 0;
@@ -88,7 +88,7 @@ inline void CompressSparseBitmapNegate(ui8* dst, const ui8* srcSparse, size_t le
return CompressSparseImpl<true>(dst, srcSparse, len);
}
-template<typename T>
+template <typename T>
inline T* CompressArray(const T* src, const ui8* sparseBitmap, T* dst, size_t count) {
while (count--) {
*dst = *src++;
@@ -207,4 +207,4 @@ Y_FORCE_INLINE std::array<ui64, 8> BitToByteExpand(ui8 x) {
}
} // namespace NUdf
-}
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/block_builder.cpp b/yql/essentials/public/udf/arrow/block_builder.cpp
index ebab4dee625..4b1aed2e42f 100644
--- a/yql/essentials/public/udf/arrow/block_builder.cpp
+++ b/yql/essentials/public/udf/arrow/block_builder.cpp
@@ -4,4 +4,4 @@ namespace NYql {
namespace NUdf {
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/block_builder.h b/yql/essentials/public/udf/arrow/block_builder.h
index 8225ba1cd2a..a4724b8121c 100644
--- a/yql/essentials/public/udf/arrow/block_builder.h
+++ b/yql/essentials/public/udf/arrow/block_builder.h
@@ -39,7 +39,7 @@ public:
};
inline const IArrayBuilder::TArrayDataItem* LookupArrayDataItem(const IArrayBuilder::TArrayDataItem* arrays, size_t arrayCount, ui64& idx) {
- IArrayBuilder::TArrayDataItem lookup{ nullptr, idx };
+ IArrayBuilder::TArrayDataItem lookup{nullptr, idx};
auto it = std::lower_bound(arrays, arrays + arrayCount, lookup, [](const auto& left, const auto& right) {
return left.StartOffset < right.StartOffset;
@@ -69,8 +69,9 @@ inline std::shared_ptr<arrow::DataType> GetArrowType(const ITypeInfoHelper& type
return ARROW_RESULT(arrow::ImportType(&s));
}
-class TArrayBuilderBase : public IArrayBuilder {
+class TArrayBuilderBase: public IArrayBuilder {
using Self = TArrayBuilderBase;
+
public:
using Ptr = std::unique_ptr<TArrayBuilderBase>;
@@ -137,12 +138,12 @@ public:
}
inline void AddMany(const arrow::ArrayData& array, ui64 beginIndex, size_t count) {
- TArrayDataItem item = { &array, 0 };
+ TArrayDataItem item = {&array, 0};
Self::AddMany(&item, 1, beginIndex, count);
}
inline void AddMany(const arrow::ArrayData& array, const ui64* indexes, size_t count) {
- TArrayDataItem item = { &array, 0 };
+ TArrayDataItem item = {&array, 0};
Self::AddMany(&item, 1, indexes, count);
}
@@ -237,6 +238,7 @@ public:
CurrLen_ = 0;
return result;
}
+
protected:
virtual void DoAdd(NUdf::TUnboxedValuePod value) = 0;
virtual void DoAdd(TBlockItem value) = 0;
@@ -333,13 +335,14 @@ protected:
const size_t MaxLen_;
const size_t MaxBlockSizeInBytes_;
const TMaybe<ui8> MinFillPercentage_;
+
private:
size_t CurrLen_ = 0;
size_t* TotalAllocated_ = nullptr;
};
-template<typename TLayout, bool Nullable, typename TDerived>
-class TFixedSizeArrayBuilderBase : public TArrayBuilderBase {
+template <typename TLayout, bool Nullable, typename TDerived>
+class TFixedSizeArrayBuilderBase: public TArrayBuilderBase {
public:
TFixedSizeArrayBuilderBase(const ITypeInfoHelper& typeInfoHelper, std::shared_ptr<arrow::DataType> arrowType, arrow::MemoryPool& pool, size_t maxLen, const TParams& params)
: TArrayBuilderBase(typeInfoHelper, std::move(arrowType), pool, maxLen, params)
@@ -407,7 +410,7 @@ public:
static_cast<TDerived*>(this)->DoAddNotNull(value, count);
}
- void DoAdd(TInputBuffer &input) final {
+ void DoAdd(TInputBuffer& input) final {
if constexpr (Nullable) {
if (!input.PopChar()) {
DoAddNull();
@@ -451,7 +454,7 @@ public:
const TLayout* values = array.GetValues<TLayout>(1);
for (size_t i = beginIndex; i < beginIndex + count; ++i) {
- ::new(DataPtr_ + GetCurrLen() + i - beginIndex) TLayout(values[i]);
+ ::new (DataPtr_ + GetCurrLen() + i - beginIndex) TLayout(values[i]);
}
}
@@ -465,7 +468,7 @@ public:
const TLayout* values = array.GetValues<TLayout>(1);
for (size_t i = 0; i < count; ++i) {
- ::new(DataPtr_ + GetCurrLen() + i) TLayout(values[indexes[i]]);
+ ::new (DataPtr_ + GetCurrLen() + i) TLayout(values[indexes[i]]);
}
}
@@ -490,9 +493,10 @@ public:
}
return result;
}
+
protected:
- void PlaceItem(TLayout&& value) {
- ::new(DataPtr_ + GetCurrLen()) TLayout(std::move(value));
+ void PlaceItem(TLayout&& value) {
+ ::new (DataPtr_ + GetCurrLen()) TLayout(std::move(value));
}
TLayout* DataPtr_ = nullptr;
@@ -517,7 +521,7 @@ private:
ui8* NullPtr_ = nullptr;
};
-template<typename TLayout, bool Nullable>
+template <typename TLayout, bool Nullable>
class TFixedSizeArrayBuilder final: public TFixedSizeArrayBuilderBase<TLayout, Nullable, TFixedSizeArrayBuilder<TLayout, Nullable>> {
using TSelf = TFixedSizeArrayBuilder<TLayout, Nullable>;
using TBase = TFixedSizeArrayBuilderBase<TLayout, Nullable, TSelf>;
@@ -526,11 +530,13 @@ class TFixedSizeArrayBuilder final: public TFixedSizeArrayBuilderBase<TLayout, N
public:
TFixedSizeArrayBuilder(const ITypeInfoHelper& typeInfoHelper, std::shared_ptr<arrow::DataType> arrowType, arrow::MemoryPool& pool, size_t maxLen, const TParams& params = {})
: TBase(typeInfoHelper, std::move(arrowType), pool, maxLen, params)
- {}
+ {
+ }
TFixedSizeArrayBuilder(const TType* type, const ITypeInfoHelper& typeInfoHelper, arrow::MemoryPool& pool, size_t maxLen, const TParams& params = {})
: TBase(typeInfoHelper, type, pool, maxLen, params)
- {}
+ {
+ }
void DoAddNotNull(TUnboxedValuePod value) {
this->PlaceItem(value.Get<TLayout>());
@@ -549,7 +555,7 @@ public:
}
};
-template<bool Nullable>
+template <bool Nullable>
class TFixedSizeArrayBuilder<NYql::NDecimal::TInt128, Nullable> final: public TFixedSizeArrayBuilderBase<NYql::NDecimal::TInt128, Nullable, TFixedSizeArrayBuilder<NYql::NDecimal::TInt128, Nullable>> {
using TSelf = TFixedSizeArrayBuilder<NYql::NDecimal::TInt128, Nullable>;
using TBase = TFixedSizeArrayBuilderBase<NYql::NDecimal::TInt128, Nullable, TSelf>;
@@ -558,11 +564,13 @@ class TFixedSizeArrayBuilder<NYql::NDecimal::TInt128, Nullable> final: public TF
public:
TFixedSizeArrayBuilder(const ITypeInfoHelper& typeInfoHelper, std::shared_ptr<arrow::DataType> arrowType, arrow::MemoryPool& pool, size_t maxLen, const TParams& params = {})
: TBase(typeInfoHelper, std::move(arrowType), pool, maxLen, params)
- {}
+ {
+ }
TFixedSizeArrayBuilder(const TType* type, const ITypeInfoHelper& typeInfoHelper, arrow::MemoryPool& pool, size_t maxLen, const TParams& params = {})
: TBase(typeInfoHelper, type, pool, maxLen, params)
- {}
+ {
+ }
void DoAddNotNull(TUnboxedValuePod value) {
this->PlaceItem(value.GetInt128());
@@ -581,7 +589,7 @@ public:
}
};
-template<bool Nullable>
+template <bool Nullable>
class TResourceArrayBuilder final: public TFixedSizeArrayBuilderBase<TUnboxedValue, Nullable, TResourceArrayBuilder<Nullable>> {
using TBase = TFixedSizeArrayBuilderBase<TUnboxedValue, Nullable, TResourceArrayBuilder<Nullable>>;
using TParams = TArrayBuilderBase::TParams;
@@ -589,11 +597,13 @@ class TResourceArrayBuilder final: public TFixedSizeArrayBuilderBase<TUnboxedVal
public:
TResourceArrayBuilder(const ITypeInfoHelper& typeInfoHelper, std::shared_ptr<arrow::DataType> arrowType, arrow::MemoryPool& pool, size_t maxLen, const TParams& params = {})
: TBase(typeInfoHelper, std::move(arrowType), pool, maxLen, params)
- {}
+ {
+ }
TResourceArrayBuilder(const TType* type, const ITypeInfoHelper& typeInfoHelper, arrow::MemoryPool& pool, size_t maxLen, const TParams& params = {})
: TBase(typeInfoHelper, type, pool, maxLen, params)
- {}
+ {
+ }
void DoAddNotNull(TUnboxedValuePod value) {
this->PlaceItem(TUnboxedValue(value));
@@ -616,13 +626,13 @@ public:
void DoAddNotNull(TBlockItem item, size_t count) {
for (size_t i = 0; i < count; ++i) {
- ::new(this->DataPtr_ + this->GetCurrLen() + i) TUnboxedValue(FromBlockItem(item));
+ ::new (this->DataPtr_ + this->GetCurrLen() + i) TUnboxedValue(FromBlockItem(item));
}
}
};
-template<typename TStringType, bool Nullable, EPgStringType PgString = EPgStringType::None>
-class TStringArrayBuilder final : public TArrayBuilderBase {
+template <typename TStringType, bool Nullable, EPgStringType PgString = EPgStringType::None>
+class TStringArrayBuilder final: public TArrayBuilderBase {
using TOffset = typename TStringType::offset_type;
public:
@@ -734,7 +744,6 @@ public:
DoAdd(TBlockItem(ref));
}
-
void DoAddDefault() final {
if constexpr (Nullable) {
NullBuilder_->UnsafeAppend(1);
@@ -764,15 +773,15 @@ public:
}
const ui8* begin = srcData + srcOffset[i];
- const ui8* end = srcData + srcOffset[i + 1];
+ const ui8* end = srcData + srcOffset[i + 1];
const size_t strSize = end - begin;
- size_t availBytes = std::max(dataLen, MaxBlockSizeInBytes_) - dataLen;
+ size_t availBytes = std::max(dataLen, MaxBlockSizeInBytes_) - dataLen;
for (;;) {
// try to append ith string
if (strSize <= availBytes) {
- if (begin == chunkEnd) {
+ if (begin == chunkEnd) {
chunkEnd = end;
} else {
DataBuilder_->UnsafeAppend(chunkStart, chunkEnd - chunkStart);
@@ -838,7 +847,7 @@ public:
const ui8* chunkEnd = chunkStart;
for (size_t i = beginIndex; i < beginIndex + count; ++i) {
const ui8* begin = srcData + offsets[i];
- const ui8* end = srcData + offsets[i + 1];
+ const ui8* end = srcData + offsets[i + 1];
const size_t strSize = end - begin;
size_t availBytes = std::max(dataLen, MaxBlockSizeInBytes_) - dataLen;
@@ -905,7 +914,6 @@ public:
}
}
-
TBlockArrayTree::Ptr DoBuildTree(bool finish) final {
FlushChunk(finish);
TBlockArrayTree::Ptr result = std::make_shared<TBlockArrayTree>();
@@ -954,7 +962,7 @@ private:
std::shared_ptr<arrow::Buffer> offsets = OffsetsBuilder_->Finish();
std::shared_ptr<arrow::Buffer> data = DataBuilder_->Finish();
- Chunks_.push_back(arrow::ArrayData::Make(ArrowType_, length, { nullBitmap, offsets, data }));
+ Chunks_.push_back(arrow::ArrayData::Make(ArrowType_, length, {nullBitmap, offsets, data}));
if (!finish) {
Reserve();
}
@@ -970,8 +978,8 @@ private:
i32 TypeLen_ = 0;
};
-template<bool Nullable, typename TDerived>
-class TTupleArrayBuilderBase : public TArrayBuilderBase {
+template <bool Nullable, typename TDerived>
+class TTupleArrayBuilderBase: public TArrayBuilderBase {
public:
TTupleArrayBuilderBase(const ITypeInfoHelper& typeInfoHelper, const TType* type, arrow::MemoryPool& pool, size_t maxLen, const TParams& params = {})
: TArrayBuilderBase(typeInfoHelper, type, pool, maxLen, params)
@@ -1077,7 +1085,7 @@ public:
}
Y_ABORT_UNLESS(length);
- result->Payload.push_back(arrow::ArrayData::Make(ArrowType_, length, { nullBitmap }));
+ result->Payload.push_back(arrow::ArrayData::Make(ArrowType_, length, {nullBitmap}));
static_cast<TDerived*>(this)->BuildChildrenTree(finish, result->Children);
if (!finish) {
@@ -1101,8 +1109,8 @@ private:
std::unique_ptr<TTypedBufferBuilder<ui8>> NullBuilder_;
};
-template<bool Nullable>
-class TTupleArrayBuilder final : public TTupleArrayBuilderBase<Nullable, TTupleArrayBuilder<Nullable>> {
+template <bool Nullable>
+class TTupleArrayBuilder final: public TTupleArrayBuilderBase<Nullable, TTupleArrayBuilder<Nullable>> {
using TBase = TTupleArrayBuilderBase<Nullable, TTupleArrayBuilder<Nullable>>;
using TParams = TArrayBuilderBase::TParams;
@@ -1179,8 +1187,8 @@ private:
TVector<std::unique_ptr<TArrayBuilderBase>> Children_;
};
-template<typename TDate, bool Nullable>
-class TTzDateArrayBuilder final : public TTupleArrayBuilderBase<Nullable, TTzDateArrayBuilder<TDate, Nullable>> {
+template <typename TDate, bool Nullable>
+class TTzDateArrayBuilder final: public TTupleArrayBuilderBase<Nullable, TTzDateArrayBuilder<TDate, Nullable>> {
using TBase = TTupleArrayBuilderBase<Nullable, TTzDateArrayBuilder<TDate, Nullable>>;
using TParams = TArrayBuilderBase::TParams;
using TDateLayout = typename TDataType<TDate>::TLayout;
@@ -1242,8 +1250,7 @@ private:
TFixedSizeArrayBuilder<ui16, false> TimezoneBuilder_;
};
-
-class TExternalOptionalArrayBuilder final : public TArrayBuilderBase {
+class TExternalOptionalArrayBuilder final: public TArrayBuilderBase {
public:
TExternalOptionalArrayBuilder(std::unique_ptr<TArrayBuilderBase>&& inner, const TType* type, const ITypeInfoHelper& typeInfoHelper, arrow::MemoryPool& pool,
size_t maxLen, const TParams& params = {})
@@ -1338,7 +1345,7 @@ public:
nullBitmap = MakeDenseBitmap(nullBitmap->data(), length, Pool_);
Y_ABORT_UNLESS(length);
- result->Payload.push_back(arrow::ArrayData::Make(ArrowType_, length, { nullBitmap }));
+ result->Payload.push_back(arrow::ArrayData::Make(ArrowType_, length, {nullBitmap}));
result->Children.emplace_back(Inner_->BuildTree(finish));
if (!finish) {
@@ -1363,8 +1370,9 @@ private:
class TSingularBlockBuilder final: public TArrayBuilderBase {
public:
TSingularBlockBuilder(const TType* type, const ITypeInfoHelper& typeInfoHelper, arrow::MemoryPool& pool,
- size_t maxLen, const TParams& params = {})
- : TArrayBuilderBase(typeInfoHelper, type, pool, maxLen, params) {
+ size_t maxLen, const TParams& params = {})
+ : TArrayBuilderBase(typeInfoHelper, type, pool, maxLen, params)
+ {
Reserve();
}
@@ -1380,7 +1388,8 @@ public:
Y_UNUSED(input);
}
- void DoAddDefault() final {}
+ void DoAddDefault() final {
+ }
void DoAddMany(const arrow::ArrayData& array, const ui8* sparseBitmap, size_t popCount) final {
Y_UNUSED(array, sparseBitmap, popCount);
@@ -1418,9 +1427,9 @@ struct TBuilderTraits {
template <typename TStringType, bool Nullable, NKikimr::NUdf::EDataSlot TOriginal>
using TStrings = TStringArrayBuilder<TStringType, Nullable>;
using TExtOptional = TExternalOptionalArrayBuilder;
- template<bool Nullable>
+ template <bool Nullable>
using TResource = TResourceArrayBuilder<Nullable>;
- template<typename TTzDate, bool Nullable>
+ template <typename TTzDate, bool Nullable>
using TTzDateReader = TTzDateArrayBuilder<TTzDate, Nullable>;
using TSingular = TSingularBlockBuilder;
@@ -1454,7 +1463,7 @@ struct TBuilderTraits {
}
}
- template<typename TTzDate>
+ template <typename TTzDate>
static std::unique_ptr<TResult> MakeTzDate(bool isOptional, const TType* type, const ITypeInfoHelper& typeInfoHelper, arrow::MemoryPool& pool, size_t maxLen, const TArrayBuilderParams& params) {
if (isOptional) {
return std::make_unique<TTzDateReader<TTzDate, true>>(type, typeInfoHelper, pool, maxLen, params);
@@ -1472,14 +1481,14 @@ inline std::unique_ptr<IArrayBuilder> MakeArrayBuilder(
const ITypeInfoHelper& typeInfoHelper, const TType* type, arrow::MemoryPool& pool,
size_t maxBlockLength, const IPgBuilder* pgBuilder)
{
- return DispatchByArrowTraits<TBuilderTraits>(typeInfoHelper, type, pgBuilder, typeInfoHelper, pool, maxBlockLength, TArrayBuilderParams {});
+ return DispatchByArrowTraits<TBuilderTraits>(typeInfoHelper, type, pgBuilder, typeInfoHelper, pool, maxBlockLength, TArrayBuilderParams{});
}
inline std::unique_ptr<IArrayBuilder> MakeArrayBuilder(
const ITypeInfoHelper& typeInfoHelper, const TType* type, arrow::MemoryPool& pool,
size_t maxBlockLength, const IPgBuilder* pgBuilder, size_t* totalAllocated)
{
- return DispatchByArrowTraits<TBuilderTraits>(typeInfoHelper, type, pgBuilder, typeInfoHelper, pool, maxBlockLength, TArrayBuilderParams {.TotalAllocated = totalAllocated});
+ return DispatchByArrowTraits<TBuilderTraits>(typeInfoHelper, type, pgBuilder, typeInfoHelper, pool, maxBlockLength, TArrayBuilderParams{.TotalAllocated = totalAllocated});
}
inline std::unique_ptr<IArrayBuilder> MakeArrayBuilder(
diff --git a/yql/essentials/public/udf/arrow/block_io_buffer.h b/yql/essentials/public/udf/arrow/block_io_buffer.h
index 2d1b7b79e11..8af658f67c6 100644
--- a/yql/essentials/public/udf/arrow/block_io_buffer.h
+++ b/yql/essentials/public/udf/arrow/block_io_buffer.h
@@ -11,7 +11,8 @@ class TInputBuffer {
public:
TInputBuffer(TStringBuf buf)
: Buf_(buf)
- {}
+ {
+ }
char PopChar() {
Ensure(1);
@@ -109,7 +110,5 @@ private:
TVector<char> Vec_;
};
-
-
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/block_item.cpp b/yql/essentials/public/udf/arrow/block_item.cpp
index c5668bd73de..cac53ed4cae 100644
--- a/yql/essentials/public/udf/arrow/block_item.cpp
+++ b/yql/essentials/public/udf/arrow/block_item.cpp
@@ -4,4 +4,4 @@ namespace NYql {
namespace NUdf {
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/block_item.h b/yql/essentials/public/udf/arrow/block_item.h
index 79686b3094f..1bc94f7519a 100644
--- a/yql/essentials/public/udf/arrow/block_item.h
+++ b/yql/essentials/public/udf/arrow/block_item.h
@@ -27,7 +27,7 @@ public:
*reinterpret_cast<NYql::NDecimal::TInt128*>(&Raw) = value;
Raw.Simple.Meta = static_cast<ui8>(EMarkers::Embedded);
}
-
+
inline explicit TBlockItem(IBoxedValuePtr&& value) {
Raw.Resource.Meta = static_cast<ui8>(EMarkers::Boxed);
Raw.Resource.Value = value.Release();
@@ -127,26 +127,26 @@ public:
Y_DEBUG_ABORT_UNLESS(GetMarkers() == EMarkers::String);
return TStringValue(Raw.StringValue.Value);
}
-
+
inline TStringRef GetStringRefFromValue() const {
Y_DEBUG_ABORT_UNLESS(GetMarkers() == EMarkers::String);
- return { Raw.StringValue.Value->Data() + (Raw.StringValue.Offset & 0xFFFFFF), Raw.StringValue.Size };
+ return {Raw.StringValue.Value->Data() + (Raw.StringValue.Offset & 0xFFFFFF), Raw.StringValue.Size};
}
- inline TBlockItem MakeOptional() const
- {
- if (Raw.Simple.Meta)
+ inline TBlockItem MakeOptional() const {
+ if (Raw.Simple.Meta) {
return *this;
+ }
TBlockItem result(*this);
++result.Raw.Simple.Count;
return result;
}
- inline TBlockItem GetOptionalValue() const
- {
- if (Raw.Simple.Meta)
+ inline TBlockItem GetOptionalValue() const {
+ if (Raw.Simple.Meta) {
return *this;
+ }
Y_DEBUG_ABORT_UNLESS(Raw.Simple.Count > 0U, "Can't get value from empty.");
@@ -155,8 +155,7 @@ public:
return result;
}
- inline IBoxedValuePtr GetBoxed() const
- {
+ inline IBoxedValuePtr GetBoxed() const {
Y_DEBUG_ABORT_UNLESS(GetMarkers() == EMarkers::Boxed, "Value is not boxed");
return Raw.Resource.Value;
}
@@ -178,21 +177,28 @@ public:
return v;
}
- inline const void* GetRawPtr() const
- {
+ inline const void* GetRawPtr() const {
return &Raw;
}
- inline explicit operator bool() const { return bool(Raw); }
-
+ inline explicit operator bool() const {
+ return bool(Raw);
+ }
+
EMarkers GetMarkers() const {
return static_cast<EMarkers>(Raw.Simple.Meta);
}
- bool HasValue() const { return EMarkers::Empty != GetMarkers(); }
+ bool HasValue() const {
+ return EMarkers::Empty != GetMarkers();
+ }
- bool IsBoxed() const { return EMarkers::Boxed == GetMarkers(); }
- bool IsEmbedded() const { return EMarkers::Embedded == GetMarkers(); }
+ bool IsBoxed() const {
+ return EMarkers::Boxed == GetMarkers();
+ }
+ bool IsEmbedded() const {
+ return EMarkers::Embedded == GetMarkers();
+ }
inline void SetTimezoneId(ui16 id) {
UDF_VERIFY(GetMarkers() == EMarkers::Embedded, "Value is not a datetime");
Raw.Simple.TimezoneId = id;
@@ -208,16 +214,16 @@ private:
ui64 Halfs[2] = {0, 0};
TRawEmbeddedValue Embedded;
-
+
TRawBoxedValue Resource;
TRawStringValue StringValue;
struct {
union {
- #define FIELD(type) type type##_;
+#define FIELD(type) type type##_;
PRIMITIVE_VALUE_TYPES(FIELD);
- #undef FIELD
+#undef FIELD
// According to the YQL <-> arrow type mapping convention,
// boolean values are processed as 8-bit unsigned integer
// with either 0 or 1 as a condition payload.
@@ -246,33 +252,32 @@ private:
const TBlockItem* Value;
} Tuple;
- explicit operator bool() const { return Simple.FullMeta | Simple.Count; }
+ explicit operator bool() const {
+ return Simple.FullMeta | Simple.Count;
+ }
} Raw;
};
UDF_ASSERT_TYPE_SIZE(TBlockItem, 16);
-#define VALUE_AS(xType) \
- template <> \
- inline xType TBlockItem::As<xType>() const \
- { \
+#define VALUE_AS(xType) \
+ template <> \
+ inline xType TBlockItem::As<xType>() const { \
Y_DEBUG_ABORT_UNLESS(GetMarkers() == EMarkers::Embedded); \
- return Raw.Simple.xType##_; \
+ return Raw.Simple.xType##_; \
}
-#define VALUE_GET(xType) \
- template <> \
- inline xType TBlockItem::Get<xType>() const \
- { \
+#define VALUE_GET(xType) \
+ template <> \
+ inline xType TBlockItem::Get<xType>() const { \
Y_DEBUG_ABORT_UNLESS(GetMarkers() == EMarkers::Embedded); \
- return Raw.Simple.xType##_; \
+ return Raw.Simple.xType##_; \
}
-#define VALUE_CONSTR(xType) \
- template <> \
- inline TBlockItem::TBlockItem(xType value) \
- { \
- Raw.Simple.xType##_ = value; \
+#define VALUE_CONSTR(xType) \
+ template <> \
+ inline TBlockItem::TBlockItem(xType value) { \
+ Raw.Simple.xType##_ = value; \
Raw.Simple.Meta = static_cast<ui8>(EMarkers::Embedded); \
}
@@ -287,4 +292,4 @@ VALUE_GET(bool)
#undef VALUE_GET
#undef VALUE_CONSTR
-}
+} // namespace NYql::NUdf
diff --git a/yql/essentials/public/udf/arrow/block_item_comparator.h b/yql/essentials/public/udf/arrow/block_item_comparator.h
index ad803799c63..339eb213829 100644
--- a/yql/essentials/public/udf/arrow/block_item_comparator.h
+++ b/yql/essentials/public/udf/arrow/block_item_comparator.h
@@ -26,7 +26,7 @@ public:
UDF_ASSERT_TYPE_SIZE(IBlockItemComparator, 8);
template <typename TDerived, bool Nullable>
-class TBlockItemComparatorBase : public IBlockItemComparator {
+class TBlockItemComparatorBase: public IBlockItemComparator {
public:
const TDerived* Derived() const {
return static_cast<const TDerived*>(this);
@@ -78,8 +78,7 @@ public:
if (lhs) {
if (rhs) {
return Derived()->DoLess(lhs, rhs);
- }
- else {
+ } else {
return false;
}
} else {
@@ -96,7 +95,7 @@ public:
};
template <typename T, bool Nullable>
-class TFixedSizeBlockItemComparator : public TBlockItemComparatorBase<TFixedSizeBlockItemComparator<T, Nullable>, Nullable> {
+class TFixedSizeBlockItemComparator: public TBlockItemComparatorBase<TFixedSizeBlockItemComparator<T, Nullable>, Nullable> {
public:
i64 DoCompare(TBlockItem lhs, TBlockItem rhs) const {
if constexpr (std::is_integral<T>::value && sizeof(T) < sizeof(i64)) {
@@ -132,7 +131,7 @@ public:
};
template <bool Nullable>
-class TFixedSizeBlockItemComparator<NYql::NDecimal::TInt128, Nullable> : public TBlockItemComparatorBase<TFixedSizeBlockItemComparator<NYql::NDecimal::TInt128, Nullable>, Nullable> {
+class TFixedSizeBlockItemComparator<NYql::NDecimal::TInt128, Nullable>: public TBlockItemComparatorBase<TFixedSizeBlockItemComparator<NYql::NDecimal::TInt128, Nullable>, Nullable> {
public:
i64 DoCompare(TBlockItem lhs, TBlockItem rhs) const {
auto l = lhs.GetInt128();
@@ -154,7 +153,7 @@ public:
};
template <typename TStringType, bool Nullable>
-class TStringBlockItemComparator : public TBlockItemComparatorBase<TStringBlockItemComparator<TStringType, Nullable>, Nullable> {
+class TStringBlockItemComparator: public TBlockItemComparatorBase<TStringBlockItemComparator<TStringType, Nullable>, Nullable> {
public:
i64 DoCompare(TBlockItem lhs, TBlockItem rhs) const {
return lhs.AsStringRef().Compare(rhs.AsStringRef());
@@ -187,8 +186,8 @@ public:
}
};
-template<typename TTzType, bool Nullable>
-class TTzDateBlockItemComparator : public TBlockItemComparatorBase<TTzDateBlockItemComparator<TTzType, Nullable>, Nullable> {
+template <typename TTzType, bool Nullable>
+class TTzDateBlockItemComparator: public TBlockItemComparatorBase<TTzDateBlockItemComparator<TTzType, Nullable>, Nullable> {
using TLayout = typename TDataType<TTzType>::TLayout;
public:
@@ -218,13 +217,13 @@ public:
}
};
-
template <bool Nullable>
-class TTupleBlockItemComparator : public TBlockItemComparatorBase<TTupleBlockItemComparator<Nullable>, Nullable> {
+class TTupleBlockItemComparator: public TBlockItemComparatorBase<TTupleBlockItemComparator<Nullable>, Nullable> {
public:
TTupleBlockItemComparator(TVector<std::unique_ptr<IBlockItemComparator>>&& children)
: Children_(std::move(children))
- {}
+ {
+ }
public:
i64 DoCompare(TBlockItem lhs, TBlockItem rhs) const {
@@ -267,11 +266,12 @@ private:
const TVector<std::unique_ptr<IBlockItemComparator>> Children_;
};
-class TExternalOptionalBlockItemComparator : public TBlockItemComparatorBase<TExternalOptionalBlockItemComparator, true> {
+class TExternalOptionalBlockItemComparator: public TBlockItemComparatorBase<TExternalOptionalBlockItemComparator, true> {
public:
TExternalOptionalBlockItemComparator(std::unique_ptr<IBlockItemComparator> inner)
: Inner_(std::move(inner))
- {}
+ {
+ }
i64 DoCompare(TBlockItem lhs, TBlockItem rhs) const {
return Inner_->Compare(lhs.GetOptionalValue(), rhs.GetOptionalValue());
@@ -289,4 +289,4 @@ private:
std::unique_ptr<IBlockItemComparator> Inner_;
};
-}
+} // namespace NYql::NUdf
diff --git a/yql/essentials/public/udf/arrow/block_item_hasher.h b/yql/essentials/public/udf/arrow/block_item_hasher.h
index 9108d7b06e8..d776e9740ac 100644
--- a/yql/essentials/public/udf/arrow/block_item_hasher.h
+++ b/yql/essentials/public/udf/arrow/block_item_hasher.h
@@ -21,7 +21,7 @@ public:
UDF_ASSERT_TYPE_SIZE(IBlockItemHasher, 8);
template <typename TDerived, bool Nullable>
-class TBlockItemHasherBase : public IBlockItemHasher {
+class TBlockItemHasherBase: public IBlockItemHasher {
public:
const TDerived* Derived() const {
return static_cast<const TDerived*>(this);
@@ -42,7 +42,7 @@ public:
};
template <typename T, bool Nullable>
-class TFixedSizeBlockItemHasher : public TBlockItemHasherBase<TFixedSizeBlockItemHasher<T, Nullable>, Nullable> {
+class TFixedSizeBlockItemHasher: public TBlockItemHasherBase<TFixedSizeBlockItemHasher<T, Nullable>, Nullable> {
public:
ui64 DoHash(TBlockItem value) const {
return GetValueHash<TDataType<T>::Slot>(NUdf::TUnboxedValuePod(value.As<T>()));
@@ -50,7 +50,7 @@ public:
};
template <bool Nullable>
-class TFixedSizeBlockItemHasher<NYql::NDecimal::TInt128, Nullable> : public TBlockItemHasherBase<TFixedSizeBlockItemHasher<NYql::NDecimal::TInt128, Nullable>, Nullable> {
+class TFixedSizeBlockItemHasher<NYql::NDecimal::TInt128, Nullable>: public TBlockItemHasherBase<TFixedSizeBlockItemHasher<NYql::NDecimal::TInt128, Nullable>, Nullable> {
public:
ui64 DoHash(TBlockItem value) const {
return GetValueHash<TDataType<NUdf::TDecimal>::Slot>(NUdf::TUnboxedValuePod(value.GetInt128()));
@@ -58,25 +58,25 @@ public:
};
template <typename T, bool Nullable>
-class TTzDateBlockItemHasher : public TBlockItemHasherBase<TTzDateBlockItemHasher<T, Nullable>, Nullable> {
+class TTzDateBlockItemHasher: public TBlockItemHasherBase<TTzDateBlockItemHasher<T, Nullable>, Nullable> {
public:
ui64 DoHash(TBlockItem value) const {
using TLayout = typename TDataType<T>::TLayout;
- TUnboxedValuePod uv {value.Get<TLayout>()};
+ TUnboxedValuePod uv{value.Get<TLayout>()};
uv.SetTimezoneId(value.GetTimezoneId());
return GetValueHash<TDataType<T>::Slot>(uv);
}
};
template <typename TStringType, bool Nullable>
-class TStringBlockItemHasher : public TBlockItemHasherBase<TStringBlockItemHasher<TStringType, Nullable>, Nullable> {
+class TStringBlockItemHasher: public TBlockItemHasherBase<TStringBlockItemHasher<TStringType, Nullable>, Nullable> {
public:
ui64 DoHash(TBlockItem value) const {
return GetStringHash(value.AsStringRef());
}
};
-class TSingularTypeBlockItemHaser : public TBlockItemHasherBase<TSingularTypeBlockItemHaser, /*Nullable=*/false> {
+class TSingularTypeBlockItemHaser: public TBlockItemHasherBase<TSingularTypeBlockItemHaser, /*Nullable=*/false> {
public:
ui64 DoHash(TBlockItem value) const {
Y_UNUSED(value);
@@ -85,11 +85,12 @@ public:
};
template <bool Nullable>
-class TTupleBlockItemHasher : public TBlockItemHasherBase<TTupleBlockItemHasher<Nullable>, Nullable> {
+class TTupleBlockItemHasher: public TBlockItemHasherBase<TTupleBlockItemHasher<Nullable>, Nullable> {
public:
TTupleBlockItemHasher(TVector<std::unique_ptr<IBlockItemHasher>>&& children)
: Children_(std::move(children))
- {}
+ {
+ }
ui64 DoHash(TBlockItem value) const {
// keep hash computation in sync with
@@ -106,11 +107,12 @@ private:
const TVector<std::unique_ptr<IBlockItemHasher>> Children_;
};
-class TExternalOptionalBlockItemHasher : public TBlockItemHasherBase<TExternalOptionalBlockItemHasher, true> {
+class TExternalOptionalBlockItemHasher: public TBlockItemHasherBase<TExternalOptionalBlockItemHasher, true> {
public:
TExternalOptionalBlockItemHasher(std::unique_ptr<IBlockItemHasher>&& inner)
: Inner_(std::move(inner))
- {}
+ {
+ }
ui64 DoHash(TBlockItem value) const {
return Inner_->Hash(value.GetOptionalValue());
@@ -120,4 +122,4 @@ private:
const std::unique_ptr<IBlockItemHasher> Inner_;
};
-}
+} // namespace NYql::NUdf
diff --git a/yql/essentials/public/udf/arrow/block_reader.cpp b/yql/essentials/public/udf/arrow/block_reader.cpp
index 89d21389af4..76db9fba3a5 100644
--- a/yql/essentials/public/udf/arrow/block_reader.cpp
+++ b/yql/essentials/public/udf/arrow/block_reader.cpp
@@ -4,4 +4,4 @@ namespace NYql {
namespace NUdf {
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/block_reader.h b/yql/essentials/public/udf/arrow/block_reader.h
index 25a3dbe4775..cb81e6b8745 100644
--- a/yql/essentials/public/udf/arrow/block_reader.h
+++ b/yql/essentials/public/udf/arrow/block_reader.h
@@ -12,7 +12,7 @@
namespace NYql {
namespace NUdf {
-class IBlockReader : private TNonCopyable {
+class IBlockReader: private TNonCopyable {
public:
virtual ~IBlockReader() = default;
// result will reference to Array/Scalar internals and will be valid until next call to GetItem/GetScalarItem
@@ -34,7 +34,7 @@ struct TBlockItemSerializeProps {
bool IsFixed = true; // true if each block item takes fixed size
};
-class TBlockReaderBase : public IBlockReader {
+class TBlockReaderBase: public IBlockReader {
public:
ui64 GetSliceDataWeight(const arrow::ArrayData& data, int64_t offset, int64_t length) const final {
Y_ENSURE(0 <= offset && offset < data.length);
@@ -54,8 +54,8 @@ protected:
}
};
-template<typename T, bool Nullable, typename TDerived>
-class TFixedSizeBlockReaderBase : public TBlockReaderBase {
+template <typename T, bool Nullable, typename TDerived>
+class TFixedSizeBlockReaderBase: public TBlockReaderBase {
public:
TBlockItem GetItem(const arrow::ArrayData& data, size_t index) final {
if constexpr (Nullable) {
@@ -75,14 +75,14 @@ public:
}
}
- if constexpr(std::is_same_v<T, NYql::NDecimal::TInt128>) {
+ if constexpr (std::is_same_v<T, NYql::NDecimal::TInt128>) {
auto& fixedScalar = checked_cast<const arrow::FixedSizeBinaryScalar&>(scalar);
- T value; memcpy((void*)&value, fixedScalar.value->data(), sizeof(T));
+ T value;
+ memcpy((void*)&value, fixedScalar.value->data(), sizeof(T));
return static_cast<TDerived*>(this)->MakeBlockItem(value);
} else {
return static_cast<TDerived*>(this)->MakeBlockItem(
- *static_cast<const T*>(checked_cast<const PrimitiveScalarBase&>(scalar).data())
- );
+ *static_cast<const T*>(checked_cast<const PrimitiveScalarBase&>(scalar).data()));
}
}
@@ -126,9 +126,10 @@ public:
out.PushChar(1);
}
- if constexpr(std::is_same_v<T, NYql::NDecimal::TInt128>) {
+ if constexpr (std::is_same_v<T, NYql::NDecimal::TInt128>) {
auto& fixedScalar = arrow::internal::checked_cast<const arrow::FixedSizeBinaryScalar&>(scalar);
- T value; memcpy((void*)&value, fixedScalar.value->data(), sizeof(T));
+ T value;
+ memcpy((void*)&value, fixedScalar.value->data(), sizeof(T));
out.PushNumber(value);
} else {
out.PushNumber(*static_cast<const T*>(arrow::internal::checked_cast<const arrow::internal::PrimitiveScalarBase&>(scalar).data()));
@@ -145,16 +146,16 @@ private:
}
};
-template<typename T, bool Nullable>
-class TFixedSizeBlockReader : public TFixedSizeBlockReaderBase<T, Nullable, TFixedSizeBlockReader<T, Nullable>> {
+template <typename T, bool Nullable>
+class TFixedSizeBlockReader: public TFixedSizeBlockReaderBase<T, Nullable, TFixedSizeBlockReader<T, Nullable>> {
public:
TBlockItem MakeBlockItem(const T& item) const {
return TBlockItem(item);
}
};
-template<bool Nullable>
-class TResourceBlockReader : public TFixedSizeBlockReaderBase<TUnboxedValuePod, Nullable, TResourceBlockReader<Nullable>> {
+template <bool Nullable>
+class TResourceBlockReader: public TFixedSizeBlockReaderBase<TUnboxedValuePod, Nullable, TResourceBlockReader<Nullable>> {
public:
TBlockItem MakeBlockItem(const TUnboxedValuePod& pod) const {
TBlockItem item;
@@ -163,8 +164,8 @@ public:
}
};
-template<typename TStringType, bool Nullable, NKikimr::NUdf::EDataSlot TOriginal = NKikimr::NUdf::EDataSlot::String>
-class TStringBlockReader final : public TBlockReaderBase {
+template <typename TStringType, bool Nullable, NKikimr::NUdf::EDataSlot TOriginal = NKikimr::NUdf::EDataSlot::String>
+class TStringBlockReader final: public TBlockReaderBase {
public:
using TOffset = typename TStringType::offset_type;
@@ -258,8 +259,8 @@ private:
}
};
-template<bool Nullable, typename TDerived>
-class TTupleBlockReaderBase : public TBlockReaderBase {
+template <bool Nullable, typename TDerived>
+class TTupleBlockReaderBase: public TBlockReaderBase {
public:
TBlockItem GetItem(const arrow::ArrayData& data, size_t index) final {
if constexpr (Nullable) {
@@ -337,13 +338,14 @@ public:
}
};
-template<bool Nullable>
-class TTupleBlockReader final : public TTupleBlockReaderBase<Nullable, TTupleBlockReader<Nullable>> {
+template <bool Nullable>
+class TTupleBlockReader final: public TTupleBlockReaderBase<Nullable, TTupleBlockReader<Nullable>> {
public:
TTupleBlockReader(TVector<std::unique_ptr<IBlockReader>>&& children)
: Children_(std::move(children))
, Items_(Children_.size())
- {}
+ {
+ }
TBlockItem GetChildrenItems(const arrow::ArrayData& data, size_t index) {
for (ui32 i = 0; i < Children_.size(); ++i) {
@@ -423,13 +425,13 @@ private:
TVector<TBlockItem> Items_;
};
-template<typename TTzDate, bool Nullable>
-class TTzDateBlockReader final : public TTupleBlockReaderBase<Nullable, TTzDateBlockReader<TTzDate, Nullable>> {
+template <typename TTzDate, bool Nullable>
+class TTzDateBlockReader final: public TTupleBlockReaderBase<Nullable, TTzDateBlockReader<TTzDate, Nullable>> {
public:
TBlockItem GetChildrenItems(const arrow::ArrayData& data, size_t index) {
Y_DEBUG_ABORT_UNLESS(data.child_data.size() == 2);
- TBlockItem item {DateReader_.GetItem(*data.child_data[0], index)};
+ TBlockItem item{DateReader_.GetItem(*data.child_data[0], index)};
item.SetTimezoneId(TimezoneReader_.GetItem(*data.child_data[1], index).Get<ui16>());
return item;
}
@@ -437,7 +439,7 @@ public:
TBlockItem GetChildrenScalarItems(const arrow::StructScalar& structScalar) {
Y_DEBUG_ABORT_UNLESS(structScalar.value.size() == 2);
- TBlockItem item {DateReader_.GetScalarItem(*structScalar.value[0])};
+ TBlockItem item{DateReader_.GetScalarItem(*structScalar.value[0])};
item.SetTimezoneId(TimezoneReader_.GetScalarItem(*structScalar.value[1]).Get<ui16>());
return item;
}
@@ -487,8 +489,8 @@ public:
}
private:
- TFixedSizeBlockReader<typename TDataType<TTzDate>::TLayout, /* Nullable */false> DateReader_;
- TFixedSizeBlockReader<ui16, /* Nullable */false> TimezoneReader_;
+ TFixedSizeBlockReader<typename TDataType<TTzDate>::TLayout, /* Nullable */ false> DateReader_;
+ TFixedSizeBlockReader<ui16, /* Nullable */ false> TimezoneReader_;
};
// NOTE: For any singular type we use arrow::null() data type.
@@ -538,11 +540,12 @@ public:
}
};
-class TExternalOptionalBlockReader final : public TBlockReaderBase {
+class TExternalOptionalBlockReader final: public TBlockReaderBase {
public:
TExternalOptionalBlockReader(std::unique_ptr<IBlockReader>&& inner)
: Inner_(std::move(inner))
- {}
+ {
+ }
TBlockItem GetItem(const arrow::ArrayData& data, size_t index) final {
if (IsNull(data, index)) {
@@ -612,9 +615,9 @@ struct TReaderTraits {
template <typename TStringType, bool Nullable, NKikimr::NUdf::EDataSlot TOriginal>
using TStrings = TStringBlockReader<TStringType, Nullable, TOriginal>;
using TExtOptional = TExternalOptionalBlockReader;
- template<bool Nullable>
+ template <bool Nullable>
using TResource = TResourceBlockReader<Nullable>;
- template<typename TTzDate, bool Nullable>
+ template <typename TTzDate, bool Nullable>
using TTzDateReader = TTzDateBlockReader<TTzDate, Nullable>;
using TSingularType = TSingularTypeBlockReader;
@@ -641,7 +644,7 @@ struct TReaderTraits {
return std::make_unique<TSingularType>();
}
- template<typename TTzDate>
+ template <typename TTzDate>
static std::unique_ptr<TResult> MakeTzDate(bool isOptional) {
if (isOptional) {
return std::make_unique<TTzDateReader<TTzDate, true>>();
@@ -698,8 +701,7 @@ inline void UpdateBlockItemSerializeProps(const ITypeInfoHelper& typeInfoHelper,
props.IsFixed = false;
} else if (dataTypeInfo.Features & TzDateType) {
*props.MaxSize += dataTypeInfo.FixedSize + sizeof(TTimezoneId);
- }
- else {
+ } else {
*props.MaxSize += dataTypeInfo.FixedSize;
}
return;
@@ -725,5 +727,5 @@ inline void UpdateBlockItemSerializeProps(const ITypeInfoHelper& typeInfoHelper,
Y_ENSURE(false, "Unsupported type");
}
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/block_type_helper.cpp b/yql/essentials/public/udf/arrow/block_type_helper.cpp
index 362d9faf254..33477afd563 100644
--- a/yql/essentials/public/udf/arrow/block_type_helper.cpp
+++ b/yql/essentials/public/udf/arrow/block_type_helper.cpp
@@ -3,7 +3,8 @@
namespace NYql {
namespace NUdf {
-IBlockTypeHelper::IBlockTypeHelper() {}
+IBlockTypeHelper::IBlockTypeHelper() {
+}
} // namespace NUdf
} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/block_type_helper.h b/yql/essentials/public/udf/arrow/block_type_helper.h
index 55995c5f16d..a3aa995b393 100644
--- a/yql/essentials/public/udf/arrow/block_type_helper.h
+++ b/yql/essentials/public/udf/arrow/block_type_helper.h
@@ -17,19 +17,19 @@ public:
};
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 34)
-class IBlockTypeHelper2 : public IBlockTypeHelper1 {
+class IBlockTypeHelper2: public IBlockTypeHelper1 {
public:
- virtual IBlockItemHasher::TPtr MakeHasher(TType *type) const = 0;
+ virtual IBlockItemHasher::TPtr MakeHasher(TType* type) const = 0;
};
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 34)
-class IBlockTypeHelper : public IBlockTypeHelper2 {
+class IBlockTypeHelper: public IBlockTypeHelper2 {
public:
IBlockTypeHelper();
};
#else
-class IBlockTypeHelper : public IBlockTypeHelper1 {
+class IBlockTypeHelper: public IBlockTypeHelper1 {
public:
IBlockTypeHelper();
};
@@ -37,11 +37,10 @@ public:
UDF_ASSERT_TYPE_SIZE(IBlockTypeHelper, 8);
-template<EDataSlot slot>
+template <EDataSlot slot>
std::shared_ptr<arrow::DataType> MakeTzLayoutArrowType() {
- static_assert(slot == EDataSlot::TzDate || slot == EDataSlot::TzDatetime || slot == EDataSlot::TzTimestamp
- || slot == EDataSlot::TzDate32 || slot == EDataSlot::TzDatetime64 || slot == EDataSlot::TzTimestamp64,
- "Expected tz date type slot");
+ static_assert(slot == EDataSlot::TzDate || slot == EDataSlot::TzDatetime || slot == EDataSlot::TzTimestamp || slot == EDataSlot::TzDate32 || slot == EDataSlot::TzDatetime64 || slot == EDataSlot::TzTimestamp64,
+ "Expected tz date type slot");
if constexpr (slot == EDataSlot::TzDate) {
return arrow::uint16();
@@ -63,5 +62,5 @@ std::shared_ptr<arrow::DataType> MakeTzLayoutArrowType() {
}
}
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/defs.h b/yql/essentials/public/udf/arrow/defs.h
index f05965396b8..f468802ab86 100644
--- a/yql/essentials/public/udf/arrow/defs.h
+++ b/yql/essentials/public/udf/arrow/defs.h
@@ -3,30 +3,31 @@
#include <arrow/result.h>
#include <util/generic/yexception.h>
-#define ARROW_CHECK_STATUS(s, op, ...) \
- if (!s.ok()) { \
- ythrow yexception() << "Operation failed: [" << #op << "]\n" \
- << "" __VA_ARGS__ << ": [" << s.ToString() << "]"; \
+#define ARROW_CHECK_STATUS(s, op, ...) \
+ if (!s.ok()) { \
+ ythrow yexception() << "Operation failed: [" << #op << "]\n" \
+ << "" __VA_ARGS__ << ": [" << s.ToString() << "]"; \
}
-#define ARROW_OK_S(op, ...) \
-do { \
- ::arrow::Status _s = (op); \
- ARROW_CHECK_STATUS(_s, op, __VA_ARGS__); \
- } while (false)
+#define ARROW_OK_S(op, ...) \
+ do { \
+ ::arrow::Status _s = (op); \
+ ARROW_CHECK_STATUS(_s, op, __VA_ARGS__); \
+ } while (false)
-#define ARROW_OK(op) ARROW_OK_S(op, "Bad status")
+#define ARROW_OK(op) ARROW_OK_S(op, "Bad status")
-#define ARROW_RESULT_S(op, ...) \
- [&]() { \
- auto result = (op); \
- ARROW_CHECK_STATUS(result.status(), op, __VA_ARGS__); \
- return std::move(result).ValueOrDie(); \
+#define ARROW_RESULT_S(op, ...) \
+ [&]() { \
+ auto result = (op); \
+ ARROW_CHECK_STATUS(result.status(), op, __VA_ARGS__); \
+ return std::move(result).ValueOrDie(); \
}()
-#define ARROW_RESULT(op) ARROW_RESULT_S(op, "Bad status")
+#define ARROW_RESULT(op) ARROW_RESULT_S(op, "Bad status")
-#define ARROW_DEBUG_CHECK_DATUM_TYPES(expected, got) do { \
- Y_DEBUG_ABORT_UNLESS((expected) == (got), "Bad datum type: %s expected, %s got", \
- (expected).ToString().c_str(), (got).ToString().c_str()); \
-} while(false)
+#define ARROW_DEBUG_CHECK_DATUM_TYPES(expected, got) \
+ do { \
+ Y_DEBUG_ABORT_UNLESS((expected) == (got), "Bad datum type: %s expected, %s got", \
+ (expected).ToString().c_str(), (got).ToString().c_str()); \
+ } while (false)
diff --git a/yql/essentials/public/udf/arrow/dispatch_traits.h b/yql/essentials/public/udf/arrow/dispatch_traits.h
index 9fb6559f4aa..b4f54608571 100644
--- a/yql/essentials/public/udf/arrow/dispatch_traits.h
+++ b/yql/essentials/public/udf/arrow/dispatch_traits.h
@@ -69,7 +69,7 @@ std::unique_ptr<typename TTraits::TResult> MakeTzDateArrowTraitsImpl(bool isOpti
}
}
-template<typename TTraits>
+template <typename TTraits>
concept CanInstantiateArrowTraitsForDecimal = requires {
typename TTraits::template TFixedSize<NYql::NDecimal::TInt128, true>;
};
@@ -150,67 +150,67 @@ std::unique_ptr<typename TTraits::TResult> DispatchByArrowTraits(const ITypeInfo
if (typeData) {
auto typeId = typeData.GetTypeId();
switch (GetDataSlot(typeId)) {
- case NUdf::EDataSlot::Int8:
- return MakeFixedSizeArrowTraitsImpl<TTraits, i8>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Bool:
- case NUdf::EDataSlot::Uint8:
- return MakeFixedSizeArrowTraitsImpl<TTraits, ui8>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Int16:
- return MakeFixedSizeArrowTraitsImpl<TTraits, i16>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Uint16:
- case NUdf::EDataSlot::Date:
- return MakeFixedSizeArrowTraitsImpl<TTraits, ui16>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Int32:
- case NUdf::EDataSlot::Date32:
- return MakeFixedSizeArrowTraitsImpl<TTraits, i32>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Uint32:
- case NUdf::EDataSlot::Datetime:
- return MakeFixedSizeArrowTraitsImpl<TTraits, ui32>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Int64:
- case NUdf::EDataSlot::Interval:
- case NUdf::EDataSlot::Interval64:
- case NUdf::EDataSlot::Datetime64:
- case NUdf::EDataSlot::Timestamp64:
- return MakeFixedSizeArrowTraitsImpl<TTraits, i64>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Uint64:
- case NUdf::EDataSlot::Timestamp:
- return MakeFixedSizeArrowTraitsImpl<TTraits, ui64>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Float:
- return MakeFixedSizeArrowTraitsImpl<TTraits, float>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Double:
- return MakeFixedSizeArrowTraitsImpl<TTraits, double>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::String:
- return MakeStringArrowTraitsImpl<TTraits, arrow::BinaryType, NUdf::EDataSlot::String>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Yson:
- return MakeStringArrowTraitsImpl<TTraits, arrow::BinaryType, NUdf::EDataSlot::Yson>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::JsonDocument:
- return MakeStringArrowTraitsImpl<TTraits, arrow::BinaryType, NUdf::EDataSlot::JsonDocument>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Utf8:
- return MakeStringArrowTraitsImpl<TTraits, arrow::StringType, NUdf::EDataSlot::Utf8>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Json:
- return MakeStringArrowTraitsImpl<TTraits, arrow::StringType, NUdf::EDataSlot::Json>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::TzDate:
- return MakeTzDateArrowTraitsImpl<TTraits, TTzDate>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::TzDatetime:
- return MakeTzDateArrowTraitsImpl<TTraits, TTzDatetime>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::TzTimestamp:
- return MakeTzDateArrowTraitsImpl<TTraits, TTzTimestamp>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::TzDate32:
- return MakeTzDateArrowTraitsImpl<TTraits, TTzDate32>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::TzDatetime64:
- return MakeTzDateArrowTraitsImpl<TTraits, TTzDatetime64>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::TzTimestamp64:
- return MakeTzDateArrowTraitsImpl<TTraits, TTzTimestamp64>(isOptional, type, std::forward<TArgs>(args)...);
- case NUdf::EDataSlot::Decimal: {
- if constexpr (CanInstantiateArrowTraitsForDecimal<TTraits>) {
- return MakeFixedSizeArrowTraitsImpl<TTraits, NYql::NDecimal::TInt128>(isOptional, type, std::forward<TArgs>(args)...);
- } else {
- Y_ENSURE(false, "Unsupported data slot");
+ case NUdf::EDataSlot::Int8:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, i8>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Bool:
+ case NUdf::EDataSlot::Uint8:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, ui8>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Int16:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, i16>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Uint16:
+ case NUdf::EDataSlot::Date:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, ui16>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Int32:
+ case NUdf::EDataSlot::Date32:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, i32>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Uint32:
+ case NUdf::EDataSlot::Datetime:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, ui32>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Int64:
+ case NUdf::EDataSlot::Interval:
+ case NUdf::EDataSlot::Interval64:
+ case NUdf::EDataSlot::Datetime64:
+ case NUdf::EDataSlot::Timestamp64:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, i64>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Uint64:
+ case NUdf::EDataSlot::Timestamp:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, ui64>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Float:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, float>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Double:
+ return MakeFixedSizeArrowTraitsImpl<TTraits, double>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::String:
+ return MakeStringArrowTraitsImpl<TTraits, arrow::BinaryType, NUdf::EDataSlot::String>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Yson:
+ return MakeStringArrowTraitsImpl<TTraits, arrow::BinaryType, NUdf::EDataSlot::Yson>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::JsonDocument:
+ return MakeStringArrowTraitsImpl<TTraits, arrow::BinaryType, NUdf::EDataSlot::JsonDocument>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Utf8:
+ return MakeStringArrowTraitsImpl<TTraits, arrow::StringType, NUdf::EDataSlot::Utf8>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Json:
+ return MakeStringArrowTraitsImpl<TTraits, arrow::StringType, NUdf::EDataSlot::Json>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::TzDate:
+ return MakeTzDateArrowTraitsImpl<TTraits, TTzDate>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::TzDatetime:
+ return MakeTzDateArrowTraitsImpl<TTraits, TTzDatetime>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::TzTimestamp:
+ return MakeTzDateArrowTraitsImpl<TTraits, TTzTimestamp>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::TzDate32:
+ return MakeTzDateArrowTraitsImpl<TTraits, TTzDate32>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::TzDatetime64:
+ return MakeTzDateArrowTraitsImpl<TTraits, TTzDatetime64>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::TzTimestamp64:
+ return MakeTzDateArrowTraitsImpl<TTraits, TTzTimestamp64>(isOptional, type, std::forward<TArgs>(args)...);
+ case NUdf::EDataSlot::Decimal: {
+ if constexpr (CanInstantiateArrowTraitsForDecimal<TTraits>) {
+ return MakeFixedSizeArrowTraitsImpl<TTraits, NYql::NDecimal::TInt128>(isOptional, type, std::forward<TArgs>(args)...);
+ } else {
+ Y_ENSURE(false, "Unsupported data slot");
+ }
}
- }
- case NUdf::EDataSlot::Uuid:
- case NUdf::EDataSlot::DyNumber:
- Y_ENSURE(false, "Unsupported data slot");
+ case NUdf::EDataSlot::Uuid:
+ case NUdf::EDataSlot::DyNumber:
+ Y_ENSURE(false, "Unsupported data slot");
}
}
@@ -245,5 +245,5 @@ std::unique_ptr<typename TTraits::TResult> DispatchByArrowTraits(const ITypeInfo
Y_ENSURE(false, "Unsupported type");
}
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/memory_pool.cpp b/yql/essentials/public/udf/arrow/memory_pool.cpp
index 5a074b60aba..281973e1f08 100644
--- a/yql/essentials/public/udf/arrow/memory_pool.cpp
+++ b/yql/essentials/public/udf/arrow/memory_pool.cpp
@@ -8,7 +8,7 @@
namespace NYql {
namespace NUdf {
-class TYqlMemoryPool : public arrow::MemoryPool {
+class TYqlMemoryPool: public arrow::MemoryPool {
arrow::Status Allocate(int64_t size, uint8_t** out) final {
Y_ENSURE(size >= 0 && out);
*out = (uint8_t*)UdfArrowAllocate(size);
@@ -58,5 +58,5 @@ arrow::MemoryPool* GetYqlMemoryPool() {
return Singleton<TYqlMemoryPool>();
}
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/memory_pool.h b/yql/essentials/public/udf/arrow/memory_pool.h
index bad76f9450e..1bc7874e81d 100644
--- a/yql/essentials/public/udf/arrow/memory_pool.h
+++ b/yql/essentials/public/udf/arrow/memory_pool.h
@@ -17,5 +17,5 @@ inline arrow::MemoryPool* GetYqlMemoryPool() {
}
#endif
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/udf_arrow_helpers.cpp b/yql/essentials/public/udf/arrow/udf_arrow_helpers.cpp
index dea156b206a..44493835929 100644
--- a/yql/essentials/public/udf/arrow/udf_arrow_helpers.cpp
+++ b/yql/essentials/public/udf/arrow/udf_arrow_helpers.cpp
@@ -4,4 +4,4 @@ namespace NYql {
namespace NUdf {
}
-}
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/udf_arrow_helpers.h b/yql/essentials/public/udf/arrow/udf_arrow_helpers.h
index add584513f9..f2e0de8a68d 100644
--- a/yql/essentials/public/udf/arrow/udf_arrow_helpers.h
+++ b/yql/essentials/public/udf/arrow/udf_arrow_helpers.h
@@ -23,9 +23,9 @@
namespace NYql {
namespace NUdf {
-using TExec = arrow::Status(*)(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*);
+using TExec = arrow::Status (*)(arrow::compute::KernelContext*, const arrow::compute::ExecBatch&, arrow::Datum*);
-class TUdfKernelState : public arrow::compute::KernelState {
+class TUdfKernelState: public arrow::compute::KernelState {
public:
TUdfKernelState(const TVector<const TType*>& argTypes, const TType* outputType, bool onlyScalars, const ITypeInfoHelper* typeInfoHelper, const IValueBuilder* valueBuilder)
: ArgTypes_(argTypes)
@@ -79,11 +79,11 @@ private:
std::unique_ptr<IScalarBuilder> ScalarBuilder_;
};
-class TSimpleArrowUdfImpl : public TBoxedValue {
+class TSimpleArrowUdfImpl: public TBoxedValue {
public:
TSimpleArrowUdfImpl(const TVector<const TType*> argBlockTypes, const TType* outputType, bool onlyScalars,
- TExec exec, IFunctionTypeInfoBuilder& builder, const TString& name,
- arrow::compute::NullHandling::type nullHandling)
+ TExec exec, IFunctionTypeInfoBuilder& builder, const TString& name,
+ arrow::compute::NullHandling::type nullHandling)
: OnlyScalars_(onlyScalars)
, Exec_(exec)
, Pos_(GetSourcePosition(builder))
@@ -170,7 +170,7 @@ public:
arrow::Datum res;
if (OnlyScalars_) {
auto executor = arrow::compute::detail::KernelExecutor::MakeScalar();
- ARROW_OK(executor->Init(&kernelContext, { &Kernel_, ArgsValuesDescr_, nullptr }));
+ ARROW_OK(executor->Init(&kernelContext, {&Kernel_, ArgsValuesDescr_, nullptr}));
auto listener = std::make_shared<arrow::compute::detail::DatumAccumulator>();
ARROW_OK(executor->Execute(argDatums, listener.get()));
@@ -182,7 +182,7 @@ public:
while (dechunker.Next(chunk)) {
auto executor = arrow::compute::detail::KernelExecutor::MakeScalar();
- ARROW_OK(executor->Init(&kernelContext, { &Kernel_, ArgsValuesDescr_, nullptr }));
+ ARROW_OK(executor->Init(&kernelContext, {&Kernel_, ArgsValuesDescr_, nullptr}));
arrow::compute::detail::DatumAccumulator listener;
ARROW_OK(executor->Execute(chunk, &listener));
@@ -240,7 +240,7 @@ private:
};
inline void SetCallableArgumentAttributes(IFunctionArgTypesBuilder& argsBuilder,
- const TCallableTypeInspector& callableInspector, const ui32 index) {
+ const TCallableTypeInspector& callableInspector, const ui32 index) {
if (callableInspector.GetArgumentName(index).Size() > 0) {
argsBuilder.Name(callableInspector.GetArgumentName(index));
}
@@ -250,7 +250,7 @@ inline void SetCallableArgumentAttributes(IFunctionArgTypesBuilder& argsBuilder,
}
inline void PrepareSimpleArrowUdf(IFunctionTypeInfoBuilder& builder, TType* signature, TType* userType, TExec exec, bool typesOnly,
- const TString& name, arrow::compute::NullHandling::type nullHandling = arrow::compute::NullHandling::type::COMPUTED_NO_PREALLOCATE) {
+ const TString& name, arrow::compute::NullHandling::type nullHandling = arrow::compute::NullHandling::type::COMPUTED_NO_PREALLOCATE) {
auto typeInfoHelper = builder.TypeInfoHelper();
TCallableTypeInspector callableInspector(*typeInfoHelper, signature);
Y_ENSURE(callableInspector);
@@ -322,11 +322,11 @@ inline void PrepareSimpleArrowUdf(IFunctionTypeInfoBuilder& builder, TType* sign
if (!typesOnly) {
builder.Implementation(new TSimpleArrowUdfImpl(argBlockTypes, callableInspector.GetReturnType(),
- onlyScalars, exec, builder, name, nullHandling));
+ onlyScalars, exec, builder, name, nullHandling));
}
}
-template<typename TBuilder>
+template <typename TBuilder>
TBuilder* CastToArrayBuilderImpl(IArrayBuilder& builder) {
static_assert(std::is_base_of_v<IArrayBuilder, TBuilder>);
@@ -335,7 +335,7 @@ TBuilder* CastToArrayBuilderImpl(IArrayBuilder& builder) {
return builderImpl;
}
-template<typename TScalarBuilderImpl>
+template <typename TScalarBuilderImpl>
TScalarBuilderImpl* CastToScalarBuilderImpl(IScalarBuilder& builder) {
static_assert(std::is_base_of_v<IScalarBuilder, TScalarBuilderImpl>);
@@ -344,7 +344,7 @@ TScalarBuilderImpl* CastToScalarBuilderImpl(IScalarBuilder& builder) {
return builderImpl;
}
-template<typename TReader>
+template <typename TReader>
TReader* CastToBlockReaderImpl(IBlockReader& reader) {
static_assert(std::is_base_of_v<IBlockReader, TReader>);
@@ -355,7 +355,6 @@ TReader* CastToBlockReaderImpl(IBlockReader& reader) {
template <typename TDerived, typename TReader = IBlockReader, typename TArrayBuilderImpl = IArrayBuilder, typename TScalarBuilderImpl = IScalarBuilder>
struct TUnaryKernelExec {
-
static arrow::Status Do(arrow::compute::KernelContext* ctx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
auto& state = dynamic_cast<TUdfKernelState&>(*ctx->state());
auto& reader = state.GetReader(0);
@@ -370,8 +369,7 @@ struct TUnaryKernelExec {
TDerived::Process(&state.GetValueBuilder(), item, [&](TBlockItem out) {
*res = builderImpl->Build(out);
});
- }
- else {
+ } else {
auto& array = *arg.array();
auto& builder = state.GetArrayBuilder();
auto* builderImpl = CastToArrayBuilderImpl<TArrayBuilderImpl>(builder);
@@ -420,8 +418,7 @@ struct TBinaryKernelExec {
TDerived::Process(&state.GetValueBuilder(), item1, item2, [&](TBlockItem out) {
*res = builderImpl->Build(out);
});
- }
- else if (arg1.is_scalar() && arg2.is_array()) {
+ } else if (arg1.is_scalar() && arg2.is_array()) {
auto item1 = reader1Impl->GetScalarItem(*arg1.scalar());
auto& array2 = *arg2.array();
auto& builder = state.GetArrayBuilder();
@@ -580,7 +577,7 @@ struct TGenericKernelExec {
}
};
-template <typename TInput, typename TOutput, TOutput(*Core)(TInput)>
+template <typename TInput, typename TOutput, TOutput (*Core)(TInput)>
arrow::Status UnaryPreallocatedExecImpl(arrow::compute::KernelContext* ctx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
Y_UNUSED(ctx);
auto& inArray = batch.values[0].array();
@@ -595,8 +592,7 @@ arrow::Status UnaryPreallocatedExecImpl(arrow::compute::KernelContext* ctx, cons
return arrow::Status::OK();
}
-
-template <typename TReader, typename TOutput, TOutput(*Core)(TBlockItem)>
+template <typename TReader, typename TOutput, TOutput (*Core)(TBlockItem)>
arrow::Status UnaryPreallocatedReaderExecImpl(arrow::compute::KernelContext* ctx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
Y_UNUSED(ctx);
static_assert(std::is_base_of_v<IBlockReader, TReader>);
@@ -614,7 +610,7 @@ arrow::Status UnaryPreallocatedReaderExecImpl(arrow::compute::KernelContext* ctx
return arrow::Status::OK();
}
-template<typename TInput, typename TOutput, std::pair<TOutput, bool> Core(TInput)>
+template <typename TInput, typename TOutput, std::pair<TOutput, bool> Core(TInput)>
struct TUnaryUnsafeFixedSizeFilterKernel {
static arrow::Status Do(arrow::compute::KernelContext* ctx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
static_assert(std::is_arithmetic<TInput>::value);
@@ -656,9 +652,8 @@ struct TUnaryUnsafeFixedSizeFilterKernel {
}
};
-
-template <typename TInput, typename TOutput, TOutput(*Core)(TInput)>
-class TUnaryOverOptionalImpl : public TBoxedValue {
+template <typename TInput, typename TOutput, TOutput (*Core)(TInput)>
+class TUnaryOverOptionalImpl: public TBoxedValue {
public:
TUnboxedValue Run(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const final {
Y_UNUSED(valueBuilder);
@@ -670,77 +665,77 @@ public:
}
};
-}
-}
-
-#define BEGIN_ARROW_UDF_IMPL(udfNameBlocks, signatureFunc, optArgc, isStrict) \
- class udfNameBlocks { \
- public: \
- typedef bool TTypeAwareMarker; \
- static const ::NYql::NUdf::TStringRef& Name() { \
- static auto name = ::NYql::NUdf::TStringRef::Of(#udfNameBlocks).Substring(1, 256); \
- return name; \
- } \
- static bool IsStrict() { \
- return isStrict; \
- } \
+} // namespace NUdf
+} // namespace NYql
+
+#define BEGIN_ARROW_UDF_IMPL(udfNameBlocks, signatureFunc, optArgc, isStrict) \
+ class udfNameBlocks { \
+ public: \
+ typedef bool TTypeAwareMarker; \
+ static const ::NYql::NUdf::TStringRef& Name() { \
+ static auto name = ::NYql::NUdf::TStringRef::Of(#udfNameBlocks).Substring(1, 256); \
+ return name; \
+ } \
+ static bool IsStrict() { \
+ return isStrict; \
+ } \
static ::NYql::NUdf::TType* GetSignatureType(::NYql::NUdf::IFunctionTypeInfoBuilder& builder) { \
- return builder.SimpleSignatureType<signatureFunc>(optArgc); \
- } \
- static bool DeclareSignature(\
- const ::NYql::NUdf::TStringRef& name, \
- ::NYql::NUdf::TType* userType, \
- ::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
- bool typesOnly); \
+ return builder.SimpleSignatureType<signatureFunc>(optArgc); \
+ } \
+ static bool DeclareSignature( \
+ const ::NYql::NUdf::TStringRef& name, \
+ ::NYql::NUdf::TType* userType, \
+ ::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
+ bool typesOnly); \
};
-#define BEGIN_SIMPLE_ARROW_UDF(udfName, signatureFunc) \
+#define BEGIN_SIMPLE_ARROW_UDF(udfName, signatureFunc) \
BEGIN_ARROW_UDF_IMPL(udfName##_BlocksImpl, signatureFunc, 0, false) \
UDF_IMPL(udfName, builder.SimpleSignature<signatureFunc>().SupportsBlocks();, ;, ;, "", "", udfName##_BlocksImpl)
-#define BEGIN_SIMPLE_STRICT_ARROW_UDF(udfName, signatureFunc) \
+#define BEGIN_SIMPLE_STRICT_ARROW_UDF(udfName, signatureFunc) \
BEGIN_ARROW_UDF_IMPL(udfName##_BlocksImpl, signatureFunc, 0, true) \
UDF_IMPL(udfName, builder.SimpleSignature<signatureFunc>().SupportsBlocks().IsStrict();, ;, ;, "", "", udfName##_BlocksImpl)
#define BEGIN_SIMPLE_STRICT_ARROW_UDF_OPTIONS(udfName, signatureFunc, options) \
- BEGIN_ARROW_UDF_IMPL(udfName##_BlocksImpl, signatureFunc, 0, true) \
+ BEGIN_ARROW_UDF_IMPL(udfName##_BlocksImpl, signatureFunc, 0, true) \
UDF_IMPL(udfName, builder.SimpleSignature<signatureFunc>().SupportsBlocks().IsStrict(); options;, ;, ;, "", "", udfName##_BlocksImpl)
#define BEGIN_SIMPLE_ARROW_UDF_WITH_OPTIONAL_ARGS(udfName, signatureFunc, optArgc) \
- BEGIN_ARROW_UDF_IMPL(udfName##_BlocksImpl, signatureFunc, optArgc, false) \
+ BEGIN_ARROW_UDF_IMPL(udfName##_BlocksImpl, signatureFunc, optArgc, false) \
UDF_IMPL(udfName, builder.SimpleSignature<signatureFunc>().SupportsBlocks().OptionalArgs(optArgc);, ;, ;, "", "", udfName##_BlocksImpl)
#define BEGIN_SIMPLE_STRICT_ARROW_UDF_WITH_OPTIONAL_ARGS(udfName, signatureFunc, optArgc) \
- BEGIN_ARROW_UDF_IMPL(udfName##_BlocksImpl, signatureFunc, optArgc, true) \
+ BEGIN_ARROW_UDF_IMPL(udfName##_BlocksImpl, signatureFunc, optArgc, true) \
UDF_IMPL(udfName, builder.SimpleSignature<signatureFunc>().SupportsBlocks().IsStrict().OptionalArgs(optArgc);, ;, ;, "", "", udfName##_BlocksImpl)
-#define END_ARROW_UDF(udfNameBlocks, exec) \
- inline bool udfNameBlocks::DeclareSignature(\
- const ::NYql::NUdf::TStringRef& name, \
- ::NYql::NUdf::TType* userType, \
- ::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
- bool typesOnly) { \
- if (Name() == name) { \
- if (IsStrict()) { \
- builder.IsStrict(); \
- } \
- PrepareSimpleArrowUdf(builder, GetSignatureType(builder), userType, exec, typesOnly, TString(name)); \
- return true; \
- } \
- return false; \
+#define END_ARROW_UDF(udfNameBlocks, exec) \
+ inline bool udfNameBlocks::DeclareSignature( \
+ const ::NYql::NUdf::TStringRef& name, \
+ ::NYql::NUdf::TType* userType, \
+ ::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
+ bool typesOnly) { \
+ if (Name() == name) { \
+ if (IsStrict()) { \
+ builder.IsStrict(); \
+ } \
+ PrepareSimpleArrowUdf(builder, GetSignatureType(builder), userType, exec, typesOnly, TString(name)); \
+ return true; \
+ } \
+ return false; \
}
-#define END_ARROW_UDF_WITH_NULL_HANDLING(udfNameBlocks, exec, nullHandling) \
- inline bool udfNameBlocks::DeclareSignature(\
- const ::NYql::NUdf::TStringRef& name, \
- ::NYql::NUdf::TType* userType, \
- ::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
- bool typesOnly) { \
- if (Name() == name) { \
- PrepareSimpleArrowUdf(builder, GetSignatureType(builder), userType, exec, typesOnly, TString(name), nullHandling); \
- return true; \
- } \
- return false; \
+#define END_ARROW_UDF_WITH_NULL_HANDLING(udfNameBlocks, exec, nullHandling) \
+ inline bool udfNameBlocks::DeclareSignature( \
+ const ::NYql::NUdf::TStringRef& name, \
+ ::NYql::NUdf::TType* userType, \
+ ::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
+ bool typesOnly) { \
+ if (Name() == name) { \
+ PrepareSimpleArrowUdf(builder, GetSignatureType(builder), userType, exec, typesOnly, TString(name), nullHandling); \
+ return true; \
+ } \
+ return false; \
}
#define END_SIMPLE_ARROW_UDF(udfName, exec) \
diff --git a/yql/essentials/public/udf/arrow/ut/array_builder_ut.cpp b/yql/essentials/public/udf/arrow/ut/array_builder_ut.cpp
index cc389d3d94c..7c173be3651 100644
--- a/yql/essentials/public/udf/arrow/ut/array_builder_ut.cpp
+++ b/yql/essentials/public/udf/arrow/ut/array_builder_ut.cpp
@@ -34,352 +34,353 @@ struct TArrayBuilderTestData {
std::unique_ptr<IArrayBuilder> MakeResourceArrayBuilder(TType* resourceType, TArrayBuilderTestData& data) {
auto arrayBuilder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), resourceType,
- *data.ArrowPool, MAX_BLOCK_SIZE, /* pgBuilder */nullptr);
+ *data.ArrowPool, MAX_BLOCK_SIZE, /* pgBuilder */ nullptr);
UNIT_ASSERT_C(arrayBuilder, "Failed to make resource arrow array builder");
return arrayBuilder;
}
Y_UNIT_TEST_SUITE(TArrayBuilderTest) {
- Y_UNIT_TEST(TestEmbeddedResourceBuilder) {
- TArrayBuilderTestData data;
- const auto resourceType = data.PgmBuilder.NewResourceType("Test.Resource");
- const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
- auto resource = TUnboxedValuePod::Embedded("testtest");
- arrayBuilder->Add(resource);
- auto datum = arrayBuilder->Build(true);
- UNIT_ASSERT(datum.is_array());
- UNIT_ASSERT_VALUES_EQUAL(datum.length(), 1);
+Y_UNIT_TEST(TestEmbeddedResourceBuilder) {
+ TArrayBuilderTestData data;
+ const auto resourceType = data.PgmBuilder.NewResourceType("Test.Resource");
+ const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
+ auto resource = TUnboxedValuePod::Embedded("testtest");
+ arrayBuilder->Add(resource);
+ auto datum = arrayBuilder->Build(true);
+ UNIT_ASSERT(datum.is_array());
+ UNIT_ASSERT_VALUES_EQUAL(datum.length(), 1);
+
+ auto value = datum.array()->GetValues<TUnboxedValue>(1)[0];
+ UNIT_ASSERT(value.IsEmbedded());
+ UNIT_ASSERT_VALUES_EQUAL_C(TStringRef(value.AsStringRef()), TStringRef(resource.AsStringRef()),
+ "Expected equal values after building array");
+}
- auto value = datum.array()->GetValues<TUnboxedValue>(1)[0];
- UNIT_ASSERT(value.IsEmbedded());
- UNIT_ASSERT_VALUES_EQUAL_C(TStringRef(value.AsStringRef()), TStringRef(resource.AsStringRef()),
- "Expected equal values after building array");
- }
+Y_UNIT_TEST(TestTaggedTypeBuilder) {
+ TArrayBuilderTestData data;
+ const auto intType = data.PgmBuilder.NewDataType(NUdf::EDataSlot::Int32, false);
+ const auto taggedType = data.PgmBuilder.NewTaggedType(intType, "tag");
- Y_UNIT_TEST(TestTaggedTypeBuilder) {
- TArrayBuilderTestData data;
- const auto intType = data.PgmBuilder.NewDataType(NUdf::EDataSlot::Int32, false);
- const auto taggedType = data.PgmBuilder.NewTaggedType(intType, "tag");
+ const auto arrayBuilder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), taggedType, *data.ArrowPool, MAX_BLOCK_SIZE, /*pgBuilder=*/nullptr);
- const auto arrayBuilder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), taggedType, *data.ArrowPool, MAX_BLOCK_SIZE, /*pgBuilder=*/nullptr);
+ TUnboxedValue testData = TUnboxedValuePod(123);
- TUnboxedValue testData = TUnboxedValuePod(123);
+ arrayBuilder->Add(testData);
- arrayBuilder->Add(testData);
+ auto datum = arrayBuilder->Build(true);
- auto datum = arrayBuilder->Build(true);
+ UNIT_ASSERT(datum.is_array());
+ UNIT_ASSERT_VALUES_EQUAL(datum.length(), 1);
- UNIT_ASSERT(datum.is_array());
- UNIT_ASSERT_VALUES_EQUAL(datum.length(), 1);
+ auto value = datum.array()->buffers[1];
- auto value = datum.array()->buffers[1];
+ UNIT_ASSERT_VALUES_EQUAL(*reinterpret_cast<int32_t*>(value->address()), 123);
+}
- UNIT_ASSERT_VALUES_EQUAL(*reinterpret_cast<int32_t*>(value->address()), 123);
- }
+Y_UNIT_TEST(TestTaggedTypeReader) {
+ TArrayBuilderTestData data;
+ const auto intType = data.PgmBuilder.NewDataType(NUdf::EDataSlot::Int32, false);
+ const auto taggedType = data.PgmBuilder.NewTaggedType(intType, "tag");
- Y_UNIT_TEST(TestTaggedTypeReader) {
- TArrayBuilderTestData data;
- const auto intType = data.PgmBuilder.NewDataType(NUdf::EDataSlot::Int32, false);
- const auto taggedType = data.PgmBuilder.NewTaggedType(intType, "tag");
+ const auto arrayBuilder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), taggedType, *data.ArrowPool, MAX_BLOCK_SIZE, /*pgBuilder=*/nullptr);
- const auto arrayBuilder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), taggedType, *data.ArrowPool, MAX_BLOCK_SIZE, /*pgBuilder=*/nullptr);
+ TUnboxedValue first = TUnboxedValuePod(123);
+ TUnboxedValue second = TUnboxedValuePod(456);
- TUnboxedValue first = TUnboxedValuePod(123);
- TUnboxedValue second = TUnboxedValuePod(456);
+ arrayBuilder->Add(first);
+ arrayBuilder->Add(second);
- arrayBuilder->Add(first);
- arrayBuilder->Add(second);
+ auto datum = arrayBuilder->Build(true);
- auto datum = arrayBuilder->Build(true);
+ UNIT_ASSERT(datum.is_array());
+ UNIT_ASSERT_VALUES_EQUAL(datum.length(), 2);
- UNIT_ASSERT(datum.is_array());
- UNIT_ASSERT_VALUES_EQUAL(datum.length(), 2);
+ const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), taggedType);
- const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), taggedType);
+ const auto item1AfterRead = blockReader->GetItem(*datum.array(), 0);
+ const auto item2AfterRead = blockReader->GetItem(*datum.array(), 1);
- const auto item1AfterRead = blockReader->GetItem(*datum.array(), 0);
- const auto item2AfterRead = blockReader->GetItem(*datum.array(), 1);
+ UNIT_ASSERT_C(item1AfterRead.HasValue(), "Expected not null");
+ UNIT_ASSERT_C(item2AfterRead.HasValue(), "Expected not null");
- UNIT_ASSERT_C(item1AfterRead.HasValue(), "Expected not null");
- UNIT_ASSERT_C(item2AfterRead.HasValue(), "Expected not null");
+ UNIT_ASSERT_VALUES_EQUAL(item1AfterRead.Get<int>(), 123);
+ UNIT_ASSERT_VALUES_EQUAL(item2AfterRead.Get<int>(), 456);
+}
- UNIT_ASSERT_VALUES_EQUAL(item1AfterRead.Get<int>(), 123);
- UNIT_ASSERT_VALUES_EQUAL(item2AfterRead.Get<int>(), 456);
- }
+extern const char ResourceName[] = "Resource.Name";
+Y_UNIT_TEST(TestDtorCall) {
+ TArrayBuilderTestData data;
+ const auto resourceType = data.PgmBuilder.NewResourceType("Test.Resource");
+ const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
- extern const char ResourceName[] = "Resource.Name";
- Y_UNIT_TEST(TestDtorCall) {
- TArrayBuilderTestData data;
- const auto resourceType = data.PgmBuilder.NewResourceType("Test.Resource");
- const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
-
- auto destructorCallsCnt = std::make_shared<int>(0);
-
- struct TWithDtor {
- int Payload;
- std::shared_ptr<int> DestructorCallsCnt;
- TWithDtor(int payload, std::shared_ptr<int> destructorCallsCnt):
- Payload(payload), DestructorCallsCnt(std::move(destructorCallsCnt)) {
- }
- ~TWithDtor() {
- *DestructorCallsCnt = *DestructorCallsCnt + 1;
- }
- };
- int payload = 123;
-
- using TTestResource = TBoxedResource<std::shared_ptr<TWithDtor>, ResourceName>;
- auto resourcePtr = std::make_shared<TWithDtor>(payload, destructorCallsCnt);
- TUnboxedValuePod resource(new TTestResource(std::move(resourcePtr)));
+ auto destructorCallsCnt = std::make_shared<int>(0);
+ struct TWithDtor {
+ int Payload;
+ std::shared_ptr<int> DestructorCallsCnt;
+ TWithDtor(int payload, std::shared_ptr<int> destructorCallsCnt)
+ : Payload(payload)
+ , DestructorCallsCnt(std::move(destructorCallsCnt))
{
- arrayBuilder->Add(resource);
- auto datum = arrayBuilder->Build(true);
- UNIT_ASSERT(datum.is_array());
- UNIT_ASSERT_VALUES_EQUAL(datum.length(), 1);
-
- const auto value = datum.array()->GetValues<TUnboxedValuePod>(1)[0];
- auto boxed = value.AsBoxed().Get();
- const auto resource = reinterpret_cast<TTestResource*>(boxed);
- UNIT_ASSERT_VALUES_EQUAL(resource->Get()->get()->Payload, payload);
}
+ ~TWithDtor() {
+ *DestructorCallsCnt = *DestructorCallsCnt + 1;
+ }
+ };
+ int payload = 123;
+
+ using TTestResource = TBoxedResource<std::shared_ptr<TWithDtor>, ResourceName>;
+ auto resourcePtr = std::make_shared<TWithDtor>(payload, destructorCallsCnt);
+ TUnboxedValuePod resource(new TTestResource(std::move(resourcePtr)));
+
+ {
+ arrayBuilder->Add(resource);
+ auto datum = arrayBuilder->Build(true);
+ UNIT_ASSERT(datum.is_array());
+ UNIT_ASSERT_VALUES_EQUAL(datum.length(), 1);
- UNIT_ASSERT_VALUES_EQUAL_C(*destructorCallsCnt, 1, "Expected 1 call to resource destructor");
+ const auto value = datum.array()->GetValues<TUnboxedValuePod>(1)[0];
+ auto boxed = value.AsBoxed().Get();
+ const auto resource = reinterpret_cast<TTestResource*>(boxed);
+ UNIT_ASSERT_VALUES_EQUAL(resource->Get()->get()->Payload, payload);
}
- Y_UNIT_TEST(TestBoxedResourceNullable) {
- TArrayBuilderTestData data;
- const auto resourceType = data.PgmBuilder.NewOptionalType(data.PgmBuilder.NewResourceType("Test.Resource"));
- const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
-
- struct TResourceItem {
- int Payload;
- };
- using TTestResource = TBoxedResource<TResourceItem, ResourceName>;
- for (int i = 0; i < 4; i++) {
- if ((i % 2) == 0) {
- TUnboxedValuePod resource(new TTestResource(TResourceItem{i}));
- arrayBuilder->Add(resource);
- } else {
- arrayBuilder->Add(TUnboxedValuePod{});
- }
+ UNIT_ASSERT_VALUES_EQUAL_C(*destructorCallsCnt, 1, "Expected 1 call to resource destructor");
+}
+
+Y_UNIT_TEST(TestBoxedResourceNullable) {
+ TArrayBuilderTestData data;
+ const auto resourceType = data.PgmBuilder.NewOptionalType(data.PgmBuilder.NewResourceType("Test.Resource"));
+ const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
+
+ struct TResourceItem {
+ int Payload;
+ };
+ using TTestResource = TBoxedResource<TResourceItem, ResourceName>;
+ for (int i = 0; i < 4; i++) {
+ if ((i % 2) == 0) {
+ TUnboxedValuePod resource(new TTestResource(TResourceItem{i}));
+ arrayBuilder->Add(resource);
+ } else {
+ arrayBuilder->Add(TUnboxedValuePod{});
}
- auto datum = arrayBuilder->Build(true);
- const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), resourceType);
- for (int i = 0; i < 4; i++) {
- if ((i % 2) == 0) {
- auto item = blockReader->GetItem(*datum.array(), i);
- UNIT_ASSERT_C(item.HasValue(), "Expected not null");
- auto* resourcePtr = reinterpret_cast<TTestResource*>(item.GetBoxed().Get());
- UNIT_ASSERT_EQUAL(i, resourcePtr->Get()->Payload);
- } else {
- auto item = blockReader->GetItem(*datum.array(), i);
- UNIT_ASSERT(!item.HasValue());
- }
+ }
+ auto datum = arrayBuilder->Build(true);
+ const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), resourceType);
+ for (int i = 0; i < 4; i++) {
+ if ((i % 2) == 0) {
+ auto item = blockReader->GetItem(*datum.array(), i);
+ UNIT_ASSERT_C(item.HasValue(), "Expected not null");
+ auto* resourcePtr = reinterpret_cast<TTestResource*>(item.GetBoxed().Get());
+ UNIT_ASSERT_EQUAL(i, resourcePtr->Get()->Payload);
+ } else {
+ auto item = blockReader->GetItem(*datum.array(), i);
+ UNIT_ASSERT(!item.HasValue());
}
}
+}
- Y_UNIT_TEST(TestBuilderWithReader) {
- TArrayBuilderTestData data;
- const auto resourceType = data.PgmBuilder.NewResourceType("Test.Resource");
- const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
+Y_UNIT_TEST(TestBuilderWithReader) {
+ TArrayBuilderTestData data;
+ const auto resourceType = data.PgmBuilder.NewResourceType("Test.Resource");
+ const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
- const auto item1 = TUnboxedValuePod::Embedded("1");
- arrayBuilder->Add(item1);
- const auto item2 = TUnboxedValuePod::Embedded("22");
- arrayBuilder->Add(item2);
+ const auto item1 = TUnboxedValuePod::Embedded("1");
+ arrayBuilder->Add(item1);
+ const auto item2 = TUnboxedValuePod::Embedded("22");
+ arrayBuilder->Add(item2);
- auto datum = arrayBuilder->Build(true);
- UNIT_ASSERT(datum.is_array());
- UNIT_ASSERT_VALUES_EQUAL(datum.length(), 2);
+ auto datum = arrayBuilder->Build(true);
+ UNIT_ASSERT(datum.is_array());
+ UNIT_ASSERT_VALUES_EQUAL(datum.length(), 2);
- const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), resourceType);
- const auto item1AfterRead = blockReader->GetItem(*datum.array(), 0);
- const auto item2AfterRead = blockReader->GetItem(*datum.array(), 1);
+ const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), resourceType);
+ const auto item1AfterRead = blockReader->GetItem(*datum.array(), 0);
+ const auto item2AfterRead = blockReader->GetItem(*datum.array(), 1);
- UNIT_ASSERT_C(std::memcmp(item1.GetRawPtr(), item1AfterRead.GetRawPtr(), sizeof(TBlockItem)) == 0, "Expected UnboxedValue to equal to BlockItem");
- UNIT_ASSERT_C(std::memcmp(item2.GetRawPtr(), item2AfterRead.GetRawPtr(), sizeof(TBlockItem)) == 0, "Expected UnboxedValue to equal to BlockItem");
- }
-
- Y_UNIT_TEST(TestBoxedResourceReader) {
- TArrayBuilderTestData data;
- const auto resourceType = data.PgmBuilder.NewResourceType(ResourceName);
- const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
+ UNIT_ASSERT_C(std::memcmp(item1.GetRawPtr(), item1AfterRead.GetRawPtr(), sizeof(TBlockItem)) == 0, "Expected UnboxedValue to equal to BlockItem");
+ UNIT_ASSERT_C(std::memcmp(item2.GetRawPtr(), item2AfterRead.GetRawPtr(), sizeof(TBlockItem)) == 0, "Expected UnboxedValue to equal to BlockItem");
+}
- using TTestResource = TBoxedResource<int, ResourceName>;
+Y_UNIT_TEST(TestBoxedResourceReader) {
+ TArrayBuilderTestData data;
+ const auto resourceType = data.PgmBuilder.NewResourceType(ResourceName);
+ const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
- arrayBuilder->Add(TUnboxedValuePod(new TTestResource(11111111)));
- arrayBuilder->Add(TUnboxedValuePod(new TTestResource(22222222)));
- const auto datum = arrayBuilder->Build(true);
- UNIT_ASSERT(datum.is_array());
- UNIT_ASSERT_VALUES_EQUAL(datum.length(), 2);
+ using TTestResource = TBoxedResource<int, ResourceName>;
- const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), resourceType);
- const auto item1AfterRead = blockReader->GetItem(*datum.array(), 0);
- const auto item2AfterRead = blockReader->GetItem(*datum.array(), 1);
+ arrayBuilder->Add(TUnboxedValuePod(new TTestResource(11111111)));
+ arrayBuilder->Add(TUnboxedValuePod(new TTestResource(22222222)));
+ const auto datum = arrayBuilder->Build(true);
+ UNIT_ASSERT(datum.is_array());
+ UNIT_ASSERT_VALUES_EQUAL(datum.length(), 2);
- auto boxed1 = item1AfterRead.GetBoxed().Get();
- const auto resource1 = reinterpret_cast<TTestResource*>(boxed1);
- UNIT_ASSERT_VALUES_EQUAL(*resource1->Get(), 11111111);
- UNIT_ASSERT_VALUES_EQUAL(resource1->GetResourceTag(), ResourceName);
+ const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), resourceType);
+ const auto item1AfterRead = blockReader->GetItem(*datum.array(), 0);
+ const auto item2AfterRead = blockReader->GetItem(*datum.array(), 1);
- auto boxed2 = item2AfterRead.GetBoxed().Get();
- const auto resource2 = reinterpret_cast<TTestResource*>(boxed2);
- UNIT_ASSERT_VALUES_EQUAL(*resource2->Get(), 22222222);
- UNIT_ASSERT_VALUES_EQUAL(resource2->GetResourceTag(), ResourceName);
- }
+ auto boxed1 = item1AfterRead.GetBoxed().Get();
+ const auto resource1 = reinterpret_cast<TTestResource*>(boxed1);
+ UNIT_ASSERT_VALUES_EQUAL(*resource1->Get(), 11111111);
+ UNIT_ASSERT_VALUES_EQUAL(resource1->GetResourceTag(), ResourceName);
- Y_UNIT_TEST(TestTzDateBuilder_Layout) {
- TArrayBuilderTestData data;
- const auto tzDateType = data.PgmBuilder.NewDataType(EDataSlot::TzDate);
- const NMiniKQL::TTypeInfoHelper typeInfoHelper;
- const auto arrayBuilder = MakeArrayBuilder(typeInfoHelper, tzDateType,
- *data.ArrowPool, MAX_BLOCK_SIZE, /* pgBuilder */ nullptr);
-
- auto makeTzDate = [] (ui16 val, ui16 tz) {
- TUnboxedValuePod tzDate {val};
- tzDate.SetTimezoneId(tz);
- return tzDate;
- };
-
- TVector<TUnboxedValuePod> dates{makeTzDate(1234, 1), makeTzDate(1234, 2), makeTzDate(45678, 333)};
- for (auto date: dates) {
- arrayBuilder->Add(date);
- }
+ auto boxed2 = item2AfterRead.GetBoxed().Get();
+ const auto resource2 = reinterpret_cast<TTestResource*>(boxed2);
+ UNIT_ASSERT_VALUES_EQUAL(*resource2->Get(), 22222222);
+ UNIT_ASSERT_VALUES_EQUAL(resource2->GetResourceTag(), ResourceName);
+}
- const auto datum = arrayBuilder->Build(true);
- UNIT_ASSERT(datum.is_array());
- const auto array = datum.array();
- const auto expectedType = GetArrowType(typeInfoHelper, tzDateType);
- UNIT_ASSERT(array->type->Equals(expectedType));
- UNIT_ASSERT_VALUES_EQUAL(datum.length(), dates.size());
- const auto childData = array->child_data;
- UNIT_ASSERT_VALUES_EQUAL_C(childData.size(), 2, "Expected date and timezone children");
- UNIT_ASSERT(childData[0]->type->Equals(expectedType->field(0)->type()));
- UNIT_ASSERT(childData[1]->type->Equals(expectedType->field(1)->type()));
+Y_UNIT_TEST(TestTzDateBuilder_Layout) {
+ TArrayBuilderTestData data;
+ const auto tzDateType = data.PgmBuilder.NewDataType(EDataSlot::TzDate);
+ const NMiniKQL::TTypeInfoHelper typeInfoHelper;
+ const auto arrayBuilder = MakeArrayBuilder(typeInfoHelper, tzDateType,
+ *data.ArrowPool, MAX_BLOCK_SIZE, /* pgBuilder */ nullptr);
+
+ auto makeTzDate = [](ui16 val, ui16 tz) {
+ TUnboxedValuePod tzDate{val};
+ tzDate.SetTimezoneId(tz);
+ return tzDate;
+ };
+
+ TVector<TUnboxedValuePod> dates{makeTzDate(1234, 1), makeTzDate(1234, 2), makeTzDate(45678, 333)};
+ for (auto date : dates) {
+ arrayBuilder->Add(date);
}
- Y_UNIT_TEST(TestResourceStringValueBuilderReader) {
- TArrayBuilderTestData data;
- const auto resourceType = data.PgmBuilder.NewResourceType(ResourceName);
- const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
+ const auto datum = arrayBuilder->Build(true);
+ UNIT_ASSERT(datum.is_array());
+ const auto array = datum.array();
+ const auto expectedType = GetArrowType(typeInfoHelper, tzDateType);
+ UNIT_ASSERT(array->type->Equals(expectedType));
+ UNIT_ASSERT_VALUES_EQUAL(datum.length(), dates.size());
+ const auto childData = array->child_data;
+ UNIT_ASSERT_VALUES_EQUAL_C(childData.size(), 2, "Expected date and timezone children");
+ UNIT_ASSERT(childData[0]->type->Equals(expectedType->field(0)->type()));
+ UNIT_ASSERT(childData[1]->type->Equals(expectedType->field(1)->type()));
+}
- arrayBuilder->Add(TUnboxedValuePod(TStringValue("test")));
- arrayBuilder->Add(TUnboxedValuePod(TStringValue("1234"), /* size */ 3, /* offset */ 1));
- const auto datum = arrayBuilder->Build(true);
- UNIT_ASSERT(datum.is_array());
- UNIT_ASSERT_VALUES_EQUAL(datum.length(), 2);
+Y_UNIT_TEST(TestResourceStringValueBuilderReader) {
+ TArrayBuilderTestData data;
+ const auto resourceType = data.PgmBuilder.NewResourceType(ResourceName);
+ const auto arrayBuilder = MakeResourceArrayBuilder(resourceType, data);
- const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), resourceType);
- const auto item1AfterRead = blockReader->GetItem(*datum.array(), 0);
- const auto item2AfterRead = blockReader->GetItem(*datum.array(), 1);
+ arrayBuilder->Add(TUnboxedValuePod(TStringValue("test")));
+ arrayBuilder->Add(TUnboxedValuePod(TStringValue("1234"), /* size */ 3, /* offset */ 1));
+ const auto datum = arrayBuilder->Build(true);
+ UNIT_ASSERT(datum.is_array());
+ UNIT_ASSERT_VALUES_EQUAL(datum.length(), 2);
- UNIT_ASSERT_VALUES_EQUAL(item1AfterRead.GetStringRefFromValue(), "test");
- UNIT_ASSERT_VALUES_EQUAL(item2AfterRead.GetStringRefFromValue(), "234");
- }
+ const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), resourceType);
+ const auto item1AfterRead = blockReader->GetItem(*datum.array(), 0);
+ const auto item2AfterRead = blockReader->GetItem(*datum.array(), 1);
- Y_UNIT_TEST(TestSingularTypeValueBuilderReader) {
- TArrayBuilderTestData data;
- const auto nullType = data.PgmBuilder.NewNullType();
+ UNIT_ASSERT_VALUES_EQUAL(item1AfterRead.GetStringRefFromValue(), "test");
+ UNIT_ASSERT_VALUES_EQUAL(item2AfterRead.GetStringRefFromValue(), "234");
+}
- std::shared_ptr<arrow::ArrayData> arrayData = arrow::NullArray{42}.data();
- IArrayBuilder::TArrayDataItem arrayDataItem = {.Data = arrayData.get(), .StartOffset = 0};
- {
- const auto arrayBuilder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), nullType, *data.ArrowPool, MAX_BLOCK_SIZE, /*pgBuilder=*/nullptr);
- // Check builder.
- arrayBuilder->Add(TUnboxedValuePod::Zero());
- arrayBuilder->Add(TBlockItem::Zero());
- arrayBuilder->Add(TBlockItem::Zero(), 4);
- TInputBuffer inputBuffer("Just arbitrary string");
- arrayBuilder->Add(inputBuffer);
- UNIT_ASSERT_VALUES_EQUAL_C(inputBuffer.PopChar(), 'J', "The input buffer must not be consumed.");
- arrayBuilder->AddMany(*arrayData, /*popCount=*/3u, /*sparseBitmat=*/nullptr, /*bitmapSize=*/arrayData->length);
- arrayBuilder->AddMany(&arrayDataItem, /*arrayCount=*/1, /*beginIndex=*/1, /*count=*/3u);
- std::vector<ui64> indexes = {1, 5, 7, 10};
- arrayBuilder->AddMany(&arrayDataItem, /*arrayCount=*/1, /*beginIndex=*/indexes.data(), /*count=*/4u);
- UNIT_ASSERT_VALUES_EQUAL(arrayBuilder->Build(true).array()->length, 1 + 1 + 4 + 1 + 3 + 3 + 4);
- }
+Y_UNIT_TEST(TestSingularTypeValueBuilderReader) {
+ TArrayBuilderTestData data;
+ const auto nullType = data.PgmBuilder.NewNullType();
- {
- // Check reader.
- const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), nullType);
-
- UNIT_ASSERT(blockReader->GetItem(*arrayData, 0));
- UNIT_ASSERT(blockReader->GetScalarItem(arrow::Scalar(arrow::null())));
- UNIT_ASSERT_EQUAL(blockReader->GetDataWeight(*arrayData), 0);
- UNIT_ASSERT_EQUAL(blockReader->GetDataWeight(TBlockItem::Zero()), 0);
- UNIT_ASSERT_EQUAL(blockReader->GetDefaultValueWeight(), 0);
- UNIT_ASSERT_EQUAL(blockReader->GetDefaultValueWeight(), 0);
-
- TOutputBuffer outputBuffer;
- blockReader->SaveItem(*arrayData, 1, outputBuffer);
- UNIT_ASSERT(outputBuffer.Finish().empty());
- blockReader->SaveScalarItem(arrow::Scalar(arrow::null()), outputBuffer);
- UNIT_ASSERT(outputBuffer.Finish().empty());
- }
+ std::shared_ptr<arrow::ArrayData> arrayData = arrow::NullArray{42}.data();
+ IArrayBuilder::TArrayDataItem arrayDataItem = {.Data = arrayData.get(), .StartOffset = 0};
+ {
+ const auto arrayBuilder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), nullType, *data.ArrowPool, MAX_BLOCK_SIZE, /*pgBuilder=*/nullptr);
+ // Check builder.
+ arrayBuilder->Add(TUnboxedValuePod::Zero());
+ arrayBuilder->Add(TBlockItem::Zero());
+ arrayBuilder->Add(TBlockItem::Zero(), 4);
+ TInputBuffer inputBuffer("Just arbitrary string");
+ arrayBuilder->Add(inputBuffer);
+ UNIT_ASSERT_VALUES_EQUAL_C(inputBuffer.PopChar(), 'J', "The input buffer must not be consumed.");
+ arrayBuilder->AddMany(*arrayData, /*popCount=*/3u, /*sparseBitmat=*/nullptr, /*bitmapSize=*/arrayData->length);
+ arrayBuilder->AddMany(&arrayDataItem, /*arrayCount=*/1, /*beginIndex=*/1, /*count=*/3u);
+ std::vector<ui64> indexes = {1, 5, 7, 10};
+ arrayBuilder->AddMany(&arrayDataItem, /*arrayCount=*/1, /*beginIndex=*/indexes.data(), /*count=*/4u);
+ UNIT_ASSERT_VALUES_EQUAL(arrayBuilder->Build(true).array()->length, 1 + 1 + 4 + 1 + 3 + 3 + 4);
}
- Y_UNIT_TEST(TestBuilderAllocatedSize) {
- TArrayBuilderTestData data;
- const auto optStringType = data.PgmBuilder.NewDataType(NUdf::EDataSlot::String, true);
- const auto int64Type = data.PgmBuilder.NewDataType(NUdf::EDataSlot::Int64, false);
- const auto structType = data.PgmBuilder.NewStructType({{ "a", optStringType }, { "b", int64Type }});
- const auto optStructType = data.PgmBuilder.NewOptionalType(structType);
- const auto doubleOptStructType = data.PgmBuilder.NewOptionalType(optStructType);
-
- size_t itemSize = NMiniKQL::CalcMaxBlockItemSize(doubleOptStructType);
- size_t blockLen = NMiniKQL::CalcBlockLen(itemSize);
- Y_ENSURE(blockLen > 8);
-
- size_t bigStringSize = NMiniKQL::MaxBlockSizeInBytes / 8;
- size_t hugeStringSize = NMiniKQL::MaxBlockSizeInBytes * 2;
-
- const TString bString(bigStringSize, 'a');
- TBlockItem strItem1(bString);
- TBlockItem intItem1(1);
- TBlockItem sItems1[] = { strItem1, intItem1 };
- TBlockItem sItem1(sItems1);
-
- const TBlockItem bigItem = sItem1.MakeOptional();
-
- const TString hString(hugeStringSize, 'b');
- TBlockItem strItem2(hString);
- TBlockItem intItem2(2);
- TBlockItem sItems2[] = { strItem2, intItem2 };
- TBlockItem sItem2(sItems2);
-
- const TBlockItem hugeItem = sItem2.MakeOptional();
-
- const size_t stringAllocStep =
- arrow::BitUtil::RoundUpToMultipleOf64(blockLen + 1) + // String NullMask
- arrow::BitUtil::RoundUpToMultipleOf64((blockLen + 1) * 4) + // String Offsets
- NMiniKQL::MaxBlockSizeInBytes; // String Data
- const size_t initialAllocated =
- stringAllocStep +
- arrow::BitUtil::RoundUpToMultipleOf64((blockLen + 1) * 8) + // Int64 Data
- 2 * arrow::BitUtil::RoundUpToMultipleOf64(blockLen + 1); // Double Optional
-
-
- size_t totalAllocated = 0;
- auto builder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), doubleOptStructType, *data.ArrowPool, blockLen, nullptr, &totalAllocated);
- UNIT_ASSERT_VALUES_EQUAL(totalAllocated, initialAllocated);
-
- for (ui32 i = 0; i < 8; ++i) {
- builder->Add(bigItem);
- }
- UNIT_ASSERT_VALUES_EQUAL(totalAllocated, initialAllocated);
- // string data block is fully used here
+ {
+ // Check reader.
+ const auto blockReader = MakeBlockReader(NMiniKQL::TTypeInfoHelper(), nullType);
+
+ UNIT_ASSERT(blockReader->GetItem(*arrayData, 0));
+ UNIT_ASSERT(blockReader->GetScalarItem(arrow::Scalar(arrow::null())));
+ UNIT_ASSERT_EQUAL(blockReader->GetDataWeight(*arrayData), 0);
+ UNIT_ASSERT_EQUAL(blockReader->GetDataWeight(TBlockItem::Zero()), 0);
+ UNIT_ASSERT_EQUAL(blockReader->GetDefaultValueWeight(), 0);
+ UNIT_ASSERT_EQUAL(blockReader->GetDefaultValueWeight(), 0);
+
+ TOutputBuffer outputBuffer;
+ blockReader->SaveItem(*arrayData, 1, outputBuffer);
+ UNIT_ASSERT(outputBuffer.Finish().empty());
+ blockReader->SaveScalarItem(arrow::Scalar(arrow::null()), outputBuffer);
+ UNIT_ASSERT(outputBuffer.Finish().empty());
+ }
+}
- size_t beforeBlockBoundary = totalAllocated;
+Y_UNIT_TEST(TestBuilderAllocatedSize) {
+ TArrayBuilderTestData data;
+ const auto optStringType = data.PgmBuilder.NewDataType(NUdf::EDataSlot::String, true);
+ const auto int64Type = data.PgmBuilder.NewDataType(NUdf::EDataSlot::Int64, false);
+ const auto structType = data.PgmBuilder.NewStructType({{"a", optStringType}, {"b", int64Type}});
+ const auto optStructType = data.PgmBuilder.NewOptionalType(structType);
+ const auto doubleOptStructType = data.PgmBuilder.NewOptionalType(optStructType);
+
+ size_t itemSize = NMiniKQL::CalcMaxBlockItemSize(doubleOptStructType);
+ size_t blockLen = NMiniKQL::CalcBlockLen(itemSize);
+ Y_ENSURE(blockLen > 8);
+
+ size_t bigStringSize = NMiniKQL::MaxBlockSizeInBytes / 8;
+ size_t hugeStringSize = NMiniKQL::MaxBlockSizeInBytes * 2;
+
+ const TString bString(bigStringSize, 'a');
+ TBlockItem strItem1(bString);
+ TBlockItem intItem1(1);
+ TBlockItem sItems1[] = {strItem1, intItem1};
+ TBlockItem sItem1(sItems1);
+
+ const TBlockItem bigItem = sItem1.MakeOptional();
+
+ const TString hString(hugeStringSize, 'b');
+ TBlockItem strItem2(hString);
+ TBlockItem intItem2(2);
+ TBlockItem sItems2[] = {strItem2, intItem2};
+ TBlockItem sItem2(sItems2);
+
+ const TBlockItem hugeItem = sItem2.MakeOptional();
+
+ const size_t stringAllocStep =
+ arrow::BitUtil::RoundUpToMultipleOf64(blockLen + 1) + // String NullMask
+ arrow::BitUtil::RoundUpToMultipleOf64((blockLen + 1) * 4) + // String Offsets
+ NMiniKQL::MaxBlockSizeInBytes; // String Data
+ const size_t initialAllocated =
+ stringAllocStep +
+ arrow::BitUtil::RoundUpToMultipleOf64((blockLen + 1) * 8) + // Int64 Data
+ 2 * arrow::BitUtil::RoundUpToMultipleOf64(blockLen + 1); // Double Optional
+
+ size_t totalAllocated = 0;
+ auto builder = MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), doubleOptStructType, *data.ArrowPool, blockLen, nullptr, &totalAllocated);
+ UNIT_ASSERT_VALUES_EQUAL(totalAllocated, initialAllocated);
+
+ for (ui32 i = 0; i < 8; ++i) {
builder->Add(bigItem);
- UNIT_ASSERT_VALUES_EQUAL(totalAllocated, beforeBlockBoundary + stringAllocStep);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(totalAllocated, initialAllocated);
+ // string data block is fully used here
- // string data block is partially used
- size_t beforeHugeString = totalAllocated;
- builder->Add(hugeItem);
- UNIT_ASSERT_VALUES_EQUAL(totalAllocated, beforeHugeString + stringAllocStep + hugeStringSize - NMiniKQL::MaxBlockSizeInBytes);
+ size_t beforeBlockBoundary = totalAllocated;
+ builder->Add(bigItem);
+ UNIT_ASSERT_VALUES_EQUAL(totalAllocated, beforeBlockBoundary + stringAllocStep);
- totalAllocated = 0;
- builder->Build(false);
- UNIT_ASSERT_VALUES_EQUAL(totalAllocated, initialAllocated);
- }
+ // string data block is partially used
+ size_t beforeHugeString = totalAllocated;
+ builder->Add(hugeItem);
+ UNIT_ASSERT_VALUES_EQUAL(totalAllocated, beforeHugeString + stringAllocStep + hugeStringSize - NMiniKQL::MaxBlockSizeInBytes);
+
+ totalAllocated = 0;
+ builder->Build(false);
+ UNIT_ASSERT_VALUES_EQUAL(totalAllocated, initialAllocated);
}
+} // Y_UNIT_TEST_SUITE(TArrayBuilderTest)
diff --git a/yql/essentials/public/udf/arrow/ut/bit_util_ut.cpp b/yql/essentials/public/udf/arrow/ut/bit_util_ut.cpp
index dd95030c1b3..579c90d8b6a 100644
--- a/yql/essentials/public/udf/arrow/ut/bit_util_ut.cpp
+++ b/yql/essentials/public/udf/arrow/ut/bit_util_ut.cpp
@@ -8,37 +8,37 @@
using namespace NYql::NUdf;
namespace {
- void PerformTest(const ui8* testData, size_t offset, size_t length) {
- std::vector<ui8> copied(arrow::BitUtil::BytesForBits(length) + 1, 0);
- CopyDenseBitmap(copied.data(), testData, offset, length);
-
- std::vector<ui8> origSparse(length), copiedSparse(length);
- DecompressToSparseBitmap(origSparse.data(), testData, offset, length);
- DecompressToSparseBitmap(copiedSparse.data(), copied.data(), 0, length);
- for (size_t i = 0; i < length; i++) {
- UNIT_ASSERT_EQUAL_C(origSparse[i], copiedSparse[i], "Expected the same data");
- }
+void PerformTest(const ui8* testData, size_t offset, size_t length) {
+ std::vector<ui8> copied(arrow::BitUtil::BytesForBits(length) + 1, 0);
+ CopyDenseBitmap(copied.data(), testData, offset, length);
+
+ std::vector<ui8> origSparse(length), copiedSparse(length);
+ DecompressToSparseBitmap(origSparse.data(), testData, offset, length);
+ DecompressToSparseBitmap(copiedSparse.data(), copied.data(), 0, length);
+ for (size_t i = 0; i < length; i++) {
+ UNIT_ASSERT_EQUAL_C(origSparse[i], copiedSparse[i], "Expected the same data");
}
}
+} // namespace
Y_UNIT_TEST_SUITE(CopyDenseBitmapTest) {
- constexpr size_t testSize = 32;
+constexpr size_t testSize = 32;
- Y_UNIT_TEST(Test) {
- SetRandomSeed(0);
+Y_UNIT_TEST(Test) {
+ SetRandomSeed(0);
- std::vector<ui8> testData(testSize);
- for (size_t i = 0; i < testSize; i++) {
- testData[i] = RandomNumber<ui8>();
- }
+ std::vector<ui8> testData(testSize);
+ for (size_t i = 0; i < testSize; i++) {
+ testData[i] = RandomNumber<ui8>();
+ }
- for (size_t offset = 0; offset < testSize * 8; offset++) {
- for (size_t length = 0; length <= testSize * 8 - offset; length++) {
- PerformTest(testData.data(), offset, length);
- }
+ for (size_t offset = 0; offset < testSize * 8; offset++) {
+ for (size_t length = 0; length <= testSize * 8 - offset; length++) {
+ PerformTest(testData.data(), offset, length);
}
}
}
+} // Y_UNIT_TEST_SUITE(CopyDenseBitmapTest)
Y_UNIT_TEST_SUITE(BitExpanding) {
diff --git a/yql/essentials/public/udf/arrow/ut/block_reader_ut.cpp b/yql/essentials/public/udf/arrow/ut/block_reader_ut.cpp
index 1ac4c88d65e..6d1fb8e21b9 100644
--- a/yql/essentials/public/udf/arrow/ut/block_reader_ut.cpp
+++ b/yql/essentials/public/udf/arrow/ut/block_reader_ut.cpp
@@ -13,15 +13,16 @@ namespace {
using namespace NKikimr;
-class TBlockReaderFixture : public NUnitTest::TBaseFixture {
- class TArrayHelpers : public TThrRefBase {
+class TBlockReaderFixture: public NUnitTest::TBaseFixture {
+ class TArrayHelpers: public TThrRefBase {
public:
using TPtr = TIntrusivePtr<TArrayHelpers>;
explicit TArrayHelpers(const NMiniKQL::TType* type, arrow::MemoryPool* const arrowPool)
: Builder(MakeArrayBuilder(NMiniKQL::TTypeInfoHelper(), type, *arrowPool, NMiniKQL::CalcBlockLen(CalcMaxBlockItemSize(type)), nullptr))
, Reader(MakeBlockReader(NMiniKQL::TTypeInfoHelper(), type))
- {}
+ {
+ }
public:
const std::unique_ptr<IArrayBuilder> Builder;
@@ -35,7 +36,8 @@ public:
, Env(Alloc)
, PgmBuilder(Env, *FunctionRegistry)
, ArrowPool(GetYqlMemoryPool())
- {}
+ {
+ }
NMiniKQL::TType* OptionaType(NMiniKQL::TType* type) const {
return PgmBuilder.NewOptionalType(type);
@@ -67,67 +69,65 @@ public:
arrow::MemoryPool* const ArrowPool;
};
-} // anonymous namespace
+} // anonymous namespace
Y_UNIT_TEST_SUITE(BlockReaderTest) {
- Y_UNIT_TEST_F(TestLogicalDataSize, TBlockReaderFixture) {
- const std::vector arrayHelpers = {
- GetArrayHelpers(DataType<ui32>()),
- GetArrayHelpers(OptionaType(DataType<char*>())),
- GetArrayHelpers(OptionaType(TupleType(OptionaType(DataType<ui32>()), DataType<char*>()))),
- GetArrayHelpers(DataType(NUdf::EDataSlot::TzDate)),
- GetArrayHelpers(PgmBuilder.NewNullType())
- };
-
- constexpr ui32 size = 1000;
- constexpr ui32 stringSize = 37;
- for (ui32 i = 0; i < size; ++i) {
- arrayHelpers[0]->Builder->Add(TBlockItem(i));
-
- const auto str = NUnitTest::RandomString(stringSize, i);
- arrayHelpers[1]->Builder->Add((i % 2) ? TBlockItem(str) : TBlockItem());
-
- TBlockItem tuple[] = { ((i / 2) % 2) ? TBlockItem(i) : TBlockItem(), TBlockItem(str) };
- arrayHelpers[2]->Builder->Add((i % 2) ? TBlockItem(tuple) : TBlockItem());
-
- TBlockItem tzDate(i);
- tzDate.SetTimezoneId(i % 100);
- arrayHelpers[3]->Builder->Add(tzDate);
- arrayHelpers[4]->Builder->Add(TBlockItem::Zero());
- }
+Y_UNIT_TEST_F(TestLogicalDataSize, TBlockReaderFixture) {
+ const std::vector arrayHelpers = {
+ GetArrayHelpers(DataType<ui32>()),
+ GetArrayHelpers(OptionaType(DataType<char*>())),
+ GetArrayHelpers(OptionaType(TupleType(OptionaType(DataType<ui32>()), DataType<char*>()))),
+ GetArrayHelpers(DataType(NUdf::EDataSlot::TzDate)),
+ GetArrayHelpers(PgmBuilder.NewNullType())};
+
+ constexpr ui32 size = 1000;
+ constexpr ui32 stringSize = 37;
+ for (ui32 i = 0; i < size; ++i) {
+ arrayHelpers[0]->Builder->Add(TBlockItem(i));
+
+ const auto str = NUnitTest::RandomString(stringSize, i);
+ arrayHelpers[1]->Builder->Add((i % 2) ? TBlockItem(str) : TBlockItem());
+
+ TBlockItem tuple[] = {((i / 2) % 2) ? TBlockItem(i) : TBlockItem(), TBlockItem(str)};
+ arrayHelpers[2]->Builder->Add((i % 2) ? TBlockItem(tuple) : TBlockItem());
+
+ TBlockItem tzDate(i);
+ tzDate.SetTimezoneId(i % 100);
+ arrayHelpers[3]->Builder->Add(tzDate);
+ arrayHelpers[4]->Builder->Add(TBlockItem::Zero());
+ }
- std::vector<std::shared_ptr<arrow::ArrayData>> arrays;
- arrays.reserve(arrayHelpers.size());
- for (const auto& helper : arrayHelpers) {
- arrays.emplace_back(helper->Builder->Build(true).array());
- }
+ std::vector<std::shared_ptr<arrow::ArrayData>> arrays;
+ arrays.reserve(arrayHelpers.size());
+ for (const auto& helper : arrayHelpers) {
+ arrays.emplace_back(helper->Builder->Build(true).array());
+ }
- constexpr ui32 offset = 133;
- constexpr ui32 len = 533;
- static_assert(offset + len < size);
-
- constexpr ui64 offsetSize = sizeof(arrow::BinaryType::offset_type) * len;
- constexpr ui64 bitmaskSize = (len - 1) / 8 + 1;
- constexpr ui64 nonEmptyStrings = (len - offset % 2) / 2 + offset % 2;
- const std::vector<ui64> expectedLogicalSize = {
- sizeof(ui32) * len,
- bitmaskSize + offsetSize + stringSize * nonEmptyStrings,
- 2 * bitmaskSize + offsetSize + sizeof(ui32) * len + stringSize * nonEmptyStrings,
- (sizeof(ui16) + sizeof(ui16)) * len,
- 0
- };
-
- // Test GetDataWeight with offset and length
- for (ui32 i = 0; i < arrayHelpers.size(); ++i) {
- UNIT_ASSERT_VALUES_EQUAL_C(arrayHelpers[i]->Reader->GetSliceDataWeight(*arrays[i], offset, len), expectedLogicalSize[i], "array: " << i);
- }
+ constexpr ui32 offset = 133;
+ constexpr ui32 len = 533;
+ static_assert(offset + len < size);
+
+ constexpr ui64 offsetSize = sizeof(arrow::BinaryType::offset_type) * len;
+ constexpr ui64 bitmaskSize = (len - 1) / 8 + 1;
+ constexpr ui64 nonEmptyStrings = (len - offset % 2) / 2 + offset % 2;
+ const std::vector<ui64> expectedLogicalSize = {
+ sizeof(ui32) * len,
+ bitmaskSize + offsetSize + stringSize * nonEmptyStrings,
+ 2 * bitmaskSize + offsetSize + sizeof(ui32) * len + stringSize * nonEmptyStrings,
+ (sizeof(ui16) + sizeof(ui16)) * len,
+ 0};
+
+ // Test GetDataWeight with offset and length
+ for (ui32 i = 0; i < arrayHelpers.size(); ++i) {
+ UNIT_ASSERT_VALUES_EQUAL_C(arrayHelpers[i]->Reader->GetSliceDataWeight(*arrays[i], offset, len), expectedLogicalSize[i], "array: " << i);
+ }
- // Test GetDataWeight after slize
- for (ui32 i = 0; i < arrayHelpers.size(); ++i) {
- const auto slice = DeepSlice(arrays[i], offset, len);
- UNIT_ASSERT_VALUES_EQUAL_C(arrayHelpers[i]->Reader->GetDataWeight(*slice), expectedLogicalSize[i], "sliced array: " << i);
- }
+ // Test GetDataWeight after slize
+ for (ui32 i = 0; i < arrayHelpers.size(); ++i) {
+ const auto slice = DeepSlice(arrays[i], offset, len);
+ UNIT_ASSERT_VALUES_EQUAL_C(arrayHelpers[i]->Reader->GetDataWeight(*slice), expectedLogicalSize[i], "sliced array: " << i);
}
}
+} // Y_UNIT_TEST_SUITE(BlockReaderTest)
-} // namespace NYql::NUdf
+} // namespace NYql::NUdf
diff --git a/yql/essentials/public/udf/arrow/ut/ya.make b/yql/essentials/public/udf/arrow/ut/ya.make
index 037deb20fc8..4f3e9e00b77 100644
--- a/yql/essentials/public/udf/arrow/ut/ya.make
+++ b/yql/essentials/public/udf/arrow/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
array_builder_ut.cpp
bit_util_ut.cpp
diff --git a/yql/essentials/public/udf/arrow/util.cpp b/yql/essentials/public/udf/arrow/util.cpp
index 1fe4df77b31..60c3317a3ad 100644
--- a/yql/essentials/public/udf/arrow/util.cpp
+++ b/yql/essentials/public/udf/arrow/util.cpp
@@ -189,5 +189,5 @@ const TType* SkipTaggedType(const ITypeInfoHelper& typeInfoHelper, const TType*
return type;
}
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/arrow/util.h b/yql/essentials/public/udf/arrow/util.h
index bc3f79b4174..3f52ff0d209 100644
--- a/yql/essentials/public/udf/arrow/util.h
+++ b/yql/essentials/public/udf/arrow/util.h
@@ -55,7 +55,7 @@ ui64 GetSizeOfArrayDataInBytes(const arrow::ArrayData& data);
ui64 GetSizeOfArrowBatchInBytes(const arrow::RecordBatch& batch);
ui64 GetSizeOfArrowExecBatchInBytes(const arrow::compute::ExecBatch& batch);
-class TResizeableBuffer : public arrow::ResizableBuffer {
+class TResizeableBuffer: public arrow::ResizableBuffer {
public:
explicit TResizeableBuffer(arrow::MemoryPool* pool)
: ResizableBuffer(nullptr, 0, arrow::CPUDevice::memory_manager(pool))
@@ -111,7 +111,7 @@ private:
arrow::MemoryPool* Pool_;
};
-template<typename TBuffer = TResizeableBuffer>
+template <typename TBuffer = TResizeableBuffer>
std::unique_ptr<arrow::ResizableBuffer> AllocateResizableBuffer(size_t capacity, arrow::MemoryPool* pool, bool zeroPad = false) {
std::unique_ptr<TBuffer> result = std::make_unique<TBuffer>(pool);
ARROW_OK(result->Reserve(capacity));
@@ -122,12 +122,15 @@ std::unique_ptr<arrow::ResizableBuffer> AllocateResizableBuffer(size_t capacity,
}
/// \brief owning buffer that calls destructors
-template<typename T>
-class TResizableManagedBuffer final : public TResizeableBuffer {
+template <typename T>
+class TResizableManagedBuffer final: public TResizeableBuffer {
static_assert(!std::is_trivially_destructible_v<T>);
+
public:
explicit TResizableManagedBuffer(arrow::MemoryPool* pool)
- : TResizeableBuffer(pool) {}
+ : TResizeableBuffer(pool)
+ {
+ }
~TResizableManagedBuffer() override {
for (int64_t i = 0; i < size_; i += sizeof(T)) {
@@ -141,11 +144,12 @@ public:
// 1) with UnsafeAdvance() method
// 2) shrinkToFit = false
// 3) doesn't zero pad buffer
-template<typename T>
+template <typename T>
class TTypedBufferBuilder {
static_assert(!std::is_same_v<T, bool>);
using TArrowBuffer = std::conditional_t<std::is_trivially_destructible_v<T>, TResizeableBuffer, TResizableManagedBuffer<T>>;
+
public:
explicit TTypedBufferBuilder(arrow::MemoryPool* pool, TMaybe<ui8> minFillPercentage = {})
: MinFillPercentage_(minFillPercentage)
@@ -215,14 +219,15 @@ public:
inline std::shared_ptr<arrow::Buffer> Finish() {
int64_t newSize = Len_ * sizeof(T);
bool shrinkToFit = MinFillPercentage_
- ? newSize <= Buffer_->capacity() * *MinFillPercentage_ / 100
- : false;
+ ? newSize <= Buffer_->capacity() * *MinFillPercentage_ / 100
+ : false;
ARROW_OK(Buffer_->Resize(newSize, shrinkToFit));
std::shared_ptr<arrow::ResizableBuffer> result;
std::swap(result, Buffer_);
Len_ = 0;
return result;
}
+
private:
const TMaybe<ui8> MinFillPercentage_;
arrow::MemoryPool* const Pool_;
@@ -262,7 +267,7 @@ inline bool NeedWrapWithExternalOptional(const ITypeInfoHelper& typeInfoHelper,
TOptionalTypeInspector typeOptOpt(typeInfoHelper, type);
if (typeOptOpt) {
return true;
- } else if (TPgTypeInspector(typeInfoHelper, type) || IsSingularType(typeInfoHelper, type)) {
+ } else if (TPgTypeInspector(typeInfoHelper, type) || IsSingularType(typeInfoHelper, type)) {
return true;
}
return false;
diff --git a/yql/essentials/public/udf/arrow/ya.make b/yql/essentials/public/udf/arrow/ya.make
index 3928b638522..88554de462d 100644
--- a/yql/essentials/public/udf/arrow/ya.make
+++ b/yql/essentials/public/udf/arrow/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
args_dechunker.cpp
udf_arrow_helpers.cpp
diff --git a/yql/essentials/public/udf/sanitizer_utils.h b/yql/essentials/public/udf/sanitizer_utils.h
index 60c7b71e3e6..22fa0965e2a 100644
--- a/yql/essentials/public/udf/sanitizer_utils.h
+++ b/yql/essentials/public/udf/sanitizer_utils.h
@@ -91,7 +91,7 @@ constexpr size_t GetSizeToAlloc(size_t size) {
return 0;
}
return size + 2 * ALLOCATION_REDZONE_SIZE;
-#else // defined(_asan_enabled_) || defined(_msan_enabled_)
+#else // defined(_asan_enabled_) || defined(_msan_enabled_)
return size;
#endif // defined(_asan_enabled_) || defined(_msan_enabled_)
}
@@ -102,7 +102,7 @@ constexpr const void* GetOriginalAllocatedObject(const void* ptr, bool isZeroSiz
return ptr;
}
return static_cast<const char*>(ptr) - ALLOCATION_REDZONE_SIZE;
-#else // defined(_asan_enabled_) || defined(_msan_enabled_)
+#else // defined(_asan_enabled_) || defined(_msan_enabled_)
Y_UNUSED(isZeroSize);
return ptr;
#endif // defined(_asan_enabled_) || defined(_msan_enabled_)
@@ -116,7 +116,7 @@ constexpr void* WrapPointerWithRedZones(void* ptr, size_t extendedSizeWithRedzon
SanitizerMakeRegionInaccessible(ptr, extendedSizeWithRedzone);
SanitizerMakeRegionAccessible(static_cast<char*>(ptr) + ALLOCATION_REDZONE_SIZE, extendedSizeWithRedzone - 2 * ALLOCATION_REDZONE_SIZE);
return static_cast<char*>(ptr) + ALLOCATION_REDZONE_SIZE;
-#else // defined(_asan_enabled_) || defined(_msan_enabled_)
+#else // defined(_asan_enabled_) || defined(_msan_enabled_)
Y_UNUSED(extendedSizeWithRedzone);
return ptr;
#endif // defined(_asan_enabled_) || defined(_msan_enabled_)
@@ -130,7 +130,7 @@ constexpr const void* UnwrapPointerWithRedZones(const void* ptr, size_t size) {
SanitizerMakeRegionInaccessible(static_cast<char*>(const_cast<void*>(ptr)) - ALLOCATION_REDZONE_SIZE,
2 * ALLOCATION_REDZONE_SIZE + size);
return static_cast<const char*>(ptr) - ALLOCATION_REDZONE_SIZE;
-#else // defined(_asan_enabled_) || defined(_msan_enabled_)
+#else // defined(_asan_enabled_) || defined(_msan_enabled_)
Y_UNUSED(size);
return ptr;
#endif // defined(_asan_enabled_) || defined(_msan_enabled_)
diff --git a/yql/essentials/public/udf/service/exception_policy/udf_service.cpp b/yql/essentials/public/udf/service/exception_policy/udf_service.cpp
index 56b954e9b82..2723529b890 100644
--- a/yql/essentials/public/udf/service/exception_policy/udf_service.cpp
+++ b/yql/essentials/public/udf/service/exception_policy/udf_service.cpp
@@ -30,11 +30,11 @@ extern "C" void UdfFreeWithSize(const void* mem, ui64 size) {
return ::NKikimr::NMiniKQL::TWithDefaultMiniKQLAlloc::FreeWithSize(mem, size);
}
-extern "C" void* UdfArrowAllocate(ui64 size) {
+extern "C" void* UdfArrowAllocate(ui64 size) {
return ::NKikimr::NMiniKQL::MKQLArrowAllocate(size);
}
-extern "C" void* UdfArrowReallocate(const void* mem, ui64 prevSize, ui64 size) {
+extern "C" void* UdfArrowReallocate(const void* mem, ui64 prevSize, ui64 size) {
return ::NKikimr::NMiniKQL::MKQLArrowReallocate(mem, prevSize, size);
}
diff --git a/yql/essentials/public/udf/service/exception_policy/ya.make b/yql/essentials/public/udf/service/exception_policy/ya.make
index b985d2d0f13..720fc9bd574 100644
--- a/yql/essentials/public/udf/service/exception_policy/ya.make
+++ b/yql/essentials/public/udf/service/exception_policy/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
PROVIDES(YqlServicePolicy)
SRCS(
diff --git a/yql/essentials/public/udf/service/stub/udf_service.cpp b/yql/essentials/public/udf/service/stub/udf_service.cpp
index 1cfb5fbe9ff..848119194b1 100644
--- a/yql/essentials/public/udf/service/stub/udf_service.cpp
+++ b/yql/essentials/public/udf/service/stub/udf_service.cpp
@@ -1,13 +1,33 @@
#include <util/system/yassert.h>
#include <yql/essentials/public/udf/udf_value.h>
-extern "C" void* UdfAllocate(ui64) { Y_ABORT("Called UdfAllocate"); }
-extern "C" void UdfFree(const void*) { Y_ABORT("Called UdfFree"); }
-extern "C" void UdfTerminate(const char*) { Y_ABORT("Called UdfTerminate."); }
-extern "C" void UdfRegisterObject(::NYql::NUdf::TBoxedValue*) { Y_ABORT("Called UdfRegisterObject"); }
-extern "C" void UdfUnregisterObject(::NYql::NUdf::TBoxedValue*) { Y_ABORT("Called UdfUnregisterObject"); }
-extern "C" void* UdfAllocateWithSize(ui64) { Y_ABORT("Called UdfAllocateWithSize"); }
-extern "C" void UdfFreeWithSize(const void*, ui64) { Y_ABORT("Called UdfFreeWithSize"); }
-extern "C" void* UdfArrowAllocate(ui64) { Y_ABORT("Called UdfArrowAllocate"); }
-extern "C" void* UdfArrowReallocate(const void*, ui64, ui64) { Y_ABORT("Called UdfArrowReallocate"); }
-extern "C" void UdfArrowFree(const void*, ui64) { Y_ABORT("Called UdfArrowFree"); }
+extern "C" void* UdfAllocate(ui64) {
+ Y_ABORT("Called UdfAllocate");
+}
+extern "C" void UdfFree(const void*) {
+ Y_ABORT("Called UdfFree");
+}
+extern "C" void UdfTerminate(const char*) {
+ Y_ABORT("Called UdfTerminate.");
+}
+extern "C" void UdfRegisterObject(::NYql::NUdf::TBoxedValue*) {
+ Y_ABORT("Called UdfRegisterObject");
+}
+extern "C" void UdfUnregisterObject(::NYql::NUdf::TBoxedValue*) {
+ Y_ABORT("Called UdfUnregisterObject");
+}
+extern "C" void* UdfAllocateWithSize(ui64) {
+ Y_ABORT("Called UdfAllocateWithSize");
+}
+extern "C" void UdfFreeWithSize(const void*, ui64) {
+ Y_ABORT("Called UdfFreeWithSize");
+}
+extern "C" void* UdfArrowAllocate(ui64) {
+ Y_ABORT("Called UdfArrowAllocate");
+}
+extern "C" void* UdfArrowReallocate(const void*, ui64, ui64) {
+ Y_ABORT("Called UdfArrowReallocate");
+}
+extern "C" void UdfArrowFree(const void*, ui64) {
+ Y_ABORT("Called UdfArrowFree");
+}
diff --git a/yql/essentials/public/udf/service/stub/ya.make b/yql/essentials/public/udf/service/stub/ya.make
index 94ebed75673..2c3248ff47d 100644
--- a/yql/essentials/public/udf/service/stub/ya.make
+++ b/yql/essentials/public/udf/service/stub/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
PROVIDES(YqlServicePolicy)
SRCS(
diff --git a/yql/essentials/public/udf/service/terminate_policy/udf_service.cpp b/yql/essentials/public/udf/service/terminate_policy/udf_service.cpp
index 69da98b1d85..9f801a9a4df 100644
--- a/yql/essentials/public/udf/service/terminate_policy/udf_service.cpp
+++ b/yql/essentials/public/udf/service/terminate_policy/udf_service.cpp
@@ -14,9 +14,11 @@ extern "C" [[noreturn]] void UdfTerminate(const char* message) {
::NKikimr::NMiniKQL::MKQLTerminate(message);
}
-extern "C" void UdfRegisterObject(::NYql::NUdf::TBoxedValue*) {}
+extern "C" void UdfRegisterObject(::NYql::NUdf::TBoxedValue*) {
+}
-extern "C" void UdfUnregisterObject(::NYql::NUdf::TBoxedValue*) {}
+extern "C" void UdfUnregisterObject(::NYql::NUdf::TBoxedValue*) {
+}
extern "C" void* UdfAllocateWithSize(ui64 size) {
return ::NKikimr::NMiniKQL::TWithDefaultMiniKQLAlloc::AllocWithSize(size);
@@ -26,11 +28,11 @@ extern "C" void UdfFreeWithSize(const void* mem, ui64 size) {
return ::NKikimr::NMiniKQL::TWithDefaultMiniKQLAlloc::FreeWithSize(mem, size);
}
-extern "C" void* UdfArrowAllocate(ui64 size) {
+extern "C" void* UdfArrowAllocate(ui64 size) {
return ::NKikimr::NMiniKQL::MKQLArrowAllocate(size);
}
-extern "C" void* UdfArrowReallocate(const void* mem, ui64 prevSize, ui64 size) {
+extern "C" void* UdfArrowReallocate(const void* mem, ui64 prevSize, ui64 size) {
return ::NKikimr::NMiniKQL::MKQLArrowReallocate(mem, prevSize, size);
}
diff --git a/yql/essentials/public/udf/service/terminate_policy/ya.make b/yql/essentials/public/udf/service/terminate_policy/ya.make
index b985d2d0f13..720fc9bd574 100644
--- a/yql/essentials/public/udf/service/terminate_policy/ya.make
+++ b/yql/essentials/public/udf/service/terminate_policy/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
PROVIDES(YqlServicePolicy)
SRCS(
diff --git a/yql/essentials/public/udf/support/udf_support.cpp b/yql/essentials/public/udf/support/udf_support.cpp
index 2d933ed755f..c357abdede1 100644
--- a/yql/essentials/public/udf/support/udf_support.cpp
+++ b/yql/essentials/public/udf/support/udf_support.cpp
@@ -2,9 +2,9 @@
#include <util/system/backtrace.h>
#if defined(_win_) || defined(_darwin_)
-#include <yql/essentials/public/udf/udf_registrator.h>
+ #include <yql/essentials/public/udf/udf_registrator.h>
-#include <exception>
+ #include <exception>
static NYql::NUdf::TStaticSymbols Symbols;
@@ -29,7 +29,7 @@ extern "C" void UdfUnregisterObject(::NYql::NUdf::TBoxedValue* object) {
return Symbols.UdfUnregisterObject(object);
}
-#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8)
+ #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8)
extern "C" void* UdfAllocateWithSize(ui64 size) {
return Symbols.UdfAllocateWithSizeFunc(size);
}
@@ -37,21 +37,21 @@ extern "C" void* UdfAllocateWithSize(ui64 size) {
extern "C" void UdfFreeWithSize(const void* mem, ui64 size) {
return Symbols.UdfFreeWithSizeFunc(mem, size);
}
-#endif
+ #endif
-#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 37)
-extern "C" void* UdfArrowAllocate(ui64 size) {
+ #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 37)
+extern "C" void* UdfArrowAllocate(ui64 size) {
return Symbols.UdfArrowAllocateFunc(size);
}
-extern "C" void* UdfArrowReallocate(const void* mem, ui64 prevSize, ui64 size) {
+extern "C" void* UdfArrowReallocate(const void* mem, ui64 prevSize, ui64 size) {
return Symbols.UdfArrowReallocateFunc(mem, prevSize, size);
}
extern "C" void UdfArrowFree(const void* mem, ui64 size) {
return Symbols.UdfArrowFreeFunc(mem, size);
}
-#endif
+ #endif
extern "C" void BindSymbols(const NYql::NUdf::TStaticSymbols& symbols) {
Symbols = symbols;
@@ -61,7 +61,7 @@ extern "C" void BindSymbols(const NYql::NUdf::TStaticSymbols& symbols) {
namespace NYql {
namespace NUdf {
-typedef void(*TBackTraceCallback)();
+typedef void (*TBackTraceCallback)();
static TBackTraceCallback BackTraceCallback;
static void UdfBackTraceFn(IOutputStream*, void* const*, size_t) {
@@ -73,5 +73,5 @@ void SetBackTraceCallbackImpl(TBackTraceCallback callback) {
SetFormatBackTraceFn(UdfBackTraceFn);
}
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/support/ya.make b/yql/essentials/public/udf/support/ya.make
index 02c4197666d..6a1c75234d9 100644
--- a/yql/essentials/public/udf/support/ya.make
+++ b/yql/essentials/public/udf/support/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
udf_support.cpp
)
diff --git a/yql/essentials/public/udf/udf_allocator.h b/yql/essentials/public/udf/udf_allocator.h
index 7818b49f10f..a0e08698225 100644
--- a/yql/essentials/public/udf/udf_allocator.h
+++ b/yql/essentials/public/udf/udf_allocator.h
@@ -25,8 +25,7 @@ namespace NYql {
namespace NUdf {
template <typename Type>
-struct TStdAllocatorForUdf
-{
+struct TStdAllocatorForUdf {
typedef Type value_type;
typedef Type* pointer;
typedef const Type* const_pointer;
@@ -38,10 +37,20 @@ struct TStdAllocatorForUdf
TStdAllocatorForUdf() noexcept = default;
~TStdAllocatorForUdf() noexcept = default;
- template<typename U> TStdAllocatorForUdf(const TStdAllocatorForUdf<U>&) noexcept {};
- template<typename U> struct rebind { typedef TStdAllocatorForUdf<U> other; }; // NOLINT(readability-identifier-naming)
- template<typename U> bool operator==(const TStdAllocatorForUdf<U>&) const { return true; };
- template<typename U> bool operator!=(const TStdAllocatorForUdf<U>&) const { return false; }
+ template <typename U>
+ TStdAllocatorForUdf(const TStdAllocatorForUdf<U>&) noexcept {};
+ template <typename U>
+ struct rebind { // NOLINT(readability-identifier-naming)
+ typedef TStdAllocatorForUdf<U> other;
+ };
+ template <typename U>
+ bool operator==(const TStdAllocatorForUdf<U>&) const {
+ return true;
+ };
+ template <typename U>
+ bool operator!=(const TStdAllocatorForUdf<U>&) const {
+ return false;
+ }
static pointer allocate(size_type n, const void* = nullptr) // NOLINT(readability-identifier-naming)
{
@@ -82,19 +91,19 @@ struct TWithUdfAllocator {
}
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8)
- void operator delete(void *mem, std::size_t sz) noexcept {
+ void operator delete(void* mem, std::size_t sz) noexcept {
return UdfFreeWithSize(mem, sz);
}
- void operator delete[](void *mem, std::size_t sz) noexcept {
+ void operator delete[](void* mem, std::size_t sz) noexcept {
return UdfFreeWithSize(mem, sz);
}
#else
- void operator delete(void *mem) noexcept {
+ void operator delete(void* mem) noexcept {
return UdfFree(mem);
}
- void operator delete[](void *mem) noexcept {
+ void operator delete[](void* mem) noexcept {
return UdfFree(mem);
}
#endif
@@ -102,4 +111,3 @@ struct TWithUdfAllocator {
} // namespace NUdf
} // namespace NYql
-
diff --git a/yql/essentials/public/udf/udf_counter.h b/yql/essentials/public/udf/udf_counter.h
index 2350b597785..f924d582e5f 100644
--- a/yql/essentials/public/udf/udf_counter.h
+++ b/yql/essentials/public/udf/udf_counter.h
@@ -10,7 +10,8 @@ class TCounter {
public:
TCounter(i64* ptr = nullptr)
: Ptr_(ptr)
- {}
+ {
+ }
void Inc() {
if (Ptr_) {
@@ -69,7 +70,8 @@ public:
TScopedProbe(IScopedProbeHost* host = nullptr, void* cookie = nullptr)
: Host_(host ? host : &NullHost_)
, Cookie_(cookie)
- {}
+ {
+ }
void Acquire() {
Host_->Acquire(Cookie_);
@@ -80,7 +82,7 @@ public:
}
private:
- class TNullHost : public IScopedProbeHost {
+ class TNullHost: public IScopedProbeHost {
public:
void Acquire(void* cookie) override {
Y_UNUSED(cookie);
@@ -109,5 +111,5 @@ public:
UDF_ASSERT_TYPE_SIZE(ICountersProvider, 8);
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_counter_ut.cpp b/yql/essentials/public/udf/udf_counter_ut.cpp
index 22fd91d5f54..6e6b4430015 100644
--- a/yql/essentials/public/udf/udf_counter_ut.cpp
+++ b/yql/essentials/public/udf/udf_counter_ut.cpp
@@ -5,46 +5,46 @@
using namespace NYql::NUdf;
Y_UNIT_TEST_SUITE(TUdfCounter) {
- Y_UNIT_TEST(NullCounter) {
- TCounter c;
- c.Inc();
- c.Dec();
- c.Add(1);
- c.Sub(2);
- c.Set(3);
- }
+Y_UNIT_TEST(NullCounter) {
+ TCounter c;
+ c.Inc();
+ c.Dec();
+ c.Add(1);
+ c.Sub(2);
+ c.Set(3);
+}
- Y_UNIT_TEST(RealCounter) {
- i64 value = 10;
- TCounter c(&value);
- c.Inc();
- UNIT_ASSERT_VALUES_EQUAL(value, 11);
- c.Dec();
- UNIT_ASSERT_VALUES_EQUAL(value, 10);
- c.Add(1);
- UNIT_ASSERT_VALUES_EQUAL(value, 11);
- c.Sub(2);
- UNIT_ASSERT_VALUES_EQUAL(value, 9);
- c.Set(3);
- UNIT_ASSERT_VALUES_EQUAL(value, 3);
- }
+Y_UNIT_TEST(RealCounter) {
+ i64 value = 10;
+ TCounter c(&value);
+ c.Inc();
+ UNIT_ASSERT_VALUES_EQUAL(value, 11);
+ c.Dec();
+ UNIT_ASSERT_VALUES_EQUAL(value, 10);
+ c.Add(1);
+ UNIT_ASSERT_VALUES_EQUAL(value, 11);
+ c.Sub(2);
+ UNIT_ASSERT_VALUES_EQUAL(value, 9);
+ c.Set(3);
+ UNIT_ASSERT_VALUES_EQUAL(value, 3);
+}
- Y_UNIT_TEST(Copy) {
- i64 value = 1;
- TCounter c1(&value);
- TCounter c2(c1); // copy ctor
- c2.Inc();
- UNIT_ASSERT_VALUES_EQUAL(value, 2);
- TCounter c3;
- c3 = c1; // assign
- c3.Inc();
- UNIT_ASSERT_VALUES_EQUAL(value, 3);
- TCounter c4(std::move(c1)); // move ctor
- c4.Inc();
- UNIT_ASSERT_VALUES_EQUAL(value, 4);
- TCounter c5;
- c5 = std::move(c3); // move assign
- c5.Inc();
- UNIT_ASSERT_VALUES_EQUAL(value, 5);
- }
+Y_UNIT_TEST(Copy) {
+ i64 value = 1;
+ TCounter c1(&value);
+ TCounter c2(c1); // copy ctor
+ c2.Inc();
+ UNIT_ASSERT_VALUES_EQUAL(value, 2);
+ TCounter c3;
+ c3 = c1; // assign
+ c3.Inc();
+ UNIT_ASSERT_VALUES_EQUAL(value, 3);
+ TCounter c4(std::move(c1)); // move ctor
+ c4.Inc();
+ UNIT_ASSERT_VALUES_EQUAL(value, 4);
+ TCounter c5;
+ c5 = std::move(c3); // move assign
+ c5.Inc();
+ UNIT_ASSERT_VALUES_EQUAL(value, 5);
}
+} // Y_UNIT_TEST_SUITE(TUdfCounter)
diff --git a/yql/essentials/public/udf/udf_data_type.cpp b/yql/essentials/public/udf/udf_data_type.cpp
index 67f31354ce3..837f4b80c14 100644
--- a/yql/essentials/public/udf/udf_data_type.cpp
+++ b/yql/essentials/public/udf/udf_data_type.cpp
@@ -9,10 +9,14 @@ namespace {
ui8 GetDecimalWidth(EDataTypeFeatures features, size_t size) {
if (features & NUdf::IntegralType) {
switch (size) {
- case 1U: return 3U;
- case 2U: return 5U;
- case 4U: return 10U;
- case 8U: return 20U;
+ case 1U:
+ return 3U;
+ case 2U:
+ return 5U;
+ case 4U:
+ return 10U;
+ case 8U:
+ return 20U;
}
}
return 0U;
@@ -27,54 +31,54 @@ ui8 GetDecimalWidth(EDataTypeFeatures features, size_t size) {
static const std::array<std::array<std::optional<TCastResultOptions>, DataSlotCount>, DataSlotCount> CastResultsTable = {{
// Bool, Int8 ----integrals---- Uint64 Floats, Strings, YJsons, Uuid, DateTimes, Interval, TzDateTimes, Decimal, DyNumber, JsonDocument
- {{ OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO }}, // Bool
+ {{OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO}}, // Bool
- {{ LD, OK, MF, OK, MF, OK, MF, OK, MF, OK, OK, OK, OK, NO, NO, NO, MF, MF, MF, OK, MF, MF, MF, UN, NO, NO, OK, OK, OK, OK, NO, NO, NO }}, // Int8
- {{ LD, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, OK, OK, OK, OK, OK, OK, OK, UN, NO, NO, OK, OK, OK, OK, NO, NO, NO }}, // Uint8
- {{ LD, MF, MF, OK, MF, OK, MF, OK, MF, OK, OK, OK, OK, NO, NO, NO, MF, MF, MF, OK, MF, MF, MF, UN, NO, NO, OK, OK, OK, OK, NO, NO, NO }}, // Int16
- {{ LD, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, MF, OK, OK, OK, MF, OK, OK, UN, NO, NO, OK, OK, OK, OK, NO, NO, NO }}, // Uint16
- {{ LD, MF, MF, MF, MF, OK, MF, OK, MF, OK, LD, OK, OK, NO, NO, NO, MF, MF, MF, OK, MF, MF, MF, UN, NO, NO, MF, OK, OK, OK, NO, NO, NO }}, // Int32
- {{ LD, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, MF, MF, OK, OK, MF, MF, OK, UN, NO, NO, MF, OK, OK, OK, NO, NO, NO }}, // Uint32
- {{ LD, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, MF, MF, MF, MF, MF, MF, MF, UN, NO, NO, MF, MF, MF, MF, NO, NO, NO }}, // Int64
- {{ LD, MF, MF, MF, MF, MF, MF, MF, OK, LD, LD, OK, OK, NO, NO, NO, MF, MF, MF, MF, MF, MF, MF, UN, NO, NO, MF, MF, MF, MF, NO, NO, NO }}, // Uint64
+ {{LD, OK, MF, OK, MF, OK, MF, OK, MF, OK, OK, OK, OK, NO, NO, NO, MF, MF, MF, OK, MF, MF, MF, UN, NO, NO, OK, OK, OK, OK, NO, NO, NO}}, // Int8
+ {{LD, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, OK, OK, OK, OK, OK, OK, OK, UN, NO, NO, OK, OK, OK, OK, NO, NO, NO}}, // Uint8
+ {{LD, MF, MF, OK, MF, OK, MF, OK, MF, OK, OK, OK, OK, NO, NO, NO, MF, MF, MF, OK, MF, MF, MF, UN, NO, NO, OK, OK, OK, OK, NO, NO, NO}}, // Int16
+ {{LD, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, MF, OK, OK, OK, MF, OK, OK, UN, NO, NO, OK, OK, OK, OK, NO, NO, NO}}, // Uint16
+ {{LD, MF, MF, MF, MF, OK, MF, OK, MF, OK, LD, OK, OK, NO, NO, NO, MF, MF, MF, OK, MF, MF, MF, UN, NO, NO, MF, OK, OK, OK, NO, NO, NO}}, // Int32
+ {{LD, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, MF, MF, OK, OK, MF, MF, OK, UN, NO, NO, MF, OK, OK, OK, NO, NO, NO}}, // Uint32
+ {{LD, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, MF, MF, MF, MF, MF, MF, MF, UN, NO, NO, MF, MF, MF, MF, NO, NO, NO}}, // Int64
+ {{LD, MF, MF, MF, MF, MF, MF, MF, OK, LD, LD, OK, OK, NO, NO, NO, MF, MF, MF, MF, MF, MF, MF, UN, NO, NO, MF, MF, MF, MF, NO, NO, NO}}, // Uint64
- {{ FL, FL, FL, FL, FL, FL, FL, FL, FL, OK, LD, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO }}, // Double
- {{ FL, FL, FL, FL, FL, FL, FL, FL, FL, OK, OK, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO }}, // Float
+ {{FL, FL, FL, FL, FL, FL, FL, FL, FL, OK, LD, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO}}, // Double
+ {{FL, FL, FL, FL, FL, FL, FL, FL, FL, OK, OK, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO}}, // Float
- {{ MF, MF, MF, MF, MF, MF, MF, MF, MF, FL, FL, OK, MF, MF, MF, MF, MF, MF, MF, MF, MF, MF, MF, FL, FL, MF, MF, MF, MF, MF, MF, MF, MF }}, // String
- {{ MF, MF, MF, MF, MF, MF, MF, MF, MF, FL, FL, OK, OK, MF, MF, MF, MF, MF, MF, MF, MF, MF, MF, FL, FL, MF, MF, MF, MF, MF, MF, MF, MF }}, // Utf8
+ {{MF, MF, MF, MF, MF, MF, MF, MF, MF, FL, FL, OK, MF, MF, MF, MF, MF, MF, MF, MF, MF, MF, MF, FL, FL, MF, MF, MF, MF, MF, MF, MF, MF}}, // String
+ {{MF, MF, MF, MF, MF, MF, MF, MF, MF, FL, FL, OK, OK, MF, MF, MF, MF, MF, MF, MF, MF, MF, MF, FL, FL, MF, MF, MF, MF, MF, MF, MF, MF}}, // Utf8
- {{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO }}, // Yson
- {{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO }}, // Json
+ {{NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO}}, // Yson
+ {{NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO}}, // Json
- {{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO }}, // Uuid
+ {{NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO}}, // Uuid
- {{ NO, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK }}, // Date
- {{ NO, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK }}, // Datetime
- {{ NO, MF, MF, MF, MF, MF, MF, OK, OK, LD, LD, OK, OK, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK }}, // Timestamp
+ {{NO, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK}}, // Date
+ {{NO, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK}}, // Datetime
+ {{NO, MF, MF, MF, MF, MF, MF, OK, OK, LD, LD, OK, OK, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK}}, // Timestamp
- {{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO }}, // Interval
+ {{NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO}}, // Interval
- {{ NO, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK }}, // TzDate
- {{ NO, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK }}, // TzDatetime
- {{ NO, MF, MF, MF, MF, MF, MF, OK, OK, LD, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK }}, // TzTimestamp
+ {{NO, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK}}, // TzDate
+ {{NO, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK}}, // TzDatetime
+ {{NO, MF, MF, MF, MF, MF, MF, OK, OK, LD, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK}}, // TzTimestamp
- {{ NO, UN, UN, UN, UN, UN, UN, UN, UN, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, UN, NO, NO, NO, NO, NO, NO, NO, NO, NO }}, // Decimal
- {{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO }}, // DyNumber
- {{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO }}, // JsonDocument
+ {{NO, UN, UN, UN, UN, UN, UN, UN, UN, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, UN, NO, NO, NO, NO, NO, NO, NO, NO, NO}}, // Decimal
+ {{NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO}}, // DyNumber
+ {{NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO}}, // JsonDocument
- {{ NO, MF, MF, MF, MF, OK, MF, OK, MF, LD, OK, OK, OK, NO, NO, NO, MF, MF, MF, NO, MF, MF, MF, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK }}, // Date32
- {{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, FL, MF, MF, NO, FL, MF, MF, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK }}, // Datetime64
- {{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, FL, FL, MF, NO, FL, FL, MF, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK }}, // Timestamp64
+ {{NO, MF, MF, MF, MF, OK, MF, OK, MF, LD, OK, OK, OK, NO, NO, NO, MF, MF, MF, NO, MF, MF, MF, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK}}, // Date32
+ {{NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, FL, MF, MF, NO, FL, MF, MF, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK}}, // Datetime64
+ {{NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, FL, FL, MF, NO, FL, FL, MF, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK}}, // Timestamp64
- {{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, MF, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO }}, // Interval64
+ {{NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, MF, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO}}, // Interval64
- {{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, MF, MF, MF, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK }}, // TzDate32
- {{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, FL, MF, MF, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK }}, // TzDatetime64
- {{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, FL, FL, MF, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK }}, // TzTimestamp64
+ {{NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, MF, MF, MF, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK}}, // TzDate32
+ {{NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, FL, MF, MF, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK}}, // TzDatetime64
+ {{NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, FL, FL, MF, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK}}, // TzTimestamp64
}};
-}
+} // namespace
TMaybe<TCastResultOptions> GetCastResult(EDataSlot source, EDataSlot target) {
if (const auto& r = CastResultsTable[static_cast<size_t>(source)][static_cast<size_t>(target)]) {
@@ -84,16 +88,17 @@ TMaybe<TCastResultOptions> GetCastResult(EDataSlot source, EDataSlot target) {
}
#define UDF_TYPE_ID_CHECK(xName, xId, xUnused2, xUnused3, xUnused4, xUnused5) \
- case xId: return EDataSlot::xName;
+ case xId: \
+ return EDataSlot::xName;
#define UDF_TYPE_PARSE(xName, xUnused1, xUnused2, xUnused3, xUnused4, xUnused5) \
- if (TStringBuf(#xName) == str) { \
- return EDataSlot::xName; \
+ if (TStringBuf(#xName) == str) { \
+ return EDataSlot::xName; \
}
#define UDF_TYPE_INFO(xName, xId, xType, xFeatures, xLayoutType, xParamsCount) \
- { TStringBuf(#xName), xId, static_cast<EDataTypeFeatures>(xFeatures), \
- TPlainDataType<xType>::Result || TTzDataType<xType>::Result ? sizeof(xLayoutType) : 0, xParamsCount, GetDecimalWidth(static_cast<EDataTypeFeatures>(xFeatures), sizeof(xLayoutType)) },
+ {TStringBuf(#xName), xId, static_cast<EDataTypeFeatures>(xFeatures), \
+ TPlainDataType<xType>::Result || TTzDataType<xType>::Result ? sizeof(xLayoutType) : 0, xParamsCount, GetDecimalWidth(static_cast<EDataTypeFeatures>(xFeatures), sizeof(xLayoutType))},
TMaybe<EDataSlot> FindDataSlot(TDataTypeId id) {
switch (id) {
@@ -122,8 +127,7 @@ EDataSlot GetDataSlot(TStringBuf str) {
}
const TDataTypeInfo DataTypeInfos[DataSlotCount] = {
- UDF_TYPE_ID_MAP(UDF_TYPE_INFO)
-};
+ UDF_TYPE_ID_MAP(UDF_TYPE_INFO)};
bool IsComparable(EDataSlot left, EDataSlot right) {
const auto lf = GetDataTypeInfo(left).Features;
diff --git a/yql/essentials/public/udf/udf_data_type.h b/yql/essentials/public/udf/udf_data_type.h
index 3c5fd264a9d..4dda1c0ae89 100644
--- a/yql/essentials/public/udf/udf_data_type.h
+++ b/yql/essentials/public/udf/udf_data_type.h
@@ -15,7 +15,7 @@ using TDataTypeId = ui16;
using TTimezoneId = ui16;
-enum EDataTypeFeatures : ui32 {
+enum EDataTypeFeatures: ui32 {
CanCompare = 1u << 0,
HasDeterministicCompare = 1u << 1,
CanEquate = 1u << 2,
@@ -30,9 +30,9 @@ enum EDataTypeFeatures : ui32 {
AllowFromString = 1u << 11,
PayloadType = AllowToBytes | AllowFromBytes | AllowToString | AllowFromString |
- HasDeterministicToString | HasDeterministicToBytes,
+ HasDeterministicToString | HasDeterministicToBytes,
CommonType = PayloadType | CanCompare | HasDeterministicCompare | CanEquate | HasDeterministicEquals |
- CanHash | HasDeterministicHash,
+ CanHash | HasDeterministicHash,
UnknownType = 0,
StringType = 1u << 20,
@@ -52,82 +52,85 @@ template <typename T>
struct TDataType;
template <typename T>
-struct TKnownDataType
-{
+struct TKnownDataType {
static constexpr bool Result = (TDataType<T>::Id != 0);
};
template <typename T>
-struct TPlainDataType
-{
+struct TPlainDataType {
static constexpr bool Result = (TDataType<T>::Features & (NumericType | DateType | TimeIntervalType)) != 0 || std::is_same<T, bool>::value;
};
template <typename T>
-struct TTzDataType
-{
+struct TTzDataType {
static constexpr bool Result = (TDataType<T>::Features & (TzDateType)) != 0;
};
-#define INTEGRAL_VALUE_TYPES(xx) \
- xx(i8) \
- xx(ui8) \
- xx(i16) \
- xx(ui16) \
- xx(i32) \
- xx(ui32) \
- xx(i64) \
+// clang-format off
+#define INTEGRAL_VALUE_TYPES(xx) \
+ xx(i8) \
+ xx(ui8) \
+ xx(i16) \
+ xx(ui16) \
+ xx(i32) \
+ xx(ui32) \
+ xx(i64) \
xx(ui64)
+// clang-format on
+// clang-format off
#define PRIMITIVE_VALUE_TYPES(xx) \
- INTEGRAL_VALUE_TYPES(xx) \
- xx(float) \
+ INTEGRAL_VALUE_TYPES(xx) \
+ xx(float) \
xx(double)
-
-#define KNOWN_PRIMITIVE_VALUE_TYPES(xx) \
- xx(bool) \
- xx(i8) \
- xx(ui8) \
- xx(i16) \
- xx(ui16) \
- xx(i32) \
- xx(ui32) \
- xx(i64) \
- xx(ui64) \
- xx(float) \
+// clang-format on
+
+// clang-format off
+#define KNOWN_PRIMITIVE_VALUE_TYPES(xx) \
+ xx(bool) \
+ xx(i8) \
+ xx(ui8) \
+ xx(i16) \
+ xx(ui16) \
+ xx(i32) \
+ xx(ui32) \
+ xx(i64) \
+ xx(ui64) \
+ xx(float) \
xx(double)
-
-#define KNOWN_FIXED_VALUE_TYPES(xx) \
- xx(bool, bool) \
- xx(i8, i8) \
- xx(ui8, ui8) \
- xx(i16, i16) \
- xx(ui16, ui16) \
- xx(i32, i32) \
- xx(ui32, ui32) \
- xx(i64, i64) \
- xx(ui64, ui64) \
- xx(float, float) \
- xx(double, double) \
- xx(NUdf::TDate, ui16) \
- xx(NUdf::TDatetime, ui32) \
- xx(NUdf::TTimestamp, ui64) \
- xx(NUdf::TInterval, i64) \
- xx(NUdf::TDate32, i32) \
- xx(NUdf::TDatetime64, i64) \
- xx(NUdf::TTimestamp64, i64) \
+// clang-format on
+
+// clang-format off
+#define KNOWN_FIXED_VALUE_TYPES(xx) \
+ xx(bool, bool) \
+ xx(i8, i8) \
+ xx(ui8, ui8) \
+ xx(i16, i16) \
+ xx(ui16, ui16) \
+ xx(i32, i32) \
+ xx(ui32, ui32) \
+ xx(i64, i64) \
+ xx(ui64, ui64) \
+ xx(float, float) \
+ xx(double, double) \
+ xx(NUdf::TDate, ui16) \
+ xx(NUdf::TDatetime, ui32) \
+ xx(NUdf::TTimestamp, ui64) \
+ xx(NUdf::TInterval, i64) \
+ xx(NUdf::TDate32, i32) \
+ xx(NUdf::TDatetime64, i64) \
+ xx(NUdf::TTimestamp64, i64) \
xx(NUdf::TInterval64, i64)
+// clang-format on
template <typename T>
-struct TPrimitiveDataType
-{
+struct TPrimitiveDataType {
static constexpr bool Result = false;
};
-#define UDF_PRIMITIVE_TYPE_IMPL(type) \
- template <> \
- struct TPrimitiveDataType<type> \
- { \
+#define UDF_PRIMITIVE_TYPE_IMPL(type) \
+ template <> \
+ struct TPrimitiveDataType<type> { \
static constexpr bool Result = true; \
};
@@ -171,43 +174,43 @@ constexpr i64 MAX_DATETIME64 = 4611669811199ll;
constexpr i64 MAX_TIMESTAMP64 = 4611669811199999999ll;
constexpr i64 MAX_INTERVAL64 = MAX_TIMESTAMP64 - MIN_TIMESTAMP64;
constexpr i32 MIN_YEAR32 = -144169; // inclusive
-constexpr i32 MAX_YEAR32 = 148108; // non-inclusive
+constexpr i32 MAX_YEAR32 = 148108; // non-inclusive
constexpr size_t UUID_SIZE = 16;
-#define UDF_TYPE_ID_MAP(XX) \
- XX(Bool, NYql::NProto::Bool, bool, CommonType, bool, 0) \
- XX(Int8, NYql::NProto::Int8, i8, CommonType | NumericType | IntegralType | SignedIntegralType, i8, 0) \
- XX(Uint8, NYql::NProto::Uint8, ui8, CommonType | NumericType | IntegralType | UnsignedIntegralType, ui8, 0) \
- XX(Int16, NYql::NProto::Int16, i16, CommonType | NumericType | IntegralType | SignedIntegralType, i16, 0) \
+#define UDF_TYPE_ID_MAP(XX) \
+ XX(Bool, NYql::NProto::Bool, bool, CommonType, bool, 0) \
+ XX(Int8, NYql::NProto::Int8, i8, CommonType | NumericType | IntegralType | SignedIntegralType, i8, 0) \
+ XX(Uint8, NYql::NProto::Uint8, ui8, CommonType | NumericType | IntegralType | UnsignedIntegralType, ui8, 0) \
+ XX(Int16, NYql::NProto::Int16, i16, CommonType | NumericType | IntegralType | SignedIntegralType, i16, 0) \
XX(Uint16, NYql::NProto::Uint16, ui16, CommonType | NumericType | IntegralType | UnsignedIntegralType, ui16, 0) \
- XX(Int32, NYql::NProto::Int32, i32, CommonType | NumericType | IntegralType | SignedIntegralType, i32, 0) \
+ XX(Int32, NYql::NProto::Int32, i32, CommonType | NumericType | IntegralType | SignedIntegralType, i32, 0) \
XX(Uint32, NYql::NProto::Uint32, ui32, CommonType | NumericType | IntegralType | UnsignedIntegralType, ui32, 0) \
- XX(Int64, NYql::NProto::Int64, i64, CommonType | NumericType | IntegralType | SignedIntegralType, i64, 0) \
+ XX(Int64, NYql::NProto::Int64, i64, CommonType | NumericType | IntegralType | SignedIntegralType, i64, 0) \
XX(Uint64, NYql::NProto::Uint64, ui64, CommonType | NumericType | IntegralType | UnsignedIntegralType, ui64, 0) \
- XX(Double, NYql::NProto::Double, double, CommonType | NumericType | FloatType, double, 0) \
- XX(Float, NYql::NProto::Float, float, CommonType | NumericType | FloatType, float, 0) \
- XX(String, NYql::NProto::String, char*, CommonType | StringType, char*, 0) \
- XX(Utf8, NYql::NProto::Utf8, TUtf8, CommonType | StringType, TUtf8, 0) \
- XX(Yson, NYql::NProto::Yson, TYson, PayloadType | StringType, TYson, 0) \
- XX(Json, NYql::NProto::Json, TJson, PayloadType | StringType, TJson, 0) \
- XX(Uuid, NYql::NProto::Uuid, TUuid, CommonType, TUuid, 0) \
- XX(Date, NYql::NProto::Date, TDate, CommonType | DateType, ui16, 0) \
- XX(Datetime, NYql::NProto::Datetime, TDatetime, CommonType | DateType, ui32, 0) \
- XX(Timestamp, NYql::NProto::Timestamp, TTimestamp, CommonType | DateType, ui64, 0) \
- XX(Interval, NYql::NProto::Interval, TInterval, CommonType | TimeIntervalType, i64, 0) \
- XX(TzDate, NYql::NProto::TzDate, TTzDate, CommonType | TzDateType, ui16, 0) \
- XX(TzDatetime, NYql::NProto::TzDatetime, TTzDatetime, CommonType | TzDateType, ui32, 0) \
- XX(TzTimestamp, NYql::NProto::TzTimestamp, TTzTimestamp, CommonType | TzDateType, ui64, 0) \
- XX(Decimal, NYql::NProto::Decimal, TDecimal, CommonType | DecimalType, TDecimal, 2) \
- XX(DyNumber, NYql::NProto::DyNumber, TDyNumber, CommonType, TDyNumber, 0) \
- XX(JsonDocument, NYql::NProto::JsonDocument, TJsonDocument, PayloadType, TJsonDocument, 0) \
- XX(Date32, NYql::NProto::Date32, TDate32, CommonType | DateType | ExtDateType, i32, 0) \
- XX(Datetime64, NYql::NProto::Datetime64, TDatetime64, CommonType | DateType | ExtDateType, i64, 0) \
- XX(Timestamp64, NYql::NProto::Timestamp64, TTimestamp64, CommonType | DateType | ExtDateType, i64, 0) \
- XX(Interval64, NYql::NProto::Interval64, TInterval64, CommonType | TimeIntervalType | ExtDateType, i64, 0) \
- XX(TzDate32, NYql::NProto::TzDate32, TTzDate32, CommonType | TzDateType | ExtDateType, i32, 0) \
- XX(TzDatetime64, NYql::NProto::TzDatetime64, TTzDatetime64, CommonType | TzDateType | ExtDateType, i64, 0) \
- XX(TzTimestamp64, NYql::NProto::TzTimestamp64, TTzTimestamp64, CommonType | TzDateType | ExtDateType, i64, 0) \
+ XX(Double, NYql::NProto::Double, double, CommonType | NumericType | FloatType, double, 0) \
+ XX(Float, NYql::NProto::Float, float, CommonType | NumericType | FloatType, float, 0) \
+ XX(String, NYql::NProto::String, char*, CommonType | StringType, char*, 0) \
+ XX(Utf8, NYql::NProto::Utf8, TUtf8, CommonType | StringType, TUtf8, 0) \
+ XX(Yson, NYql::NProto::Yson, TYson, PayloadType | StringType, TYson, 0) \
+ XX(Json, NYql::NProto::Json, TJson, PayloadType | StringType, TJson, 0) \
+ XX(Uuid, NYql::NProto::Uuid, TUuid, CommonType, TUuid, 0) \
+ XX(Date, NYql::NProto::Date, TDate, CommonType | DateType, ui16, 0) \
+ XX(Datetime, NYql::NProto::Datetime, TDatetime, CommonType | DateType, ui32, 0) \
+ XX(Timestamp, NYql::NProto::Timestamp, TTimestamp, CommonType | DateType, ui64, 0) \
+ XX(Interval, NYql::NProto::Interval, TInterval, CommonType | TimeIntervalType, i64, 0) \
+ XX(TzDate, NYql::NProto::TzDate, TTzDate, CommonType | TzDateType, ui16, 0) \
+ XX(TzDatetime, NYql::NProto::TzDatetime, TTzDatetime, CommonType | TzDateType, ui32, 0) \
+ XX(TzTimestamp, NYql::NProto::TzTimestamp, TTzTimestamp, CommonType | TzDateType, ui64, 0) \
+ XX(Decimal, NYql::NProto::Decimal, TDecimal, CommonType | DecimalType, TDecimal, 2) \
+ XX(DyNumber, NYql::NProto::DyNumber, TDyNumber, CommonType, TDyNumber, 0) \
+ XX(JsonDocument, NYql::NProto::JsonDocument, TJsonDocument, PayloadType, TJsonDocument, 0) \
+ XX(Date32, NYql::NProto::Date32, TDate32, CommonType | DateType | ExtDateType, i32, 0) \
+ XX(Datetime64, NYql::NProto::Datetime64, TDatetime64, CommonType | DateType | ExtDateType, i64, 0) \
+ XX(Timestamp64, NYql::NProto::Timestamp64, TTimestamp64, CommonType | DateType | ExtDateType, i64, 0) \
+ XX(Interval64, NYql::NProto::Interval64, TInterval64, CommonType | TimeIntervalType | ExtDateType, i64, 0) \
+ XX(TzDate32, NYql::NProto::TzDate32, TTzDate32, CommonType | TzDateType | ExtDateType, i32, 0) \
+ XX(TzDatetime64, NYql::NProto::TzDatetime64, TTzDatetime64, CommonType | TzDateType | ExtDateType, i64, 0) \
+ XX(TzTimestamp64, NYql::NProto::TzTimestamp64, TTzTimestamp64, CommonType | TzDateType | ExtDateType, i64, 0)
#define UDF_TYPE_ID(xName, xTypeId, xType, xFeatures, xLayoutType, xParamsCount) \
template <> \
@@ -226,7 +229,9 @@ enum class EDataSlot {
enum class ECountDataSlot {
UDF_TYPE_ID_MAP(ENUM_VALUE_GEN_NO_VALUE)
+ // clang-format off
Count
+ // clang-format on
};
constexpr ui32 DataSlotCount = static_cast<ui32>(ECountDataSlot::Count);
@@ -236,7 +241,7 @@ UDF_TYPE_ID(String, 0x1001, const char*, CommonType | StringType, const char*, 0
UDF_TYPE_ID(String, 0x1001, char* const, CommonType | StringType, char* const, 0)
template <ui8 Precision, ui8 Scale>
-struct TDecimalDataType : public TDataType<TDecimal> {};
+struct TDecimalDataType: public TDataType<TDecimal> {};
TMaybe<EDataSlot> FindDataSlot(TDataTypeId id);
EDataSlot GetDataSlot(TDataTypeId id); // throws if data type is unknown
@@ -261,7 +266,7 @@ inline const TDataTypeInfo& GetDataTypeInfo(EDataSlot slot) {
using TCastResultOptions = ui8;
-enum ECastOptions : TCastResultOptions {
+enum ECastOptions: TCastResultOptions {
Complete = 0U,
MayFail = 1U << 0U,
@@ -281,5 +286,5 @@ inline IOutputStream& operator<<(IOutputStream& os, EDataSlot slot) {
return os;
}
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_data_type_ut.cpp b/yql/essentials/public/udf/udf_data_type_ut.cpp
index 77316f47b78..551df0054dd 100644
--- a/yql/essentials/public/udf/udf_data_type_ut.cpp
+++ b/yql/essentials/public/udf/udf_data_type_ut.cpp
@@ -5,12 +5,12 @@
using namespace NYql::NUdf;
Y_UNIT_TEST_SUITE(TCastsTests) {
- Y_UNIT_TEST(HasAllCasts) {
- for (ui32 source = 0; source < DataSlotCount; ++source) {
- for (ui32 target = 0; target < DataSlotCount; ++target) {
- UNIT_ASSERT_C(GetCastResult((EDataSlot)source, (EDataSlot)target),
- "Missing cast from " << (EDataSlot)source << " to " << (EDataSlot)target);
- }
+Y_UNIT_TEST(HasAllCasts) {
+ for (ui32 source = 0; source < DataSlotCount; ++source) {
+ for (ui32 target = 0; target < DataSlotCount; ++target) {
+ UNIT_ASSERT_C(GetCastResult((EDataSlot)source, (EDataSlot)target),
+ "Missing cast from " << (EDataSlot)source << " to " << (EDataSlot)target);
}
}
}
+} // Y_UNIT_TEST_SUITE(TCastsTests)
diff --git a/yql/essentials/public/udf/udf_helpers.cpp b/yql/essentials/public/udf/udf_helpers.cpp
index 91e2c1d779f..d1da39a7622 100644
--- a/yql/essentials/public/udf/udf_helpers.cpp
+++ b/yql/essentials/public/udf/udf_helpers.cpp
@@ -15,8 +15,9 @@ struct TLoadedResources {
TString Get(TStringBuf resourceId) {
const std::unique_lock lock(Sync);
const auto ins = Resources.emplace(resourceId, "");
- if (ins.second)
+ if (ins.second) {
ins.first->second = NResource::Find(resourceId);
+ }
return ins.first->second;
}
@@ -24,11 +25,11 @@ struct TLoadedResources {
std::unordered_map<TString, TString> Resources;
};
-}
+} // namespace
TString LoadResourceOnce(TStringBuf resourceId) {
return Singleton<TLoadedResources>()->Get(resourceId);
}
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_helpers.h b/yql/essentials/public/udf/udf_helpers.h
index 84b0bd35662..23f25c16b96 100644
--- a/yql/essentials/public/udf/udf_helpers.h
+++ b/yql/essentials/public/udf/udf_helpers.h
@@ -14,77 +14,76 @@
#include <util/generic/strbuf.h>
#include <util/string/builder.h>
-
namespace NYql {
namespace NUdf {
- template <class T>
- concept CUDF = requires(const TStringRef& name, TType* userType, IFunctionTypeInfoBuilder& builder, bool typesOnly) {
- { T::Name() } -> std::convertible_to<const TStringRef&>;
- { T::DeclareSignature(name, userType, builder, typesOnly) } -> std::convertible_to<bool>;
- };
+template <class T>
+concept CUDF = requires(const TStringRef& name, TType* userType, IFunctionTypeInfoBuilder& builder, bool typesOnly) {
+ { T::Name() } -> std::convertible_to<const TStringRef&>;
+ { T::DeclareSignature(name, userType, builder, typesOnly) } -> std::convertible_to<bool>;
+};
- template <ui32 V, CUDF TLegacyUDF, CUDF TActualUDF>
- class TLangVerForked {
- private:
- Y_HAS_SUBTYPE(TBlockType);
-
- public:
- using TTypeAwareMarker = bool;
-
- using TBlockType = decltype([] {
- static_assert(THasTBlockType<TLegacyUDF>::value == THasTBlockType<TActualUDF>::value);
- if constexpr (THasTBlockType<TActualUDF>::value) {
- return TLangVerForked<
- V,
- typename TLegacyUDF::TBlockType,
- typename TActualUDF::TBlockType>();
- } else {
- return;
- }
- }());
+template <ui32 V, CUDF TLegacyUDF, CUDF TActualUDF>
+class TLangVerForked {
+private:
+ Y_HAS_SUBTYPE(TBlockType);
- static const TStringRef& Name() {
- Y_ENSURE(TLegacyUDF::Name() == TActualUDF::Name());
- return TActualUDF::Name();
+public:
+ using TTypeAwareMarker = bool;
+
+ using TBlockType = decltype([] {
+ static_assert(THasTBlockType<TLegacyUDF>::value == THasTBlockType<TActualUDF>::value);
+ if constexpr (THasTBlockType<TActualUDF>::value) {
+ return TLangVerForked<
+ V,
+ typename TLegacyUDF::TBlockType,
+ typename TActualUDF::TBlockType>();
+ } else {
+ return;
}
+ }());
- static bool DeclareSignature(
- const TStringRef& name, TType* userType,
- IFunctionTypeInfoBuilder& builder, bool typesOnly) {
+ static const TStringRef& Name() {
+ Y_ENSURE(TLegacyUDF::Name() == TActualUDF::Name());
+ return TActualUDF::Name();
+ }
+
+ static bool DeclareSignature(
+ const TStringRef& name, TType* userType,
+ IFunctionTypeInfoBuilder& builder, bool typesOnly) {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 43)
- if (V <= builder.GetCurrentLangVer()) {
- return TActualUDF::DeclareSignature(name, userType, builder, typesOnly);
- }
-#endif
- return TLegacyUDF::DeclareSignature(name, userType, builder, typesOnly);
+ if (V <= builder.GetCurrentLangVer()) {
+ return TActualUDF::DeclareSignature(name, userType, builder, typesOnly);
}
- };
+#endif
+ return TLegacyUDF::DeclareSignature(name, userType, builder, typesOnly);
+ }
+};
- inline TSourcePosition GetSourcePosition(IFunctionTypeInfoBuilder& builder) {
+inline TSourcePosition GetSourcePosition(IFunctionTypeInfoBuilder& builder) {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 9)
- return builder.GetSourcePosition();
+ return builder.GetSourcePosition();
#else
- Y_UNUSED(builder);
- return {};
+ Y_UNUSED(builder);
+ return {};
#endif
- }
+}
- TString LoadResourceOnce(TStringBuf resourceId);
+TString LoadResourceOnce(TStringBuf resourceId);
- inline void SetIRImplementation(IFunctionTypeInfoBuilder& builder, TStringBuf resourceId, TStringBuf functionName) {
+inline void SetIRImplementation(IFunctionTypeInfoBuilder& builder, TStringBuf resourceId, TStringBuf functionName) {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 16)
- if (functionName) {
- builder.IRImplementation(LoadResourceOnce(resourceId), resourceId, functionName);
- }
+ if (functionName) {
+ builder.IRImplementation(LoadResourceOnce(resourceId), resourceId, functionName);
+ }
#else
- Y_UNUSED(builder);
- Y_UNUSED(resourceId);
- Y_UNUSED(functionName);
+ Y_UNUSED(builder);
+ Y_UNUSED(resourceId);
+ Y_UNUSED(functionName);
#endif
- }
-}
}
+} // namespace NUdf
+} // namespace NYql
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 17)
#define APPEND_SOURCE_LOCATION(sb, valueBuilder, Pos_) sb << valueBuilder->WithCalleePosition(Pos_) << " ";
@@ -93,131 +92,136 @@ namespace NUdf {
#endif
#define UDF_IMPL_EX(udfName, typeBody, members, init, irResourceId, irFunctionName, blockType, create_impl) \
- class udfName: public ::NYql::NUdf::TBoxedValue { \
- public: \
- using TBlockType = blockType; \
- explicit udfName(::NYql::NUdf::IFunctionTypeInfoBuilder& builder) \
- : Pos_(GetSourcePosition(builder)) \
- { \
- init \
- } \
- static const ::NYql::NUdf::TStringRef& Name() { \
- static auto name = ::NYql::NUdf::TStringRef::Of(#udfName).Substring(1, 256); \
- return name; \
- } \
- inline ::NYql::NUdf::TUnboxedValue RunImpl( \
- const ::NYql::NUdf::IValueBuilder* valueBuilder, \
- const ::NYql::NUdf::TUnboxedValuePod* args) const; \
- ::NYql::NUdf::TUnboxedValue Run( \
- const ::NYql::NUdf::IValueBuilder* valueBuilder, \
- const ::NYql::NUdf::TUnboxedValuePod* args) const override { \
- try { \
- return RunImpl(valueBuilder, args); \
- } catch (const std::exception& ex) { \
- TStringBuilder sb; \
- APPEND_SOURCE_LOCATION(sb, valueBuilder, Pos_) \
- sb << ex.what(); \
- UdfTerminate(sb.c_str()); \
- } \
- } \
- static bool DeclareSignature( \
- const ::NYql::NUdf::TStringRef& name, \
- ::NYql::NUdf::TType* userType, \
- ::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
- bool typesOnly) { \
- Y_UNUSED(userType); \
- if (Name() == name) { \
- typeBody if (!typesOnly) { \
- create_impl \
- SetIRImplementation(builder, irResourceId, irFunctionName); \
- } \
- return true; \
- } \
- return false; \
- } \
- ::NYql::NUdf::TSourcePosition GetPos() const { return Pos_; } \
- private: \
- ::NYql::NUdf::TSourcePosition Pos_; \
- members \
- }; \
- ::NYql::NUdf::TUnboxedValue udfName::RunImpl( \
- const ::NYql::NUdf::IValueBuilder* valueBuilder, \
+ class udfName: public ::NYql::NUdf::TBoxedValue { \
+ public: \
+ using TBlockType = blockType; \
+ explicit udfName(::NYql::NUdf::IFunctionTypeInfoBuilder& builder) \
+ : Pos_(GetSourcePosition(builder)) \
+ { \
+ init \
+ } \
+ static const ::NYql::NUdf::TStringRef& Name() { \
+ static auto name = ::NYql::NUdf::TStringRef::Of(#udfName).Substring(1, 256); \
+ return name; \
+ } \
+ inline ::NYql::NUdf::TUnboxedValue RunImpl( \
+ const ::NYql::NUdf::IValueBuilder* valueBuilder, \
+ const ::NYql::NUdf::TUnboxedValuePod* args) const; \
+ ::NYql::NUdf::TUnboxedValue Run( \
+ const ::NYql::NUdf::IValueBuilder* valueBuilder, \
+ const ::NYql::NUdf::TUnboxedValuePod* args) const override { \
+ try { \
+ return RunImpl(valueBuilder, args); \
+ } catch (const std::exception& ex) { \
+ TStringBuilder sb; \
+ APPEND_SOURCE_LOCATION(sb, valueBuilder, Pos_) \
+ sb << ex.what(); \
+ UdfTerminate(sb.c_str()); \
+ } \
+ } \
+ static bool DeclareSignature( \
+ const ::NYql::NUdf::TStringRef& name, \
+ ::NYql::NUdf::TType* userType, \
+ ::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
+ bool typesOnly) { \
+ Y_UNUSED(userType); \
+ if (Name() == name) { \
+ typeBody if (!typesOnly) { \
+ create_impl \
+ SetIRImplementation(builder, irResourceId, irFunctionName); \
+ } \
+ return true; \
+ } \
+ return false; \
+ } \
+ ::NYql::NUdf::TSourcePosition GetPos() const { \
+ return Pos_; \
+ } \
+ \
+ private: \
+ ::NYql::NUdf::TSourcePosition Pos_; \
+ members \
+ }; \
+ ::NYql::NUdf::TUnboxedValue udfName::RunImpl( \
+ const ::NYql::NUdf::IValueBuilder* valueBuilder, \
const ::NYql::NUdf::TUnboxedValuePod* args) const
#define UDF_IMPL(udfName, typeBody, members, init, irResourceId, irFunctionName, blockType) \
- UDF_IMPL_EX(udfName, typeBody, members, init, irResourceId, irFunctionName, blockType, builder.Implementation(new udfName(builder));)
+ UDF_IMPL_EX(udfName, typeBody, members, init, irResourceId, irFunctionName, blockType, builder.Implementation(new udfName(builder));)
#define UDF(udfName, typeBody) UDF_IMPL(udfName, typeBody, ;, ;, "", "", void)
-#define UDF_RUN_IMPL(udfName, typeBody, members, init, irResourceId, irFunctionName) \
- struct udfName##Members { \
- members \
- }; \
- \
+#define UDF_RUN_IMPL(udfName, typeBody, members, init, irResourceId, irFunctionName) \
+ struct udfName##Members { \
+ members \
+ }; \
+ \
class udfName: public ::NYql::NUdf::TBoxedValue, public udfName##Members { \
- public: \
+ public: \
explicit udfName(::NYql::NUdf::IFunctionTypeInfoBuilder& builder) \
- : Pos_(GetSourcePosition(builder)) \
- { \
- init \
- } \
+ : Pos_(GetSourcePosition(builder)) \
+ { \
+ init \
+ } \
static const ::NYql::NUdf::TStringRef& Name() { \
static auto name = ::NYql::NUdf::TStringRef::Of(#udfName).Substring(1, 256); \
- return name; \
- } \
- class TImpl: public TBoxedValue, public udfName##Members { \
- public: \
- TImpl(const udfName##Members& parent, \
- const ::NYql::NUdf::TUnboxedValuePod& runConfig, \
- ::NYql::NUdf::TSourcePosition pos) \
- : udfName##Members(parent) \
+ return name; \
+ } \
+ class TImpl: public TBoxedValue, public udfName##Members { \
+ public: \
+ TImpl(const udfName##Members& parent, \
+ const ::NYql::NUdf::TUnboxedValuePod& runConfig, \
+ ::NYql::NUdf::TSourcePosition pos) \
+ : udfName##Members(parent) \
, RunConfig(::NYql::NUdf::TUnboxedValuePod(runConfig)) \
- , Pos_(pos) \
- {} \
+ , Pos_(pos) \
+ { \
+ } \
inline ::NYql::NUdf::TUnboxedValue RunImpl( \
const ::NYql::NUdf::IValueBuilder* valueBuilder, \
const ::NYql::NUdf::TUnboxedValuePod* args) const; \
::NYql::NUdf::TUnboxedValue Run( \
const ::NYql::NUdf::IValueBuilder* valueBuilder, \
const ::NYql::NUdf::TUnboxedValuePod* args) const override { \
- try { \
- return RunImpl(valueBuilder, args); \
- } catch (const std::exception& ex) { \
- TStringBuilder sb; \
- APPEND_SOURCE_LOCATION(sb, valueBuilder, Pos_) \
- sb << ex.what(); \
- UdfTerminate(sb.c_str()); \
- } \
- } \
- \
- private: \
+ try { \
+ return RunImpl(valueBuilder, args); \
+ } catch (const std::exception& ex) { \
+ TStringBuilder sb; \
+ APPEND_SOURCE_LOCATION(sb, valueBuilder, Pos_) \
+ sb << ex.what(); \
+ UdfTerminate(sb.c_str()); \
+ } \
+ } \
+ \
+ private: \
::NYql::NUdf::TUnboxedValue RunConfig; \
::NYql::NUdf::TSourcePosition Pos_; \
- }; \
+ }; \
::NYql::NUdf::TUnboxedValue Run( \
const ::NYql::NUdf::IValueBuilder* valueBuilder, \
const ::NYql::NUdf::TUnboxedValuePod* args) const override { \
- Y_UNUSED(valueBuilder); \
+ Y_UNUSED(valueBuilder); \
return ::NYql::NUdf::TUnboxedValuePod(new TImpl(*this, args[0], Pos_)); \
- } \
- static bool DeclareSignature( \
+ } \
+ static bool DeclareSignature( \
const ::NYql::NUdf::TStringRef& name, \
::NYql::NUdf::TType* userType, \
::NYql::NUdf::IFunctionTypeInfoBuilder& builder, \
- bool typesOnly) { \
- Y_UNUSED(userType); \
- if (Name() == name) { \
- typeBody if (!typesOnly) { \
- builder.Implementation(new udfName(builder)); \
- SetIRImplementation(builder, irResourceId, irFunctionName); \
- } \
- return true; \
- } \
- return false; \
- } \
- private: \
+ bool typesOnly) { \
+ Y_UNUSED(userType); \
+ if (Name() == name) { \
+ typeBody if (!typesOnly) { \
+ builder.Implementation(new udfName(builder)); \
+ SetIRImplementation(builder, irResourceId, irFunctionName); \
+ } \
+ return true; \
+ } \
+ return false; \
+ } \
+ \
+ private: \
::NYql::NUdf::TSourcePosition Pos_; \
- }; \
+ }; \
::NYql::NUdf::TUnboxedValue udfName::TImpl::RunImpl( \
const ::NYql::NUdf::IValueBuilder* valueBuilder, \
const ::NYql::NUdf::TUnboxedValuePod* args) const
@@ -230,7 +234,6 @@ namespace NUdf {
#define SIMPLE_UDF_IMPL(udfName, typeBody, signature, irResourceId, irFunctionName, blockType) \
SIMPLE_UDF_IMPL_EX(udfName, typeBody, signature, irResourceId, irFunctionName, blockType, builder.Implementation(new udfName(builder));)
-
#define SIMPLE_UDF(udfName, signature) \
SIMPLE_UDF_IMPL(udfName, builder.SimpleSignature<signature>();, signature, "", "", void)
@@ -261,25 +264,25 @@ namespace NUdf {
#define SIMPLE_UDF_RUN(udfName, signature, runConfigSignature) \
SIMPLE_UDF_RUN_OPTIONS(udfName, signature, builder.RunConfig<runConfigSignature>())
-#define SIMPLE_MODULE(moduleName, ...) \
- class moduleName: public ::NYql::NUdf::TSimpleUdfModuleHelper<__VA_ARGS__> { \
- public: \
- ::NYql::NUdf::TStringRef Name() const { \
- auto name = ::NYql::NUdf::TStringRef::Of(#moduleName); \
- return name.Substring(1, name.Size() - 7); \
- } \
+#define SIMPLE_MODULE(moduleName, ...) \
+ class moduleName: public ::NYql::NUdf::TSimpleUdfModuleHelper<__VA_ARGS__> { \
+ public: \
+ ::NYql::NUdf::TStringRef Name() const { \
+ auto name = ::NYql::NUdf::TStringRef::Of(#moduleName); \
+ return name.Substring(1, name.Size() - 7); \
+ } \
};
-#define EMPTY_RESULT_ON_EMPTY_ARG(n) \
- if (!args[n]) { \
+#define EMPTY_RESULT_ON_EMPTY_ARG(n) \
+ if (!args[n]) { \
return ::NYql::NUdf::TUnboxedValue(); \
}
namespace NYql {
namespace NUdf {
-template<bool CheckOptional, bool CheckBlock, const char* TFuncName, template<class> class TFunc, typename... TUserTypes>
-class TUserDataTypeFuncFactory : public ::NYql::NUdf::TBoxedValue {
+template <bool CheckOptional, bool CheckBlock, const char* TFuncName, template <class> class TFunc, typename... TUserTypes>
+class TUserDataTypeFuncFactory: public ::NYql::NUdf::TBoxedValue {
public:
typedef bool TTypeAwareMarker;
@@ -308,8 +311,7 @@ public:
return userType;
}
-
- template<typename TUserType>
+ template <typename TUserType>
static bool DeclareSignatureImpl(
const ::NYql::NUdf::TStringRef& name,
TDataTypeId typeId,
@@ -324,7 +326,7 @@ public:
return true;
}
- template<typename TUserType, typename THead, typename... TTail>
+ template <typename TUserType, typename THead, typename... TTail>
static bool DeclareSignatureImpl(
const ::NYql::NUdf::TStringRef& name,
TDataTypeId typeId,
@@ -390,9 +392,8 @@ public:
}
};
-template<CUDF... TUdfs>
-class TSimpleUdfModuleHelper : public IUdfModule
-{
+template <CUDF... TUdfs>
+class TSimpleUdfModuleHelper: public IUdfModule {
Y_HAS_SUBTYPE(TTypeAwareMarker);
Y_HAS_SUBTYPE(TBlockType);
@@ -400,7 +401,7 @@ public:
void CleanupOnTerminate() const override {
}
- template<typename TUdfType>
+ template <typename TUdfType>
void GetAllFunctionsImpl(IFunctionNamesSink& names) const {
auto r = names.Add(TUdfType::Name());
if (THasTTypeAwareMarker<TUdfType>::value) {
@@ -415,20 +416,19 @@ public:
}
}
- template<typename THead1, typename THead2, typename... TTail>
+ template <typename THead1, typename THead2, typename... TTail>
void GetAllFunctionsImpl(IFunctionNamesSink& names) const {
GetAllFunctionsImpl<THead1>(names);
GetAllFunctionsImpl<THead2, TTail...>(names);
}
- template<typename TUdfType>
+ template <typename TUdfType>
bool BuildFunctionTypeInfoImpl(
- const TStringRef& name,
- TType* userType,
- const TStringRef& typeConfig,
- ui32 flags,
- IFunctionTypeInfoBuilder& builder) const
- {
+ const TStringRef& name,
+ TType* userType,
+ const TStringRef& typeConfig,
+ ui32 flags,
+ IFunctionTypeInfoBuilder& builder) const {
Y_UNUSED(typeConfig);
bool typesOnly = (flags & TFlags::TypesOnly);
bool found = TUdfType::DeclareSignature(name, userType, builder, typesOnly);
@@ -443,14 +443,13 @@ public:
return found;
}
- template<typename THead1, typename THead2, typename... TTail>
+ template <typename THead1, typename THead2, typename... TTail>
bool BuildFunctionTypeInfoImpl(
- const TStringRef& name,
- TType* userType,
- const TStringRef& typeConfig,
- ui32 flags,
- IFunctionTypeInfoBuilder& builder) const
- {
+ const TStringRef& name,
+ TType* userType,
+ const TStringRef& typeConfig,
+ ui32 flags,
+ IFunctionTypeInfoBuilder& builder) const {
bool found = BuildFunctionTypeInfoImpl<THead1>(name, userType, typeConfig, flags, builder);
if (!found) {
found = BuildFunctionTypeInfoImpl<THead2, TTail...>(name, userType, typeConfig, flags, builder);
@@ -463,12 +462,11 @@ public:
}
void BuildFunctionTypeInfo(
- const TStringRef& name,
- TType* userType,
- const TStringRef& typeConfig,
- ui32 flags,
- IFunctionTypeInfoBuilder& builder) const override
- {
+ const TStringRef& name,
+ TType* userType,
+ const TStringRef& typeConfig,
+ ui32 flags,
+ IFunctionTypeInfoBuilder& builder) const override {
try {
bool found = BuildFunctionTypeInfoImpl<TUdfs...>(name, userType, typeConfig, flags, builder);
if (!found) {
@@ -480,8 +478,7 @@ public:
builder.SetError(CurrentExceptionMessage());
}
}
-
};
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_log.cpp b/yql/essentials/public/udf/udf_log.cpp
index d9f1327acb2..25983f7e686 100644
--- a/yql/essentials/public/udf/udf_log.cpp
+++ b/yql/essentials/public/udf/udf_log.cpp
@@ -9,7 +9,7 @@ namespace NUdf {
namespace {
-class TNullLogger : public ILogger {
+class TNullLogger: public ILogger {
public:
TLogComponentId RegisterComponent(const TStringRef& component) final {
Y_UNUSED(component);
@@ -38,38 +38,39 @@ public:
}
};
-class TSynchronizedLogger : public ILogger {
+class TSynchronizedLogger: public ILogger {
public:
TSynchronizedLogger(const TLoggerPtr& inner)
: Inner_(inner)
- {}
+ {
+ }
TLogComponentId RegisterComponent(const TStringRef& component) final {
- with_lock(Mutex_) {
+ with_lock (Mutex_) {
return Inner_->RegisterComponent(component);
}
}
void SetDefaultLevel(ELogLevel level) final {
- with_lock(Mutex_) {
+ with_lock (Mutex_) {
Inner_->SetDefaultLevel(level);
}
}
void SetComponentLevel(TLogComponentId component, ELogLevel level) final {
- with_lock(Mutex_) {
+ with_lock (Mutex_) {
Inner_->SetComponentLevel(component, level);
}
}
bool IsActive(TLogComponentId component, ELogLevel level) const final {
- with_lock(Mutex_) {
+ with_lock (Mutex_) {
return Inner_->IsActive(component, level);
}
}
void Log(TLogComponentId component, ELogLevel level, const TStringRef& message) final {
- with_lock(Mutex_) {
+ with_lock (Mutex_) {
Inner_->Log(component, level, message);
}
}
@@ -139,12 +140,13 @@ private:
THashMap<TLogComponentId, ELogLevel> CompLevels_;
};
-class TLogProvider : public ILogProvider {
+class TLogProvider: public ILogProvider {
public:
TLogProvider(TLogProviderFunc func, TMaybe<ELogLevel> filter)
: Func_(func)
, Filter_(filter)
- {}
+ {
+ }
TLoggerPtr MakeLogger() const final {
return new TLogger(Func_, Filter_);
@@ -155,7 +157,7 @@ private:
const TMaybe<ELogLevel> Filter_;
};
-}
+} // namespace
TLoggerPtr MakeNullLogger() {
return new TNullLogger();
@@ -166,7 +168,8 @@ TLoggerPtr MakeSynchronizedLogger(const TLoggerPtr& inner) {
}
#define SWITCH_ENUM_TYPE_TO_STR(name, val) \
- case val: return TStringBuf(#name);
+ case val: \
+ return TStringBuf(#name);
TStringBuf LevelToString(ELogLevel level) {
switch (static_cast<ui32>(level)) {
@@ -177,7 +180,8 @@ TStringBuf LevelToString(ELogLevel level) {
}
#define PARSE_ENUM_TYPE_FROM_STR(name, val) \
- if (#name == str) return static_cast<ELogLevel>(val);
+ if (#name == str) \
+ return static_cast<ELogLevel>(val);
TMaybe<ELogLevel> TryLevelFromString(TStringBuf str) {
UDF_LOG_LEVEL(PARSE_ENUM_TYPE_FROM_STR)
@@ -189,13 +193,12 @@ TMaybe<ELogLevel> TryLevelFromString(TStringBuf str) {
TString LogLevelAvailables() {
return JoinSeq(", ",
- {UDF_LOG_LEVEL(ENUM_STR_JOIN)}
- );
+ {UDF_LOG_LEVEL(ENUM_STR_JOIN)});
}
TUniquePtr<ILogProvider> MakeLogProvider(TLogProviderFunc func, TMaybe<ELogLevel> filter) {
return new TLogProvider(func, filter);
}
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_log.h b/yql/essentials/public/udf/udf_log.h
index b09edef148f..d76c7031509 100644
--- a/yql/essentials/public/udf/udf_log.h
+++ b/yql/essentials/public/udf/udf_log.h
@@ -11,30 +11,30 @@
namespace NYql {
namespace NUdf {
-#define UDF_LOG(logger, component, level, msg) \
-do { \
- if ((logger) && (logger)->IsActive(component, level)) { \
- (logger)->Log(component, level, msg); \
- } \
-} while (0)
-
-#define UDF_LOG_IF(condition, logger, component, level, msg) \
-do { \
- if ((logger) && (condition) && (logger)->IsActive(component, level)) { \
- (logger)->Log(component, level, msg); \
- } \
-} while (0)
+#define UDF_LOG(logger, component, level, msg) \
+ do { \
+ if ((logger) && (logger)->IsActive(component, level)) { \
+ (logger)->Log(component, level, msg); \
+ } \
+ } while (0)
+
+#define UDF_LOG_IF(condition, logger, component, level, msg) \
+ do { \
+ if ((logger) && (condition) && (logger)->IsActive(component, level)) { \
+ (logger)->Log(component, level, msg); \
+ } \
+ } while (0)
#define UDF_LOG_LEVEL(XX) \
- XX(Fatal, 0) \
- XX(Error, 1) \
- XX(Warn, 2) \
- XX(Notice, 3) \
- XX(Info, 4) \
- XX(Debug, 5) \
+ XX(Fatal, 0) \
+ XX(Error, 1) \
+ XX(Warn, 2) \
+ XX(Notice, 3) \
+ XX(Info, 4) \
+ XX(Debug, 5) \
XX(Trace, 6)
-enum class ELogLevel : ui32 {
+enum class ELogLevel: ui32 {
UDF_LOG_LEVEL(ENUM_VALUE_GEN)
};
@@ -48,7 +48,7 @@ TMaybe<ELogLevel> TryLevelFromString(TStringBuf str);
using TLogComponentId = ui32;
-class ILogger : public IRefCounted {
+class ILogger: public IRefCounted {
public:
virtual TLogComponentId RegisterComponent(const TStringRef& component) = 0;
virtual void SetDefaultLevel(ELogLevel level) = 0;
@@ -75,10 +75,10 @@ TLoggerPtr MakeSynchronizedLogger(const TLoggerPtr& inner);
using TLogProviderFunc = std::function<void(const TStringRef&, ELogLevel, const TStringRef&)>;
TUniquePtr<ILogProvider> MakeLogProvider(TLogProviderFunc func, TMaybe<ELogLevel> filter = Nothing());
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
-template<>
-inline void Out<NYql::NUdf::ELogLevel>(IOutputStream &o, NYql::NUdf::ELogLevel value) {
+template <>
+inline void Out<NYql::NUdf::ELogLevel>(IOutputStream& o, NYql::NUdf::ELogLevel value) {
o << NYql::NUdf::LevelToString(value);
}
diff --git a/yql/essentials/public/udf/udf_pg_type_description.h b/yql/essentials/public/udf/udf_pg_type_description.h
index 859dba6c54d..6e242f675b9 100644
--- a/yql/essentials/public/udf/udf_pg_type_description.h
+++ b/yql/essentials/public/udf/udf_pg_type_description.h
@@ -24,5 +24,5 @@ using TPgTypeDescription = TPgTypeDescription1;
UDF_ASSERT_TYPE_SIZE(TPgTypeDescription1, 40);
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_ptr.h b/yql/essentials/public/udf/udf_ptr.h
index 98945c5f5fe..e0a62ce4d30 100644
--- a/yql/essentials/public/udf/udf_ptr.h
+++ b/yql/essentials/public/udf/udf_ptr.h
@@ -13,14 +13,13 @@ struct TDelete {
delete ptr;
}
};
-}
+} // namespace NDetails
///////////////////////////////////////////////////////////////////////////////
// TUniquePtr
///////////////////////////////////////////////////////////////////////////////
template <typename T, typename D = NDetails::TDelete>
-class TUniquePtr
-{
+class TUniquePtr {
public:
inline TUniquePtr(T* ptr = nullptr)
: Ptr_(ptr)
@@ -66,15 +65,24 @@ public:
rhs.Ptr_ = tmp;
}
- inline T* Get() const { return Ptr_; }
- inline T& operator*() const { return *Ptr_; }
- inline T* operator->() const { return Ptr_; }
- inline explicit operator bool() const { return Ptr_ != nullptr; }
+ inline T* Get() const {
+ return Ptr_;
+ }
+ inline T& operator*() const {
+ return *Ptr_;
+ }
+ inline T* operator->() const {
+ return Ptr_;
+ }
+ inline explicit operator bool() const {
+ return Ptr_ != nullptr;
+ }
private:
inline void DoDestroy() {
- if (Ptr_)
+ if (Ptr_) {
D::DoDelete(Ptr_);
+ }
}
private:
@@ -85,8 +93,7 @@ private:
// TRefCountedPtr
///////////////////////////////////////////////////////////////////////////////
template <class T>
-class TDefaultRefCountedPtrOps
-{
+class TDefaultRefCountedPtrOps {
public:
static inline void Ref(T* t) {
Y_ASSERT(t);
@@ -105,11 +112,14 @@ public:
};
template <typename T, typename Ops = TDefaultRefCountedPtrOps<T>>
-class TRefCountedPtr
-{
+class TRefCountedPtr {
public:
- enum AddRef { ADD_REF };
- enum StealRef { STEAL_REF };
+ enum AddRef {
+ ADD_REF
+ };
+ enum StealRef {
+ STEAL_REF
+ };
public:
inline TRefCountedPtr(T* ptr = nullptr)
@@ -188,10 +198,18 @@ public:
return tmp;
}
- inline T* Get() const { return Ptr_; }
- inline T& operator*() const { return *Ptr_; }
- inline T* operator->() const { return Ptr_; }
- inline explicit operator bool() const { return Ptr_ != nullptr; }
+ inline T* Get() const {
+ return Ptr_;
+ }
+ inline T& operator*() const {
+ return *Ptr_;
+ }
+ inline T* operator->() const {
+ return Ptr_;
+ }
+ inline explicit operator bool() const {
+ return Ptr_ != nullptr;
+ }
inline ui32 RefCount() const {
return Ptr_ ? Ops::RefCount(Ptr_) : 0;
@@ -199,7 +217,7 @@ public:
private:
inline void Ref() {
- if (Ptr_){
+ if (Ptr_) {
Ops::Ref(Ptr_);
}
}
@@ -244,5 +262,5 @@ private:
UDF_ASSERT_TYPE_SIZE(IRefCounted, 16);
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_registrator.h b/yql/essentials/public/udf/udf_registrator.h
index 535b9b5199c..9da08ffbb02 100644
--- a/yql/essentials/public/udf/udf_registrator.h
+++ b/yql/essentials/public/udf/udf_registrator.h
@@ -12,37 +12,37 @@
#include <stdarg.h>
#ifdef _win_
-# ifdef BUILD_UDF
-# define YQL_UDF_API __declspec(dllexport)
-# else
-# define YQL_UDF_API __declspec(dllimport)
-# endif
+ #ifdef BUILD_UDF
+ #define YQL_UDF_API __declspec(dllexport)
+ #else
+ #define YQL_UDF_API __declspec(dllimport)
+ #endif
#else
-# define YQL_UDF_API __attribute__ ((visibility("default")))
+ #define YQL_UDF_API __attribute__((visibility("default")))
#endif
#ifdef BUILD_UDF
-#define REGISTER_MODULES(...) \
- extern "C" YQL_UDF_API void Register( \
- ::NYql::NUdf::IRegistrator& registrator, ui32 flags) { \
- Y_UNUSED(flags); \
- ::NYql::NUdf::RegisterHelper<__VA_ARGS__>(registrator); \
- } \
- extern "C" YQL_UDF_API ui32 AbiVersion() { \
- return ::NYql::NUdf::CurrentAbiVersion(); \
- }\
- extern "C" YQL_UDF_API void SetBackTraceCallback(::NYql::NUdf::TBackTraceCallback callback) { \
- ::NYql::NUdf::SetBackTraceCallbackImpl(callback); \
- }
+ #define REGISTER_MODULES(...) \
+ extern "C" YQL_UDF_API void Register( \
+ ::NYql::NUdf::IRegistrator& registrator, ui32 flags) { \
+ Y_UNUSED(flags); \
+ ::NYql::NUdf::RegisterHelper<__VA_ARGS__>(registrator); \
+ } \
+ extern "C" YQL_UDF_API ui32 AbiVersion() { \
+ return ::NYql::NUdf::CurrentAbiVersion(); \
+ } \
+ extern "C" YQL_UDF_API void SetBackTraceCallback(::NYql::NUdf::TBackTraceCallback callback) { \
+ ::NYql::NUdf::SetBackTraceCallbackImpl(callback); \
+ }
#else
-#define REGISTER_MODULES(...) \
- namespace { \
- struct TYqlStaticUdfRegistrator { \
- inline TYqlStaticUdfRegistrator() { \
+ #define REGISTER_MODULES(...) \
+ namespace { \
+ struct TYqlStaticUdfRegistrator { \
+ inline TYqlStaticUdfRegistrator() { \
::NYql::NUdf::AddToStaticUdfRegistry<__VA_ARGS__>(); \
- } \
- } YQL_REGISTRATOR; \
- }
+ } \
+ } YQL_REGISTRATOR; \
+ }
#endif
namespace NYql {
@@ -80,8 +80,7 @@ inline TStaticSymbols GetStaticSymbols();
//////////////////////////////////////////////////////////////////////////////
// IFunctionNamesSink
//////////////////////////////////////////////////////////////////////////////
-class IFunctionDescriptor
-{
+class IFunctionDescriptor {
public:
typedef TUniquePtr<IFunctionDescriptor> TPtr;
@@ -95,8 +94,7 @@ UDF_ASSERT_TYPE_SIZE(IFunctionDescriptor, 8);
//////////////////////////////////////////////////////////////////////////////
// IFunctionNamesSink
//////////////////////////////////////////////////////////////////////////////
-class IFunctionsSink
-{
+class IFunctionsSink {
public:
virtual ~IFunctionsSink() = default;
@@ -110,8 +108,7 @@ typedef IFunctionsSink IFunctionNamesSink;
//////////////////////////////////////////////////////////////////////////////
// IUdfModule
//////////////////////////////////////////////////////////////////////////////
-class IUdfModule
-{
+class IUdfModule {
public:
struct TFlags {
enum {
@@ -125,11 +122,11 @@ public:
virtual void GetAllFunctions(IFunctionsSink& sink) const = 0;
virtual void BuildFunctionTypeInfo(
- const TStringRef& name,
- TType* userType,
- const TStringRef& typeConfig,
- ui32 flags,
- IFunctionTypeInfoBuilder& builder) const = 0;
+ const TStringRef& name,
+ TType* userType,
+ const TStringRef& typeConfig,
+ ui32 flags,
+ IFunctionTypeInfoBuilder& builder) const = 0;
virtual void CleanupOnTerminate() const = 0;
};
@@ -139,8 +136,7 @@ UDF_ASSERT_TYPE_SIZE(IUdfModule, 8);
//////////////////////////////////////////////////////////////////////////////
// TRegistrator
//////////////////////////////////////////////////////////////////////////////
-class IRegistrator
-{
+class IRegistrator {
public:
struct TFlags {
enum {
@@ -152,27 +148,27 @@ public:
virtual ~IRegistrator() = default;
virtual void AddModule(
- const TStringRef& name,
- TUniquePtr<IUdfModule> module) = 0;
+ const TStringRef& name,
+ TUniquePtr<IUdfModule> module) = 0;
};
UDF_ASSERT_TYPE_SIZE(IRegistrator, 8);
-typedef void(*TBackTraceCallback)();
+typedef void (*TBackTraceCallback)();
using TRegisterFunctionPtr = void (*)(IRegistrator& registrator, ui32 flags);
using TAbiVersionFunctionPtr = ui32 (*)();
using TBindSymbolsFunctionPtr = void (*)(const TStaticSymbols& symbols);
-using TSetBackTraceCallbackPtr = void(*)(TBackTraceCallback callback);
+using TSetBackTraceCallbackPtr = void (*)(TBackTraceCallback callback);
-template<typename TModule>
+template <typename TModule>
static inline void RegisterHelper(IRegistrator& registrator) {
TUniquePtr<TModule> ptr(new TModule());
auto name = ptr->Name();
registrator.AddModule(name, ptr.Release());
}
-template<typename THead1, typename THead2, typename... TTail>
+template <typename THead1, typename THead2, typename... TTail>
static inline void RegisterHelper(IRegistrator& registrator) {
RegisterHelper<THead1>(registrator);
RegisterHelper<THead2, TTail...>(registrator);
@@ -180,12 +176,11 @@ static inline void RegisterHelper(IRegistrator& registrator) {
void SetBackTraceCallbackImpl(TBackTraceCallback callback);
-
using TUdfModuleWrapper = std::function<std::pair<TStringRef, TUniquePtr<IUdfModule>>()>;
void AddToStaticUdfRegistry(TUdfModuleWrapper&&);
-template<typename TModule>
+template <typename TModule>
static inline void AddToStaticUdfRegistry() {
AddToStaticUdfRegistry([]() {
TUniquePtr<TModule> ptr(new TModule());
@@ -194,15 +189,14 @@ static inline void AddToStaticUdfRegistry() {
});
}
-template<typename THead1, typename THead2, typename... TTail>
+template <typename THead1, typename THead2, typename... TTail>
static inline void AddToStaticUdfRegistry() {
AddToStaticUdfRegistry<THead1>();
AddToStaticUdfRegistry<THead2, TTail...>();
}
-
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
extern "C" YQL_UDF_API void Register(NYql::NUdf::IRegistrator& registrator, ui32 flags);
extern "C" YQL_UDF_API ui32 AbiVersion();
@@ -221,12 +215,14 @@ Y_PRAGMA_NO_DEPRECATED
inline TStaticSymbols GetStaticSymbols() {
return {&UdfAllocate, &UdfFree, &UdfTerminate, &UdfRegisterObject, &UdfUnregisterObject
-#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8)
- ,&UdfAllocateWithSize, &UdfFreeWithSize
-#endif
-#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 37)
- ,&UdfArrowAllocate, &UdfArrowReallocate, &UdfArrowFree
-#endif
+ #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8)
+ ,
+ &UdfAllocateWithSize, &UdfFreeWithSize
+ #endif
+ #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 37)
+ ,
+ &UdfArrowAllocate, &UdfArrowReallocate, &UdfArrowFree
+ #endif
};
}
@@ -234,5 +230,5 @@ Y_PRAGMA_DIAGNOSTIC_POP
#endif
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_static_registry.cpp b/yql/essentials/public/udf/udf_static_registry.cpp
index b6efa4872cf..05be2ef33dc 100644
--- a/yql/essentials/public/udf/udf_static_registry.cpp
+++ b/yql/essentials/public/udf/udf_static_registry.cpp
@@ -18,5 +18,5 @@ void AddToStaticUdfRegistry(TUdfModuleWrapper&& wrapper) {
StaticUdfModuleWrapperList()->emplace_back(wrapper);
};
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_static_registry.h b/yql/essentials/public/udf/udf_static_registry.h
index e50b05ffaca..75d405bad7b 100644
--- a/yql/essentials/public/udf/udf_static_registry.h
+++ b/yql/essentials/public/udf/udf_static_registry.h
@@ -10,5 +10,5 @@ namespace NUdf {
using TUdfModuleWrapperList = TVector<TUdfModuleWrapper>;
const TUdfModuleWrapperList& GetStaticUdfModuleWrapperList();
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_string.h b/yql/essentials/public/udf/udf_string.h
index 3416f4dce9c..9e7ce0ea7da 100644
--- a/yql/essentials/public/udf/udf_string.h
+++ b/yql/essentials/public/udf/udf_string.h
@@ -16,8 +16,7 @@ namespace NUdf {
//////////////////////////////////////////////////////////////////////////////
// TStringValue
//////////////////////////////////////////////////////////////////////////////
-class TStringValue
-{
+class TStringValue {
friend class TUnboxedValue;
friend class TUnboxedValuePod;
friend class TBlockItem;
@@ -25,25 +24,31 @@ class TStringValue
class TData {
friend class TStringValue;
+
public:
inline TData(ui32 size, ui64 cap)
: Size_(size)
, Refs_(1)
, Capacity_(cap)
- {}
+ {
+ }
- inline i32 RefCount() const { return Refs_; }
+ inline i32 RefCount() const {
+ return Refs_;
+ }
inline void Ref() {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 4)
- if (Refs_ < 0)
+ if (Refs_ < 0) {
return;
+ }
#endif
Refs_++;
}
inline void UnRef() {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 4)
- if (Refs_ < 0)
+ if (Refs_ < 0) {
return;
+ }
#endif
Y_DEBUG_ABORT_UNLESS(Refs_ > 0);
if (!--Refs_) {
@@ -56,16 +61,18 @@ class TStringValue
}
inline void ReleaseRef() {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 4)
- if (Refs_ < 0)
+ if (Refs_ < 0) {
return;
+ }
#endif
Y_DEBUG_ABORT_UNLESS(Refs_ > 0);
--Refs_;
}
inline void DeleteUnreferenced() {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 4)
- if (Refs_ < 0)
+ if (Refs_ < 0) {
return;
+ }
#endif
if (!Refs_) {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8)
@@ -76,10 +83,18 @@ class TStringValue
}
}
- inline char* Data() const { return (char*)(this+1); }
- inline ui32 Size() const { return Size_; }
- inline bool Empty() const { return Size_ == 0; }
- inline ui64 Capacity() const { return Capacity_; }
+ inline char* Data() const {
+ return (char*)(this + 1);
+ }
+ inline ui32 Size() const {
+ return Size_;
+ }
+ inline bool Empty() const {
+ return Size_ == 0;
+ }
+ inline ui64 Capacity() const {
+ return Capacity_;
+ }
inline i32 LockRef() noexcept {
Y_DEBUG_ABORT_UNLESS(Refs_ != -1);
@@ -110,23 +125,42 @@ class TStringValue
private:
ui32 Size_;
- i32 Refs_;
+ i32 Refs_;
ui64 Capacity_;
};
UDF_ASSERT_TYPE_SIZE(TData, 16);
public:
- inline explicit TStringValue(ui32 size): Data_(AllocateData(size, size)) {}
- inline explicit TStringValue(TData* data): Data_(data) { Ref(); }
- inline explicit TStringValue(TStringRef data): Data_(AllocateData(data.Size(), data.Size())) {
+ inline explicit TStringValue(ui32 size)
+ : Data_(AllocateData(size, size))
+ {
+ }
+ inline explicit TStringValue(TData* data)
+ : Data_(data)
+ {
+ Ref();
+ }
+ inline explicit TStringValue(TStringRef data)
+ : Data_(AllocateData(data.Size(), data.Size()))
+ {
memcpy(Data_->Data(), data.Data(), data.Size());
}
- inline TStringValue(const TStringValue& rhs): Data_(rhs.Data_) { Ref(); }
- inline TStringValue(TStringValue&& rhs): Data_(rhs.Data_) { rhs.Data_ = nullptr; }
+ inline TStringValue(const TStringValue& rhs)
+ : Data_(rhs.Data_)
+ {
+ Ref();
+ }
+ inline TStringValue(TStringValue&& rhs)
+ : Data_(rhs.Data_)
+ {
+ rhs.Data_ = nullptr;
+ }
- inline ~TStringValue() { UnRef(); }
+ inline ~TStringValue() {
+ UnRef();
+ }
inline TStringValue& operator=(const TStringValue& rhs) {
if (this != &rhs) {
@@ -148,12 +182,22 @@ public:
return *this;
}
- inline ui64 Capacity() const { return Data_->Capacity(); }
- inline ui32 Size() const { return Data_->Size(); }
- inline char* Data() const { return Data_->Data(); }
+ inline ui64 Capacity() const {
+ return Data_->Capacity();
+ }
+ inline ui32 Size() const {
+ return Data_->Size();
+ }
+ inline char* Data() const {
+ return Data_->Data();
+ }
- inline ui32 size() const { return Data_->Size(); }
- inline char* data() const { return Data_->Data(); }
+ inline ui32 size() const {
+ return Data_->Size();
+ }
+ inline char* data() const {
+ return Data_->Data();
+ }
inline void Ref() {
if (Data_ != nullptr) {
@@ -180,8 +224,9 @@ public:
}
bool TryExpandOn(ui32 len) {
- if (RefCount() < 0)
- return false;
+ if (RefCount() < 0) {
+ return false;
+ }
return Data_->TryExpandOn(len);
}
@@ -213,9 +258,9 @@ public:
const auto alligned = AlignUp<ui64>(cap, 16ULL);
const auto dataSize = sizeof(TData) + alligned;
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8)
- return ::new(UdfAllocateWithSize(dataSize)) TData(len, alligned);
+ return ::new (UdfAllocateWithSize(dataSize)) TData(len, alligned);
#else
- return ::new(UdfAllocate(dataSize)) TData(len, alligned);
+ return ::new (UdfAllocate(dataSize)) TData(len, alligned);
#endif
}
@@ -225,5 +270,5 @@ private:
UDF_ASSERT_TYPE_SIZE(TStringValue, 8);
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_string_ref.h b/yql/essentials/public/udf/udf_string_ref.h
index cee321a8b66..cfe6addc14b 100644
--- a/yql/essentials/public/udf/udf_string_ref.h
+++ b/yql/essentials/public/udf/udf_string_ref.h
@@ -14,9 +14,8 @@ namespace NUdf {
//////////////////////////////////////////////////////////////////////////////
// TStringRefBase
//////////////////////////////////////////////////////////////////////////////
-template<bool Const>
-class TStringRefBase
-{
+template <bool Const>
+class TStringRefBase {
public:
typedef std::conditional_t<Const, const char*, char*> TDataType;
@@ -26,18 +25,35 @@ protected:
inline constexpr TStringRefBase(TDataType data, ui32 size) noexcept
: Data_(data)
, Size_(size)
- {}
+ {
+ }
public:
- inline constexpr operator std::string_view() const noexcept { return { Data_, Size_ }; }
- inline constexpr operator TStringBuf() const noexcept { return { Data_, Size_ }; }
- inline constexpr TDataType Data() const noexcept { return Data_; }
- inline constexpr ui32 Size() const noexcept { return Size_; }
- inline constexpr bool Empty() const noexcept { return Size_ == 0; }
+ inline constexpr operator std::string_view() const noexcept {
+ return {Data_, Size_};
+ }
+ inline constexpr operator TStringBuf() const noexcept {
+ return {Data_, Size_};
+ }
+ inline constexpr TDataType Data() const noexcept {
+ return Data_;
+ }
+ inline constexpr ui32 Size() const noexcept {
+ return Size_;
+ }
+ inline constexpr bool Empty() const noexcept {
+ return Size_ == 0;
+ }
- inline constexpr TDataType data() const noexcept { return Data_; }
- inline constexpr ui32 size() const noexcept { return Size_; }
- inline constexpr bool empty() const noexcept { return Size_ == 0; }
+ inline constexpr TDataType data() const noexcept {
+ return Data_;
+ }
+ inline constexpr ui32 size() const noexcept {
+ return Size_;
+ }
+ inline constexpr bool empty() const noexcept {
+ return Size_ == 0;
+ }
protected:
TDataType Data_ = nullptr;
@@ -48,14 +64,14 @@ protected:
//////////////////////////////////////////////////////////////////////////////
// TMutableStringRef
//////////////////////////////////////////////////////////////////////////////
-class TMutableStringRef : public TStringRefBase<false>
-{
+class TMutableStringRef: public TStringRefBase<false> {
public:
typedef TStringRefBase<false> TBase;
inline constexpr TMutableStringRef(TDataType data, ui32 size) noexcept
: TBase(data, size)
- {}
+ {
+ }
};
UDF_ASSERT_TYPE_SIZE(TMutableStringRef, 16);
@@ -63,8 +79,7 @@ UDF_ASSERT_TYPE_SIZE(TMutableStringRef, 16);
//////////////////////////////////////////////////////////////////////////////
// TStringRef
//////////////////////////////////////////////////////////////////////////////
-class TStringRef : public TStringRefBase<true>
-{
+class TStringRef: public TStringRefBase<true> {
public:
typedef TStringRefBase<true> TBase;
@@ -72,24 +87,28 @@ public:
inline constexpr TStringRef(TDataType data, ui32 size) noexcept
: TBase(data, size)
- {}
+ {
+ }
- template<size_t Size>
+ template <size_t Size>
inline constexpr TStringRef(const char (&data)[Size]) noexcept
: TBase(data, Size - 1)
- {}
+ {
+ }
inline constexpr TStringRef(const TMutableStringRef& buf) noexcept
: TBase(buf.Data(), buf.Size())
- {}
+ {
+ }
template <typename TStringType>
inline constexpr TStringRef(const TStringType& buf) noexcept
: TBase(TGetData<TStringType>::Get(buf), TGetSize<TStringType>::Get(buf))
- {}
+ {
+ }
template <size_t size>
- inline static constexpr TStringRef Of(const char(&str)[size]) noexcept {
+ inline static constexpr TStringRef Of(const char (&str)[size]) noexcept {
return TStringRef(str);
}
@@ -137,50 +156,51 @@ public:
private:
inline static constexpr i64 Compare(const TStringRef& s1, const TStringRef& s2) noexcept {
auto minSize = std::min(s1.Size(), s2.Size());
- if (const auto result = minSize > 0 ? std::memcmp(s1.Data(), s2.Data(), minSize) : 0)
+ if (const auto result = minSize > 0 ? std::memcmp(s1.Data(), s2.Data(), minSize) : 0) {
return result;
+ }
return i64(s1.Size()) - i64(s2.Size());
}
Y_HAS_MEMBER(Data);
Y_HAS_MEMBER(Size);
- template<typename TStringType>
+ template <typename TStringType>
struct TByData {
static constexpr auto Get(const TStringType& buf) noexcept {
return buf.data();
}
};
- template<typename TStringType>
+ template <typename TStringType>
struct TBySize {
static constexpr auto Get(const TStringType& buf) noexcept {
return buf.size();
}
};
- template<typename TStringType>
+ template <typename TStringType>
struct TBydata {
static constexpr auto Get(const TStringType& buf) noexcept {
return buf.data();
}
};
- template<typename TStringType>
+ template <typename TStringType>
struct TBysize {
static constexpr auto Get(const TStringType& buf) noexcept {
return buf.size();
}
};
- template<typename TStringType>
+ template <typename TStringType>
using TGetData = std::conditional_t<THasData<TStringType>::value, TByData<TStringType>, TBydata<TStringType>>;
- template<typename TStringType>
+ template <typename TStringType>
using TGetSize = std::conditional_t<THasSize<TStringType>::value, TBySize<TStringType>, TBysize<TStringType>>;
};
UDF_ASSERT_TYPE_SIZE(TStringRef, 16);
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_terminator.h b/yql/essentials/public/udf/udf_terminator.h
index b94c7975d33..f8b4767674e 100644
--- a/yql/essentials/public/udf/udf_terminator.h
+++ b/yql/essentials/public/udf/udf_terminator.h
@@ -3,9 +3,9 @@
namespace NYql {
namespace NUdf {
- class TBoxedValue;
-}
-}
+class TBoxedValue;
+} // namespace NUdf
+} // namespace NYql
extern "C" [[noreturn]] void UdfTerminate(const char* message);
extern "C" void UdfRegisterObject(::NYql::NUdf::TBoxedValue* object);
diff --git a/yql/essentials/public/udf/udf_type_builder.cpp b/yql/essentials/public/udf/udf_type_builder.cpp
index 321d36685c7..70e73297307 100644
--- a/yql/essentials/public/udf/udf_type_builder.cpp
+++ b/yql/essentials/public/udf/udf_type_builder.cpp
@@ -4,7 +4,8 @@ namespace NYql {
namespace NUdf {
IFunctionTypeInfoBuilder::IFunctionTypeInfoBuilder()
-{}
+{
+}
} // namespace NUdf
} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_type_builder.h b/yql/essentials/public/udf/udf_type_builder.h
index 4cb08c89ecc..3b8b6c7dc6f 100644
--- a/yql/essentials/public/udf/udf_type_builder.h
+++ b/yql/essentials/public/udf/udf_type_builder.h
@@ -27,16 +27,24 @@ public:
};
template <typename T>
-struct TAutoMap { using ItemType = T; };
+struct TAutoMap {
+ using ItemType = T;
+};
template <typename T>
-struct TOptional { using ItemType = T; };
+struct TOptional {
+ using ItemType = T;
+};
template <typename T, const char* Name>
-struct TNamedArg { using ItemType = T; };
+struct TNamedArg {
+ using ItemType = T;
+};
template <typename T>
-struct TListType { using ItemType = T; };
+struct TListType {
+ using ItemType = T;
+};
template <typename TKey, typename TValue>
struct TDict {
@@ -59,30 +67,39 @@ template <typename... TArgs>
struct TVariant;
template <typename T>
-struct TStream { using ItemType = T; };
+struct TStream {
+ using ItemType = T;
+};
template <typename T, const char* Tag>
-struct TTagged { using BaseType = T; };
+struct TTagged {
+ using BaseType = T;
+};
template <ui32 TypeId>
struct TPg;
template <typename T>
-struct TBlockType { using ItemType = T; };
+struct TBlockType {
+ using ItemType = T;
+};
template <typename T>
-struct TScalarType { using ItemType = T; };
+struct TScalarType {
+ using ItemType = T;
+};
template <typename T, bool IsDynamic = false>
-struct TLinear { using ItemType = T; };
+struct TLinear {
+ using ItemType = T;
+};
struct TVoid {};
//////////////////////////////////////////////////////////////////////////////
// ITypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class ITypeBuilder
-{
+class ITypeBuilder {
public:
virtual ~ITypeBuilder() = default;
@@ -94,8 +111,7 @@ UDF_ASSERT_TYPE_SIZE(ITypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// IOptionalTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class IOptionalTypeBuilder: public ITypeBuilder
-{
+class IOptionalTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<IOptionalTypeBuilder>;
@@ -115,8 +131,7 @@ UDF_ASSERT_TYPE_SIZE(IOptionalTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// IListTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class IListTypeBuilder: public ITypeBuilder
-{
+class IListTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<IListTypeBuilder>;
@@ -136,8 +151,7 @@ UDF_ASSERT_TYPE_SIZE(IListTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// IVariantTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class IVariantTypeBuilder : public ITypeBuilder
-{
+class IVariantTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<IVariantTypeBuilder>;
@@ -152,8 +166,7 @@ UDF_ASSERT_TYPE_SIZE(IVariantTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// IStreamTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class IStreamTypeBuilder : public ITypeBuilder
-{
+class IStreamTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<IStreamTypeBuilder>;
@@ -173,8 +186,7 @@ UDF_ASSERT_TYPE_SIZE(IStreamTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// IDictTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class IDictTypeBuilder: public ITypeBuilder
-{
+class IDictTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<IDictTypeBuilder>;
@@ -203,8 +215,7 @@ UDF_ASSERT_TYPE_SIZE(IDictTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// ISetTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class ISetTypeBuilder: public ITypeBuilder
-{
+class ISetTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<ISetTypeBuilder>;
@@ -224,29 +235,28 @@ UDF_ASSERT_TYPE_SIZE(ISetTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// IStructTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class IStructTypeBuilder: public ITypeBuilder
-{
+class IStructTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<IStructTypeBuilder>;
public:
template <typename T, typename = std::enable_if_t<TKnownDataType<T>::Result>>
inline IStructTypeBuilder& AddField(
- const TStringRef& name, ui32* index)
+ const TStringRef& name, ui32* index)
{
return AddField(name, TDataType<T>::Id, index);
}
virtual IStructTypeBuilder& AddField(
- const TStringRef& name, TDataTypeId type, ui32* index) = 0;
+ const TStringRef& name, TDataTypeId type, ui32* index) = 0;
virtual IStructTypeBuilder& AddField(
- const TStringRef& name, const TType* type, ui32* index) = 0;
+ const TStringRef& name, const TType* type, ui32* index) = 0;
virtual IStructTypeBuilder& AddField(
- const TStringRef& name,
- const ITypeBuilder& typeBuilder,
- ui32* index) = 0;
+ const TStringRef& name,
+ const ITypeBuilder& typeBuilder,
+ ui32* index) = 0;
};
UDF_ASSERT_TYPE_SIZE(IStructTypeBuilder, 8);
@@ -254,14 +264,13 @@ UDF_ASSERT_TYPE_SIZE(IStructTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// IEnumTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class IEnumTypeBuilder: public ITypeBuilder
-{
+class IEnumTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<IEnumTypeBuilder>;
public:
virtual IEnumTypeBuilder& AddField(
- const TStringRef& name, ui32* index) = 0;
+ const TStringRef& name, ui32* index) = 0;
};
UDF_ASSERT_TYPE_SIZE(IEnumTypeBuilder, 8);
@@ -269,8 +278,7 @@ UDF_ASSERT_TYPE_SIZE(IEnumTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// ITupleTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class ITupleTypeBuilder: public ITypeBuilder
-{
+class ITupleTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<ITupleTypeBuilder>;
@@ -290,8 +298,7 @@ UDF_ASSERT_TYPE_SIZE(ITupleTypeBuilder, 8);
//////////////////////////////////////////////////////////////////////////////
// ICallableTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class ICallableTypeBuilder: public ITypeBuilder
-{
+class ICallableTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<ICallableTypeBuilder>;
@@ -332,8 +339,7 @@ class IFunctionTypeInfoBuilder;
//////////////////////////////////////////////////////////////////////////////
// IFunctionArgTypesBuilder
//////////////////////////////////////////////////////////////////////////////
-class IFunctionArgTypesBuilder
-{
+class IFunctionArgTypesBuilder {
public:
using TPtr = TUniquePtr<IFunctionArgTypesBuilder>;
@@ -373,7 +379,7 @@ UDF_ASSERT_TYPE_SIZE(IFunctionArgTypesBuilder, 16);
//////////////////////////////////////////////////////////////////////////////
// IHash
//////////////////////////////////////////////////////////////////////////////
-class IHash : public IRefCounted {
+class IHash: public IRefCounted {
public:
using TPtr = TRefCountedPtr<IHash>;
@@ -385,7 +391,7 @@ UDF_ASSERT_TYPE_SIZE(IHash, 16);
//////////////////////////////////////////////////////////////////////////////
// IEquate
//////////////////////////////////////////////////////////////////////////////
-class IEquate : public IRefCounted {
+class IEquate: public IRefCounted {
public:
using TPtr = TRefCountedPtr<IEquate>;
@@ -397,7 +403,7 @@ UDF_ASSERT_TYPE_SIZE(IEquate, 16);
//////////////////////////////////////////////////////////////////////////////
// ICompare
//////////////////////////////////////////////////////////////////////////////
-class ICompare : public IRefCounted {
+class ICompare: public IRefCounted {
public:
using TPtr = TRefCountedPtr<ICompare>;
@@ -411,14 +417,15 @@ UDF_ASSERT_TYPE_SIZE(ICompare, 16);
//////////////////////////////////////////////////////////////////////////////
// IBlockTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class IBlockTypeBuilder: public ITypeBuilder
-{
+class IBlockTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<IBlockTypeBuilder>;
explicit IBlockTypeBuilder(bool isScalar)
: IsScalar_(isScalar)
- {}
+ {
+ }
+
public:
template <typename T, typename = std::enable_if_t<TKnownDataType<T>::Result>>
inline IBlockTypeBuilder& Item() {
@@ -438,14 +445,15 @@ UDF_ASSERT_TYPE_SIZE(IBlockTypeBuilder, 16);
//////////////////////////////////////////////////////////////////////////////
// ILinearTypeBuilder
//////////////////////////////////////////////////////////////////////////////
-class ILinearTypeBuilder: public ITypeBuilder
-{
+class ILinearTypeBuilder: public ITypeBuilder {
public:
using TPtr = TUniquePtr<ILinearTypeBuilder>;
explicit ILinearTypeBuilder(bool isDynamic)
: IsDynamic_(isDynamic)
- {}
+ {
+ }
+
public:
template <typename T, typename = std::enable_if_t<TKnownDataType<T>::Result>>
inline ILinearTypeBuilder& Item() {
@@ -467,21 +475,28 @@ UDF_ASSERT_TYPE_SIZE(ILinearTypeBuilder, 16);
//////////////////////////////////////////////////////////////////////////////
namespace NImpl {
-template <typename T> struct TSimpleSignatureHelper;
-template <typename T> struct TSimpleSignatureTypeHelper;
-template <typename T> struct TTypeBuilderHelper;
-template <typename... TArgs> struct TArgsHelper;
-template <typename... TArgs> struct TTupleHelper;
-template <typename... TArgs> struct TCallableArgsHelper;
+template <typename T>
+struct TSimpleSignatureHelper;
+template <typename T>
+struct TSimpleSignatureTypeHelper;
+template <typename T>
+struct TTypeBuilderHelper;
+template <typename... TArgs>
+struct TArgsHelper;
+template <typename... TArgs>
+struct TTupleHelper;
+template <typename... TArgs>
+struct TCallableArgsHelper;
-} // namspace NImpl
+} // namespace NImpl
struct TSourcePosition {
TSourcePosition(ui32 row = 0, ui32 column = 0, TStringRef file = {})
: Row(row)
, Column(column)
, File(file)
- {}
+ {
+ }
ui32 Row;
ui32 Column;
@@ -495,14 +510,13 @@ inline IOutputStream& operator<<(IOutputStream& os, const TSourcePosition& pos)
return os;
}
-class IFunctionTypeInfoBuilder1
-{
+class IFunctionTypeInfoBuilder1 {
public:
virtual ~IFunctionTypeInfoBuilder1() = default;
// function implementation
virtual IFunctionTypeInfoBuilder1& ImplementationImpl(
- TUniquePtr<IBoxedValue> impl) = 0;
+ TUniquePtr<IBoxedValue> impl) = 0;
virtual IFunctionTypeInfoBuilder1& ReturnsImpl(TDataTypeId type) = 0;
virtual IFunctionTypeInfoBuilder1& ReturnsImpl(const TType* type) = 0;
@@ -594,8 +608,7 @@ public:
virtual IFunctionTypeInfoBuilder7& IRImplementationImpl(
const TStringRef& moduleIR,
const TStringRef& moduleIRUniqId,
- const TStringRef& functionName
- ) = 0;
+ const TStringRef& functionName) = 0;
};
#endif
@@ -740,7 +753,7 @@ public:
IFunctionTypeInfoBuilder();
IFunctionTypeInfoBuilder& Implementation(
- TUniquePtr<IBoxedValue> impl) {
+ TUniquePtr<IBoxedValue> impl) {
ImplementationImpl(std::move(impl));
return *this;
}
@@ -852,8 +865,7 @@ public:
IFunctionTypeInfoBuilder& IRImplementation(
const TStringRef& moduleIR,
const TStringRef& moduleIRUniqId,
- const TStringRef& functionName
- ) {
+ const TStringRef& functionName) {
IRImplementationImpl(moduleIR, moduleIRUniqId, functionName);
return *this;
}
@@ -869,8 +881,8 @@ namespace NImpl {
template <typename T>
struct TTypeBuilderHelper {
static TType* Build(
- const IFunctionTypeInfoBuilder& builder,
- std::enable_if_t<TKnownDataType<T>::Result>* = nullptr)
+ const IFunctionTypeInfoBuilder& builder,
+ std::enable_if_t<TKnownDataType<T>::Result>* = nullptr)
{
return builder.Primitive(TDataType<T>::Id);
}
@@ -902,38 +914,28 @@ struct TTypeBuilderHelper<TResource<Tag>> {
template <typename T>
struct TTypeBuilderHelper<TListType<T>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
- return builder.List()->
- Item(TTypeBuilderHelper<T>::Build(builder))
- .Build();
+ return builder.List()->Item(TTypeBuilderHelper<T>::Build(builder)).Build();
}
};
template <typename T>
struct TTypeBuilderHelper<TOptional<T>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
- return builder.Optional()->
- Item(TTypeBuilderHelper<T>::Build(builder))
- .Build();
+ return builder.Optional()->Item(TTypeBuilderHelper<T>::Build(builder)).Build();
}
};
template <typename TKey, typename TValue>
struct TTypeBuilderHelper<TDict<TKey, TValue>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
- return builder.Dict()->
- Key(TTypeBuilderHelper<TKey>::Build(builder))
- .Value(TTypeBuilderHelper<TValue>::Build(builder))
- .Build();
+ return builder.Dict()->Key(TTypeBuilderHelper<TKey>::Build(builder)).Value(TTypeBuilderHelper<TValue>::Build(builder)).Build();
}
};
template <typename TKey>
struct TTypeBuilderHelper<TSetType<TKey>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
- return builder.Dict()->
- Key(TTypeBuilderHelper<TKey>::Build(builder))
- .Value(builder.Void())
- .Build();
+ return builder.Dict()->Key(TTypeBuilderHelper<TKey>::Build(builder)).Value(builder.Void()).Build();
}
};
@@ -947,9 +949,7 @@ struct TTypeBuilderHelper<TVoid> {
template <typename T>
struct TTypeBuilderHelper<TStream<T>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
- return builder.Stream()->
- Item(TTypeBuilderHelper<T>::Build(builder))
- .Build();
+ return builder.Stream()->Item(TTypeBuilderHelper<T>::Build(builder)).Build();
}
};
@@ -958,7 +958,7 @@ template <typename T, const char* Tag>
struct TTypeBuilderHelper<TTagged<T, Tag>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
return builder.Tagged(TTypeBuilderHelper<T>::Build(builder),
- TStringRef(Tag, std::strlen(Tag)));
+ TStringRef(Tag, std::strlen(Tag)));
}
};
#endif
@@ -976,18 +976,14 @@ struct TTypeBuilderHelper<TPg<TypeId>> {
template <typename T>
struct TTypeBuilderHelper<TBlockType<T>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
- return builder.Block(false)->
- Item(TTypeBuilderHelper<T>::Build(builder))
- .Build();
+ return builder.Block(false)->Item(TTypeBuilderHelper<T>::Build(builder)).Build();
}
};
template <typename T>
struct TTypeBuilderHelper<TScalarType<T>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
- return builder.Block(true)->
- Item(TTypeBuilderHelper<T>::Build(builder))
- .Build();
+ return builder.Block(true)->Item(TTypeBuilderHelper<T>::Build(builder)).Build();
}
};
#endif
@@ -996,9 +992,7 @@ struct TTypeBuilderHelper<TScalarType<T>> {
template <typename T, bool IsDynamic>
struct TTypeBuilderHelper<TLinear<T, IsDynamic>> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
- return builder.Linear(IsDynamic)->
- Item(TTypeBuilderHelper<T>::Build(builder))
- .Build();
+ return builder.Linear(IsDynamic)->Item(TTypeBuilderHelper<T>::Build(builder)).Build();
}
};
@@ -1007,18 +1001,19 @@ struct TTypeBuilderHelper<TLinear<T, IsDynamic>> {
template <>
struct TCallableArgsHelper<> {
static void Arg(
- ICallableTypeBuilder& callableBuilder,
- const IFunctionTypeInfoBuilder& builder)
+ ICallableTypeBuilder& callableBuilder,
+ const IFunctionTypeInfoBuilder& builder)
{
- Y_UNUSED(callableBuilder); Y_UNUSED(builder);
+ Y_UNUSED(callableBuilder);
+ Y_UNUSED(builder);
}
};
template <typename TArg, typename... TArgs>
struct TCallableArgsHelper<TArg, TArgs...> {
static void Arg(
- ICallableTypeBuilder& callableBuilder,
- const IFunctionTypeInfoBuilder& builder)
+ ICallableTypeBuilder& callableBuilder,
+ const IFunctionTypeInfoBuilder& builder)
{
callableBuilder.Arg(TTypeBuilderHelper<TArg>::Build(builder));
TCallableArgsHelper<TArgs...>::Arg(callableBuilder, builder);
@@ -1028,28 +1023,28 @@ struct TCallableArgsHelper<TArg, TArgs...> {
template <typename TArg, typename... TArgs>
struct TCallableArgsHelper<TAutoMap<TArg>, TArgs...> {
static void Arg(
- ICallableTypeBuilder& callableBuilder,
- const IFunctionTypeInfoBuilder& builder)
+ ICallableTypeBuilder& callableBuilder,
+ const IFunctionTypeInfoBuilder& builder)
{
callableBuilder.Arg(TTypeBuilderHelper<TArg>::Build(builder))
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 38)
- // XXX: Unfortunately, ICallableTypeBuilder provides Flags
- // method only since UDF ABI 2.38. However, AutoMap flag
- // has been silently ignored by this builder and also by
- // the TTypeBuilderHelper specialization for AutoMap type.
- // Hence, the correct AutoMap type processing is wrapped
- // with this compatibility macro, since the caller of
- // ICallableTypeBuilder has to explicitly set AutoMap flag
- // for the particular argument anyway.
- .Flags(ICallablePayload::TArgumentFlags::AutoMap)
+ // XXX: Unfortunately, ICallableTypeBuilder provides Flags
+ // method only since UDF ABI 2.38. However, AutoMap flag
+ // has been silently ignored by this builder and also by
+ // the TTypeBuilderHelper specialization for AutoMap type.
+ // Hence, the correct AutoMap type processing is wrapped
+ // with this compatibility macro, since the caller of
+ // ICallableTypeBuilder has to explicitly set AutoMap flag
+ // for the particular argument anyway.
+ .Flags(ICallablePayload::TArgumentFlags::AutoMap)
#endif
- ;
+ ;
TCallableArgsHelper<TArgs...>::Arg(callableBuilder, builder);
}
};
template <typename TReturn, typename... TArgs>
-struct TTypeBuilderHelper<TReturn(*)(TArgs...)> {
+struct TTypeBuilderHelper<TReturn (*)(TArgs...)> {
static TType* Build(const IFunctionTypeInfoBuilder& builder) {
auto callableBuilder = builder.Callable(sizeof...(TArgs));
callableBuilder->Returns(TTypeBuilderHelper<TReturn>::Build(builder));
@@ -1061,8 +1056,8 @@ struct TTypeBuilderHelper<TReturn(*)(TArgs...)> {
template <typename TArg, typename... TArgs>
struct TTupleHelper<TArg, TArgs...> {
static void Add(
- ITupleTypeBuilder& tupleBuilder,
- const IFunctionTypeInfoBuilder& builder)
+ ITupleTypeBuilder& tupleBuilder,
+ const IFunctionTypeInfoBuilder& builder)
{
tupleBuilder.Add(TTypeBuilderHelper<TArg>::Build(builder));
TTupleHelper<TArgs...>::Add(tupleBuilder, builder);
@@ -1072,10 +1067,11 @@ struct TTupleHelper<TArg, TArgs...> {
template <>
struct TTupleHelper<> {
static void Add(
- ITupleTypeBuilder& tupleBuilder,
- const IFunctionTypeInfoBuilder& builder)
+ ITupleTypeBuilder& tupleBuilder,
+ const IFunctionTypeInfoBuilder& builder)
{
- Y_UNUSED(tupleBuilder); Y_UNUSED(builder);
+ Y_UNUSED(tupleBuilder);
+ Y_UNUSED(builder);
}
};
@@ -1108,10 +1104,10 @@ struct TArgsHelper<> {
template <typename TArg, typename... TArgs>
struct TArgsHelper<TAutoMap<TArg>, TArgs...> {
- static void Add(IFunctionArgTypesBuilder& builder, const char* name = nullptr, ui64 flags = 0) {
- TArgsHelper<TArg>::Add(builder, name, flags | ICallablePayload::TArgumentFlags::AutoMap);
- TArgsHelper<TArgs...>::Add(builder);
- }
+ static void Add(IFunctionArgTypesBuilder& builder, const char* name = nullptr, ui64 flags = 0) {
+ TArgsHelper<TArg>::Add(builder, name, flags | ICallablePayload::TArgumentFlags::AutoMap);
+ TArgsHelper<TArgs...>::Add(builder);
+ }
};
template <const char* Name, typename TArg, typename... TArgs>
@@ -1120,7 +1116,7 @@ struct TArgsHelper<TNamedArg<TArg, Name>, TArgs...> {
Y_UNUSED(name);
TArgsHelper<TOptional<TArg>>::Add(builder, Name, flags);
TArgsHelper<TArgs...>::Add(builder);
- }
+ }
};
template <typename TArg, typename... TArgs>
@@ -1156,7 +1152,7 @@ struct TSimpleSignatureTypeHelper<TReturn(TArgs...)> {
}
};
-} // namspace NImpl
+} // namespace NImpl
template <typename T>
inline IFunctionArgTypesBuilder& IFunctionArgTypesBuilder::Add()
diff --git a/yql/essentials/public/udf/udf_type_inspection.cpp b/yql/essentials/public/udf/udf_type_inspection.cpp
index 88b5940a584..2e096e83427 100644
--- a/yql/essentials/public/udf/udf_type_inspection.cpp
+++ b/yql/essentials/public/udf/udf_type_inspection.cpp
@@ -128,5 +128,5 @@ TLinearTypeInspector::TLinearTypeInspector(const ITypeInfoHelper1& typeHelper, c
}
}
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_type_inspection.h b/yql/essentials/public/udf/udf_type_inspection.h
index 31aa66cdd96..93c9a45c8bf 100644
--- a/yql/essentials/public/udf/udf_type_inspection.h
+++ b/yql/essentials/public/udf/udf_type_inspection.h
@@ -6,42 +6,40 @@
#include <library/cpp/containers/stack_vector/stack_vec.h> // TSmallVec
#include <util/generic/algorithm.h>
-#include <util/system/yassert.h> // FAIL, VERIFY_DEBUG
+#include <util/system/yassert.h> // FAIL, VERIFY_DEBUG
#include <util/generic/ylimits.h> // Max
-
namespace NYql {
namespace NUdf {
//////////////////////////////////////////////////////////////////////////////
// TStubTypeVisitor
//////////////////////////////////////////////////////////////////////////////
-class TStubTypeVisitor1: public ITypeVisitor
-{
+class TStubTypeVisitor1: public ITypeVisitor {
protected:
using ITypeVisitor::ITypeVisitor;
+
private:
void OnDataType(TDataTypeId typeId) override;
void OnStruct(
- ui32 membersCount,
- TStringRef* membersNames,
- const TType** membersTypes) override;
+ ui32 membersCount,
+ TStringRef* membersNames,
+ const TType** membersTypes) override;
void OnList(const TType* itemType) override;
void OnOptional(const TType* itemType) override;
void OnTuple(ui32 elementsCount, const TType** elementsTypes) override;
void OnDict(const TType* keyType, const TType* valueType) override;
void OnCallable(
- const TType* returnType,
- ui32 argsCount, const TType** argsTypes,
- ui32 optionalArgsCount,
- const ICallablePayload* payload) override;
+ const TType* returnType,
+ ui32 argsCount, const TType** argsTypes,
+ ui32 optionalArgsCount,
+ const ICallablePayload* payload) override;
void OnVariant(const TType* underlyingType) override;
void OnStream(const TType* itemType) override;
};
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 13)
-class TStubTypeVisitor2: public TStubTypeVisitor1
-{
+class TStubTypeVisitor2: public TStubTypeVisitor1 {
public:
using TStubTypeVisitor1::TStubTypeVisitor1;
@@ -49,8 +47,7 @@ public:
};
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 15)
-class TStubTypeVisitor3: public TStubTypeVisitor2
-{
+class TStubTypeVisitor3: public TStubTypeVisitor2 {
public:
using TStubTypeVisitor2::TStubTypeVisitor2;
@@ -58,8 +55,7 @@ public:
};
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 21)
-class TStubTypeVisitor4: public TStubTypeVisitor3
-{
+class TStubTypeVisitor4: public TStubTypeVisitor3 {
public:
using TStubTypeVisitor3::TStubTypeVisitor3;
@@ -68,8 +64,7 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
-class TStubTypeVisitor5: public TStubTypeVisitor4
-{
+class TStubTypeVisitor5: public TStubTypeVisitor4 {
public:
using TStubTypeVisitor4::TStubTypeVisitor4;
@@ -78,8 +73,7 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 26)
-class TStubTypeVisitor6: public TStubTypeVisitor5
-{
+class TStubTypeVisitor6: public TStubTypeVisitor5 {
public:
using TStubTypeVisitor5::TStubTypeVisitor5;
@@ -88,8 +82,7 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 44)
-class TStubTypeVisitor7: public TStubTypeVisitor6
-{
+class TStubTypeVisitor7: public TStubTypeVisitor6 {
public:
using TStubTypeVisitor6::TStubTypeVisitor6;
@@ -98,52 +91,45 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 44)
-class TStubTypeVisitor : public TStubTypeVisitor7
-{
+class TStubTypeVisitor: public TStubTypeVisitor7 {
public:
- using TBase = TStubTypeVisitor7;
+ using TBase = TStubTypeVisitor7;
TStubTypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 26)
-class TStubTypeVisitor : public TStubTypeVisitor6
-{
+class TStubTypeVisitor: public TStubTypeVisitor6 {
public:
- using TBase = TStubTypeVisitor6;
+ using TBase = TStubTypeVisitor6;
TStubTypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
-class TStubTypeVisitor : public TStubTypeVisitor5
-{
+class TStubTypeVisitor: public TStubTypeVisitor5 {
public:
- using TBase = TStubTypeVisitor5;
+ using TBase = TStubTypeVisitor5;
TStubTypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 21)
-class TStubTypeVisitor : public TStubTypeVisitor4
-{
+class TStubTypeVisitor: public TStubTypeVisitor4 {
public:
- using TBase = TStubTypeVisitor4;
+ using TBase = TStubTypeVisitor4;
TStubTypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 15)
-class TStubTypeVisitor : public TStubTypeVisitor3
-{
+class TStubTypeVisitor: public TStubTypeVisitor3 {
public:
- using TBase = TStubTypeVisitor3;
+ using TBase = TStubTypeVisitor3;
TStubTypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 13)
-class TStubTypeVisitor : public TStubTypeVisitor2
-{
+class TStubTypeVisitor: public TStubTypeVisitor2 {
public:
- using TBase = TStubTypeVisitor2;
+ using TBase = TStubTypeVisitor2;
TStubTypeVisitor(ui16 compatibilityVersion);
};
#else
-class TStubTypeVisitor : public TStubTypeVisitor1
-{
+class TStubTypeVisitor: public TStubTypeVisitor1 {
public:
- using TBase = TStubTypeVisitor1;
+ using TBase = TStubTypeVisitor1;
TStubTypeVisitor(ui16 compatibilityVersion);
};
#endif
@@ -151,19 +137,24 @@ public:
//////////////////////////////////////////////////////////////////////////////
// TDataTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TDataTypeInspector: public TStubTypeVisitor
-{
+class TDataTypeInspector: public TStubTypeVisitor {
public:
TDataTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return TypeId_ != 0; }
- TDataTypeId GetTypeId() const { return TypeId_; }
+ explicit operator bool() const {
+ return TypeId_ != 0;
+ }
+ TDataTypeId GetTypeId() const {
+ return TypeId_;
+ }
+
private:
void OnDataType(TDataTypeId typeId) override {
TypeId_ = typeId;
}
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 13)
- void OnDecimal(ui8, ui8) override {}
+ void OnDecimal(ui8, ui8) override {
+ }
#endif
TDataTypeId TypeId_ = 0;
};
@@ -171,13 +162,16 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TDataAndDecimalTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TDataAndDecimalTypeInspector: public TStubTypeVisitor
-{
+class TDataAndDecimalTypeInspector: public TStubTypeVisitor {
public:
TDataAndDecimalTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return TypeId_ != 0; }
- TDataTypeId GetTypeId() const { return TypeId_; }
+ explicit operator bool() const {
+ return TypeId_ != 0;
+ }
+ TDataTypeId GetTypeId() const {
+ return TypeId_;
+ }
ui8 GetPrecision() const {
return Precision_;
}
@@ -203,16 +197,19 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TStructTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TStructTypeInspector: public TStubTypeVisitor
-{
+class TStructTypeInspector: public TStubTypeVisitor {
public:
TStructTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return MembersCount_ != Max<ui32>(); }
- ui32 GetMembersCount() const { return MembersCount_; }
+ explicit operator bool() const {
+ return MembersCount_ != Max<ui32>();
+ }
+ ui32 GetMembersCount() const {
+ return MembersCount_;
+ }
ui32 GetMemberIndex(TStringRef name) const {
ui32 index = 0;
- for (TStringRef memberName: MembersNames_) {
+ for (TStringRef memberName : MembersNames_) {
if (memberName == name) {
return index;
}
@@ -220,17 +217,24 @@ public:
}
return Max<ui32>();
}
- const TStringRef& GetMemberName(ui32 i) const { return MembersNames_[i]; }
- const TType* GetMemberType(ui32 i) const { return MembersTypes_[i]; }
- TStringRef* GetMemberNames() { return MembersNames_.data(); }
- const TType** GetMemberTypes() { return MembersTypes_.data(); }
+ const TStringRef& GetMemberName(ui32 i) const {
+ return MembersNames_[i];
+ }
+ const TType* GetMemberType(ui32 i) const {
+ return MembersTypes_[i];
+ }
+ TStringRef* GetMemberNames() {
+ return MembersNames_.data();
+ }
+ const TType** GetMemberTypes() {
+ return MembersTypes_.data();
+ }
private:
void OnStruct(
- ui32 membersCount,
- TStringRef* membersNames,
- const TType** membersTypes) override
- {
+ ui32 membersCount,
+ TStringRef* membersNames,
+ const TType** membersTypes) override {
MembersCount_ = membersCount;
MembersNames_.reserve(membersCount);
MembersTypes_.reserve(membersCount);
@@ -250,13 +254,16 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TListTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TListTypeInspector: public TStubTypeVisitor
-{
+class TListTypeInspector: public TStubTypeVisitor {
public:
TListTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return ItemType_ != nullptr; }
- const TType* GetItemType() const { return ItemType_; }
+ explicit operator bool() const {
+ return ItemType_ != nullptr;
+ }
+ const TType* GetItemType() const {
+ return ItemType_;
+ }
private:
void OnList(const TType* itemType) override {
@@ -270,13 +277,16 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TOptionalTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TOptionalTypeInspector: public TStubTypeVisitor
-{
+class TOptionalTypeInspector: public TStubTypeVisitor {
public:
TOptionalTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return ItemType_ != nullptr; }
- const TType* GetItemType() const { return ItemType_; }
+ explicit operator bool() const {
+ return ItemType_ != nullptr;
+ }
+ const TType* GetItemType() const {
+ return ItemType_;
+ }
private:
void OnOptional(const TType* itemType) override {
@@ -290,15 +300,22 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TTupleTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TTupleTypeInspector: public TStubTypeVisitor
-{
+class TTupleTypeInspector: public TStubTypeVisitor {
public:
TTupleTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return ElementsCount_ != Max<ui32>(); }
- ui32 GetElementsCount() const { return ElementsCount_; }
- const TType* GetElementType(ui32 i) const { return ElementsTypes_[i]; }
- const TType** GetElementTypes() { return ElementsTypes_.data(); }
+ explicit operator bool() const {
+ return ElementsCount_ != Max<ui32>();
+ }
+ ui32 GetElementsCount() const {
+ return ElementsCount_;
+ }
+ const TType* GetElementType(ui32 i) const {
+ return ElementsTypes_[i];
+ }
+ const TType** GetElementTypes() {
+ return ElementsTypes_.data();
+ }
private:
void OnTuple(ui32 elementsCount, const TType** elementsTypes) override {
@@ -318,14 +335,19 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TDictTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TDictTypeInspector: public TStubTypeVisitor
-{
+class TDictTypeInspector: public TStubTypeVisitor {
public:
TDictTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return KeyType_ != nullptr; }
- const TType* GetKeyType() const { return KeyType_; }
- const TType* GetValueType() const { return ValueType_; }
+ explicit operator bool() const {
+ return KeyType_ != nullptr;
+ }
+ const TType* GetKeyType() const {
+ return KeyType_;
+ }
+ const TType* GetValueType() const {
+ return ValueType_;
+ }
private:
void OnDict(const TType* keyType, const TType* valueType) override {
@@ -341,27 +363,41 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TCallableTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TCallableTypeInspector: public TStubTypeVisitor
-{
+class TCallableTypeInspector: public TStubTypeVisitor {
public:
TCallableTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return ReturnType_ != nullptr; }
- const TType* GetReturnType() const { return ReturnType_; }
- ui32 GetArgsCount() const { return ArgsCount_; }
- const TType* GetArgType(ui32 i) const { return ArgsTypes_[i]; }
- ui32 GetOptionalArgsCount() const { return OptionalArgsCount_; }
- TStringRef GetPayload() const { return HasPayload_ ? Payload_ : TStringRef(); }
- TStringRef GetArgumentName(ui32 i) const { return HasPayload_ ? ArgsNames_[i] : TStringRef(); }
- ui64 GetArgumentFlags(ui32 i) const { return HasPayload_ ? ArgsFlags_[i] : 0; }
+ explicit operator bool() const {
+ return ReturnType_ != nullptr;
+ }
+ const TType* GetReturnType() const {
+ return ReturnType_;
+ }
+ ui32 GetArgsCount() const {
+ return ArgsCount_;
+ }
+ const TType* GetArgType(ui32 i) const {
+ return ArgsTypes_[i];
+ }
+ ui32 GetOptionalArgsCount() const {
+ return OptionalArgsCount_;
+ }
+ TStringRef GetPayload() const {
+ return HasPayload_ ? Payload_ : TStringRef();
+ }
+ TStringRef GetArgumentName(ui32 i) const {
+ return HasPayload_ ? ArgsNames_[i] : TStringRef();
+ }
+ ui64 GetArgumentFlags(ui32 i) const {
+ return HasPayload_ ? ArgsFlags_[i] : 0;
+ }
private:
void OnCallable(
- const TType* returnType,
- ui32 argsCount, const TType** argsTypes,
- ui32 optionalArgsCount,
- const ICallablePayload* payload) override
- {
+ const TType* returnType,
+ ui32 argsCount, const TType** argsTypes,
+ ui32 optionalArgsCount,
+ const ICallablePayload* payload) override {
ReturnType_ = returnType;
ArgsCount_ = argsCount;
OptionalArgsCount_ = optionalArgsCount;
@@ -397,13 +433,16 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TStreamTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TStreamTypeInspector : public TStubTypeVisitor
-{
+class TStreamTypeInspector: public TStubTypeVisitor {
public:
TStreamTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return ItemType_ != nullptr; }
- const TType* GetItemType() const { return ItemType_; }
+ explicit operator bool() const {
+ return ItemType_ != nullptr;
+ }
+ const TType* GetItemType() const {
+ return ItemType_;
+ }
private:
void OnStream(const TType* itemType) override {
@@ -417,13 +456,16 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TVariantTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TVariantTypeInspector : public TStubTypeVisitor
-{
+class TVariantTypeInspector: public TStubTypeVisitor {
public:
TVariantTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return UnderlyingType_ != nullptr; }
- const TType* GetUnderlyingType() const { return UnderlyingType_; }
+ explicit operator bool() const {
+ return UnderlyingType_ != nullptr;
+ }
+ const TType* GetUnderlyingType() const {
+ return UnderlyingType_;
+ }
private:
void OnVariant(const TType* underlyingType) override {
@@ -438,13 +480,16 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TResourceTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TResourceTypeInspector: public TStubTypeVisitor
-{
+class TResourceTypeInspector: public TStubTypeVisitor {
public:
TResourceTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return Tag_.Data() != nullptr; }
- TStringRef GetTag() const { return Tag_; }
+ explicit operator bool() const {
+ return Tag_.Data() != nullptr;
+ }
+ TStringRef GetTag() const {
+ return Tag_;
+ }
private:
void OnResource(TStringRef tag) override {
@@ -459,14 +504,19 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TTaggedTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TTaggedTypeInspector: public TStubTypeVisitor
-{
+class TTaggedTypeInspector: public TStubTypeVisitor {
public:
TTaggedTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return BaseType_ != nullptr; }
- const TType* GetBaseType() const { return BaseType_; }
- TStringRef GetTag() const { return Tag_; }
+ explicit operator bool() const {
+ return BaseType_ != nullptr;
+ }
+ const TType* GetBaseType() const {
+ return BaseType_;
+ }
+ TStringRef GetTag() const {
+ return Tag_;
+ }
private:
void OnTagged(const TType* baseType, TStringRef tag) override {
@@ -483,13 +533,16 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TPgTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TPgTypeInspector: public TStubTypeVisitor
-{
+class TPgTypeInspector: public TStubTypeVisitor {
public:
TPgTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return TypeId_ != 0; }
- ui32 GetTypeId() const { return TypeId_; }
+ explicit operator bool() const {
+ return TypeId_ != 0;
+ }
+ ui32 GetTypeId() const {
+ return TypeId_;
+ }
private:
void OnPg(ui32 typeId) override {
@@ -504,14 +557,19 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TBlockTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TBlockTypeInspector: public TStubTypeVisitor
-{
+class TBlockTypeInspector: public TStubTypeVisitor {
public:
TBlockTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return ItemType_ != 0; }
- const TType* GetItemType() const { return ItemType_; }
- bool IsScalar() const { return IsScalar_; }
+ explicit operator bool() const {
+ return ItemType_ != 0;
+ }
+ const TType* GetItemType() const {
+ return ItemType_;
+ }
+ bool IsScalar() const {
+ return IsScalar_;
+ }
private:
void OnBlock(const TType* itemType, bool isScalar) override {
@@ -529,14 +587,19 @@ private:
//////////////////////////////////////////////////////////////////////////////
// TLinearTypeInspector
//////////////////////////////////////////////////////////////////////////////
-class TLinearTypeInspector: public TStubTypeVisitor
-{
+class TLinearTypeInspector: public TStubTypeVisitor {
public:
TLinearTypeInspector(const ITypeInfoHelper1& typeHelper, const TType* type);
- explicit operator bool() const { return ItemType_ != 0; }
- const TType* GetItemType() const { return ItemType_; }
- bool IsDynamic() const { return IsDynamic_; }
+ explicit operator bool() const {
+ return ItemType_ != 0;
+ }
+ const TType* GetItemType() const {
+ return ItemType_;
+ }
+ bool IsDynamic() const {
+ return IsDynamic_;
+ }
private:
void OnLinear(const TType* itemType, bool isDynamic) override {
@@ -557,11 +620,13 @@ inline void TStubTypeVisitor1::OnDataType(TDataTypeId typeId)
}
inline void TStubTypeVisitor1::OnStruct(
- ui32 membersCount,
- TStringRef* membersNames,
- const TType** membersTypes)
+ ui32 membersCount,
+ TStringRef* membersNames,
+ const TType** membersTypes)
{
- Y_UNUSED(membersCount); Y_UNUSED(membersNames); Y_UNUSED(membersTypes);
+ Y_UNUSED(membersCount);
+ Y_UNUSED(membersNames);
+ Y_UNUSED(membersTypes);
Y_ABORT("Not implemented");
}
@@ -579,24 +644,28 @@ inline void TStubTypeVisitor1::OnOptional(const TType* itemType)
inline void TStubTypeVisitor1::OnTuple(ui32 elementsCount, const TType** elementsTypes)
{
- Y_UNUSED(elementsCount); Y_UNUSED(elementsTypes);
+ Y_UNUSED(elementsCount);
+ Y_UNUSED(elementsTypes);
Y_ABORT("Not implemented");
}
inline void TStubTypeVisitor1::OnDict(const TType* keyType, const TType* valueType)
{
- Y_UNUSED(keyType); Y_UNUSED(valueType);
+ Y_UNUSED(keyType);
+ Y_UNUSED(valueType);
Y_ABORT("Not implemented");
}
inline void TStubTypeVisitor1::OnCallable(
- const TType* returnType,
- ui32 argsCount, const TType** argsTypes,
- ui32 optionalArgsCount,
- const ICallablePayload* payload)
-{
- Y_UNUSED(returnType); Y_UNUSED(argsCount);
- Y_UNUSED(argsTypes); Y_UNUSED(optionalArgsCount);
+ const TType* returnType,
+ ui32 argsCount, const TType** argsTypes,
+ ui32 optionalArgsCount,
+ const ICallablePayload* payload)
+{
+ Y_UNUSED(returnType);
+ Y_UNUSED(argsCount);
+ Y_UNUSED(argsTypes);
+ Y_UNUSED(optionalArgsCount);
Y_UNUSED(payload);
Y_ABORT("Not implemented");
}
@@ -645,5 +714,5 @@ inline void TStubTypeVisitor7::OnLinear(const TType* itemType, bool isDynamic) {
}
#endif
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_type_ops.h b/yql/essentials/public/udf/udf_type_ops.h
index ac848d07c8b..38ed738cd5f 100644
--- a/yql/essentials/public/udf/udf_type_ops.h
+++ b/yql/essentials/public/udf/udf_type_ops.h
@@ -235,7 +235,7 @@ inline THashType GetValueHash(EDataSlot type, const TUnboxedValuePod& value) {
return GetValueHash<EDataSlot::slot>(value);
switch (type) {
- UDF_TYPE_ID_MAP(HASH_TYPE)
+ UDF_TYPE_ID_MAP(HASH_TYPE)
}
#undef HASH_TYPE
@@ -259,7 +259,8 @@ inline int CompareFloats(const TUnboxedValuePod& lhs, const TUnboxedValuePod& rh
if (std::isunordered(x, y)) {
const auto xn = std::isnan(x);
const auto yn = std::isnan(y);
- return (xn == yn) ? 0 : xn ? 1 : -1;
+ return (xn == yn) ? 0 : xn ? 1
+ : -1;
}
return (x == y) ? 0 : (x < y ? -1 : 1);
}
@@ -462,7 +463,7 @@ inline int CompareValues(EDataSlot type, const TUnboxedValuePod& lhs, const TUnb
return CompareValues<EDataSlot::slot>(lhs, rhs);
switch (type) {
- UDF_TYPE_ID_MAP(COMPARE_TYPE)
+ UDF_TYPE_ID_MAP(COMPARE_TYPE)
}
#undef COMPARE_TYPE
@@ -665,7 +666,7 @@ inline bool EquateValues(EDataSlot type, const TUnboxedValuePod& lhs, const TUnb
return EquateValues<EDataSlot::slot>(lhs, rhs);
switch (type) {
- UDF_TYPE_ID_MAP(EQUATE_TYPE)
+ UDF_TYPE_ID_MAP(EQUATE_TYPE)
}
#undef EQUATE_TYPE
diff --git a/yql/essentials/public/udf/udf_type_printer.cpp b/yql/essentials/public/udf/udf_type_printer.cpp
index fcc804699ea..422ad98be75 100644
--- a/yql/essentials/public/udf/udf_type_printer.cpp
+++ b/yql/essentials/public/udf/udf_type_printer.cpp
@@ -6,12 +6,11 @@
namespace NYql {
namespace NUdf {
-class TTypePrinter1 : private TStubTypeVisitor
-{
+class TTypePrinter1: private TStubTypeVisitor {
public:
TTypePrinter1(const ITypeInfoHelper1& typeHelper, const TType* type, ui16 compatibilityVersion);
- void Out(IOutputStream &o) const;
+ void Out(IOutputStream& o) const;
protected:
void OnDataType(TDataTypeId typeId) final;
@@ -40,7 +39,7 @@ protected:
};
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 13)
-class TTypePrinter2 : public TTypePrinter1 {
+class TTypePrinter2: public TTypePrinter1 {
public:
using TTypePrinter1::TTypePrinter1;
@@ -52,7 +51,7 @@ protected:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 15)
-class TTypePrinter3 : public TTypePrinter2 {
+class TTypePrinter3: public TTypePrinter2 {
public:
using TTypePrinter2::TTypePrinter2;
@@ -64,7 +63,7 @@ protected:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 21)
-class TTypePrinter4 : public TTypePrinter3 {
+class TTypePrinter4: public TTypePrinter3 {
public:
using TTypePrinter3::TTypePrinter3;
@@ -76,7 +75,7 @@ protected:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
-class TTypePrinter5 : public TTypePrinter4 {
+class TTypePrinter5: public TTypePrinter4 {
public:
TTypePrinter5(const ITypeInfoHelper2& typeHelper, const TType* type, ui16 compatibilityVersion);
@@ -94,7 +93,7 @@ private:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 26)
-class TTypePrinter6 : public TTypePrinter5 {
+class TTypePrinter6: public TTypePrinter5 {
public:
using TTypePrinter5::TTypePrinter5;
@@ -109,7 +108,7 @@ private:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 44)
-class TTypePrinter7 : public TTypePrinter6 {
+class TTypePrinter7: public TTypePrinter6 {
public:
using TTypePrinter6::TTypePrinter6;
@@ -125,10 +124,13 @@ private:
TTypePrinter1::TTypePrinter1(const ITypeInfoHelper1& typeHelper, const TType* type, ui16 compatibilityVersion)
: TStubTypeVisitor(compatibilityVersion)
- , TypeHelper1_(typeHelper), Type_(type), Output_(nullptr)
-{}
+ , TypeHelper1_(typeHelper)
+ , Type_(type)
+ , Output_(nullptr)
+{
+}
-void TTypePrinter1::Out(IOutputStream &o) const {
+void TTypePrinter1::Out(IOutputStream& o) const {
Output_ = &o;
Y_DEFER {
Output_ = nullptr;
@@ -138,12 +140,23 @@ void TTypePrinter1::Out(IOutputStream &o) const {
void TTypePrinter1::OutImpl(const TType* type) const {
switch (TypeHelper1_.GetTypeKind(type)) {
- case ETypeKind::Null: *Output_ << "Null"; break;
- case ETypeKind::Void: *Output_ << "Void"; break;
- case ETypeKind::EmptyList: *Output_ << "EmptyList"; break;
- case ETypeKind::EmptyDict: *Output_ << "EmptyDict"; break;
- case ETypeKind::Unknown: *Output_ << "Unknown"; break;
- default: TypeHelper1_.VisitType(type, const_cast<TTypePrinter1*>(this));
+ case ETypeKind::Null:
+ *Output_ << "Null";
+ break;
+ case ETypeKind::Void:
+ *Output_ << "Void";
+ break;
+ case ETypeKind::EmptyList:
+ *Output_ << "EmptyList";
+ break;
+ case ETypeKind::EmptyDict:
+ *Output_ << "EmptyDict";
+ break;
+ case ETypeKind::Unknown:
+ *Output_ << "Unknown";
+ break;
+ default:
+ TypeHelper1_.VisitType(type, const_cast<TTypePrinter1*>(this));
}
}
@@ -161,8 +174,9 @@ void TTypePrinter1::OutStructPayload(ui32 membersCount, TStringRef* membersNames
for (ui32 i = 0U; i < membersCount; ++i) {
*Output_ << "'" << std::string_view(membersNames[i]) << "':";
OutImpl(membersTypes[i]);
- if (i < membersCount - 1U)
+ if (i < membersCount - 1U) {
*Output_ << ',';
+ }
}
}
@@ -186,8 +200,9 @@ void TTypePrinter1::OnTuple(ui32 elementsCount, const TType** elementsTypes) {
void TTypePrinter1::OutTuplePayload(ui32 elementsCount, const TType** elementsTypes) {
for (ui32 i = 0U; i < elementsCount; ++i) {
OutImpl(elementsTypes[i]);
- if (i < elementsCount - 1U)
+ if (i < elementsCount - 1U) {
*Output_ << ',';
+ }
}
}
@@ -209,20 +224,24 @@ void TTypePrinter1::OnDict(const TType* keyType, const TType* valueType) {
void TTypePrinter1::OnCallable(const TType* returnType, ui32 argsCount, const TType** argsTypes, ui32 optionalArgsCount, const ICallablePayload* payload) {
*Output_ << "Callable<(";
for (ui32 i = 0U; i < argsCount; ++i) {
- if (optionalArgsCount && i == argsCount - optionalArgsCount)
+ if (optionalArgsCount && i == argsCount - optionalArgsCount) {
*Output_ << '[';
+ }
if (payload) {
const std::string_view name = payload->GetArgumentName(i);
- if (!name.empty())
+ if (!name.empty()) {
*Output_ << "'" << name << "':";
+ }
}
OutImpl(argsTypes[i]);
if (payload) {
- if (ICallablePayload::TArgumentFlags::AutoMap == payload->GetArgumentFlags(i))
+ if (ICallablePayload::TArgumentFlags::AutoMap == payload->GetArgumentFlags(i)) {
*Output_ << "{Flags:AutoMap}";
+ }
}
- if (i < argsCount - 1U)
+ if (i < argsCount - 1U) {
*Output_ << ',';
+ }
}
*Output_ << (optionalArgsCount ? "])->" : ")->");
OutImpl(returnType);
@@ -231,29 +250,29 @@ void TTypePrinter1::OnCallable(const TType* returnType, ui32 argsCount, const TT
void TTypePrinter1::OnVariant(const TType* underlyingType) {
switch (TypeHelper1_.GetTypeKind(underlyingType)) {
- case ETypeKind::Struct: {
- TStructTypeInspector s(TypeHelper1_, underlyingType);
- const bool isEnum = std::all_of(s.GetMemberTypes(), s.GetMemberTypes() + s.GetMembersCount(), [this](auto memberType) {
- return TypeHelper1_.GetTypeKind(memberType) == ETypeKind::Void;
- });
-
- if (isEnum) {
- *Output_ << "Enum<";
- OutEnumValues(s.GetMembersCount(), s.GetMemberNames());
- } else {
+ case ETypeKind::Struct: {
+ TStructTypeInspector s(TypeHelper1_, underlyingType);
+ const bool isEnum = std::all_of(s.GetMemberTypes(), s.GetMemberTypes() + s.GetMembersCount(), [this](auto memberType) {
+ return TypeHelper1_.GetTypeKind(memberType) == ETypeKind::Void;
+ });
+
+ if (isEnum) {
+ *Output_ << "Enum<";
+ OutEnumValues(s.GetMembersCount(), s.GetMemberNames());
+ } else {
+ *Output_ << "Variant<";
+ OutStructPayload(s.GetMembersCount(), s.GetMemberNames(), s.GetMemberTypes());
+ }
+ break;
+ }
+ case ETypeKind::Tuple: {
+ TTupleTypeInspector s(TypeHelper1_, underlyingType);
*Output_ << "Variant<";
- OutStructPayload(s.GetMembersCount(), s.GetMemberNames(), s.GetMemberTypes());
+ OutTuplePayload(s.GetElementsCount(), s.GetElementTypes());
+ break;
}
- break;
- }
- case ETypeKind::Tuple: {
- TTupleTypeInspector s(TypeHelper1_, underlyingType);
- *Output_ << "Variant<";
- OutTuplePayload(s.GetElementsCount(), s.GetElementTypes());
- break;
- }
- default:
- Y_ABORT_UNLESS(false, "Unexpected underlying type in Variant");
+ default:
+ Y_ABORT_UNLESS(false, "Unexpected underlying type in Variant");
}
*Output_ << '>';
}
@@ -261,8 +280,9 @@ void TTypePrinter1::OnVariant(const TType* underlyingType) {
void TTypePrinter1::OutEnumValues(ui32 membersCount, TStringRef* membersNames) {
for (ui32 i = 0U; i < membersCount; ++i) {
*Output_ << "'" << std::string_view(membersNames[i]) << '\'';
- if (i < membersCount - 1U)
+ if (i < membersCount - 1U) {
*Output_ << ',';
+ }
}
}
@@ -289,7 +309,8 @@ void TTypePrinter1::OnTaggedImpl(const TType* baseType, TStringRef tag) {
TTypePrinter5::TTypePrinter5(const ITypeInfoHelper2& typeHelper, const TType* type, ui16 compatibilityVersion)
: TTypePrinter4(typeHelper, type, compatibilityVersion)
, TypeHelper2_(typeHelper)
-{}
+{
+}
void TTypePrinter5::OnPgImpl(ui32 typeId) {
auto* description = TypeHelper2_.FindPgTypeDescription(typeId);
@@ -317,10 +338,10 @@ void TTypePrinter7::OnLinearImpl(const TType* itemType, bool isDynamic) {
*Output_ << '>';
}
-void TTypePrinter::Out(IOutputStream &o) const {
+void TTypePrinter::Out(IOutputStream& o) const {
TTypePrinter7 p(TypeHelper_, Type_, UDF_ABI_COMPATIBILITY_VERSION(2, 44));
p.Out(o);
}
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_type_printer.h b/yql/essentials/public/udf/udf_type_printer.h
index ea7c79ec5e7..436ff415efa 100644
--- a/yql/essentials/public/udf/udf_type_printer.h
+++ b/yql/essentials/public/udf/udf_type_printer.h
@@ -7,8 +7,7 @@
namespace NYql {
namespace NUdf {
-class TTypePrinter
-{
+class TTypePrinter {
public:
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
TTypePrinter(const ITypeInfoHelper2& typeHelper, const TType* type)
@@ -17,9 +16,10 @@ public:
#endif
: TypeHelper_(typeHelper)
, Type_(type)
- {}
+ {
+ }
- void Out(IOutputStream &o) const;
+ void Out(IOutputStream& o) const;
private:
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
@@ -30,5 +30,5 @@ private:
const TType* Type_;
};
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_type_printer_ut.cpp b/yql/essentials/public/udf/udf_type_printer_ut.cpp
index 39e0fd7d5f3..886e98b11b4 100644
--- a/yql/essentials/public/udf/udf_type_printer_ut.cpp
+++ b/yql/essentials/public/udf/udf_type_printer_ut.cpp
@@ -6,26 +6,26 @@
using namespace NYql::NUdf;
Y_UNIT_TEST_SUITE(TUdfTypePrinter) {
- template <typename F>
- void TestType(const TString& expected, F&& f) {
- NKikimr::NMiniKQL::TScopedAlloc alloc(__LOCATION__);
- NKikimr::NMiniKQL::TTypeEnvironment env(alloc);
- NKikimr::NMiniKQL::TTypeBuilder typeBuilder(env);
- NKikimr::NMiniKQL::TTypeInfoHelper typeHelper;
+template <typename F>
+void TestType(const TString& expected, F&& f) {
+ NKikimr::NMiniKQL::TScopedAlloc alloc(__LOCATION__);
+ NKikimr::NMiniKQL::TTypeEnvironment env(alloc);
+ NKikimr::NMiniKQL::TTypeBuilder typeBuilder(env);
+ NKikimr::NMiniKQL::TTypeInfoHelper typeHelper;
- auto type = f(typeBuilder);
- TStringStream stream;
- TTypePrinter(typeHelper, type).Out(stream);
- UNIT_ASSERT_STRINGS_EQUAL(stream.Str(), expected);
- }
+ auto type = f(typeBuilder);
+ TStringStream stream;
+ TTypePrinter(typeHelper, type).Out(stream);
+ UNIT_ASSERT_STRINGS_EQUAL(stream.Str(), expected);
+}
- Y_UNIT_TEST(TestLinear) {
- TestType("Linear<Int32>", [](const NKikimr::NMiniKQL::TTypeBuilder& typeBuilder) {
- return typeBuilder.NewLinearType(typeBuilder.NewDataType(EDataSlot::Int32), false);
- });
+Y_UNIT_TEST(TestLinear) {
+ TestType("Linear<Int32>", [](const NKikimr::NMiniKQL::TTypeBuilder& typeBuilder) {
+ return typeBuilder.NewLinearType(typeBuilder.NewDataType(EDataSlot::Int32), false);
+ });
- TestType("DynamicLinear<Int32>", [](const NKikimr::NMiniKQL::TTypeBuilder& typeBuilder) {
- return typeBuilder.NewLinearType(typeBuilder.NewDataType(EDataSlot::Int32), true);
- });
- }
+ TestType("DynamicLinear<Int32>", [](const NKikimr::NMiniKQL::TTypeBuilder& typeBuilder) {
+ return typeBuilder.NewLinearType(typeBuilder.NewDataType(EDataSlot::Int32), true);
+ });
}
+} // Y_UNIT_TEST_SUITE(TUdfTypePrinter)
diff --git a/yql/essentials/public/udf/udf_type_size_check.h b/yql/essentials/public/udf/udf_type_size_check.h
index 1433abf3620..0c80b8de405 100644
--- a/yql/essentials/public/udf/udf_type_size_check.h
+++ b/yql/essentials/public/udf/udf_type_size_check.h
@@ -1,7 +1,6 @@
#pragma once
-#define UDF_ASSERT_TYPE_SIZE(type, expectedSize) \
- static_assert(sizeof(type) <= (expectedSize), \
- "Size of " #type " mismatches expected size. " \
- "Expected size is " #expectedSize)
-
+#define UDF_ASSERT_TYPE_SIZE(type, expectedSize) \
+ static_assert(sizeof(type) <= (expectedSize), \
+ "Size of " #type " mismatches expected size. " \
+ "Expected size is " #expectedSize)
diff --git a/yql/essentials/public/udf/udf_types.cpp b/yql/essentials/public/udf/udf_types.cpp
index 1c61fd2713c..dfba87785a7 100644
--- a/yql/essentials/public/udf/udf_types.cpp
+++ b/yql/essentials/public/udf/udf_types.cpp
@@ -5,10 +5,12 @@ namespace NUdf {
ITypeVisitor::ITypeVisitor(ui16 compatibilityVersion)
: TBase(compatibilityVersion)
-{}
+{
+}
ITypeInfoHelper::ITypeInfoHelper()
-{}
+{
+}
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_types.h b/yql/essentials/public/udf/udf_types.h
index ba889feabd0..8a9fb51280f 100644
--- a/yql/essentials/public/udf/udf_types.h
+++ b/yql/essentials/public/udf/udf_types.h
@@ -16,128 +16,127 @@ using TType = void;
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 44)
-#define UDF_TYPE_KIND_MAP(XX) \
- XX(Unknown) \
- XX(Data) \
- XX(Struct) \
- XX(List) \
- XX(Optional) \
- XX(Tuple) \
- XX(Dict) \
- XX(Callable) \
- XX(Resource) \
- XX(Void) \
- XX(Variant) \
- XX(Stream) \
- XX(Null) \
- XX(EmptyList) \
- XX(EmptyDict) \
- XX(Tagged) \
- XX(Pg) \
- XX(Block) \
- XX(Linear)
+ #define UDF_TYPE_KIND_MAP(XX) \
+ XX(Unknown) \
+ XX(Data) \
+ XX(Struct) \
+ XX(List) \
+ XX(Optional) \
+ XX(Tuple) \
+ XX(Dict) \
+ XX(Callable) \
+ XX(Resource) \
+ XX(Void) \
+ XX(Variant) \
+ XX(Stream) \
+ XX(Null) \
+ XX(EmptyList) \
+ XX(EmptyDict) \
+ XX(Tagged) \
+ XX(Pg) \
+ XX(Block) \
+ XX(Linear)
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 26)
-#define UDF_TYPE_KIND_MAP(XX) \
- XX(Unknown) \
- XX(Data) \
- XX(Struct) \
- XX(List) \
- XX(Optional) \
- XX(Tuple) \
- XX(Dict) \
- XX(Callable) \
- XX(Resource) \
- XX(Void) \
- XX(Variant) \
- XX(Stream) \
- XX(Null) \
- XX(EmptyList) \
- XX(EmptyDict) \
- XX(Tagged) \
- XX(Pg) \
- XX(Block)
+ #define UDF_TYPE_KIND_MAP(XX) \
+ XX(Unknown) \
+ XX(Data) \
+ XX(Struct) \
+ XX(List) \
+ XX(Optional) \
+ XX(Tuple) \
+ XX(Dict) \
+ XX(Callable) \
+ XX(Resource) \
+ XX(Void) \
+ XX(Variant) \
+ XX(Stream) \
+ XX(Null) \
+ XX(EmptyList) \
+ XX(EmptyDict) \
+ XX(Tagged) \
+ XX(Pg) \
+ XX(Block)
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
-#define UDF_TYPE_KIND_MAP(XX) \
- XX(Unknown) \
- XX(Data) \
- XX(Struct) \
- XX(List) \
- XX(Optional) \
- XX(Tuple) \
- XX(Dict) \
- XX(Callable) \
- XX(Resource) \
- XX(Void) \
- XX(Variant) \
- XX(Stream) \
- XX(Null) \
- XX(EmptyList) \
- XX(EmptyDict) \
- XX(Tagged) \
- XX(Pg)
+ #define UDF_TYPE_KIND_MAP(XX) \
+ XX(Unknown) \
+ XX(Data) \
+ XX(Struct) \
+ XX(List) \
+ XX(Optional) \
+ XX(Tuple) \
+ XX(Dict) \
+ XX(Callable) \
+ XX(Resource) \
+ XX(Void) \
+ XX(Variant) \
+ XX(Stream) \
+ XX(Null) \
+ XX(EmptyList) \
+ XX(EmptyDict) \
+ XX(Tagged) \
+ XX(Pg)
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 21)
-#define UDF_TYPE_KIND_MAP(XX) \
- XX(Unknown) \
- XX(Data) \
- XX(Struct) \
- XX(List) \
- XX(Optional) \
- XX(Tuple) \
- XX(Dict) \
- XX(Callable) \
- XX(Resource) \
- XX(Void) \
- XX(Variant) \
- XX(Stream) \
- XX(Null) \
- XX(EmptyList) \
- XX(EmptyDict) \
- XX(Tagged)
+ #define UDF_TYPE_KIND_MAP(XX) \
+ XX(Unknown) \
+ XX(Data) \
+ XX(Struct) \
+ XX(List) \
+ XX(Optional) \
+ XX(Tuple) \
+ XX(Dict) \
+ XX(Callable) \
+ XX(Resource) \
+ XX(Void) \
+ XX(Variant) \
+ XX(Stream) \
+ XX(Null) \
+ XX(EmptyList) \
+ XX(EmptyDict) \
+ XX(Tagged)
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 18)
-#define UDF_TYPE_KIND_MAP(XX) \
- XX(Unknown) \
- XX(Data) \
- XX(Struct) \
- XX(List) \
- XX(Optional) \
- XX(Tuple) \
- XX(Dict) \
- XX(Callable) \
- XX(Resource) \
- XX(Void) \
- XX(Variant) \
- XX(Stream) \
- XX(Null) \
- XX(EmptyList) \
- XX(EmptyDict)
+ #define UDF_TYPE_KIND_MAP(XX) \
+ XX(Unknown) \
+ XX(Data) \
+ XX(Struct) \
+ XX(List) \
+ XX(Optional) \
+ XX(Tuple) \
+ XX(Dict) \
+ XX(Callable) \
+ XX(Resource) \
+ XX(Void) \
+ XX(Variant) \
+ XX(Stream) \
+ XX(Null) \
+ XX(EmptyList) \
+ XX(EmptyDict)
#else
-#define UDF_TYPE_KIND_MAP(XX) \
- XX(Unknown) \
- XX(Data) \
- XX(Struct) \
- XX(List) \
- XX(Optional) \
- XX(Tuple) \
- XX(Dict) \
- XX(Callable) \
- XX(Resource) \
- XX(Void) \
- XX(Variant) \
- XX(Stream)
+ #define UDF_TYPE_KIND_MAP(XX) \
+ XX(Unknown) \
+ XX(Data) \
+ XX(Struct) \
+ XX(List) \
+ XX(Optional) \
+ XX(Tuple) \
+ XX(Dict) \
+ XX(Callable) \
+ XX(Resource) \
+ XX(Void) \
+ XX(Variant) \
+ XX(Stream)
#endif
-enum ETypeKind
-{
+enum ETypeKind {
UDF_TYPE_KIND_MAP(ENUM_VALUE_GEN_NO_VALUE)
};
@@ -146,8 +145,7 @@ ENUM_TO_STRING(ETypeKind, UDF_TYPE_KIND_MAP)
//////////////////////////////////////////////////////////////////////////////
// ICallablePayload
//////////////////////////////////////////////////////////////////////////////
-class ICallablePayload
-{
+class ICallablePayload {
public:
virtual ~ICallablePayload() = default;
@@ -170,12 +168,13 @@ UDF_ASSERT_TYPE_SIZE(ICallablePayload, 8);
//////////////////////////////////////////////////////////////////////////////
// ITypeVisitor
//////////////////////////////////////////////////////////////////////////////
-class ITypeVisitor1
-{
+class ITypeVisitor1 {
protected:
ITypeVisitor1(ui16 compatibilityVersion)
: AbiCompatibility_(compatibilityVersion)
- {}
+ {
+ }
+
public:
inline bool IsCompatibleTo(ui16 compatibilityVersion) const {
return AbiCompatibility_ >= compatibilityVersion;
@@ -185,19 +184,20 @@ public:
virtual void OnDataType(TDataTypeId typeId) = 0;
virtual void OnStruct(
- ui32 membersCount,
- TStringRef* membersNames,
- const TType** membersTypes) = 0;
+ ui32 membersCount,
+ TStringRef* membersNames,
+ const TType** membersTypes) = 0;
virtual void OnList(const TType* itemType) = 0;
virtual void OnOptional(const TType* itemType) = 0;
virtual void OnTuple(ui32 elementsCount, const TType** elementsTypes) = 0;
virtual void OnDict(const TType* keyType, const TType* valueType) = 0;
virtual void OnCallable(
- const TType* returnType,
- ui32 argsCount, const TType** argsTypes,
- ui32 optionalArgsCount, const ICallablePayload* payload) = 0;
+ const TType* returnType,
+ ui32 argsCount, const TType** argsTypes,
+ ui32 optionalArgsCount, const ICallablePayload* payload) = 0;
virtual void OnVariant(const TType* underlyingType) = 0;
virtual void OnStream(const TType* itemType) = 0;
+
private:
ui16 AbiCompatibility_ = 0;
ui16 Reserved1_ = 0;
@@ -258,43 +258,43 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 44)
-class ITypeVisitor : public ITypeVisitor7 {
+class ITypeVisitor: public ITypeVisitor7 {
protected:
using TBase = ITypeVisitor7;
ITypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 26)
-class ITypeVisitor : public ITypeVisitor6 {
+class ITypeVisitor: public ITypeVisitor6 {
protected:
using TBase = ITypeVisitor6;
ITypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
-class ITypeVisitor : public ITypeVisitor5 {
+class ITypeVisitor: public ITypeVisitor5 {
protected:
using TBase = ITypeVisitor5;
ITypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 21)
-class ITypeVisitor : public ITypeVisitor4 {
+class ITypeVisitor: public ITypeVisitor4 {
protected:
using TBase = ITypeVisitor4;
ITypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 15)
-class ITypeVisitor : public ITypeVisitor3 {
+class ITypeVisitor: public ITypeVisitor3 {
protected:
using TBase = ITypeVisitor3;
ITypeVisitor(ui16 compatibilityVersion);
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 13)
-class ITypeVisitor : public ITypeVisitor2 {
+class ITypeVisitor: public ITypeVisitor2 {
protected:
using TBase = ITypeVisitor2;
ITypeVisitor(ui16 compatibilityVersion);
};
#else
-class ITypeVisitor : public ITypeVisitor1 {
+class ITypeVisitor: public ITypeVisitor1 {
protected:
using TBase = ITypeVisitor1;
ITypeVisitor(ui16 compatibilityVersion);
@@ -306,8 +306,7 @@ UDF_ASSERT_TYPE_SIZE(ITypeVisitor, 16);
//////////////////////////////////////////////////////////////////////////////
// ITypeInfoHelper
//////////////////////////////////////////////////////////////////////////////
-class ITypeInfoHelper1
-{
+class ITypeInfoHelper1 {
public:
using TPtr = TRefCountedPtr<ITypeInfoHelper1>;
@@ -344,7 +343,7 @@ private:
};
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
-class ITypeInfoHelper2 : public ITypeInfoHelper1 {
+class ITypeInfoHelper2: public ITypeInfoHelper1 {
public:
using TPtr = TRefCountedPtr<ITypeInfoHelper2>;
@@ -356,8 +355,7 @@ public:
//////////////////////////////////////////////////////////////////////////////
// IArrowType
//////////////////////////////////////////////////////////////////////////////
-class IArrowType
-{
+class IArrowType {
public:
using TPtr = TUniquePtr<IArrowType>;
@@ -369,7 +367,7 @@ public:
UDF_ASSERT_TYPE_SIZE(IArrowType, 8);
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 26)
-class ITypeInfoHelper3 : public ITypeInfoHelper2 {
+class ITypeInfoHelper3: public ITypeInfoHelper2 {
public:
using TPtr = TRefCountedPtr<ITypeInfoHelper3>;
@@ -382,7 +380,7 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 29)
-class ITypeInfoHelper4 : public ITypeInfoHelper3 {
+class ITypeInfoHelper4: public ITypeInfoHelper3 {
public:
using TPtr = TRefCountedPtr<ITypeInfoHelper4>;
@@ -393,25 +391,25 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 29)
-class ITypeInfoHelper : public ITypeInfoHelper4 {
+class ITypeInfoHelper: public ITypeInfoHelper4 {
public:
using TPtr = TRefCountedPtr<ITypeInfoHelper>;
ITypeInfoHelper();
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 26)
-class ITypeInfoHelper : public ITypeInfoHelper3 {
+class ITypeInfoHelper: public ITypeInfoHelper3 {
public:
using TPtr = TRefCountedPtr<ITypeInfoHelper>;
ITypeInfoHelper();
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 25)
-class ITypeInfoHelper : public ITypeInfoHelper2 {
+class ITypeInfoHelper: public ITypeInfoHelper2 {
public:
using TPtr = TRefCountedPtr<ITypeInfoHelper>;
ITypeInfoHelper();
};
#else
-class ITypeInfoHelper : public ITypeInfoHelper1 {
+class ITypeInfoHelper: public ITypeInfoHelper1 {
public:
using TPtr = TRefCountedPtr<ITypeInfoHelper>;
ITypeInfoHelper();
@@ -421,5 +419,5 @@ public:
UDF_ASSERT_TYPE_SIZE(ITypeInfoHelper, 16);
UDF_ASSERT_TYPE_SIZE(ITypeInfoHelper::TPtr, 8);
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_ut_helpers.h b/yql/essentials/public/udf/udf_ut_helpers.h
index af95e727dc3..fb56eae790c 100644
--- a/yql/essentials/public/udf/udf_ut_helpers.h
+++ b/yql/essentials/public/udf/udf_ut_helpers.h
@@ -12,11 +12,13 @@
namespace NYql {
namespace NUdf {
-template<bool HasLength = true>
+template <bool HasLength = true>
class TLazyList: public NUdf::TBoxedValue {
struct TIterator: public NUdf::TBoxedValue {
TIterator(i32 from, i32 to)
- : From_(from), To_(to), Curr_(Max<i32>())
+ : From_(from)
+ , To_(to)
+ , Curr_(Max<i32>())
{
if (To_ >= From_) {
To_--; // exclude last
@@ -24,6 +26,7 @@ class TLazyList: public NUdf::TBoxedValue {
From_--; // exclude first
}
}
+
private:
bool Skip() override {
if (Curr_ == Max<i32>()) {
@@ -45,16 +48,19 @@ class TLazyList: public NUdf::TBoxedValue {
}
bool Next(NUdf::TUnboxedValue& value) override {
- if (!Skip())
+ if (!Skip()) {
return false;
+ }
value = NUdf::TUnboxedValuePod(Curr_);
return true;
}
i32 From_, To_, Curr_;
};
+
public:
TLazyList(i32 from, i32 to)
- : From_(from), To_(to)
+ : From_(from)
+ , To_(to)
{
}
@@ -64,8 +70,9 @@ private:
}
ui64 GetListLength() const override {
- if (HasLength)
+ if (HasLength) {
return Abs(To_ - From_);
+ }
Y_ABORT("No length!");
}
@@ -109,5 +116,5 @@ private:
i32 From_, To_;
};
-}
-}
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_validate.cpp b/yql/essentials/public/udf/udf_validate.cpp
index d6fe5524f9a..10858ba09fd 100644
--- a/yql/essentials/public/udf/udf_validate.cpp
+++ b/yql/essentials/public/udf/udf_validate.cpp
@@ -6,14 +6,14 @@ namespace NYql {
namespace NUdf {
#define SWITCH_ENUM_TYPE_TO_STR(name, val) \
- case val: return TStringBuf(#name);
+ case val: \
+ return TStringBuf(#name);
TString ValidateModeAvailables() {
return Join(", ",
- ValidateModeAsStr(EValidateMode::None),
- ValidateModeAsStr(EValidateMode::Lazy),
- ValidateModeAsStr(EValidateMode::Greedy)
- );
+ ValidateModeAsStr(EValidateMode::None),
+ ValidateModeAsStr(EValidateMode::Lazy),
+ ValidateModeAsStr(EValidateMode::Greedy));
}
TStringBuf ValidateModeAsStr(EValidateMode validateMode) {
@@ -63,5 +63,5 @@ EValidateDatumMode ToDatumValidateMode(EValidateMode validateMode) {
return EValidateDatumMode::Expensive;
}
}
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_validate.h b/yql/essentials/public/udf/udf_validate.h
index 361615770df..306b301fd0f 100644
--- a/yql/essentials/public/udf/udf_validate.h
+++ b/yql/essentials/public/udf/udf_validate.h
@@ -7,14 +7,14 @@ namespace NYql {
namespace NUdf {
#define UDF_VALIDATE_MODE(XX) \
- XX(None, 0) \
- XX(Lazy, 1) \
- XX(Greedy, 2) \
- XX(Max, 3) \
+ XX(None, 0) \
+ XX(Lazy, 1) \
+ XX(Greedy, 2) \
+ XX(Max, 3)
#define UDF_VALIDATE_POLICY(XX) \
- XX(Fail, 0) \
- XX(Exception, 1) \
+ XX(Fail, 0) \
+ XX(Exception, 1) \
XX(Max, 2)
enum class EValidateDatumMode {
@@ -23,11 +23,11 @@ enum class EValidateDatumMode {
Expensive,
};
-enum class EValidateMode : ui8 {
+enum class EValidateMode: ui8 {
UDF_VALIDATE_MODE(ENUM_VALUE_GEN)
};
-enum class EValidatePolicy : ui8 {
+enum class EValidatePolicy: ui8 {
UDF_VALIDATE_POLICY(ENUM_VALUE_GEN)
};
@@ -38,5 +38,5 @@ TStringBuf ValidatePolicyAsStr(EValidatePolicy verifyPolicy);
EValidatePolicy ValidatePolicyByStr(const TString& verifyPolicy);
EValidateDatumMode ToDatumValidateMode(EValidateMode validateMode);
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_value.cpp b/yql/essentials/public/udf/udf_value.cpp
index 8d8add7393e..c2c096a1c0a 100644
--- a/yql/essentials/public/udf/udf_value.cpp
+++ b/yql/essentials/public/udf/udf_value.cpp
@@ -4,7 +4,8 @@ namespace NYql {
namespace NUdf {
IBoxedValue::IBoxedValue()
-{}
-
+{
}
-} \ No newline at end of file
+
+} // namespace NUdf
+} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_value.h b/yql/essentials/public/udf/udf_value.h
index a895d0f8ea7..4b3e3cfbe55 100644
--- a/yql/essentials/public/udf/udf_value.h
+++ b/yql/essentials/public/udf/udf_value.h
@@ -8,10 +8,10 @@
#include <yql/essentials/public/decimal/yql_decimal.h>
-#include <util/system/yassert.h> // FAIL, VERIFY_DEBUG
-#include <util/generic/utility.h> // Min, Max
+#include <util/system/yassert.h> // FAIL, VERIFY_DEBUG
+#include <util/generic/utility.h> // Min, Max
#include <util/generic/yexception.h> // Y_ENSURE
-#include <util/system/compiler.h> // Y_FORCE_INLINE
+#include <util/system/compiler.h> // Y_FORCE_INLINE
#include <algorithm>
#include <type_traits>
@@ -26,7 +26,7 @@ class TUnboxedValuePod;
class TOpaqueListRepresentation;
class IValueBuilder;
-enum class EFetchStatus : ui32 {
+enum class EFetchStatus: ui32 {
Ok,
Finish,
Yield
@@ -48,9 +48,9 @@ UDF_ASSERT_TYPE_SIZE(IApplyContext, 8);
class IBoxedValue;
using IBoxedValuePtr = TRefCountedPtr<IBoxedValue>;
-class IBoxedValue1
-{
-friend struct TBoxedValueAccessor;
+class IBoxedValue1 {
+ friend struct TBoxedValueAccessor;
+
public:
inline bool IsCompatibleTo(ui16 compatibilityVersion) const {
return AbiCompatibility_ >= compatibilityVersion;
@@ -79,7 +79,7 @@ private:
// Dict accessors
virtual ui64 GetDictLength() const = 0;
virtual TUnboxedValue GetDictIterator() const = 0;
- virtual TUnboxedValue GetKeysIterator() const = 0; // May return empty.
+ virtual TUnboxedValue GetKeysIterator() const = 0; // May return empty.
virtual TUnboxedValue GetPayloadsIterator() const = 0; // May return empty.
virtual bool Contains(const TUnboxedValuePod& key) const = 0;
virtual TUnboxedValue Lookup(const TUnboxedValuePod& key) const = 0;
@@ -133,8 +133,9 @@ private:
};
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 3)
-class IBoxedValue2 : public IBoxedValue1 {
-friend struct TBoxedValueAccessor;
+class IBoxedValue2: public IBoxedValue1 {
+ friend struct TBoxedValueAccessor;
+
private:
// Save/Load state
virtual ui32 GetTraverseCount() const = 0;
@@ -145,24 +146,27 @@ private:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 11)
-class IBoxedValue3 : public IBoxedValue2 {
-friend struct TBoxedValueAccessor;
+class IBoxedValue3: public IBoxedValue2 {
+ friend struct TBoxedValueAccessor;
+
private:
virtual void Push(const TUnboxedValuePod& value) = 0;
};
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 12)
-class IBoxedValue4 : public IBoxedValue3 {
-friend struct TBoxedValueAccessor;
+class IBoxedValue4: public IBoxedValue3 {
+ friend struct TBoxedValueAccessor;
+
private:
virtual bool IsSortedDict() const = 0;
};
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 19)
-class IBoxedValue5 : public IBoxedValue4 {
-friend struct TBoxedValueAccessor;
+class IBoxedValue5: public IBoxedValue4 {
+ friend struct TBoxedValueAccessor;
+
private:
virtual void Unused1() = 0;
virtual void Unused2() = 0;
@@ -174,53 +178,55 @@ private:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 30)
-class IBoxedValue6 : public IBoxedValue5 {
-friend struct TBoxedValueAccessor;
+class IBoxedValue6: public IBoxedValue5 {
+ friend struct TBoxedValueAccessor;
+
private:
virtual EFetchStatus WideFetch(TUnboxedValue* result, ui32 width) = 0;
};
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 36)
-class IBoxedValue7 : public IBoxedValue6 {
-friend struct TBoxedValueAccessor;
+class IBoxedValue7: public IBoxedValue6 {
+ friend struct TBoxedValueAccessor;
+
private:
virtual bool Load2(const TUnboxedValue& state) = 0;
};
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 36)
-class IBoxedValue : public IBoxedValue7 {
+class IBoxedValue: public IBoxedValue7 {
protected:
IBoxedValue();
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 30)
-class IBoxedValue : public IBoxedValue6 {
+class IBoxedValue: public IBoxedValue6 {
protected:
IBoxedValue();
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 19)
-class IBoxedValue : public IBoxedValue5 {
+class IBoxedValue: public IBoxedValue5 {
protected:
IBoxedValue();
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 12)
-class IBoxedValue : public IBoxedValue4 {
+class IBoxedValue: public IBoxedValue4 {
protected:
IBoxedValue();
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 11)
-class IBoxedValue : public IBoxedValue3 {
+class IBoxedValue: public IBoxedValue3 {
protected:
IBoxedValue();
};
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 3)
-class IBoxedValue : public IBoxedValue2 {
+class IBoxedValue: public IBoxedValue2 {
protected:
IBoxedValue();
};
#else
-class IBoxedValue : public IBoxedValue1 {
+class IBoxedValue: public IBoxedValue1 {
protected:
IBoxedValue();
};
@@ -233,302 +239,304 @@ UDF_ASSERT_TYPE_SIZE(IBoxedValuePtr, 8);
///////////////////////////////////////////////////////////////////////////////
// TBoxedValueAccessor
///////////////////////////////////////////////////////////////////////////////
-struct TBoxedValueAccessor
-{
+struct TBoxedValueAccessor {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 36)
-
-#define METHOD_MAP(xx) \
- xx(HasFastListLength) \
- xx(GetListLength) \
- xx(GetEstimatedListLength) \
- xx(GetListIterator) \
- xx(GetListRepresentation) \
- xx(ReverseListImpl) \
- xx(SkipListImpl) \
- xx(TakeListImpl) \
- xx(ToIndexDictImpl) \
- xx(GetDictLength) \
- xx(GetDictIterator) \
- xx(GetKeysIterator) \
- xx(GetPayloadsIterator) \
- xx(Contains) \
- xx(Lookup) \
- xx(GetElement) \
- xx(GetElements) \
- xx(Run) \
- xx(GetResourceTag) \
- xx(GetResource) \
- xx(HasListItems) \
- xx(HasDictItems) \
- xx(GetVariantIndex) \
- xx(GetVariantItem) \
- xx(Fetch) \
- xx(Skip) \
- xx(Next) \
- xx(NextPair) \
- xx(Apply) \
- xx(GetTraverseCount) \
- xx(GetTraverseItem) \
- xx(Save) \
- xx(Load) \
- xx(Push) \
- xx(IsSortedDict) \
- xx(Unused1) \
- xx(Unused2) \
- xx(Unused3) \
- xx(Unused4) \
- xx(Unused5) \
- xx(Unused6) \
- xx(WideFetch) \
- xx(Load2)
+ // clang-format off
+ #define METHOD_MAP(xx) \
+ xx(HasFastListLength) \
+ xx(GetListLength) \
+ xx(GetEstimatedListLength) \
+ xx(GetListIterator) \
+ xx(GetListRepresentation) \
+ xx(ReverseListImpl) \
+ xx(SkipListImpl) \
+ xx(TakeListImpl) \
+ xx(ToIndexDictImpl) \
+ xx(GetDictLength) \
+ xx(GetDictIterator) \
+ xx(GetKeysIterator) \
+ xx(GetPayloadsIterator) \
+ xx(Contains) \
+ xx(Lookup) \
+ xx(GetElement) \
+ xx(GetElements) \
+ xx(Run) \
+ xx(GetResourceTag) \
+ xx(GetResource) \
+ xx(HasListItems) \
+ xx(HasDictItems) \
+ xx(GetVariantIndex) \
+ xx(GetVariantItem) \
+ xx(Fetch) \
+ xx(Skip) \
+ xx(Next) \
+ xx(NextPair) \
+ xx(Apply) \
+ xx(GetTraverseCount) \
+ xx(GetTraverseItem) \
+ xx(Save) \
+ xx(Load) \
+ xx(Push) \
+ xx(IsSortedDict) \
+ xx(Unused1) \
+ xx(Unused2) \
+ xx(Unused3) \
+ xx(Unused4) \
+ xx(Unused5) \
+ xx(Unused6) \
+ xx(WideFetch) \
+ xx(Load2)
+ // clang-format on
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 30)
-
-#define METHOD_MAP(xx) \
- xx(HasFastListLength) \
- xx(GetListLength) \
- xx(GetEstimatedListLength) \
- xx(GetListIterator) \
- xx(GetListRepresentation) \
- xx(ReverseListImpl) \
- xx(SkipListImpl) \
- xx(TakeListImpl) \
- xx(ToIndexDictImpl) \
- xx(GetDictLength) \
- xx(GetDictIterator) \
- xx(GetKeysIterator) \
- xx(GetPayloadsIterator) \
- xx(Contains) \
- xx(Lookup) \
- xx(GetElement) \
- xx(GetElements) \
- xx(Run) \
- xx(GetResourceTag) \
- xx(GetResource) \
- xx(HasListItems) \
- xx(HasDictItems) \
- xx(GetVariantIndex) \
- xx(GetVariantItem) \
- xx(Fetch) \
- xx(Skip) \
- xx(Next) \
- xx(NextPair) \
- xx(Apply) \
- xx(GetTraverseCount) \
- xx(GetTraverseItem) \
- xx(Save) \
- xx(Load) \
- xx(Push) \
- xx(IsSortedDict) \
- xx(Unused1) \
- xx(Unused2) \
- xx(Unused3) \
- xx(Unused4) \
- xx(Unused5) \
- xx(Unused6) \
- xx(WideFetch) \
+ // clang-format off
+ #define METHOD_MAP(xx) \
+ xx(HasFastListLength) \
+ xx(GetListLength) \
+ xx(GetEstimatedListLength) \
+ xx(GetListIterator) \
+ xx(GetListRepresentation) \
+ xx(ReverseListImpl) \
+ xx(SkipListImpl) \
+ xx(TakeListImpl) \
+ xx(ToIndexDictImpl) \
+ xx(GetDictLength) \
+ xx(GetDictIterator) \
+ xx(GetKeysIterator) \
+ xx(GetPayloadsIterator) \
+ xx(Contains) \
+ xx(Lookup) \
+ xx(GetElement) \
+ xx(GetElements) \
+ xx(Run) \
+ xx(GetResourceTag) \
+ xx(GetResource) \
+ xx(HasListItems) \
+ xx(HasDictItems) \
+ xx(GetVariantIndex) \
+ xx(GetVariantItem) \
+ xx(Fetch) \
+ xx(Skip) \
+ xx(Next) \
+ xx(NextPair) \
+ xx(Apply) \
+ xx(GetTraverseCount) \
+ xx(GetTraverseItem) \
+ xx(Save) \
+ xx(Load) \
+ xx(Push) \
+ xx(IsSortedDict) \
+ xx(Unused1) \
+ xx(Unused2) \
+ xx(Unused3) \
+ xx(Unused4) \
+ xx(Unused5) \
+ xx(Unused6) \
+ xx(WideFetch)
+ // clang-format on
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 19)
-
-#define METHOD_MAP(xx) \
- xx(HasFastListLength) \
- xx(GetListLength) \
- xx(GetEstimatedListLength) \
- xx(GetListIterator) \
- xx(GetListRepresentation) \
- xx(ReverseListImpl) \
- xx(SkipListImpl) \
- xx(TakeListImpl) \
- xx(ToIndexDictImpl) \
- xx(GetDictLength) \
- xx(GetDictIterator) \
- xx(GetKeysIterator) \
- xx(GetPayloadsIterator) \
- xx(Contains) \
- xx(Lookup) \
- xx(GetElement) \
- xx(GetElements) \
- xx(Run) \
- xx(GetResourceTag) \
- xx(GetResource) \
- xx(HasListItems) \
- xx(HasDictItems) \
- xx(GetVariantIndex) \
- xx(GetVariantItem) \
- xx(Fetch) \
- xx(Skip) \
- xx(Next) \
- xx(NextPair) \
- xx(Apply) \
- xx(GetTraverseCount) \
- xx(GetTraverseItem) \
- xx(Save) \
- xx(Load) \
- xx(Push) \
- xx(IsSortedDict) \
- xx(Unused1) \
- xx(Unused2) \
- xx(Unused3) \
- xx(Unused4) \
- xx(Unused5) \
- xx(Unused6)
+ // clang-format off
+ #define METHOD_MAP(xx) \
+ xx(HasFastListLength) \
+ xx(GetListLength) \
+ xx(GetEstimatedListLength) \
+ xx(GetListIterator) \
+ xx(GetListRepresentation) \
+ xx(ReverseListImpl) \
+ xx(SkipListImpl) \
+ xx(TakeListImpl) \
+ xx(ToIndexDictImpl) \
+ xx(GetDictLength) \
+ xx(GetDictIterator) \
+ xx(GetKeysIterator) \
+ xx(GetPayloadsIterator) \
+ xx(Contains) \
+ xx(Lookup) \
+ xx(GetElement) \
+ xx(GetElements) \
+ xx(Run) \
+ xx(GetResourceTag) \
+ xx(GetResource) \
+ xx(HasListItems) \
+ xx(HasDictItems) \
+ xx(GetVariantIndex) \
+ xx(GetVariantItem) \
+ xx(Fetch) \
+ xx(Skip) \
+ xx(Next) \
+ xx(NextPair) \
+ xx(Apply) \
+ xx(GetTraverseCount) \
+ xx(GetTraverseItem) \
+ xx(Save) \
+ xx(Load) \
+ xx(Push) \
+ xx(IsSortedDict) \
+ xx(Unused1) \
+ xx(Unused2) \
+ xx(Unused3) \
+ xx(Unused4) \
+ xx(Unused5) \
+ xx(Unused6)
+ // clang-format on
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 12)
-
-#define METHOD_MAP(xx) \
- xx(HasFastListLength) \
- xx(GetListLength) \
- xx(GetEstimatedListLength) \
- xx(GetListIterator) \
- xx(GetListRepresentation) \
- xx(ReverseListImpl) \
- xx(SkipListImpl) \
- xx(TakeListImpl) \
- xx(ToIndexDictImpl) \
- xx(GetDictLength) \
- xx(GetDictIterator) \
- xx(GetKeysIterator) \
- xx(GetPayloadsIterator) \
- xx(Contains) \
- xx(Lookup) \
- xx(GetElement) \
- xx(GetElements) \
- xx(Run) \
- xx(GetResourceTag) \
- xx(GetResource) \
- xx(HasListItems) \
- xx(HasDictItems) \
- xx(GetVariantIndex) \
- xx(GetVariantItem) \
- xx(Fetch) \
- xx(Skip) \
- xx(Next) \
- xx(NextPair) \
- xx(Apply) \
- xx(GetTraverseCount) \
- xx(GetTraverseItem) \
- xx(Save) \
- xx(Load) \
- xx(Push) \
- xx(IsSortedDict)
-
+ // clang-format off
+ #define METHOD_MAP(xx) \
+ xx(HasFastListLength) \
+ xx(GetListLength) \
+ xx(GetEstimatedListLength) \
+ xx(GetListIterator) \
+ xx(GetListRepresentation) \
+ xx(ReverseListImpl) \
+ xx(SkipListImpl) \
+ xx(TakeListImpl) \
+ xx(ToIndexDictImpl) \
+ xx(GetDictLength) \
+ xx(GetDictIterator) \
+ xx(GetKeysIterator) \
+ xx(GetPayloadsIterator) \
+ xx(Contains) \
+ xx(Lookup) \
+ xx(GetElement) \
+ xx(GetElements) \
+ xx(Run) \
+ xx(GetResourceTag) \
+ xx(GetResource) \
+ xx(HasListItems) \
+ xx(HasDictItems) \
+ xx(GetVariantIndex) \
+ xx(GetVariantItem) \
+ xx(Fetch) \
+ xx(Skip) \
+ xx(Next) \
+ xx(NextPair) \
+ xx(Apply) \
+ xx(GetTraverseCount) \
+ xx(GetTraverseItem) \
+ xx(Save) \
+ xx(Load) \
+ xx(Push) \
+ xx(IsSortedDict)
+ // clang-format on
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 11)
-
-#define METHOD_MAP(xx) \
- xx(HasFastListLength) \
- xx(GetListLength) \
- xx(GetEstimatedListLength) \
- xx(GetListIterator) \
- xx(GetListRepresentation) \
- xx(ReverseListImpl) \
- xx(SkipListImpl) \
- xx(TakeListImpl) \
- xx(ToIndexDictImpl) \
- xx(GetDictLength) \
- xx(GetDictIterator) \
- xx(GetKeysIterator) \
- xx(GetPayloadsIterator) \
- xx(Contains) \
- xx(Lookup) \
- xx(GetElement) \
- xx(GetElements) \
- xx(Run) \
- xx(GetResourceTag) \
- xx(GetResource) \
- xx(HasListItems) \
- xx(HasDictItems) \
- xx(GetVariantIndex) \
- xx(GetVariantItem) \
- xx(Fetch) \
- xx(Skip) \
- xx(Next) \
- xx(NextPair) \
- xx(Apply) \
- xx(GetTraverseCount) \
- xx(GetTraverseItem) \
- xx(Save) \
- xx(Load) \
- xx(Push)
-
+ // clang-format off
+ #define METHOD_MAP(xx) \
+ xx(HasFastListLength) \
+ xx(GetListLength) \
+ xx(GetEstimatedListLength) \
+ xx(GetListIterator) \
+ xx(GetListRepresentation) \
+ xx(ReverseListImpl) \
+ xx(SkipListImpl) \
+ xx(TakeListImpl) \
+ xx(ToIndexDictImpl) \
+ xx(GetDictLength) \
+ xx(GetDictIterator) \
+ xx(GetKeysIterator) \
+ xx(GetPayloadsIterator) \
+ xx(Contains) \
+ xx(Lookup) \
+ xx(GetElement) \
+ xx(GetElements) \
+ xx(Run) \
+ xx(GetResourceTag) \
+ xx(GetResource) \
+ xx(HasListItems) \
+ xx(HasDictItems) \
+ xx(GetVariantIndex) \
+ xx(GetVariantItem) \
+ xx(Fetch) \
+ xx(Skip) \
+ xx(Next) \
+ xx(NextPair) \
+ xx(Apply) \
+ xx(GetTraverseCount) \
+ xx(GetTraverseItem) \
+ xx(Save) \
+ xx(Load) \
+ xx(Push)
+ // clang-format on
#elif UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 3)
-
-#define METHOD_MAP(xx) \
- xx(HasFastListLength) \
- xx(GetListLength) \
- xx(GetEstimatedListLength) \
- xx(GetListIterator) \
- xx(GetListRepresentation) \
- xx(ReverseListImpl) \
- xx(SkipListImpl) \
- xx(TakeListImpl) \
- xx(ToIndexDictImpl) \
- xx(GetDictLength) \
- xx(GetDictIterator) \
- xx(GetKeysIterator) \
- xx(GetPayloadsIterator) \
- xx(Contains) \
- xx(Lookup) \
- xx(GetElement) \
- xx(GetElements) \
- xx(Run) \
- xx(GetResourceTag) \
- xx(GetResource) \
- xx(HasListItems) \
- xx(HasDictItems) \
- xx(GetVariantIndex) \
- xx(GetVariantItem) \
- xx(Fetch) \
- xx(Skip) \
- xx(Next) \
- xx(NextPair) \
- xx(Apply) \
- xx(GetTraverseCount) \
- xx(GetTraverseItem) \
- xx(Save) \
- xx(Load)
-
+ // clang-format off
+ #define METHOD_MAP(xx) \
+ xx(HasFastListLength) \
+ xx(GetListLength) \
+ xx(GetEstimatedListLength) \
+ xx(GetListIterator) \
+ xx(GetListRepresentation) \
+ xx(ReverseListImpl) \
+ xx(SkipListImpl) \
+ xx(TakeListImpl) \
+ xx(ToIndexDictImpl) \
+ xx(GetDictLength) \
+ xx(GetDictIterator) \
+ xx(GetKeysIterator) \
+ xx(GetPayloadsIterator) \
+ xx(Contains) \
+ xx(Lookup) \
+ xx(GetElement) \
+ xx(GetElements) \
+ xx(Run) \
+ xx(GetResourceTag) \
+ xx(GetResource) \
+ xx(HasListItems) \
+ xx(HasDictItems) \
+ xx(GetVariantIndex) \
+ xx(GetVariantItem) \
+ xx(Fetch) \
+ xx(Skip) \
+ xx(Next) \
+ xx(NextPair) \
+ xx(Apply) \
+ xx(GetTraverseCount) \
+ xx(GetTraverseItem) \
+ xx(Save) \
+ xx(Load)
+ // clang-format on
#else
-
-#define METHOD_MAP(xx) \
- xx(HasFastListLength) \
- xx(GetListLength) \
- xx(GetEstimatedListLength) \
- xx(GetListIterator) \
- xx(GetListRepresentation) \
- xx(ReverseListImpl) \
- xx(SkipListImpl) \
- xx(TakeListImpl) \
- xx(ToIndexDictImpl) \
- xx(GetDictLength) \
- xx(GetDictIterator) \
- xx(GetKeysIterator) \
- xx(GetPayloadsIterator) \
- xx(Contains) \
- xx(Lookup) \
- xx(GetElement) \
- xx(GetElements) \
- xx(Run) \
- xx(GetResourceTag) \
- xx(GetResource) \
- xx(HasListItems) \
- xx(HasDictItems) \
- xx(GetVariantIndex) \
- xx(GetVariantItem) \
- xx(Fetch) \
- xx(Skip) \
- xx(Next) \
- xx(NextPair) \
- xx(Apply)
-
+ // clang-format off
+ #define METHOD_MAP(xx) \
+ xx(HasFastListLength) \
+ xx(GetListLength) \
+ xx(GetEstimatedListLength) \
+ xx(GetListIterator) \
+ xx(GetListRepresentation) \
+ xx(ReverseListImpl) \
+ xx(SkipListImpl) \
+ xx(TakeListImpl) \
+ xx(ToIndexDictImpl) \
+ xx(GetDictLength) \
+ xx(GetDictIterator) \
+ xx(GetKeysIterator) \
+ xx(GetPayloadsIterator) \
+ xx(Contains) \
+ xx(Lookup) \
+ xx(GetElement) \
+ xx(GetElements) \
+ xx(Run) \
+ xx(GetResourceTag) \
+ xx(GetResource) \
+ xx(HasListItems) \
+ xx(HasDictItems) \
+ xx(GetVariantIndex) \
+ xx(GetVariantItem) \
+ xx(Fetch) \
+ xx(Skip) \
+ xx(Next) \
+ xx(NextPair) \
+ xx(Apply)
+ // clang-format on
#endif
- enum class EMethod : ui32 {
+ enum class EMethod: ui32 {
#define MAP_HANDLER(xx) xx,
METHOD_MAP(MAP_HANDLER)
#undef MAP_HANDLER
};
- template<typename Method>
+ template <typename Method>
static uintptr_t GetMethodPtr(Method method) {
uintptr_t ret;
memcpy(&ret, &method, sizeof(uintptr_t));
@@ -537,7 +545,9 @@ struct TBoxedValueAccessor
static uintptr_t GetMethodPtr(EMethod method) {
switch (method) {
-#define MAP_HANDLER(xx) case EMethod::xx: return GetMethodPtr(&IBoxedValue::xx);
+#define MAP_HANDLER(xx) \
+ case EMethod::xx: \
+ return GetMethodPtr(&IBoxedValue::xx);
METHOD_MAP(MAP_HANDLER)
#undef MAP_HANDLER
}
@@ -545,7 +555,8 @@ struct TBoxedValueAccessor
Y_ABORT("unknown method");
}
- template<EMethod Method> static uintptr_t GetMethodPtr();
+ template <EMethod Method>
+ static uintptr_t GetMethodPtr();
// List accessors
static inline bool HasFastListLength(const IBoxedValue& value);
@@ -621,7 +632,11 @@ struct TBoxedValueAccessor
#endif
};
-#define MAP_HANDLER(xx) template<> inline uintptr_t TBoxedValueAccessor::GetMethodPtr<TBoxedValueAccessor::EMethod::xx>() { return GetMethodPtr(&IBoxedValue::xx); }
+#define MAP_HANDLER(xx) \
+ template <> \
+ inline uintptr_t TBoxedValueAccessor::GetMethodPtr<TBoxedValueAccessor::EMethod::xx>() { \
+ return GetMethodPtr(&IBoxedValue::xx); \
+ }
METHOD_MAP(MAP_HANDLER)
#undef MAP_HANDLER
@@ -713,28 +728,32 @@ private:
#endif
};
-class TBoxedValueLink: public TBoxedValueBase
-{
+class TBoxedValueLink: public TBoxedValueBase {
public:
void Link(TBoxedValueLink* root);
void Unlink();
- void InitLinks() { Left_ = Right_ = this; }
- TBoxedValueLink* GetLeft() const { return Left_; }
- TBoxedValueLink* GetRight() const { return Right_; }
+ void InitLinks() {
+ Left_ = Right_ = this;
+ }
+ TBoxedValueLink* GetLeft() const {
+ return Left_;
+ }
+ TBoxedValueLink* GetRight() const {
+ return Right_;
+ }
+
private:
- TBoxedValueLink *Left_ = nullptr;
- TBoxedValueLink *Right_ = nullptr;
+ TBoxedValueLink* Left_ = nullptr;
+ TBoxedValueLink* Right_ = nullptr;
};
-class TBoxedValue: public TBoxedValueLink, public TWithUdfAllocator
-{
+class TBoxedValue: public TBoxedValueLink, public TWithUdfAllocator {
public:
TBoxedValue();
~TBoxedValue();
};
-class TManagedBoxedValue: public TBoxedValueBase, public TWithUdfAllocator
-{
+class TManagedBoxedValue: public TBoxedValueBase, public TWithUdfAllocator {
};
UDF_ASSERT_TYPE_SIZE(TBoxedValue, 32);
@@ -769,11 +788,11 @@ struct TRawStringValue {
};
};
-class TUnboxedValuePod
-{
-friend class TUnboxedValue;
+class TUnboxedValuePod {
+ friend class TUnboxedValue;
+
public:
- enum class EMarkers : ui8 {
+ enum class EMarkers: ui8 {
Empty = 0,
Embedded,
String,
@@ -799,13 +818,23 @@ public:
void Dump(IOutputStream& out) const;
// meta information
- inline explicit operator bool() const { return bool(Raw); }
+ inline explicit operator bool() const {
+ return bool(Raw);
+ }
- inline bool HasValue() const { return EMarkers::Empty != Raw.GetMarkers(); }
+ inline bool HasValue() const {
+ return EMarkers::Empty != Raw.GetMarkers();
+ }
- inline bool IsString() const { return EMarkers::String == Raw.GetMarkers(); }
- inline bool IsBoxed() const { return EMarkers::Boxed == Raw.GetMarkers(); }
- inline bool IsEmbedded() const { return EMarkers::Embedded == Raw.GetMarkers(); }
+ inline bool IsString() const {
+ return EMarkers::String == Raw.GetMarkers();
+ }
+ inline bool IsBoxed() const {
+ return EMarkers::Boxed == Raw.GetMarkers();
+ }
+ inline bool IsEmbedded() const {
+ return EMarkers::Embedded == Raw.GetMarkers();
+ }
// Data accessors
template <typename T, typename = std::enable_if_t<TPrimitiveDataType<T>::Result || std::is_same_v<T, NYql::NDecimal::TInt128>>>
@@ -847,8 +876,10 @@ public:
inline TUnboxedValuePod MakeOptional() const;
inline TUnboxedValuePod GetOptionalValue() const;
- template<bool IsOptional> inline TUnboxedValuePod GetOptionalValueIf() const;
- template<bool IsOptional> inline TUnboxedValuePod MakeOptionalIf() const;
+ template <bool IsOptional>
+ inline TUnboxedValuePod GetOptionalValueIf() const;
+ template <bool IsOptional>
+ inline TUnboxedValuePod MakeOptionalIf() const;
// List accessors
inline bool HasFastListLength() const;
@@ -908,7 +939,7 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 30)
- inline EFetchStatus WideFetch(TUnboxedValue *result, ui32 width) const;
+ inline EFetchStatus WideFetch(TUnboxedValue* result, ui32 width) const;
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 36)
@@ -932,9 +963,9 @@ protected:
struct {
union {
- #define FIELD(type) type type##_;
+#define FIELD(type) type type##_;
PRIMITIVE_VALUE_TYPES(FIELD);
- #undef FIELD
+#undef FIELD
const void* Void;
ui64 Count;
};
@@ -957,7 +988,9 @@ protected:
return Simple.Meta >> 2;
}
- explicit operator bool() const { return Simple.FullMeta | Simple.Count; }
+ explicit operator bool() const {
+ return Simple.FullMeta | Simple.Count;
+ }
} Raw;
public:
@@ -984,8 +1017,7 @@ static_assert(std::is_trivially_move_constructible<TUnboxedValuePod>::value, "In
//////////////////////////////////////////////////////////////////////////////
// TUnboxedValue
///////////////////////////////////////////////////////////////////////////////
-class TUnboxedValue : public TUnboxedValuePod
-{
+class TUnboxedValue: public TUnboxedValuePod {
public:
inline TUnboxedValue() noexcept = default;
inline ~TUnboxedValue() noexcept;
@@ -1012,8 +1044,7 @@ UDF_ASSERT_TYPE_SIZE(TUnboxedValue, 16);
// TBoxedResource
///////////////////////////////////////////////////////////////////////////////
template <typename TResourceData, const char* ResourceTag>
-class TBoxedResource: public TBoxedValue
-{
+class TBoxedResource: public TBoxedValue {
public:
template <typename... Args>
inline TBoxedResource(Args&&... args)
@@ -1048,17 +1079,17 @@ private:
} // namespace NUdf
} // namespace NYql
-template<>
-inline void Out<NYql::NUdf::TUnboxedValuePod>(class IOutputStream &o, const NYql::NUdf::TUnboxedValuePod& value);
+template <>
+inline void Out<NYql::NUdf::TUnboxedValuePod>(class IOutputStream& o, const NYql::NUdf::TUnboxedValuePod& value);
-template<>
-inline void Out<NYql::NUdf::TUnboxedValue>(class IOutputStream &o, const NYql::NUdf::TUnboxedValue& value);
+template <>
+inline void Out<NYql::NUdf::TUnboxedValue>(class IOutputStream& o, const NYql::NUdf::TUnboxedValue& value);
-template<>
-inline void Out<NYql::NUdf::EFetchStatus>(class IOutputStream &o, NYql::NUdf::EFetchStatus value);
+template <>
+inline void Out<NYql::NUdf::EFetchStatus>(class IOutputStream& o, NYql::NUdf::EFetchStatus value);
-template<>
-inline void Out<NYql::NUdf::TStringRef>(class IOutputStream &o, const NYql::NUdf::TStringRef& value);
+template <>
+inline void Out<NYql::NUdf::TStringRef>(class IOutputStream& o, const NYql::NUdf::TStringRef& value);
#include "udf_terminator.h"
#include <util/stream/output.h>
@@ -1070,18 +1101,15 @@ namespace NUdf {
//////////////////////////////////////////////////////////////////////////////
// TBoxedValue
//////////////////////////////////////////////////////////////////////////////
-inline bool TBoxedValueBase::HasFastListLength() const
-{
+inline bool TBoxedValueBase::HasFastListLength() const {
Y_ABORT("Not implemented");
}
-inline ui64 TBoxedValueBase::GetListLength() const
-{
+inline ui64 TBoxedValueBase::GetListLength() const {
Y_ABORT("Not implemented");
}
-inline ui64 TBoxedValueBase::GetEstimatedListLength() const
-{
+inline ui64 TBoxedValueBase::GetEstimatedListLength() const {
Y_ABORT("Not implemented");
}
@@ -1111,8 +1139,7 @@ inline IBoxedValuePtr TBoxedValueBase::ToIndexDictImpl(const IValueBuilder& buil
return nullptr;
}
-inline ui64 TBoxedValueBase::GetDictLength() const
-{
+inline ui64 TBoxedValueBase::GetDictLength() const {
Y_ABORT("Not implemented");
}
@@ -1137,23 +1164,19 @@ inline void TBoxedValueLink::Unlink() {
Left_ = Right_ = nullptr;
}
-inline TUnboxedValue TBoxedValueBase::GetDictIterator() const
-{
+inline TUnboxedValue TBoxedValueBase::GetDictIterator() const {
Y_ABORT("Not implemented");
}
-inline TUnboxedValue TBoxedValueBase::GetListIterator() const
-{
+inline TUnboxedValue TBoxedValueBase::GetListIterator() const {
Y_ABORT("Not implemented");
}
-inline TUnboxedValue TBoxedValueBase::GetKeysIterator() const
-{
+inline TUnboxedValue TBoxedValueBase::GetKeysIterator() const {
Y_ABORT("Not implemented");
}
-inline TUnboxedValue TBoxedValueBase::GetPayloadsIterator() const
-{
+inline TUnboxedValue TBoxedValueBase::GetPayloadsIterator() const {
Y_ABORT("Not implemented");
}
@@ -1173,19 +1196,16 @@ inline bool TBoxedValueBase::NextPair(TUnboxedValue&, TUnboxedValue&)
Y_ABORT("Not implemented");
}
-inline TUnboxedValue TBoxedValueBase::GetElement(ui32 index) const
-{
+inline TUnboxedValue TBoxedValueBase::GetElement(ui32 index) const {
Y_UNUSED(index);
Y_ABORT("Not implemented");
}
-inline const TUnboxedValue* TBoxedValueBase::GetElements() const
-{
+inline const TUnboxedValue* TBoxedValueBase::GetElements() const {
return nullptr;
}
-inline void TBoxedValueBase::Apply(IApplyContext&) const
-{
+inline void TBoxedValueBase::Apply(IApplyContext&) const {
Y_ABORT("Not implemented");
}
@@ -1210,20 +1230,17 @@ inline ui32 TBoxedValueBase::GetVariantIndex() const {
Y_ABORT("Not implemented");
}
-inline bool TBoxedValueBase::Contains(const TUnboxedValuePod& key) const
-{
+inline bool TBoxedValueBase::Contains(const TUnboxedValuePod& key) const {
Y_UNUSED(key);
Y_ABORT("Not implemented");
}
-inline TUnboxedValue TBoxedValueBase::Lookup(const TUnboxedValuePod& key) const
-{
+inline TUnboxedValue TBoxedValueBase::Lookup(const TUnboxedValuePod& key) const {
Y_UNUSED(key);
Y_ABORT("Not implemented");
}
-inline TUnboxedValue TBoxedValueBase::Run(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const
-{
+inline TUnboxedValue TBoxedValueBase::Run(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const {
Y_UNUSED(valueBuilder);
Y_UNUSED(args);
Y_ABORT("Not implemented");
@@ -1299,7 +1316,7 @@ inline void TBoxedValueBase::Unused6() {
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 30)
-inline EFetchStatus TBoxedValueBase::WideFetch(TUnboxedValue *result, ui32 width) {
+inline EFetchStatus TBoxedValueBase::WideFetch(TUnboxedValue* result, ui32 width) {
Y_UNUSED(result);
Y_UNUSED(width);
Y_ABORT("Not implemented");
@@ -1315,54 +1332,53 @@ inline bool TBoxedValueBase::Load2(const TUnboxedValue& value) {
inline void TUnboxedValuePod::Dump(IOutputStream& out) const {
switch (Raw.GetMarkers()) {
- case EMarkers::Empty:
- out << "Empty, count: " << (i64)Raw.Simple.Count;
- break;
- case EMarkers::Embedded:
- out << "Embedded, size: " << (ui32)Raw.Embedded.Size << ", buffer: " <<
- TString(Raw.Embedded.Buffer, sizeof(Raw.Embedded.Buffer)).Quote();
- break;
- case EMarkers::String: {
- out << "String, size: " << Raw.String.Size << ", offset: " << (Raw.String.Offset & 0xffffff) << ", buffer: ";
- auto ref = AsStringRef();
- out << TString(ref.Data(), ref.Size()).Quote();
- break;
- }
- case EMarkers::Boxed:
- out << "Boxed, pointer: " << (void*)Raw.Boxed.Value;
- break;
+ case EMarkers::Empty:
+ out << "Empty, count: " << (i64)Raw.Simple.Count;
+ break;
+ case EMarkers::Embedded:
+ out << "Embedded, size: " << (ui32)Raw.Embedded.Size << ", buffer: " << TString(Raw.Embedded.Buffer, sizeof(Raw.Embedded.Buffer)).Quote();
+ break;
+ case EMarkers::String: {
+ out << "String, size: " << Raw.String.Size << ", offset: " << (Raw.String.Offset & 0xffffff) << ", buffer: ";
+ auto ref = AsStringRef();
+ out << TString(ref.Data(), ref.Size()).Quote();
+ break;
+ }
+ case EMarkers::Boxed:
+ out << "Boxed, pointer: " << (void*)Raw.Boxed.Value;
+ break;
}
}
} // namespace NUdf
} // namespace NYql
-template<>
-inline void Out<NYql::NUdf::TUnboxedValuePod>(class IOutputStream &o, const NYql::NUdf::TUnboxedValuePod& value) {
+template <>
+inline void Out<NYql::NUdf::TUnboxedValuePod>(class IOutputStream& o, const NYql::NUdf::TUnboxedValuePod& value) {
value.Dump(o);
}
-template<>
-inline void Out<NYql::NUdf::TUnboxedValue>(class IOutputStream &o, const NYql::NUdf::TUnboxedValue& value) {
+template <>
+inline void Out<NYql::NUdf::TUnboxedValue>(class IOutputStream& o, const NYql::NUdf::TUnboxedValue& value) {
value.Dump(o);
}
-template<>
-inline void Out<NYql::NUdf::EFetchStatus>(class IOutputStream &o, NYql::NUdf::EFetchStatus value) {
+template <>
+inline void Out<NYql::NUdf::EFetchStatus>(class IOutputStream& o, NYql::NUdf::EFetchStatus value) {
switch (value) {
- case NYql::NUdf::EFetchStatus::Ok:
- o << "Ok";
- break;
- case NYql::NUdf::EFetchStatus::Yield:
- o << "Yield";
- break;
- case NYql::NUdf::EFetchStatus::Finish:
- o << "Finish";
- break;
+ case NYql::NUdf::EFetchStatus::Ok:
+ o << "Ok";
+ break;
+ case NYql::NUdf::EFetchStatus::Yield:
+ o << "Yield";
+ break;
+ case NYql::NUdf::EFetchStatus::Finish:
+ o << "Finish";
+ break;
}
}
-template<>
-inline void Out<NYql::NUdf::TStringRef>(class IOutputStream &o, const NYql::NUdf::TStringRef& value) {
+template <>
+inline void Out<NYql::NUdf::TStringRef>(class IOutputStream& o, const NYql::NUdf::TStringRef& value) {
o << TStringBuf(value.Data(), value.Size());
}
diff --git a/yql/essentials/public/udf/udf_value_builder.cpp b/yql/essentials/public/udf/udf_value_builder.cpp
index 1d0662f7702..d615e79e32c 100644
--- a/yql/essentials/public/udf/udf_value_builder.cpp
+++ b/yql/essentials/public/udf/udf_value_builder.cpp
@@ -4,13 +4,16 @@ namespace NYql {
namespace NUdf {
IDateBuilder::IDateBuilder()
-{}
+{
+}
IPgBuilder::IPgBuilder()
-{}
+{
+}
IValueBuilder::IValueBuilder()
-{}
+{
+}
} // namespace NUdf
} // namespace NYql
diff --git a/yql/essentials/public/udf/udf_value_builder.h b/yql/essentials/public/udf/udf_value_builder.h
index a1c48016447..2f154821cd3 100644
--- a/yql/essentials/public/udf/udf_value_builder.h
+++ b/yql/essentials/public/udf/udf_value_builder.h
@@ -27,8 +27,7 @@ struct TDictFlags {
};
};
-class IDictValueBuilder
-{
+class IDictValueBuilder {
public:
using TPtr = TUniquePtr<IDictValueBuilder>;
@@ -63,8 +62,7 @@ UDF_ASSERT_TYPE_SIZE(IListValueBuilder, 8);
///////////////////////////////////////////////////////////////////////////////
// IDateBuilder
///////////////////////////////////////////////////////////////////////////////
-class IDateBuilder1
-{
+class IDateBuilder1 {
public:
virtual ~IDateBuilder1() = default;
@@ -72,31 +70,30 @@ public:
virtual bool SplitDate(ui16 value, ui32& year, ui32& month, ui32& day) const = 0;
virtual bool MakeDatetime(ui32 year, ui32 month, ui32 day, ui32 hour, ui32 minute, ui32 second, ui32& value,
- ui16 timezoneId = 0) const = 0;
+ ui16 timezoneId = 0) const = 0;
virtual bool SplitDatetime(ui32 value, ui32& year, ui32& month, ui32& day, ui32& hour, ui32& minute, ui32& second,
- ui16 timezoneId = 0) const = 0;
+ ui16 timezoneId = 0) const = 0;
// deprecated
virtual bool EnrichDate(ui16 date, ui32& dayOfYear, ui32& weekOfYear, ui32& dayOfWeek) const = 0;
// in minutes
virtual bool GetTimezoneShift(ui32 year, ui32 month, ui32 day, ui32 hour, ui32 minute, ui32 second,
- ui16 timezoneId, i32& value) const = 0;
+ ui16 timezoneId, i32& value) const = 0;
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT < UDF_ABI_COMPATIBILITY_VERSION(2, 23)
virtual void Unused7() const = 0;
virtual void Unused8() const = 0;
#else
virtual bool FullSplitDate(ui16 value, ui32& year, ui32& month, ui32& day,
- ui32& dayOfYear, ui32& weekOfYear, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
+ ui32& dayOfYear, ui32& weekOfYear, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
virtual bool FullSplitDatetime(ui32 value, ui32& year, ui32& month, ui32& day, ui32& hour, ui32& minute, ui32& second,
- ui32& dayOfYear, ui32& weekOfYear, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
+ ui32& dayOfYear, ui32& weekOfYear, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
#endif
};
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 7)
-class IDateBuilder2: public IDateBuilder1
-{
+class IDateBuilder2: public IDateBuilder1 {
public:
virtual bool FindTimezoneName(ui32 id, TStringRef& name) const = 0;
virtual bool FindTimezoneId(const TStringRef& name, ui32& id) const = 0;
@@ -104,29 +101,27 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 24)
-class IDateBuilder3: public IDateBuilder2
-{
+class IDateBuilder3: public IDateBuilder2 {
public:
virtual bool EnrichDate2(ui16 date, ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek) const = 0;
virtual bool FullSplitDate2(ui16 value, ui32& year, ui32& month, ui32& day,
- ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
+ ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
virtual bool FullSplitDatetime2(ui32 value, ui32& year, ui32& month, ui32& day, ui32& hour, ui32& minute, ui32& second,
- ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
+ ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
};
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 40)
-class IDateBuilder4: public IDateBuilder3
-{
+class IDateBuilder4: public IDateBuilder3 {
public:
virtual bool SplitTzDate32(i32 date, i32& year, ui32& month, ui32& day,
- ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
+ ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
virtual bool SplitTzDatetime64(i64 datetime, i32& year, ui32& month, ui32& day,
- ui32& hour, ui32& minute, ui32& second,
- ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
+ ui32& hour, ui32& minute, ui32& second,
+ ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const = 0;
virtual bool MakeTzDate32(i32 year, ui32 month, ui32 day, i32& date, ui16 timezoneId = 0) const = 0;
virtual bool MakeTzDatetime64(i32 year, ui32 month, ui32 day,
- ui32 hour, ui32 minute, ui32 second, i64& datetime, ui16 timezoneId = 0) const = 0;
+ ui32 hour, ui32 minute, ui32 second, i64& datetime, ui16 timezoneId = 0) const = 0;
};
#endif
@@ -177,8 +172,7 @@ public:
};
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 31)
-class IPgBuilder2: public IPgBuilder1
-{
+class IPgBuilder2: public IPgBuilder1 {
public:
virtual TStringRef AsCStringBuffer(const TUnboxedValue& value) const = 0;
virtual TStringRef AsTextBuffer(const TUnboxedValue& value) const = 0;
@@ -186,8 +180,7 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 33)
-class IPgBuilder3: public IPgBuilder2
-{
+class IPgBuilder3: public IPgBuilder2 {
public:
virtual TUnboxedValue MakeCString(const char* value) const = 0;
virtual TUnboxedValue MakeText(const char* value) const = 0;
@@ -195,8 +188,7 @@ public:
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 35)
-class IPgBuilder4: public IPgBuilder3
-{
+class IPgBuilder4: public IPgBuilder3 {
public:
virtual TStringRef AsFixedStringBuffer(const TUnboxedValue& value, ui32 length) const = 0;
};
@@ -229,8 +221,7 @@ UDF_ASSERT_TYPE_SIZE(IPgBuilder, 8);
///////////////////////////////////////////////////////////////////////////////
// IValueBuilder
///////////////////////////////////////////////////////////////////////////////
-class IValueBuilder1
-{
+class IValueBuilder1 {
public:
virtual ~IValueBuilder1() = default;
@@ -263,7 +254,9 @@ public:
virtual TUnboxedValue NewVariant(ui32 index, TUnboxedValue&& value) const = 0;
- inline TUnboxedValue NewEmptyList() const { return NewList(nullptr, 0); }
+ inline TUnboxedValue NewEmptyList() const {
+ return NewList(nullptr, 0);
+ }
};
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 1)
@@ -385,8 +378,13 @@ private:
std::array<TUnboxedValue, 2U> Cached_;
std::array<TUnboxedValue*, 2U> CachedItems_;
ui8 CacheIndex_ = 0U;
+
public:
- TPlainArrayCache(ui32 size): Size_(size) { Clear(); }
+ TPlainArrayCache(ui32 size)
+ : Size_(size)
+ {
+ Clear();
+ }
TPlainArrayCache(TPlainArrayCache&&) = delete;
TPlainArrayCache(const TPlainArrayCache&) = delete;
diff --git a/yql/essentials/public/udf/udf_value_builder_ut.cpp b/yql/essentials/public/udf/udf_value_builder_ut.cpp
index 64084a37e75..4b9d88e715a 100644
--- a/yql/essentials/public/udf/udf_value_builder_ut.cpp
+++ b/yql/essentials/public/udf/udf_value_builder_ut.cpp
@@ -7,30 +7,30 @@
using namespace NYql::NUdf;
Y_UNIT_TEST_SUITE(TUdfValueBuilder) {
- Y_UNIT_TEST(LockMethodsTable) {
- using NYql::GetMethodIndex;
- UNIT_ASSERT_VALUES_EQUAL(2, GetMethodIndex(&IValueBuilder::NewStringNotFilled));
- UNIT_ASSERT_VALUES_EQUAL(3, GetMethodIndex(&IValueBuilder::NewString));
- UNIT_ASSERT_VALUES_EQUAL(4, GetMethodIndex(&IValueBuilder::ConcatStrings));
- UNIT_ASSERT_VALUES_EQUAL(5, GetMethodIndex(&IValueBuilder::AppendString));
- UNIT_ASSERT_VALUES_EQUAL(6, GetMethodIndex(&IValueBuilder::PrependString));
- UNIT_ASSERT_VALUES_EQUAL(7, GetMethodIndex(&IValueBuilder::SubString));
- UNIT_ASSERT_VALUES_EQUAL(8, GetMethodIndex(&IValueBuilder::NewDict));
- UNIT_ASSERT_VALUES_EQUAL(9, GetMethodIndex(&IValueBuilder::NewList));
- UNIT_ASSERT_VALUES_EQUAL(10, GetMethodIndex(&IValueBuilder::ReverseList));
- UNIT_ASSERT_VALUES_EQUAL(11, GetMethodIndex(&IValueBuilder::SkipList));
- UNIT_ASSERT_VALUES_EQUAL(12, GetMethodIndex(&IValueBuilder::TakeList));
- UNIT_ASSERT_VALUES_EQUAL(13, GetMethodIndex(&IValueBuilder::ToIndexDict));
- UNIT_ASSERT_VALUES_EQUAL(14, GetMethodIndex(&IValueBuilder::NewArray32));
- UNIT_ASSERT_VALUES_EQUAL(15, GetMethodIndex(&IValueBuilder::NewVariant));
- UNIT_ASSERT_VALUES_EQUAL(16, GetMethodIndex(&IValueBuilder::GetDateBuilder));
- UNIT_ASSERT_VALUES_EQUAL(17, GetMethodIndex(&IValueBuilder::GetSecureParam));
- UNIT_ASSERT_VALUES_EQUAL(18, GetMethodIndex(&IValueBuilder::CalleePosition));
- UNIT_ASSERT_VALUES_EQUAL(19, GetMethodIndex(&IValueBuilder::Run));
- UNIT_ASSERT_VALUES_EQUAL(20, GetMethodIndex(&IValueBuilder::ExportArrowBlock));
- UNIT_ASSERT_VALUES_EQUAL(21, GetMethodIndex(&IValueBuilder::ImportArrowBlock));
- UNIT_ASSERT_VALUES_EQUAL(22, GetMethodIndex(&IValueBuilder::GetArrowBlockChunks));
- UNIT_ASSERT_VALUES_EQUAL(23, GetMethodIndex(&IValueBuilder::GetPgBuilder));
- UNIT_ASSERT_VALUES_EQUAL(24, GetMethodIndex(&IValueBuilder::NewArray64));
- }
+Y_UNIT_TEST(LockMethodsTable) {
+ using NYql::GetMethodIndex;
+ UNIT_ASSERT_VALUES_EQUAL(2, GetMethodIndex(&IValueBuilder::NewStringNotFilled));
+ UNIT_ASSERT_VALUES_EQUAL(3, GetMethodIndex(&IValueBuilder::NewString));
+ UNIT_ASSERT_VALUES_EQUAL(4, GetMethodIndex(&IValueBuilder::ConcatStrings));
+ UNIT_ASSERT_VALUES_EQUAL(5, GetMethodIndex(&IValueBuilder::AppendString));
+ UNIT_ASSERT_VALUES_EQUAL(6, GetMethodIndex(&IValueBuilder::PrependString));
+ UNIT_ASSERT_VALUES_EQUAL(7, GetMethodIndex(&IValueBuilder::SubString));
+ UNIT_ASSERT_VALUES_EQUAL(8, GetMethodIndex(&IValueBuilder::NewDict));
+ UNIT_ASSERT_VALUES_EQUAL(9, GetMethodIndex(&IValueBuilder::NewList));
+ UNIT_ASSERT_VALUES_EQUAL(10, GetMethodIndex(&IValueBuilder::ReverseList));
+ UNIT_ASSERT_VALUES_EQUAL(11, GetMethodIndex(&IValueBuilder::SkipList));
+ UNIT_ASSERT_VALUES_EQUAL(12, GetMethodIndex(&IValueBuilder::TakeList));
+ UNIT_ASSERT_VALUES_EQUAL(13, GetMethodIndex(&IValueBuilder::ToIndexDict));
+ UNIT_ASSERT_VALUES_EQUAL(14, GetMethodIndex(&IValueBuilder::NewArray32));
+ UNIT_ASSERT_VALUES_EQUAL(15, GetMethodIndex(&IValueBuilder::NewVariant));
+ UNIT_ASSERT_VALUES_EQUAL(16, GetMethodIndex(&IValueBuilder::GetDateBuilder));
+ UNIT_ASSERT_VALUES_EQUAL(17, GetMethodIndex(&IValueBuilder::GetSecureParam));
+ UNIT_ASSERT_VALUES_EQUAL(18, GetMethodIndex(&IValueBuilder::CalleePosition));
+ UNIT_ASSERT_VALUES_EQUAL(19, GetMethodIndex(&IValueBuilder::Run));
+ UNIT_ASSERT_VALUES_EQUAL(20, GetMethodIndex(&IValueBuilder::ExportArrowBlock));
+ UNIT_ASSERT_VALUES_EQUAL(21, GetMethodIndex(&IValueBuilder::ImportArrowBlock));
+ UNIT_ASSERT_VALUES_EQUAL(22, GetMethodIndex(&IValueBuilder::GetArrowBlockChunks));
+ UNIT_ASSERT_VALUES_EQUAL(23, GetMethodIndex(&IValueBuilder::GetPgBuilder));
+ UNIT_ASSERT_VALUES_EQUAL(24, GetMethodIndex(&IValueBuilder::NewArray64));
}
+} // Y_UNIT_TEST_SUITE(TUdfValueBuilder)
diff --git a/yql/essentials/public/udf/udf_value_inl.h b/yql/essentials/public/udf/udf_value_inl.h
index 43c4c84140f..20445a5d4f7 100644
--- a/yql/essentials/public/udf/udf_value_inl.h
+++ b/yql/essentials/public/udf/udf_value_inl.h
@@ -1,69 +1,69 @@
#pragma once
#if !defined(INCLUDE_UDF_VALUE_INL_H)
-#error "you should never include udf_value_inl.h directly"
-#endif // INCLUDE_UDF_VALUE_INL_H
+ #error "you should never include udf_value_inl.h directly"
+#endif // INCLUDE_UDF_VALUE_INL_H
#ifdef LLVM_BC
-#define UDF_VERIFY(expr, ...) \
- do { \
- if (false) { \
- bool __xxx = static_cast<bool>(expr); \
- Y_UNUSED(__xxx); \
- } \
- } while (false)
+ #define UDF_VERIFY(expr, ...) \
+ do { \
+ if (false) { \
+ bool __xxx = static_cast<bool>(expr); \
+ Y_UNUSED(__xxx); \
+ } \
+ } while (false)
-#define UDF_ALWAYS_INLINE __attribute__((always_inline))
+ #define UDF_ALWAYS_INLINE __attribute__((always_inline))
#else
-#define UDF_VERIFY Y_DEBUG_ABORT_UNLESS
-#define UDF_ALWAYS_INLINE Y_FORCE_INLINE
+ #define UDF_VERIFY Y_DEBUG_ABORT_UNLESS
+ #define UDF_ALWAYS_INLINE Y_FORCE_INLINE
#endif
//////////////////////////////////////////////////////////////////////////////
// IBoxedValue
//////////////////////////////////////////////////////////////////////////////
-inline void IBoxedValue1::Ref() noexcept
-{
+inline void IBoxedValue1::Ref() noexcept {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 4)
- if (Refs_ < 0)
+ if (Refs_ < 0) {
return;
+ }
#endif
++Refs_;
}
-inline void IBoxedValue1::UnRef() noexcept
-{
+inline void IBoxedValue1::UnRef() noexcept {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 4)
- if (Refs_ < 0)
+ if (Refs_ < 0) {
return;
+ }
#endif
Y_DEBUG_ABORT_UNLESS(Refs_ > 0);
- if (!--Refs_)
+ if (!--Refs_) {
delete this;
+ }
}
-inline void IBoxedValue1::ReleaseRef() noexcept
-{
+inline void IBoxedValue1::ReleaseRef() noexcept {
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 4)
- if (Refs_ < 0)
+ if (Refs_ < 0) {
return;
+ }
#endif
Y_DEBUG_ABORT_UNLESS(Refs_ > 0);
--Refs_;
}
-inline void IBoxedValue1::DeleteUnreferenced() noexcept
-{
- if (!Refs_)
+inline void IBoxedValue1::DeleteUnreferenced() noexcept {
+ if (!Refs_) {
delete this;
+ }
}
-inline i32 IBoxedValue1::RefCount() const noexcept
-{
+inline i32 IBoxedValue1::RefCount() const noexcept {
return Refs_;
}
@@ -76,16 +76,16 @@ inline ui8 IBoxedValue1::UserMark() const noexcept {
}
inline i32 IBoxedValue1::LockRef() noexcept {
- Y_DEBUG_ABORT_UNLESS(Refs_ != -1);
- auto ret = Refs_;
- Refs_ = -1;
- return ret;
+ Y_DEBUG_ABORT_UNLESS(Refs_ != -1);
+ auto ret = Refs_;
+ Refs_ = -1;
+ return ret;
}
inline void IBoxedValue1::UnlockRef(i32 prev) noexcept {
- Y_DEBUG_ABORT_UNLESS(Refs_ == -1);
- Y_DEBUG_ABORT_UNLESS(prev != -1);
- Refs_ = prev;
+ Y_DEBUG_ABORT_UNLESS(Refs_ == -1);
+ Y_DEBUG_ABORT_UNLESS(prev != -1);
+ Refs_ = prev;
}
//////////////////////////////////////////////////////////////////////////////
@@ -93,113 +93,113 @@ inline void IBoxedValue1::UnlockRef(i32 prev) noexcept {
//////////////////////////////////////////////////////////////////////////////
inline bool TBoxedValueAccessor::HasFastListLength(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.HasFastListLength();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.HasFastListLength();
}
inline ui64 TBoxedValueAccessor::GetListLength(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetListLength();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetListLength();
}
inline ui64 TBoxedValueAccessor::GetEstimatedListLength(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetEstimatedListLength();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetEstimatedListLength();
}
inline TUnboxedValue TBoxedValueAccessor::GetListIterator(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetListIterator();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetListIterator();
}
inline const TOpaqueListRepresentation* TBoxedValueAccessor::GetListRepresentation(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetListRepresentation();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetListRepresentation();
}
inline IBoxedValuePtr TBoxedValueAccessor::ReverseListImpl(const IBoxedValue& value, const IValueBuilder& builder) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.ReverseListImpl(builder);
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.ReverseListImpl(builder);
}
inline IBoxedValuePtr TBoxedValueAccessor::SkipListImpl(const IBoxedValue& value, const IValueBuilder& builder, ui64 count) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.SkipListImpl(builder, count);
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.SkipListImpl(builder, count);
}
inline IBoxedValuePtr TBoxedValueAccessor::TakeListImpl(const IBoxedValue& value, const IValueBuilder& builder, ui64 count) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.TakeListImpl(builder, count);
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.TakeListImpl(builder, count);
}
inline IBoxedValuePtr TBoxedValueAccessor::ToIndexDictImpl(const IBoxedValue& value, const IValueBuilder& builder) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.ToIndexDictImpl(builder);
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.ToIndexDictImpl(builder);
}
inline ui64 TBoxedValueAccessor::GetDictLength(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetDictLength();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetDictLength();
}
inline TUnboxedValue TBoxedValueAccessor::GetDictIterator(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetDictIterator();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetDictIterator();
}
inline TUnboxedValue TBoxedValueAccessor::GetKeysIterator(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetKeysIterator();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetKeysIterator();
}
inline TUnboxedValue TBoxedValueAccessor::GetPayloadsIterator(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetPayloadsIterator();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetPayloadsIterator();
}
inline bool TBoxedValueAccessor::Contains(const IBoxedValue& value, const TUnboxedValuePod& key) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.Contains(key);
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.Contains(key);
}
inline TUnboxedValue TBoxedValueAccessor::Lookup(const IBoxedValue& value, const TUnboxedValuePod& key) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.Lookup(key);
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.Lookup(key);
}
inline TUnboxedValue TBoxedValueAccessor::GetElement(const IBoxedValue& value, ui32 index) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetElement(index);
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetElement(index);
}
inline const TUnboxedValue* TBoxedValueAccessor::GetElements(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetElements();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetElements();
}
inline TUnboxedValue TBoxedValueAccessor::Run(const IBoxedValue& value, const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.Run(valueBuilder, args);
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.Run(valueBuilder, args);
}
inline TStringRef TBoxedValueAccessor::GetResourceTag(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetResourceTag();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetResourceTag();
}
inline void* TBoxedValueAccessor::GetResource(IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.GetResource();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.GetResource();
}
inline bool TBoxedValueAccessor::HasListItems(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.HasListItems();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.HasListItems();
}
inline bool TBoxedValueAccessor::HasDictItems(const IBoxedValue& value) {
- Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
- return value.HasDictItems();
+ Y_DEBUG_ABORT_UNLESS(value.IsCompatibleTo(MakeAbiCompatibilityVersion(2, 0)));
+ return value.HasDictItems();
}
inline ui32 TBoxedValueAccessor::GetVariantIndex(const IBoxedValue& value) {
@@ -321,8 +321,7 @@ Y_FORCE_INLINE TUnboxedValue::TUnboxedValue(TUnboxedValue&& value) noexcept
value.Raw = TRaw();
}
-Y_FORCE_INLINE TUnboxedValue& TUnboxedValue::operator=(const TUnboxedValue& value) noexcept
-{
+Y_FORCE_INLINE TUnboxedValue& TUnboxedValue::operator=(const TUnboxedValue& value) noexcept {
if (this != &value) {
value.Ref();
UnRef();
@@ -331,8 +330,7 @@ Y_FORCE_INLINE TUnboxedValue& TUnboxedValue::operator=(const TUnboxedValue& valu
return *this;
}
-Y_FORCE_INLINE TUnboxedValue& TUnboxedValue::operator=(TUnboxedValue&& value) noexcept
-{
+Y_FORCE_INLINE TUnboxedValue& TUnboxedValue::operator=(TUnboxedValue&& value) noexcept {
if (this != &value) {
UnRef();
Raw = value.Raw;
@@ -348,14 +346,12 @@ Y_FORCE_INLINE TUnboxedValuePod TUnboxedValue::Release() noexcept {
return value;
}
-Y_FORCE_INLINE void TUnboxedValue::Clear() noexcept
-{
+Y_FORCE_INLINE void TUnboxedValue::Clear() noexcept {
UnRef();
Raw = TRaw();
}
-Y_FORCE_INLINE TUnboxedValue::~TUnboxedValue() noexcept
-{
+Y_FORCE_INLINE TUnboxedValue::~TUnboxedValue() noexcept {
UnRef();
}
//////////////////////////////////////////////////////////////////////////////
@@ -378,32 +374,27 @@ Y_FORCE_INLINE TUnboxedValuePod::TUnboxedValuePod(TStringValue&& value, ui32 siz
Raw.String.Meta = static_cast<ui8>(EMarkers::String);
}
-inline TStringValue TUnboxedValuePod::AsStringValue() const
-{
+inline TStringValue TUnboxedValuePod::AsStringValue() const {
UDF_VERIFY(IsString(), "Value is not a string");
return TStringValue(Raw.String.Value);
}
-inline IBoxedValuePtr TUnboxedValuePod::AsBoxed() const
-{
+inline IBoxedValuePtr TUnboxedValuePod::AsBoxed() const {
UDF_VERIFY(IsBoxed(), "Value is not boxed");
return IBoxedValuePtr(Raw.Boxed.Value);
}
-inline TStringValue::TData* TUnboxedValuePod::AsRawStringValue() const
-{
+inline TStringValue::TData* TUnboxedValuePod::AsRawStringValue() const {
UDF_VERIFY(IsString(), "Value is not a string");
return Raw.String.Value;
}
-inline IBoxedValue* TUnboxedValuePod::AsRawBoxed() const
-{
+inline IBoxedValue* TUnboxedValuePod::AsRawBoxed() const {
UDF_VERIFY(IsBoxed(), "Value is not boxed");
return Raw.Boxed.Value;
}
-inline bool TUnboxedValuePod::UniqueBoxed() const
-{
+inline bool TUnboxedValuePod::UniqueBoxed() const {
UDF_VERIFY(IsBoxed(), "Value is not boxed");
return Raw.Boxed.Value->RefCount() <= 1;
}
@@ -420,8 +411,7 @@ inline void TUnboxedValuePod::Push(const TUnboxedValuePod& value) const {
}
#endif
-inline ui64 TUnboxedValuePod::GetListLength() const
-{
+inline ui64 TUnboxedValuePod::GetListLength() const {
UDF_VERIFY(IsBoxed(), "Value is not a list");
return TBoxedValueAccessor::GetListLength(*Raw.Boxed.Value);
}
@@ -436,26 +426,25 @@ inline bool TUnboxedValuePod::HasListItems() const {
return TBoxedValueAccessor::HasListItems(*Raw.Boxed.Value);
}
-inline TUnboxedValue TUnboxedValuePod::GetListIterator() const
-{
+inline TUnboxedValue TUnboxedValuePod::GetListIterator() const {
UDF_VERIFY(IsBoxed(), "Value is not a list");
return TBoxedValueAccessor::GetListIterator(*Raw.Boxed.Value);
}
-inline TUnboxedValuePod TUnboxedValuePod::MakeOptional() const
-{
- if (Raw.Simple.Meta)
+inline TUnboxedValuePod TUnboxedValuePod::MakeOptional() const {
+ if (Raw.Simple.Meta) {
return *this;
+ }
TUnboxedValuePod result(*this);
++result.Raw.Simple.Count;
return result;
}
-inline TUnboxedValuePod TUnboxedValuePod::GetOptionalValue() const
-{
- if (Raw.Simple.Meta)
+inline TUnboxedValuePod TUnboxedValuePod::GetOptionalValue() const {
+ if (Raw.Simple.Meta) {
return *this;
+ }
UDF_VERIFY(Raw.Simple.Count > 0U, "Can't get value from empty.");
@@ -464,44 +453,50 @@ inline TUnboxedValuePod TUnboxedValuePod::GetOptionalValue() const
return result;
}
-template<> inline TUnboxedValuePod TUnboxedValuePod::GetOptionalValueIf<false>() const { return *this; }
-template<> inline TUnboxedValuePod TUnboxedValuePod::GetOptionalValueIf<true>() const { return GetOptionalValue(); }
+template <>
+inline TUnboxedValuePod TUnboxedValuePod::GetOptionalValueIf<false>() const {
+ return *this;
+}
+template <>
+inline TUnboxedValuePod TUnboxedValuePod::GetOptionalValueIf<true>() const {
+ return GetOptionalValue();
+}
-template<> inline TUnboxedValuePod TUnboxedValuePod::MakeOptionalIf<false>() const { return *this; }
-template<> inline TUnboxedValuePod TUnboxedValuePod::MakeOptionalIf<true>() const { return MakeOptional(); }
+template <>
+inline TUnboxedValuePod TUnboxedValuePod::MakeOptionalIf<false>() const {
+ return *this;
+}
+template <>
+inline TUnboxedValuePod TUnboxedValuePod::MakeOptionalIf<true>() const {
+ return MakeOptional();
+}
-inline ui64 TUnboxedValuePod::GetDictLength() const
-{
+inline ui64 TUnboxedValuePod::GetDictLength() const {
UDF_VERIFY(IsBoxed(), "Value is not a dict");
return TBoxedValueAccessor::GetDictLength(*Raw.Boxed.Value);
}
-inline TUnboxedValue TUnboxedValuePod::GetDictIterator() const
-{
+inline TUnboxedValue TUnboxedValuePod::GetDictIterator() const {
UDF_VERIFY(IsBoxed(), "Value is not a dict");
return TBoxedValueAccessor::GetDictIterator(*Raw.Boxed.Value);
}
-inline TUnboxedValue TUnboxedValuePod::GetKeysIterator() const
-{
+inline TUnboxedValue TUnboxedValuePod::GetKeysIterator() const {
UDF_VERIFY(IsBoxed(), "Value is not a dict");
return TBoxedValueAccessor::GetKeysIterator(*Raw.Boxed.Value);
}
-inline TUnboxedValue TUnboxedValuePod::GetPayloadsIterator() const
-{
+inline TUnboxedValue TUnboxedValuePod::GetPayloadsIterator() const {
UDF_VERIFY(IsBoxed(), "Value is not a dict");
return TBoxedValueAccessor::GetPayloadsIterator(*Raw.Boxed.Value);
}
-inline bool TUnboxedValuePod::Contains(const TUnboxedValuePod& key) const
-{
+inline bool TUnboxedValuePod::Contains(const TUnboxedValuePod& key) const {
UDF_VERIFY(IsBoxed(), "Value is not a dict");
return TBoxedValueAccessor::Contains(*Raw.Boxed.Value, key);
}
-inline TUnboxedValue TUnboxedValuePod::Lookup(const TUnboxedValuePod& key) const
-{
+inline TUnboxedValue TUnboxedValuePod::Lookup(const TUnboxedValuePod& key) const {
UDF_VERIFY(IsBoxed(), "Value is not a dict");
return TBoxedValueAccessor::Lookup(*Raw.Boxed.Value, key);
}
@@ -511,21 +506,18 @@ inline bool TUnboxedValuePod::HasDictItems() const {
return TBoxedValueAccessor::HasDictItems(*Raw.Boxed.Value);
}
-inline TUnboxedValue TUnboxedValuePod::GetElement(ui32 index) const
-{
+inline TUnboxedValue TUnboxedValuePod::GetElement(ui32 index) const {
UDF_VERIFY(IsBoxed(), "Value is not a tuple");
return TBoxedValueAccessor::GetElement(*Raw.Boxed.Value, index);
}
-inline const TUnboxedValue* TUnboxedValuePod::GetElements() const
-{
+inline const TUnboxedValue* TUnboxedValuePod::GetElements() const {
UDF_VERIFY(IsBoxed(), "Value is not a tuple");
return TBoxedValueAccessor::GetElements(*Raw.Boxed.Value);
}
inline TUnboxedValue TUnboxedValuePod::Run(
- const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const
-{
+ const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const {
UDF_VERIFY(IsBoxed(), "Value is not a callable");
return TBoxedValueAccessor::Run(*Raw.Boxed.Value, valueBuilder, args);
}
@@ -541,8 +533,9 @@ inline void* TUnboxedValuePod::GetResource() const {
}
inline ui32 TUnboxedValuePod::GetVariantIndex() const {
- if (auto index = Raw.GetIndex())
+ if (auto index = Raw.GetIndex()) {
return --index;
+ }
UDF_VERIFY(IsBoxed(), "Value is not a variant");
return TBoxedValueAccessor::GetVariantIndex(*Raw.Boxed.Value);
}
@@ -559,8 +552,9 @@ inline TUnboxedValue TUnboxedValuePod::GetVariantItem() const {
inline bool TUnboxedValuePod::TryMakeVariant(ui32 index) {
static const ui32 limit = (1U << 6U) - 1U;
- if (index >= limit || Raw.GetIndex())
+ if (index >= limit || Raw.GetIndex()) {
return false;
+ }
Raw.Simple.Meta |= ui8(++index << 2);
return true;
@@ -644,89 +638,100 @@ inline bool TUnboxedValuePod::Load2(const TUnboxedValue& value) {
}
#endif
-Y_FORCE_INLINE void TUnboxedValuePod::Ref() const noexcept
-{
+Y_FORCE_INLINE void TUnboxedValuePod::Ref() const noexcept {
switch (Raw.GetMarkers()) {
- case EMarkers::String: return Raw.String.Value->Ref();
- case EMarkers::Boxed: return Raw.Boxed.Value->Ref();
- default: return;
+ case EMarkers::String:
+ return Raw.String.Value->Ref();
+ case EMarkers::Boxed:
+ return Raw.Boxed.Value->Ref();
+ default:
+ return;
}
}
-Y_FORCE_INLINE void TUnboxedValuePod::UnRef() const noexcept
-{
+Y_FORCE_INLINE void TUnboxedValuePod::UnRef() const noexcept {
switch (Raw.GetMarkers()) {
- case EMarkers::String: return Raw.String.Value->UnRef();
- case EMarkers::Boxed: return Raw.Boxed.Value->UnRef();
- default: return;
+ case EMarkers::String:
+ return Raw.String.Value->UnRef();
+ case EMarkers::Boxed:
+ return Raw.Boxed.Value->UnRef();
+ default:
+ return;
}
}
-Y_FORCE_INLINE void TUnboxedValuePod::ReleaseRef() const noexcept
-{
+Y_FORCE_INLINE void TUnboxedValuePod::ReleaseRef() const noexcept {
switch (Raw.GetMarkers()) {
- case EMarkers::String: return Raw.String.Value->ReleaseRef();
- case EMarkers::Boxed: return Raw.Boxed.Value->ReleaseRef();
- default: return;
+ case EMarkers::String:
+ return Raw.String.Value->ReleaseRef();
+ case EMarkers::Boxed:
+ return Raw.Boxed.Value->ReleaseRef();
+ default:
+ return;
}
}
-Y_FORCE_INLINE void TUnboxedValuePod::DeleteUnreferenced() const noexcept
-{
+Y_FORCE_INLINE void TUnboxedValuePod::DeleteUnreferenced() const noexcept {
switch (Raw.GetMarkers()) {
- case EMarkers::String: return Raw.String.Value->DeleteUnreferenced();
- case EMarkers::Boxed: return Raw.Boxed.Value->DeleteUnreferenced();
- default: return;
+ case EMarkers::String:
+ return Raw.String.Value->DeleteUnreferenced();
+ case EMarkers::Boxed:
+ return Raw.Boxed.Value->DeleteUnreferenced();
+ default:
+ return;
}
}
-Y_FORCE_INLINE i32 TUnboxedValuePod::LockRef() const noexcept
-{
+Y_FORCE_INLINE i32 TUnboxedValuePod::LockRef() const noexcept {
switch (Raw.GetMarkers()) {
- case EMarkers::String: return Raw.String.Value->LockRef();
- case EMarkers::Boxed: return Raw.Boxed.Value->LockRef();
- default: return -1;
+ case EMarkers::String:
+ return Raw.String.Value->LockRef();
+ case EMarkers::Boxed:
+ return Raw.Boxed.Value->LockRef();
+ default:
+ return -1;
}
}
-Y_FORCE_INLINE void TUnboxedValuePod::UnlockRef(i32 prev) const noexcept
-{
+Y_FORCE_INLINE void TUnboxedValuePod::UnlockRef(i32 prev) const noexcept {
switch (Raw.GetMarkers()) {
- case EMarkers::String: return Raw.String.Value->UnlockRef(prev);
- case EMarkers::Boxed: return Raw.Boxed.Value->UnlockRef(prev);
- default: return;
+ case EMarkers::String:
+ return Raw.String.Value->UnlockRef(prev);
+ case EMarkers::Boxed:
+ return Raw.Boxed.Value->UnlockRef(prev);
+ default:
+ return;
}
}
-Y_FORCE_INLINE i32 TUnboxedValuePod::RefCount() const noexcept
-{
+Y_FORCE_INLINE i32 TUnboxedValuePod::RefCount() const noexcept {
switch (Raw.GetMarkers()) {
- case EMarkers::String: return Raw.String.Value->RefCount();
- case EMarkers::Boxed: return Raw.Boxed.Value->RefCount();
- default: return -1;
+ case EMarkers::String:
+ return Raw.String.Value->RefCount();
+ case EMarkers::Boxed:
+ return Raw.Boxed.Value->RefCount();
+ default:
+ return -1;
}
}
-#define VALUE_GET(xType) \
- template <> \
- inline xType TUnboxedValuePod::Get<xType>() const \
- { \
+#define VALUE_GET(xType) \
+ template <> \
+ inline xType TUnboxedValuePod::Get<xType>() const { \
UDF_VERIFY(EMarkers::Embedded == Raw.GetMarkers(), "Value is empty."); \
- return Raw.Simple.xType##_; \
+ return Raw.Simple.xType##_; \
}
-#define VALUE_GET_DEF(xType) \
- template <> \
- inline xType TUnboxedValuePod::GetOrDefault<xType>(xType def) const \
- { \
+#define VALUE_GET_DEF(xType) \
+ template <> \
+ inline xType TUnboxedValuePod::GetOrDefault<xType>(xType def) const { \
return EMarkers::Empty == Raw.GetMarkers() ? def : Raw.Simple.xType##_; \
}
-#define VALUE_CONSTR(xType) \
- template <> \
- inline TUnboxedValuePod::TUnboxedValuePod(xType value) \
- { \
- Raw.Simple.xType##_ = value; \
+#define VALUE_CONSTR(xType) \
+ template <> \
+ inline TUnboxedValuePod::TUnboxedValuePod(xType value) { \
+ Raw.Simple.xType##_ = value; \
Raw.Simple.Meta = static_cast<ui8>(EMarkers::Embedded); \
}
@@ -739,21 +744,18 @@ PRIMITIVE_VALUE_TYPES(VALUE_CONSTR)
#undef VALUE_CONSTR
template <>
-inline bool TUnboxedValuePod::Get<bool>() const
-{
+inline bool TUnboxedValuePod::Get<bool>() const {
UDF_VERIFY(EMarkers::Empty != Raw.GetMarkers(), "Value is empty.");
return bool(Raw.Simple.ui8_);
}
template <>
-inline bool TUnboxedValuePod::GetOrDefault<bool>(bool def) const
-{
+inline bool TUnboxedValuePod::GetOrDefault<bool>(bool def) const {
return EMarkers::Empty == Raw.GetMarkers() ? def : bool(Raw.Simple.ui8_);
}
template <>
-inline NYql::NDecimal::TInt128 TUnboxedValuePod::Get<NYql::NDecimal::TInt128>() const
-{
+inline NYql::NDecimal::TInt128 TUnboxedValuePod::Get<NYql::NDecimal::TInt128>() const {
return GetInt128();
}
@@ -764,8 +766,7 @@ inline TUnboxedValuePod::TUnboxedValuePod(bool value)
Raw.Simple.Meta = static_cast<ui8>(EMarkers::Embedded);
}
-inline NYql::NDecimal::TInt128 TUnboxedValuePod::GetInt128() const
-{
+inline NYql::NDecimal::TInt128 TUnboxedValuePod::GetInt128() const {
UDF_VERIFY(EMarkers::Empty != Raw.GetMarkers(), "Value is empty.");
auto v = *reinterpret_cast<const NYql::NDecimal::TInt128*>(&Raw);
const auto p = reinterpret_cast<ui8*>(&v);
@@ -773,8 +774,7 @@ inline NYql::NDecimal::TInt128 TUnboxedValuePod::GetInt128() const
return v;
}
-inline NYql::NDecimal::TUint128 TUnboxedValuePod::GetUint128() const
-{
+inline NYql::NDecimal::TUint128 TUnboxedValuePod::GetUint128() const {
UDF_VERIFY(EMarkers::Empty != Raw.GetMarkers(), "Value is empty.");
auto v = *reinterpret_cast<const NYql::NDecimal::TUint128*>(&Raw);
const auto p = reinterpret_cast<ui8*>(&v);
@@ -794,8 +794,7 @@ inline TUnboxedValuePod::TUnboxedValuePod(NYql::NDecimal::TUint128 value)
Raw.Simple.Meta = static_cast<ui8>(EMarkers::Embedded);
}
-inline const void* TUnboxedValuePod::GetRawPtr() const
-{
+inline const void* TUnboxedValuePod::GetRawPtr() const {
return &Raw;
}
@@ -859,40 +858,40 @@ inline TUnboxedValuePod TUnboxedValuePod::MakeYield()
return Invalid();
}
-inline bool TUnboxedValuePod::IsInvalid() const
-{
+inline bool TUnboxedValuePod::IsInvalid() const {
return Raw.Simple.Count == std::numeric_limits<ui64>::max() && Raw.Simple.FullMeta == 0;
}
-inline bool TUnboxedValuePod::IsFinish() const
-{
+inline bool TUnboxedValuePod::IsFinish() const {
return Raw.Simple.Count == std::numeric_limits<ui64>::max() - 1U && Raw.Simple.FullMeta == 0;
}
-inline bool TUnboxedValuePod::IsYield() const
-{
+inline bool TUnboxedValuePod::IsYield() const {
return IsInvalid();
}
-inline bool TUnboxedValuePod::IsSpecial() const
-{
+inline bool TUnboxedValuePod::IsSpecial() const {
return Raw.Simple.FullMeta == 0 && Raw.Simple.Count >= std::numeric_limits<ui64>::max() - 1U;
}
-inline TStringRef TUnboxedValuePod::AsStringRef() const&
-{
+inline TStringRef TUnboxedValuePod::AsStringRef() const& {
switch (Raw.GetMarkers()) {
- case EMarkers::Embedded: return { Raw.Embedded.Buffer, Raw.Embedded.Size };
- case EMarkers::String: return { Raw.String.Value->Data() + (Raw.String.Offset & 0xFFFFFF), Raw.String.Size };
- default: Y_ABORT("Value is not a string.");
+ case EMarkers::Embedded:
+ return {Raw.Embedded.Buffer, Raw.Embedded.Size};
+ case EMarkers::String:
+ return {Raw.String.Value->Data() + (Raw.String.Offset & 0xFFFFFF), Raw.String.Size};
+ default:
+ Y_ABORT("Value is not a string.");
}
}
-inline TMutableStringRef TUnboxedValuePod::AsStringRef() &
-{
+inline TMutableStringRef TUnboxedValuePod::AsStringRef() & {
switch (Raw.GetMarkers()) {
- case EMarkers::Embedded: return { Raw.Embedded.Buffer, Raw.Embedded.Size };
- case EMarkers::String: return { Raw.String.Value->Data() + (Raw.String.Offset & 0xFFFFFF), Raw.String.Size };
- default: Y_ABORT("Value is not a string.");
+ case EMarkers::Embedded:
+ return {Raw.Embedded.Buffer, Raw.Embedded.Size};
+ case EMarkers::String:
+ return {Raw.String.Value->Data() + (Raw.String.Offset & 0xFFFFFF), Raw.String.Size};
+ default:
+ Y_ABORT("Value is not a string.");
}
}
diff --git a/yql/essentials/public/udf/udf_value_ut.cpp b/yql/essentials/public/udf/udf_value_ut.cpp
index 7f5489c7331..e296c6252c6 100644
--- a/yql/essentials/public/udf/udf_value_ut.cpp
+++ b/yql/essentials/public/udf/udf_value_ut.cpp
@@ -8,163 +8,163 @@ using namespace NYql::NUdf;
Y_UNIT_TEST_SUITE(TUdfValue) {
- Y_UNIT_TEST(TestOptional) {
- TUnboxedValuePod foo((ui32) 42);
- UNIT_ASSERT(foo);
- UNIT_ASSERT(42 == foo.Get<ui32>());
-
- auto optFoo = foo.MakeOptional();
- UNIT_ASSERT(optFoo);
- UNIT_ASSERT(optFoo.HasValue());
-
- auto bar = optFoo.GetOptionalValue();
- UNIT_ASSERT(42 == bar.Get<ui32>());
- }
-
- Y_UNIT_TEST(TestOptional2) {
- auto valueOpt = TUnboxedValuePod((ui32) 42);
- UNIT_ASSERT(valueOpt);
- UNIT_ASSERT(valueOpt.HasValue());
-
- auto value = valueOpt.GetOptionalValue();
- UNIT_ASSERT(42 == value.Get<ui32>());
- }
-
- Y_UNIT_TEST(TestEmptyOptional) {
- auto optEmpty = TUnboxedValuePod();
- UNIT_ASSERT(!optEmpty);
- UNIT_ASSERT(!optEmpty.HasValue());
-
- auto optOptEmpty = optEmpty.MakeOptional();
- UNIT_ASSERT(optOptEmpty);
- UNIT_ASSERT(!optOptEmpty.HasValue());
-
- auto optOptOptEmpty = optOptEmpty.MakeOptional();
- UNIT_ASSERT(optOptOptEmpty);
- UNIT_ASSERT(!optOptOptEmpty.HasValue());
-
- auto v = optOptEmpty.GetOptionalValue();
- UNIT_ASSERT(!v);
- }
-
- Y_UNIT_TEST(TestVariant) {
- TUnboxedValuePod foo((ui64) 42);
- UNIT_ASSERT(foo);
-
- UNIT_ASSERT(!foo.TryMakeVariant(63));
-
- UNIT_ASSERT(foo.TryMakeVariant(62));
-
- UNIT_ASSERT(!foo.TryMakeVariant(0));
-
- UNIT_ASSERT(62 == foo.GetVariantIndex());
- UNIT_ASSERT(42 == foo.Get<ui64>());
- }
-
- Y_UNIT_TEST(TestEmptyInVariant) {
- TUnboxedValuePod foo;
- UNIT_ASSERT(!foo);
- UNIT_ASSERT(!foo.HasValue());
-
- UNIT_ASSERT(foo.TryMakeVariant(0));
- UNIT_ASSERT(foo);
- UNIT_ASSERT(!foo.HasValue());
-
- UNIT_ASSERT(0 == foo.GetVariantIndex());
-
- const auto opt = foo.MakeOptional();
- UNIT_ASSERT(!std::memcmp(&opt, &foo, sizeof(opt)));
-
- const auto bar = opt.GetOptionalValue();
- UNIT_ASSERT(!std::memcmp(&opt, &bar, sizeof(bar)));
- }
-
- Y_UNIT_TEST(TestInvalid) {
- TUnboxedValuePod foo;
- UNIT_ASSERT(!foo.IsInvalid());
-
- UNIT_ASSERT(!TUnboxedValuePod::Void().IsInvalid());
- UNIT_ASSERT(!TUnboxedValuePod::Zero().IsInvalid());
- UNIT_ASSERT(!TUnboxedValuePod::Embedded(TStringRef("abc")).IsInvalid());
-
- auto bad = TUnboxedValuePod::Invalid();
- UNIT_ASSERT(bad.IsInvalid());
- }
-
- Y_UNIT_TEST(TestDump) {
- NKikimr::NMiniKQL::TScopedAlloc alloc(__LOCATION__);
- UNIT_ASSERT_STRINGS_EQUAL(TStringBuilder() << TUnboxedValuePod(), "Empty, count: 0");
- UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod().MakeOptional()), "Empty, count: 1");
- UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod::Invalid()), "Empty, count: -1");
- UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod::Void()),
- "Embedded, size: 0, buffer: \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"");
- UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod::Embedded("foo")),
- "Embedded, size: 3, buffer: \"foo\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"");
- UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod(ui32(258))),
- "Embedded, size: 0, buffer: \"\\2\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"");
- TString pattern = "VERY VERY LONG STRING";
- TStringValue str(pattern.size());
- memcpy(str.Data(), pattern.data(), pattern.size());
- TUnboxedValue strVal(TUnboxedValuePod(std::move(str)));
- UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << strVal),
- "String, size: 21, offset: 0, buffer: \"VERY VERY LONG STRING\"");
-
- TString objStr = (TStringBuilder() << TUnboxedValue(TUnboxedValuePod(IBoxedValuePtr(new TBoxedValue()))));
- UNIT_ASSERT(objStr.StartsWith("Boxed, pointer:"));
- }
-
- Y_UNIT_TEST(LockMethodsTable) {
+Y_UNIT_TEST(TestOptional) {
+ TUnboxedValuePod foo((ui32)42);
+ UNIT_ASSERT(foo);
+ UNIT_ASSERT(42 == foo.Get<ui32>());
+
+ auto optFoo = foo.MakeOptional();
+ UNIT_ASSERT(optFoo);
+ UNIT_ASSERT(optFoo.HasValue());
+
+ auto bar = optFoo.GetOptionalValue();
+ UNIT_ASSERT(42 == bar.Get<ui32>());
+}
+
+Y_UNIT_TEST(TestOptional2) {
+ auto valueOpt = TUnboxedValuePod((ui32)42);
+ UNIT_ASSERT(valueOpt);
+ UNIT_ASSERT(valueOpt.HasValue());
+
+ auto value = valueOpt.GetOptionalValue();
+ UNIT_ASSERT(42 == value.Get<ui32>());
+}
+
+Y_UNIT_TEST(TestEmptyOptional) {
+ auto optEmpty = TUnboxedValuePod();
+ UNIT_ASSERT(!optEmpty);
+ UNIT_ASSERT(!optEmpty.HasValue());
+
+ auto optOptEmpty = optEmpty.MakeOptional();
+ UNIT_ASSERT(optOptEmpty);
+ UNIT_ASSERT(!optOptEmpty.HasValue());
+
+ auto optOptOptEmpty = optOptEmpty.MakeOptional();
+ UNIT_ASSERT(optOptOptEmpty);
+ UNIT_ASSERT(!optOptOptEmpty.HasValue());
+
+ auto v = optOptEmpty.GetOptionalValue();
+ UNIT_ASSERT(!v);
+}
+
+Y_UNIT_TEST(TestVariant) {
+ TUnboxedValuePod foo((ui64)42);
+ UNIT_ASSERT(foo);
+
+ UNIT_ASSERT(!foo.TryMakeVariant(63));
+
+ UNIT_ASSERT(foo.TryMakeVariant(62));
+
+ UNIT_ASSERT(!foo.TryMakeVariant(0));
+
+ UNIT_ASSERT(62 == foo.GetVariantIndex());
+ UNIT_ASSERT(42 == foo.Get<ui64>());
+}
+
+Y_UNIT_TEST(TestEmptyInVariant) {
+ TUnboxedValuePod foo;
+ UNIT_ASSERT(!foo);
+ UNIT_ASSERT(!foo.HasValue());
+
+ UNIT_ASSERT(foo.TryMakeVariant(0));
+ UNIT_ASSERT(foo);
+ UNIT_ASSERT(!foo.HasValue());
+
+ UNIT_ASSERT(0 == foo.GetVariantIndex());
+
+ const auto opt = foo.MakeOptional();
+ UNIT_ASSERT(!std::memcmp(&opt, &foo, sizeof(opt)));
+
+ const auto bar = opt.GetOptionalValue();
+ UNIT_ASSERT(!std::memcmp(&opt, &bar, sizeof(bar)));
+}
+
+Y_UNIT_TEST(TestInvalid) {
+ TUnboxedValuePod foo;
+ UNIT_ASSERT(!foo.IsInvalid());
+
+ UNIT_ASSERT(!TUnboxedValuePod::Void().IsInvalid());
+ UNIT_ASSERT(!TUnboxedValuePod::Zero().IsInvalid());
+ UNIT_ASSERT(!TUnboxedValuePod::Embedded(TStringRef("abc")).IsInvalid());
+
+ auto bad = TUnboxedValuePod::Invalid();
+ UNIT_ASSERT(bad.IsInvalid());
+}
+
+Y_UNIT_TEST(TestDump) {
+ NKikimr::NMiniKQL::TScopedAlloc alloc(__LOCATION__);
+ UNIT_ASSERT_STRINGS_EQUAL(TStringBuilder() << TUnboxedValuePod(), "Empty, count: 0");
+ UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod().MakeOptional()), "Empty, count: 1");
+ UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod::Invalid()), "Empty, count: -1");
+ UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod::Void()),
+ "Embedded, size: 0, buffer: \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"");
+ UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod::Embedded("foo")),
+ "Embedded, size: 3, buffer: \"foo\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"");
+ UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << TUnboxedValuePod(ui32(258))),
+ "Embedded, size: 0, buffer: \"\\2\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"");
+ TString pattern = "VERY VERY LONG STRING";
+ TStringValue str(pattern.size());
+ memcpy(str.Data(), pattern.data(), pattern.size());
+ TUnboxedValue strVal(TUnboxedValuePod(std::move(str)));
+ UNIT_ASSERT_STRINGS_EQUAL((TStringBuilder() << strVal),
+ "String, size: 21, offset: 0, buffer: \"VERY VERY LONG STRING\"");
+
+ TString objStr = (TStringBuilder() << TUnboxedValue(TUnboxedValuePod(IBoxedValuePtr(new TBoxedValue()))));
+ UNIT_ASSERT(objStr.StartsWith("Boxed, pointer:"));
+}
+
+Y_UNIT_TEST(LockMethodsTable) {
#define METHOD_INDEX(name) NYql::GetMethodPtrIndex(TBoxedValueAccessor::GetMethodPtr(TBoxedValueAccessor::EMethod::name))
- UNIT_ASSERT_VALUES_EQUAL(2, METHOD_INDEX(HasFastListLength));
- UNIT_ASSERT_VALUES_EQUAL(3, METHOD_INDEX(GetListLength));
- UNIT_ASSERT_VALUES_EQUAL(4, METHOD_INDEX(GetEstimatedListLength));
- UNIT_ASSERT_VALUES_EQUAL(5, METHOD_INDEX(GetListIterator));
- UNIT_ASSERT_VALUES_EQUAL(6, METHOD_INDEX(GetListRepresentation));
- UNIT_ASSERT_VALUES_EQUAL(7, METHOD_INDEX(ReverseListImpl));
- UNIT_ASSERT_VALUES_EQUAL(8, METHOD_INDEX(SkipListImpl));
- UNIT_ASSERT_VALUES_EQUAL(9, METHOD_INDEX(TakeListImpl));
- UNIT_ASSERT_VALUES_EQUAL(10, METHOD_INDEX(ToIndexDictImpl));
- UNIT_ASSERT_VALUES_EQUAL(11, METHOD_INDEX(GetDictLength));
- UNIT_ASSERT_VALUES_EQUAL(12, METHOD_INDEX(GetDictIterator));
- UNIT_ASSERT_VALUES_EQUAL(13, METHOD_INDEX(GetKeysIterator));
- UNIT_ASSERT_VALUES_EQUAL(14, METHOD_INDEX(GetPayloadsIterator));
- UNIT_ASSERT_VALUES_EQUAL(15, METHOD_INDEX(Contains));
- UNIT_ASSERT_VALUES_EQUAL(16, METHOD_INDEX(Lookup));
- UNIT_ASSERT_VALUES_EQUAL(17, METHOD_INDEX(GetElement));
- UNIT_ASSERT_VALUES_EQUAL(18, METHOD_INDEX(GetElements));
- UNIT_ASSERT_VALUES_EQUAL(19, METHOD_INDEX(Run));
- UNIT_ASSERT_VALUES_EQUAL(20, METHOD_INDEX(GetResourceTag));
- UNIT_ASSERT_VALUES_EQUAL(21, METHOD_INDEX(GetResource));
- UNIT_ASSERT_VALUES_EQUAL(22, METHOD_INDEX(HasListItems));
- UNIT_ASSERT_VALUES_EQUAL(23, METHOD_INDEX(HasDictItems));
- UNIT_ASSERT_VALUES_EQUAL(24, METHOD_INDEX(GetVariantIndex));
- UNIT_ASSERT_VALUES_EQUAL(25, METHOD_INDEX(GetVariantItem));
- UNIT_ASSERT_VALUES_EQUAL(26, METHOD_INDEX(Fetch));
- UNIT_ASSERT_VALUES_EQUAL(27, METHOD_INDEX(Skip));
- UNIT_ASSERT_VALUES_EQUAL(28, METHOD_INDEX(Next));
- UNIT_ASSERT_VALUES_EQUAL(29, METHOD_INDEX(NextPair));
- UNIT_ASSERT_VALUES_EQUAL(30, METHOD_INDEX(Apply));
+ UNIT_ASSERT_VALUES_EQUAL(2, METHOD_INDEX(HasFastListLength));
+ UNIT_ASSERT_VALUES_EQUAL(3, METHOD_INDEX(GetListLength));
+ UNIT_ASSERT_VALUES_EQUAL(4, METHOD_INDEX(GetEstimatedListLength));
+ UNIT_ASSERT_VALUES_EQUAL(5, METHOD_INDEX(GetListIterator));
+ UNIT_ASSERT_VALUES_EQUAL(6, METHOD_INDEX(GetListRepresentation));
+ UNIT_ASSERT_VALUES_EQUAL(7, METHOD_INDEX(ReverseListImpl));
+ UNIT_ASSERT_VALUES_EQUAL(8, METHOD_INDEX(SkipListImpl));
+ UNIT_ASSERT_VALUES_EQUAL(9, METHOD_INDEX(TakeListImpl));
+ UNIT_ASSERT_VALUES_EQUAL(10, METHOD_INDEX(ToIndexDictImpl));
+ UNIT_ASSERT_VALUES_EQUAL(11, METHOD_INDEX(GetDictLength));
+ UNIT_ASSERT_VALUES_EQUAL(12, METHOD_INDEX(GetDictIterator));
+ UNIT_ASSERT_VALUES_EQUAL(13, METHOD_INDEX(GetKeysIterator));
+ UNIT_ASSERT_VALUES_EQUAL(14, METHOD_INDEX(GetPayloadsIterator));
+ UNIT_ASSERT_VALUES_EQUAL(15, METHOD_INDEX(Contains));
+ UNIT_ASSERT_VALUES_EQUAL(16, METHOD_INDEX(Lookup));
+ UNIT_ASSERT_VALUES_EQUAL(17, METHOD_INDEX(GetElement));
+ UNIT_ASSERT_VALUES_EQUAL(18, METHOD_INDEX(GetElements));
+ UNIT_ASSERT_VALUES_EQUAL(19, METHOD_INDEX(Run));
+ UNIT_ASSERT_VALUES_EQUAL(20, METHOD_INDEX(GetResourceTag));
+ UNIT_ASSERT_VALUES_EQUAL(21, METHOD_INDEX(GetResource));
+ UNIT_ASSERT_VALUES_EQUAL(22, METHOD_INDEX(HasListItems));
+ UNIT_ASSERT_VALUES_EQUAL(23, METHOD_INDEX(HasDictItems));
+ UNIT_ASSERT_VALUES_EQUAL(24, METHOD_INDEX(GetVariantIndex));
+ UNIT_ASSERT_VALUES_EQUAL(25, METHOD_INDEX(GetVariantItem));
+ UNIT_ASSERT_VALUES_EQUAL(26, METHOD_INDEX(Fetch));
+ UNIT_ASSERT_VALUES_EQUAL(27, METHOD_INDEX(Skip));
+ UNIT_ASSERT_VALUES_EQUAL(28, METHOD_INDEX(Next));
+ UNIT_ASSERT_VALUES_EQUAL(29, METHOD_INDEX(NextPair));
+ UNIT_ASSERT_VALUES_EQUAL(30, METHOD_INDEX(Apply));
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 3)
- UNIT_ASSERT_VALUES_EQUAL(31, METHOD_INDEX(GetTraverseCount));
- UNIT_ASSERT_VALUES_EQUAL(32, METHOD_INDEX(GetTraverseItem));
- UNIT_ASSERT_VALUES_EQUAL(33, METHOD_INDEX(Save));
- UNIT_ASSERT_VALUES_EQUAL(34, METHOD_INDEX(Load));
+ UNIT_ASSERT_VALUES_EQUAL(31, METHOD_INDEX(GetTraverseCount));
+ UNIT_ASSERT_VALUES_EQUAL(32, METHOD_INDEX(GetTraverseItem));
+ UNIT_ASSERT_VALUES_EQUAL(33, METHOD_INDEX(Save));
+ UNIT_ASSERT_VALUES_EQUAL(34, METHOD_INDEX(Load));
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 11)
- UNIT_ASSERT_VALUES_EQUAL(35, METHOD_INDEX(Push));
+ UNIT_ASSERT_VALUES_EQUAL(35, METHOD_INDEX(Push));
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 12)
- UNIT_ASSERT_VALUES_EQUAL(36, METHOD_INDEX(IsSortedDict));
+ UNIT_ASSERT_VALUES_EQUAL(36, METHOD_INDEX(IsSortedDict));
#endif
#if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 19)
- UNIT_ASSERT_VALUES_EQUAL(37, METHOD_INDEX(Unused1));
- UNIT_ASSERT_VALUES_EQUAL(38, METHOD_INDEX(Unused2));
- UNIT_ASSERT_VALUES_EQUAL(39, METHOD_INDEX(Unused3));
- UNIT_ASSERT_VALUES_EQUAL(40, METHOD_INDEX(Unused4));
- UNIT_ASSERT_VALUES_EQUAL(41, METHOD_INDEX(Unused5));
- UNIT_ASSERT_VALUES_EQUAL(42, METHOD_INDEX(Unused6));
+ UNIT_ASSERT_VALUES_EQUAL(37, METHOD_INDEX(Unused1));
+ UNIT_ASSERT_VALUES_EQUAL(38, METHOD_INDEX(Unused2));
+ UNIT_ASSERT_VALUES_EQUAL(39, METHOD_INDEX(Unused3));
+ UNIT_ASSERT_VALUES_EQUAL(40, METHOD_INDEX(Unused4));
+ UNIT_ASSERT_VALUES_EQUAL(41, METHOD_INDEX(Unused5));
+ UNIT_ASSERT_VALUES_EQUAL(42, METHOD_INDEX(Unused6));
#endif
#undef METHOD_INDEX
- }
}
+} // Y_UNIT_TEST_SUITE(TUdfValue)
diff --git a/yql/essentials/public/udf/udf_version.cpp b/yql/essentials/public/udf/udf_version.cpp
index f900f99b4b7..28a7a679824 100644
--- a/yql/essentials/public/udf/udf_version.cpp
+++ b/yql/essentials/public/udf/udf_version.cpp
@@ -2,7 +2,6 @@
#include <util/string/builder.h>
-
namespace NYql {
namespace NUdf {
diff --git a/yql/essentials/public/udf/udf_version.h b/yql/essentials/public/udf/udf_version.h
index 5853d62a0ce..5f6e6ffd0bb 100644
--- a/yql/essentials/public/udf/udf_version.h
+++ b/yql/essentials/public/udf/udf_version.h
@@ -11,13 +11,13 @@ namespace NUdf {
#define CURRENT_UDF_ABI_VERSION_PATCH 0
#ifdef USE_CURRENT_UDF_ABI_VERSION
-#define UDF_ABI_VERSION_MAJOR CURRENT_UDF_ABI_VERSION_MAJOR
-#define UDF_ABI_VERSION_MINOR CURRENT_UDF_ABI_VERSION_MINOR
-#define UDF_ABI_VERSION_PATCH CURRENT_UDF_ABI_VERSION_PATCH
+ #define UDF_ABI_VERSION_MAJOR CURRENT_UDF_ABI_VERSION_MAJOR
+ #define UDF_ABI_VERSION_MINOR CURRENT_UDF_ABI_VERSION_MINOR
+ #define UDF_ABI_VERSION_PATCH CURRENT_UDF_ABI_VERSION_PATCH
#else
-#if !defined(UDF_ABI_VERSION_MAJOR) || !defined(UDF_ABI_VERSION_MINOR) || !defined(UDF_ABI_VERSION_PATCH)
-#error Please use UDF_ABI_VERSION macro to define ABI version
-#endif
+ #if !defined(UDF_ABI_VERSION_MAJOR) || !defined(UDF_ABI_VERSION_MINOR) || !defined(UDF_ABI_VERSION_PATCH)
+ #error Please use UDF_ABI_VERSION macro to define ABI version
+ #endif
#endif
inline const char* CurrentAbiVersionStr()
@@ -25,9 +25,7 @@ inline const char* CurrentAbiVersionStr()
#define STR(s) #s
#define XSTR(s) STR(s)
- return XSTR(UDF_ABI_VERSION_MAJOR) "."
- XSTR(UDF_ABI_VERSION_MINOR) "."
- XSTR(UDF_ABI_VERSION_PATCH);
+ return XSTR(UDF_ABI_VERSION_MAJOR) "." XSTR(UDF_ABI_VERSION_MINOR) "." XSTR(UDF_ABI_VERSION_PATCH);
#undef STR
#undef XSTR
@@ -37,9 +35,8 @@ inline const char* CurrentAbiVersionStr()
#define UDF_ABI_COMPATIBILITY_VERSION_CURRENT UDF_ABI_COMPATIBILITY_VERSION(UDF_ABI_VERSION_MAJOR, UDF_ABI_VERSION_MINOR)
static_assert(UDF_ABI_COMPATIBILITY_VERSION_CURRENT <=
- UDF_ABI_COMPATIBILITY_VERSION(CURRENT_UDF_ABI_VERSION_MAJOR, CURRENT_UDF_ABI_VERSION_MINOR),
- "UDF ABI version " Y_STRINGIZE(UDF_ABI_VERSION_MAJOR) "." Y_STRINGIZE(UDF_ABI_VERSION_MINOR)
- " is above " Y_STRINGIZE(CURRENT_UDF_ABI_VERSION_MAJOR) "." Y_STRINGIZE(CURRENT_UDF_ABI_VERSION_MINOR));
+ UDF_ABI_COMPATIBILITY_VERSION(CURRENT_UDF_ABI_VERSION_MAJOR, CURRENT_UDF_ABI_VERSION_MINOR),
+ "UDF ABI version " Y_STRINGIZE(UDF_ABI_VERSION_MAJOR) "." Y_STRINGIZE(UDF_ABI_VERSION_MINOR) " is above " Y_STRINGIZE(CURRENT_UDF_ABI_VERSION_MAJOR) "." Y_STRINGIZE(CURRENT_UDF_ABI_VERSION_MINOR));
constexpr ui32 MakeAbiVersion(ui8 major, ui8 minor, ui8 patch)
{
@@ -65,12 +62,14 @@ constexpr bool IsAbiCompatible(ui32 version)
{
// backward compatibility in greater minor versions of host
return version / 10000 == UDF_ABI_VERSION_MAJOR &&
- (version / 100) % 100 <= UDF_ABI_VERSION_MINOR;
+ (version / 100) % 100 <= UDF_ABI_VERSION_MINOR;
}
TString AbiVersionToStr(ui32 version);
-} // namspace NUdf
-} // namspace NYql
+} // namespace NUdf
+} // namespace NYql
-namespace NKikimr { namespace NUdf = ::NYql::NUdf; }
+namespace NKikimr {
+namespace NUdf = ::NYql::NUdf;
+} // namespace NKikimr
diff --git a/yql/essentials/public/udf/ut/ya.make b/yql/essentials/public/udf/ut/ya.make
index f4aa2a5a4e4..e7fd58890c7 100644
--- a/yql/essentials/public/udf/ut/ya.make
+++ b/yql/essentials/public/udf/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST_FOR(yql/essentials/public/udf)
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
udf_counter_ut.cpp
udf_value_ut.cpp
diff --git a/yql/essentials/public/udf/ya.make b/yql/essentials/public/udf/ya.make
index b6ae76163d2..439e5e7eb18 100644
--- a/yql/essentials/public/udf/ya.make
+++ b/yql/essentials/public/udf/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(YQL_STYLE_CPP)
+
SRCS(
udf_allocator.cpp
udf_allocator.h