cql3: expr: change evaluation_input vector components to take spans

Spans are slightly cleaner, slightly faster (as they avoid an indirection),
and allow for replacing some of the arguments with small_vector:s.

Closes #14313
This commit is contained in:
Avi Kivity
2023-06-20 15:36:11 +03:00
committed by Kamil Braun
parent e1c2de4fb8
commit 32b27d6a08
8 changed files with 38 additions and 38 deletions

View File

@@ -110,13 +110,13 @@ managed_bytes_opt
extract_column_value(const column_definition* cdef, const evaluation_inputs& inputs) { extract_column_value(const column_definition* cdef, const evaluation_inputs& inputs) {
switch (cdef->kind) { switch (cdef->kind) {
case column_kind::partition_key: case column_kind::partition_key:
return managed_bytes((*inputs.partition_key)[cdef->id]); return managed_bytes(inputs.partition_key[cdef->id]);
case column_kind::clustering_key: case column_kind::clustering_key:
if (cdef->id >= inputs.clustering_key->size()) { if (cdef->id >= inputs.clustering_key.size()) {
// partial clustering key, or LWT non-existing row // partial clustering key, or LWT non-existing row
return std::nullopt; return std::nullopt;
} }
return managed_bytes((*inputs.clustering_key)[cdef->id]); return managed_bytes(inputs.clustering_key[cdef->id]);
case column_kind::static_column: case column_kind::static_column:
[[fallthrough]]; [[fallthrough]];
case column_kind::regular_column: { case column_kind::regular_column: {
@@ -126,7 +126,7 @@ extract_column_value(const column_definition* cdef, const evaluation_inputs& inp
format("Column definition {} does not match any column in the query selection", format("Column definition {} does not match any column in the query selection",
cdef->name_as_text())); cdef->name_as_text()));
} }
return managed_bytes_opt((*inputs.static_and_regular_columns)[index]); return managed_bytes_opt(inputs.static_and_regular_columns[index]);
} }
default: default:
throw exceptions::unsupported_operation_exception("Unknown column kind"); throw exceptions::unsupported_operation_exception("Unknown column kind");

View File

@@ -472,9 +472,9 @@ extern std::ostream& operator<<(std::ostream&, oper_t);
// Input data needed to evaluate an expression. Individual members can be // Input data needed to evaluate an expression. Individual members can be
// null if not applicable (e.g. evaluating outside a row context) // null if not applicable (e.g. evaluating outside a row context)
struct evaluation_inputs { struct evaluation_inputs {
const std::vector<bytes>* partition_key = nullptr; std::span<const bytes> partition_key;
const std::vector<bytes>* clustering_key = nullptr; std::span<const bytes> clustering_key;
const std::vector<managed_bytes_opt>* static_and_regular_columns = nullptr; // indexes match `selection` member std::span<const managed_bytes_opt> static_and_regular_columns; // indexes match `selection` member
const cql3::selection::selection* selection = nullptr; const cql3::selection::selection* selection = nullptr;
const query_options* options = nullptr; const query_options* options = nullptr;
std::span<const api::timestamp_type> static_and_regular_timestamps; // indexes match `selection` member std::span<const api::timestamp_type> static_and_regular_timestamps; // indexes match `selection` member

View File

@@ -469,9 +469,9 @@ bool result_set_builder::restrictions_filter::do_filter(const selection& selecti
bool multi_col_clustering_satisfied = expr::is_satisfied_by( bool multi_col_clustering_satisfied = expr::is_satisfied_by(
clustering_columns_restrictions, clustering_columns_restrictions,
expr::evaluation_inputs{ expr::evaluation_inputs{
.partition_key = &partition_key, .partition_key = partition_key,
.clustering_key = &clustering_key, .clustering_key = clustering_key,
.static_and_regular_columns = &static_and_regular_columns, .static_and_regular_columns = static_and_regular_columns,
.selection = &selection, .selection = &selection,
.options = &_options, .options = &_options,
}); });
@@ -501,9 +501,9 @@ bool result_set_builder::restrictions_filter::do_filter(const selection& selecti
bool regular_restriction_matches = expr::is_satisfied_by( bool regular_restriction_matches = expr::is_satisfied_by(
single_col_restriction, single_col_restriction,
expr::evaluation_inputs{ expr::evaluation_inputs{
.partition_key = &partition_key, .partition_key = partition_key,
.clustering_key = &clustering_key, .clustering_key = clustering_key,
.static_and_regular_columns = &static_and_regular_columns, .static_and_regular_columns = static_and_regular_columns,
.selection = &selection, .selection = &selection,
.options = &_options, .options = &_options,
}); });
@@ -526,9 +526,9 @@ bool result_set_builder::restrictions_filter::do_filter(const selection& selecti
if (!expr::is_satisfied_by( if (!expr::is_satisfied_by(
single_col_restriction, single_col_restriction,
expr::evaluation_inputs{ expr::evaluation_inputs{
.partition_key = &partition_key, .partition_key = partition_key,
.clustering_key = &clustering_key, .clustering_key = clustering_key,
.static_and_regular_columns = nullptr, // partition key filtering only .static_and_regular_columns = {}, // partition key filtering only
.selection = &selection, .selection = &selection,
.options = &_options, .options = &_options,
})) { })) {
@@ -554,9 +554,9 @@ bool result_set_builder::restrictions_filter::do_filter(const selection& selecti
if (!expr::is_satisfied_by( if (!expr::is_satisfied_by(
single_col_restriction, single_col_restriction,
expr::evaluation_inputs{ expr::evaluation_inputs{
.partition_key = &partition_key, .partition_key = partition_key,
.clustering_key = &clustering_key, .clustering_key = clustering_key,
.static_and_regular_columns = nullptr, // clustering key checks only .static_and_regular_columns = {}, // clustering key checks only
.selection = &selection, .selection = &selection,
.options = &_options, .options = &_options,
})) { })) {

View File

@@ -174,9 +174,9 @@ cas_request::build_cas_result_set(seastar::shared_ptr<cql3::metadata> metadata,
auto ckey_bytes = old_row.ckey->explode(); auto ckey_bytes = old_row.ckey->explode();
auto eval_inputs = expr::evaluation_inputs{ auto eval_inputs = expr::evaluation_inputs{
.partition_key = &pkey_bytes, .partition_key = pkey_bytes,
.clustering_key = &ckey_bytes, .clustering_key = ckey_bytes,
.static_and_regular_columns = &old_row.row->cells, .static_and_regular_columns = old_row.row->cells,
.selection = _rows.selection.get(), .selection = _rows.selection.get(),
}; };

View File

@@ -184,7 +184,7 @@ bool modification_statement::applies_to(const selection::selection* selection,
}); });
auto inputs = expr::evaluation_inputs{ auto inputs = expr::evaluation_inputs{
.static_and_regular_columns = static_and_regular_columns, .static_and_regular_columns = *static_and_regular_columns,
.selection = selection, .selection = selection,
.options = &options, .options = &options,
}; };

View File

@@ -29,9 +29,9 @@ update_parameters::get_prefetched_list(const partition_key& pkey, const clusteri
auto ckey_bytes = ckey.explode(); auto ckey_bytes = ckey.explode();
auto val = expr::extract_column_value(&column, expr::evaluation_inputs{ auto val = expr::extract_column_value(&column, expr::evaluation_inputs{
.partition_key = &pkey_bytes, .partition_key = pkey_bytes,
.clustering_key = &ckey_bytes, .clustering_key = ckey_bytes,
.static_and_regular_columns = &row->cells, .static_and_regular_columns = row->cells,
.selection = _prefetched.selection.get(), .selection = _prefetched.selection.get(),
}); });

View File

@@ -291,9 +291,9 @@ bool partition_key_matches(data_dictionary::database db, const schema& base, con
return cql3::expr::is_satisfied_by( return cql3::expr::is_satisfied_by(
pk_restrictions, pk_restrictions,
cql3::expr::evaluation_inputs{ cql3::expr::evaluation_inputs{
.partition_key = &exploded_pk, .partition_key = exploded_pk,
.clustering_key = &exploded_ck, .clustering_key = exploded_ck,
.static_and_regular_columns = nullptr, // partition key filtering only .static_and_regular_columns = {}, // partition key filtering only
.selection = selection.get(), .selection = selection.get(),
.options = &dummy_options, .options = &dummy_options,
}); });
@@ -315,9 +315,9 @@ bool clustering_prefix_matches(data_dictionary::database db, const schema& base,
return cql3::expr::is_satisfied_by( return cql3::expr::is_satisfied_by(
r, r,
cql3::expr::evaluation_inputs{ cql3::expr::evaluation_inputs{
.partition_key = &exploded_pk, .partition_key = exploded_pk,
.clustering_key = &exploded_ck, .clustering_key = exploded_ck,
.static_and_regular_columns = nullptr, // clustering key only filtering here .static_and_regular_columns = {}, // clustering key only filtering here
.selection = selection.get(), .selection = selection.get(),
.options = &dummy_options, .options = &dummy_options,
}); });
@@ -394,9 +394,9 @@ public:
return cql3::expr::is_satisfied_by( return cql3::expr::is_satisfied_by(
r, r,
cql3::expr::evaluation_inputs{ cql3::expr::evaluation_inputs{
.partition_key = &_pk, .partition_key = _pk,
.clustering_key = &ck, .clustering_key = ck,
.static_and_regular_columns = &static_and_regular_columns, .static_and_regular_columns = static_and_regular_columns,
.selection = _selection.get(), .selection = _selection.get(),
.options = &dummy_options, .options = &dummy_options,
}); });

View File

@@ -457,9 +457,9 @@ std::pair<evaluation_inputs, std::unique_ptr<evaluation_inputs_data>> make_evalu
.timestamps = std::move(static_and_regular_column_timestamps), .timestamps = std::move(static_and_regular_column_timestamps),
.ttls = std::move(static_and_regular_column_ttls)}); .ttls = std::move(static_and_regular_column_ttls)});
evaluation_inputs inputs{.partition_key = &data->partition_key, evaluation_inputs inputs{.partition_key = data->partition_key,
.clustering_key = &data->clustering_key, .clustering_key = data->clustering_key,
.static_and_regular_columns = &data->static_and_regular_columns, .static_and_regular_columns = data->static_and_regular_columns,
.selection = data->selection.get(), .selection = data->selection.get(),
.options = &data->options, .options = &data->options,
.static_and_regular_timestamps = data->timestamps, .static_and_regular_timestamps = data->timestamps,