mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-16 19:32:07 +00:00
40 lines
1.1 KiB
C++
40 lines
1.1 KiB
C++
#include "MarkRange.h"
|
|
|
|
namespace DB
|
|
{
|
|
|
|
namespace ErrorCodes
|
|
{
|
|
extern const int LOGICAL_ERROR;
|
|
}
|
|
|
|
bool MarkRange::operator==(const MarkRange & rhs) const
|
|
{
|
|
return begin == rhs.begin && end == rhs.end;
|
|
}
|
|
|
|
bool MarkRange::operator<(const MarkRange & rhs) const
|
|
{
|
|
/// We allow only consecutive non-intersecting ranges
|
|
/// Here we check whether a beginning of one range lies inside another range
|
|
/// (ranges are intersect)
|
|
const bool is_intersection = (begin <= rhs.begin && rhs.begin < end) ||
|
|
(rhs.begin <= begin && begin < rhs.end);
|
|
|
|
if (is_intersection)
|
|
throw Exception(ErrorCodes::LOGICAL_ERROR,
|
|
"Intersecting mark ranges are not allowed, it is a bug! First range ({}, {}), second range ({}, {})", begin, end, rhs.begin, rhs.end);
|
|
|
|
return begin < rhs.begin && end <= rhs.begin;
|
|
}
|
|
|
|
size_t getLastMark(const MarkRanges & ranges)
|
|
{
|
|
size_t current_task_last_mark = 0;
|
|
for (const auto & mark_range : ranges)
|
|
current_task_last_mark = std::max(current_task_last_mark, mark_range.end);
|
|
return current_task_last_mark;
|
|
}
|
|
|
|
}
|