diff options
author | aneporada <aneporada@yandex-team.com> | 2025-06-03 12:56:43 +0300 |
---|---|---|
committer | aneporada <aneporada@yandex-team.com> | 2025-06-03 13:14:17 +0300 |
commit | b51b122d7876de2baef5405f3c7da3b10cf99b26 (patch) | |
tree | 6d90d7b4978c404ebde32b05d6b3a7ab1b1f24a2 /yql/essentials/minikql/comp_nodes/ut/mkql_block_logical_ut.cpp | |
parent | 3e8add594e2ff4cf7ff8f552e9a6e285f4d6c372 (diff) | |
download | ydb-b51b122d7876de2baef5405f3c7da3b10cf99b26.tar.gz |
Support scalar-only logical ops
commit_hash:2be000baa1e203ec9b4bab5a4d236abc64609376
Diffstat (limited to 'yql/essentials/minikql/comp_nodes/ut/mkql_block_logical_ut.cpp')
-rw-r--r-- | yql/essentials/minikql/comp_nodes/ut/mkql_block_logical_ut.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/yql/essentials/minikql/comp_nodes/ut/mkql_block_logical_ut.cpp b/yql/essentials/minikql/comp_nodes/ut/mkql_block_logical_ut.cpp new file mode 100644 index 00000000000..bb729a95506 --- /dev/null +++ b/yql/essentials/minikql/comp_nodes/ut/mkql_block_logical_ut.cpp @@ -0,0 +1,101 @@ +#include "mkql_computation_node_ut.h" + +#include <yql/essentials/minikql/computation/mkql_computation_node_holders.h> +#include <yql/essentials/minikql/computation/mkql_block_builder.h> + +namespace NKikimr { +namespace NMiniKQL { + +namespace { + +template<typename Op> +TMaybe<bool> ScalarOp(TMaybe<bool> arg1, TMaybe<bool> arg2, const Op& op) { + TSetup<false> setup; + TProgramBuilder& pb = *setup.PgmBuilder; + auto arg1val = arg1 ? pb.NewDataLiteral<bool>(*arg1) : pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id); + auto arg2val = arg2 ? pb.NewDataLiteral<bool>(*arg2) : pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id); + TRuntimeNode root = op(pb, pb.AsScalar(arg1val), pb.AsScalar(arg2val)); + const auto graph = setup.BuildGraph(root); + NYql::NUdf::TUnboxedValue result = graph->GetValue(); + auto datum = TArrowBlock::From(result).GetDatum(); + UNIT_ASSERT(datum.is_scalar()); + const auto& scalar = datum.scalar_as<arrow::UInt8Scalar>(); + if (!scalar.is_valid) { + return {}; + } + UNIT_ASSERT(scalar.value == 0 || scalar.value == 1); + return bool(scalar.value); +} + +} //namespace + +Y_UNIT_TEST_SUITE(TMiniKQLBlockLogicalTest) { + +Y_UNIT_TEST(ScalarAnd) { + auto op = [](TProgramBuilder& pb, TRuntimeNode arg1, TRuntimeNode arg2) { + return pb.BlockAnd(arg1, arg2); + }; + + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(false, false, op), false); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(false, true, op), false); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(true, false, op), false); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(true, true, op), true); + + UNIT_ASSERT_VALUES_EQUAL(ScalarOp({}, false, op), false); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(false, {}, op), false); + + UNIT_ASSERT(ScalarOp({}, {}, op).Empty()); + UNIT_ASSERT(ScalarOp(true, {}, op).Empty()); + UNIT_ASSERT(ScalarOp({}, true, op).Empty()); +} + +Y_UNIT_TEST(ScalarOr) { + auto op = [](TProgramBuilder& pb, TRuntimeNode arg1, TRuntimeNode arg2) { + return pb.BlockOr(arg1, arg2); + }; + + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(false, false, op), false); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(false, true, op), true); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(true, false, op), true); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(true, true, op), true); + + UNIT_ASSERT_VALUES_EQUAL(ScalarOp({}, true, op), true); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(true, {}, op), true); + + UNIT_ASSERT(ScalarOp({}, {}, op).Empty()); + UNIT_ASSERT(ScalarOp(false, {}, op).Empty()); + UNIT_ASSERT(ScalarOp({}, false, op).Empty()); +} + +Y_UNIT_TEST(ScalarXor) { + auto op = [](TProgramBuilder& pb, TRuntimeNode arg1, TRuntimeNode arg2) { + return pb.BlockXor(arg1, arg2); + }; + + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(false, false, op), false); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(false, true, op), true); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(true, false, op), true); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(true, true, op), false); + + UNIT_ASSERT(ScalarOp({}, {}, op).Empty()); + UNIT_ASSERT(ScalarOp(false, {}, op).Empty()); + UNIT_ASSERT(ScalarOp({}, false, op).Empty()); + UNIT_ASSERT(ScalarOp(true, {}, op).Empty()); + UNIT_ASSERT(ScalarOp({}, true, op).Empty()); +} + +Y_UNIT_TEST(ScalarNot) { + auto op = [](TProgramBuilder& pb, TRuntimeNode arg1, TRuntimeNode arg2) { + Y_UNUSED(arg2); + return pb.BlockNot(arg1); + }; + + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(false, {}, op), true); + UNIT_ASSERT_VALUES_EQUAL(ScalarOp(true, {}, op), false); + UNIT_ASSERT(ScalarOp({}, {}, op).Empty()); +} + +} // Y_UNIT_TEST_SUITE + +} // namespace NMiniKQL +} // namespace NKikimr |