aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/minikql/comp_nodes/ut/mkql_block_logical_ut.cpp
diff options
context:
space:
mode:
authoraneporada <aneporada@yandex-team.com>2025-06-03 12:56:43 +0300
committeraneporada <aneporada@yandex-team.com>2025-06-03 13:14:17 +0300
commitb51b122d7876de2baef5405f3c7da3b10cf99b26 (patch)
tree6d90d7b4978c404ebde32b05d6b3a7ab1b1f24a2 /yql/essentials/minikql/comp_nodes/ut/mkql_block_logical_ut.cpp
parent3e8add594e2ff4cf7ff8f552e9a6e285f4d6c372 (diff)
downloadydb-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.cpp101
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