Files
scylladb/test/boost/position_range_utils_test.cc
2025-12-06 00:33:25 +00:00

127 lines
4.4 KiB
C++

/*
* Copyright (C) 2025-present ScyllaDB
*/
/*
* SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
*/
#include <seastar/testing/thread_test_case.hh>
#include "test/lib/scylla_test_case.hh"
#include "test/lib/simple_schema.hh"
#include "query/position_range_utils.hh"
#include "keys/clustering_interval_set.hh"
#include "schema/schema_builder.hh"
using namespace query;
SEASTAR_THREAD_TEST_CASE(test_deoverlap_clustering_row_ranges) {
simple_schema s;
// Create overlapping ranges
auto ck1 = s.make_ckey(1);
auto ck2 = s.make_ckey(2);
auto ck3 = s.make_ckey(3);
auto ck4 = s.make_ckey(4);
clustering_row_ranges ranges;
ranges.push_back(clustering_range::make({ck1, true}, {ck3, true})); // [1, 3]
ranges.push_back(clustering_range::make({ck2, true}, {ck4, true})); // [2, 4]
// Deoverlap should merge these into a single range [1, 4]
auto deoverlapped = deoverlap_clustering_row_ranges(*s.schema(), ranges);
BOOST_REQUIRE_EQUAL(deoverlapped.size(), 1);
BOOST_REQUIRE(deoverlapped[0].start());
BOOST_REQUIRE(deoverlapped[0].end());
BOOST_REQUIRE(deoverlapped[0].start()->value().equal(*s.schema(), ck1));
BOOST_REQUIRE(deoverlapped[0].end()->value().equal(*s.schema(), ck4));
}
SEASTAR_THREAD_TEST_CASE(test_deoverlap_with_non_overlapping_ranges) {
simple_schema s;
auto ck1 = s.make_ckey(1);
auto ck2 = s.make_ckey(2);
auto ck3 = s.make_ckey(3);
auto ck4 = s.make_ckey(4);
clustering_row_ranges ranges;
ranges.push_back(clustering_range::make({ck1, true}, {ck2, true})); // [1, 2]
ranges.push_back(clustering_range::make({ck3, true}, {ck4, true})); // [3, 4]
// These don't overlap, should remain as two separate ranges
auto deoverlapped = deoverlap_clustering_row_ranges(*s.schema(), ranges);
BOOST_REQUIRE_EQUAL(deoverlapped.size(), 2);
}
SEASTAR_THREAD_TEST_CASE(test_clustering_row_ranges_conversion) {
simple_schema s;
auto ck1 = s.make_ckey(1);
auto ck2 = s.make_ckey(2);
clustering_row_ranges ranges;
ranges.push_back(clustering_range::make({ck1, true}, {ck2, false})); // [1, 2)
// Convert to position_ranges and back
auto pos_ranges = clustering_row_ranges_to_position_ranges(ranges);
BOOST_REQUIRE_EQUAL(pos_ranges.size(), 1);
auto converted_back = position_ranges_to_clustering_row_ranges(pos_ranges, *s.schema());
BOOST_REQUIRE_EQUAL(converted_back.size(), 1);
// Check that the conversion is correct
BOOST_REQUIRE(converted_back[0].start());
BOOST_REQUIRE(converted_back[0].end());
BOOST_REQUIRE(converted_back[0].start()->value().equal(*s.schema(), ck1));
BOOST_REQUIRE(converted_back[0].start()->is_inclusive());
BOOST_REQUIRE(converted_back[0].end()->value().equal(*s.schema(), ck2));
BOOST_REQUIRE(!converted_back[0].end()->is_inclusive());
}
SEASTAR_THREAD_TEST_CASE(test_intersect_clustering_row_ranges) {
simple_schema s;
auto ck1 = s.make_ckey(1);
auto ck2 = s.make_ckey(2);
auto ck3 = s.make_ckey(3);
auto ck4 = s.make_ckey(4);
clustering_row_ranges ranges1;
ranges1.push_back(clustering_range::make({ck1, true}, {ck3, true})); // [1, 3]
clustering_row_ranges ranges2;
ranges2.push_back(clustering_range::make({ck2, true}, {ck4, true})); // [2, 4]
// Intersection should be [2, 3]
auto intersected = intersect_clustering_row_ranges(*s.schema(), ranges1, ranges2);
BOOST_REQUIRE_EQUAL(intersected.size(), 1);
BOOST_REQUIRE(intersected[0].start());
BOOST_REQUIRE(intersected[0].end());
BOOST_REQUIRE(intersected[0].start()->value().equal(*s.schema(), ck2));
BOOST_REQUIRE(intersected[0].end()->value().equal(*s.schema(), ck3));
}
SEASTAR_THREAD_TEST_CASE(test_intersect_non_overlapping_ranges) {
simple_schema s;
auto ck1 = s.make_ckey(1);
auto ck2 = s.make_ckey(2);
auto ck3 = s.make_ckey(3);
auto ck4 = s.make_ckey(4);
clustering_row_ranges ranges1;
ranges1.push_back(clustering_range::make({ck1, true}, {ck2, true})); // [1, 2]
clustering_row_ranges ranges2;
ranges2.push_back(clustering_range::make({ck3, true}, {ck4, true})); // [3, 4]
// No overlap, should return empty
auto intersected = intersect_clustering_row_ranges(*s.schema(), ranges1, ranges2);
BOOST_REQUIRE_EQUAL(intersected.size(), 0);
}