Instead of lengthy blurbs, switch to single-line, machine-readable standardized (https://spdx.dev) license identifiers. The Linux kernel switched long ago, so there is strong precedent. Three cases are handled: AGPL-only, Apache-only, and dual licensed. For the latter case, I chose (AGPL-3.0-or-later and Apache-2.0), reasoning that our changes are extensive enough to apply our license. The changes we applied mechanically with a script, except to licenses/README.md. Closes #9937
90 lines
3.2 KiB
C++
90 lines
3.2 KiB
C++
/*
|
|
* Copyright (C) 2018-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
#include "test/lib/normalizing_reader.hh"
|
|
#include <seastar/core/future-util.hh>
|
|
|
|
normalizing_reader::normalizing_reader(flat_mutation_reader rd)
|
|
: impl(rd.schema(), rd.permit())
|
|
, _rd(std::move(rd))
|
|
, _range_tombstones(*_rd.schema(), _rd.permit())
|
|
{}
|
|
|
|
future<> normalizing_reader::fill_buffer() {
|
|
return do_until([this] { return is_buffer_full() || is_end_of_stream(); }, [this] {
|
|
return _rd.fill_buffer().then([this] {
|
|
position_in_partition::less_compare less{*_rd.schema()};
|
|
while (!_rd.is_buffer_empty()) {
|
|
auto mf = _rd.pop_mutation_fragment();
|
|
if (mf.is_end_of_partition()) {
|
|
while (auto mfo = _range_tombstones.get_next()) {
|
|
push_mutation_fragment(std::move(*mfo));
|
|
}
|
|
} else if (mf.is_range_tombstone()) {
|
|
_range_tombstones.apply(std::move(mf).as_range_tombstone());
|
|
continue;
|
|
} else if (mf.is_clustering_row()) {
|
|
auto ck = mf.as_clustering_row().key();
|
|
clustering_key::make_full(*_rd.schema(), ck);
|
|
auto after_pos = position_in_partition::after_key(ck);
|
|
while (auto mfo = _range_tombstones.get_next(mf)) {
|
|
range_tombstone&& rt = std::move(*mfo).as_range_tombstone();
|
|
if (!less(after_pos, rt.end_position())) {
|
|
push_mutation_fragment(*_schema, _permit, std::move(rt));
|
|
} else {
|
|
push_mutation_fragment(*_schema, _permit, range_tombstone{rt.position(), after_pos, rt.tomb});
|
|
_range_tombstones.apply(range_tombstone{after_pos, rt.end_position(), rt.tomb});
|
|
}
|
|
}
|
|
}
|
|
|
|
push_mutation_fragment(std::move(mf));
|
|
}
|
|
|
|
if (_rd.is_end_of_stream()) {
|
|
while (auto mfo = _range_tombstones.get_next()) {
|
|
push_mutation_fragment(std::move(*mfo));
|
|
}
|
|
_end_of_stream = true;
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
future<> normalizing_reader::next_partition() {
|
|
_range_tombstones.reset();
|
|
clear_buffer_to_next_partition();
|
|
if (is_buffer_empty()) {
|
|
_end_of_stream = false;
|
|
return _rd.next_partition();
|
|
}
|
|
return make_ready_future<>();
|
|
}
|
|
future<> normalizing_reader::fast_forward_to(
|
|
const dht::partition_range& pr) {
|
|
_range_tombstones.reset();
|
|
clear_buffer();
|
|
_end_of_stream = false;
|
|
return _rd.fast_forward_to(pr);
|
|
}
|
|
future<> normalizing_reader::fast_forward_to(
|
|
position_range pr) {
|
|
_range_tombstones.forward_to(pr.start());
|
|
forward_buffer_to(pr.start());
|
|
_end_of_stream = false;
|
|
return _rd.fast_forward_to(std::move(pr));
|
|
}
|
|
future<> normalizing_reader::close() noexcept {
|
|
return _rd.close();
|
|
}
|
|
|
|
flat_mutation_reader make_normalizing_reader(flat_mutation_reader rd) {
|
|
return make_flat_mutation_reader<normalizing_reader>(std::move(rd));
|
|
}
|
|
|