view_info: Store base regular col in the view's PK as column_id
This patch stores the base_non_pk_column_in_view column as column_id, which is more convenient, and it also stores a two-level optional to encode both lazy initialization and the absence of such a column. Signed-off-by: Duarte Nunes <duarte@scylladb.com>
This commit is contained in:
@@ -56,7 +56,6 @@ static logging::logger logger("view");
|
||||
view_info::view_info(const schema& schema, const raw_view_info& raw_view_info)
|
||||
: _schema(schema)
|
||||
, _raw(raw_view_info)
|
||||
, _base_non_pk_column_in_view_pk(nullptr)
|
||||
{ }
|
||||
|
||||
cql3::statements::select_statement& view_info::select_statement() const {
|
||||
@@ -97,17 +96,18 @@ const column_definition* view_info::view_column(const schema& base, column_id ba
|
||||
return _schema.get_column_definition(base.regular_column_at(base_id).name());
|
||||
}
|
||||
|
||||
const column_definition* view_info::base_non_pk_column_in_view_pk(const schema& base) const {
|
||||
stdx::optional<column_id> view_info::base_non_pk_column_in_view_pk(const schema& base) const {
|
||||
if (!_base_non_pk_column_in_view_pk) {
|
||||
for (auto&& base_col : base.regular_columns()) {
|
||||
auto* view_col = _schema.get_column_definition(base_col.name());
|
||||
if (view_col && view_col->is_primary_key()) {
|
||||
_base_non_pk_column_in_view_pk = view_col;
|
||||
_base_non_pk_column_in_view_pk.emplace(stdx::nullopt);
|
||||
for (auto&& view_col : boost::range::join(_schema.partition_key_columns(), _schema.clustering_key_columns())) {
|
||||
auto* base_col = base.get_column_definition(view_col.name());
|
||||
if (!base_col->is_primary_key()) {
|
||||
_base_non_pk_column_in_view_pk.emplace(base_col->id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return _base_non_pk_column_in_view_pk;
|
||||
return *_base_non_pk_column_in_view_pk;
|
||||
}
|
||||
|
||||
namespace db {
|
||||
@@ -234,10 +234,10 @@ row_marker view_updates::compute_row_marker(const clustering_row& base_row) cons
|
||||
*/
|
||||
|
||||
auto marker = base_row.marker();
|
||||
auto* col = _view_info.base_non_pk_column_in_view_pk(*_base);
|
||||
if (col) {
|
||||
auto col_id = _view_info.base_non_pk_column_in_view_pk(*_base);
|
||||
if (col_id) {
|
||||
// Note: multi-cell columns can't be part of the primary key.
|
||||
auto cell = base_row.cells().cell_at(col->id).as_atomic_cell();
|
||||
auto cell = base_row.cells().cell_at(*col_id).as_atomic_cell();
|
||||
auto timestamp = std::max(marker.timestamp(), cell.timestamp());
|
||||
return cell.is_live_and_has_ttl() ? row_marker(timestamp, cell.ttl(), cell.expiry()) : row_marker(timestamp);
|
||||
}
|
||||
@@ -402,8 +402,8 @@ void view_updates::generate_update(
|
||||
return;
|
||||
}
|
||||
|
||||
auto* col = _view_info.base_non_pk_column_in_view_pk(*_base);
|
||||
if (!col) {
|
||||
auto col_id = _view_info.base_non_pk_column_in_view_pk(*_base);
|
||||
if (!col_id) {
|
||||
// The view key is necessarily the same pre and post update.
|
||||
if (existing && !existing->empty()) {
|
||||
if (update.empty()) {
|
||||
@@ -417,10 +417,9 @@ void view_updates::generate_update(
|
||||
return;
|
||||
}
|
||||
|
||||
auto col_id = col->id;
|
||||
auto* after = update.cells().find_cell(col_id);
|
||||
auto* after = update.cells().find_cell(*col_id);
|
||||
if (existing) {
|
||||
auto* before = existing->cells().find_cell(col_id);
|
||||
auto* before = existing->cells().find_cell(*col_id);
|
||||
if (before) {
|
||||
if (after) {
|
||||
// Note: multi-cell columns can't be part of the primary key.
|
||||
|
||||
Reference in New Issue
Block a user