From 4b715226fe75043142b1381326a10f30064b5681 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Sun, 12 Jun 2022 12:53:44 +0300 Subject: [PATCH] cql3: expr: convert is_satisfied_by() signature to evaluation_inputs Callers are converted, but the internals are kept using the old conventions until more APIs are converted. Although the new API allows passing no query_options, the view code keeps passing dummy query_options and improvement is left as a FIXME. --- cql3/expr/expression.cc | 10 +++------- cql3/expr/expression.hh | 8 +++----- cql3/selection/selection.cc | 39 +++++++++++++++++++++++++++++++++---- db/view/view.cc | 36 +++++++++++++++++++++++++++++++--- 4 files changed, 74 insertions(+), 19 deletions(-) diff --git a/cql3/expr/expression.cc b/cql3/expr/expression.cc index f929064087..2b5169d5fe 100644 --- a/cql3/expr/expression.cc +++ b/cql3/expr/expression.cc @@ -795,14 +795,10 @@ expression make_conjunction(expression a, expression b) { return conjunction{std::move(children)}; } -bool is_satisfied_by( - const expression& restr, - const std::vector& partition_key, const std::vector& clustering_key, - const query::result_row_view& static_row, const query::result_row_view* row, - const selection& selection, const query_options& options) { - const auto regulars = get_non_pk_values(selection, static_row, row); +bool is_satisfied_by(const expression& restr, const evaluation_inputs& inputs) { + const auto regulars = get_non_pk_values(*inputs.selection, *inputs.static_row, inputs.row); return is_satisfied_by( - restr, {options, row_data_from_partition_slice{partition_key, clustering_key, regulars, selection}}); + restr, {*inputs.options, row_data_from_partition_slice{*inputs.partition_key, *inputs.clustering_key, regulars, *inputs.selection}}); } template diff --git a/cql3/expr/expression.hh b/cql3/expr/expression.hh index e68b81ecad..a3c614a381 100644 --- a/cql3/expr/expression.hh +++ b/cql3/expr/expression.hh @@ -457,12 +457,10 @@ struct evaluation_inputs { const query_options* options = nullptr; }; -/// True iff restr is satisfied with respect to the row provided from a partition slice. +/// True iff restr evaluates to true, given these inputs extern bool is_satisfied_by( - const expression& restr, - const std::vector& partition_key, const std::vector& clustering_key, - const query::result_row_view& static_row, const query::result_row_view* row, - const selection::selection&, const query_options&); + const expression& restr, const evaluation_inputs& inputs); + /// A set of discrete values. using value_list = std::vector; // Sorted and deduped using value comparator. diff --git a/cql3/selection/selection.cc b/cql3/selection/selection.cc index 8ec56a8043..86a45b39b3 100644 --- a/cql3/selection/selection.cc +++ b/cql3/selection/selection.cc @@ -428,7 +428,14 @@ bool result_set_builder::restrictions_filter::do_filter(const selection& selecti clustering_key_prefix ckey = clustering_key_prefix::from_exploded(clustering_key); return expr::is_satisfied_by( clustering_columns_restrictions->expression, - partition_key, clustering_key, static_row, row, selection, _options); + expr::evaluation_inputs{ + .partition_key = &partition_key, + .clustering_key = &clustering_key, + .static_row = &static_row, + .row = row, + .selection = &selection, + .options = &_options, + }); } auto static_row_iterator = static_row.iterator(); @@ -448,7 +455,15 @@ bool result_set_builder::restrictions_filter::do_filter(const selection& selecti } restrictions::single_column_restriction& restriction = *restr_it->second; bool regular_restriction_matches = expr::is_satisfied_by( - restriction.expression, partition_key, clustering_key, static_row, row, selection, _options); + restriction.expression, + expr::evaluation_inputs{ + .partition_key = &partition_key, + .clustering_key = &clustering_key, + .static_row = &static_row, + .row = row, + .selection = &selection, + .options = &_options, + }); if (!regular_restriction_matches) { _current_static_row_does_not_match = (cdef->kind == column_kind::static_column); return false; @@ -466,7 +481,15 @@ bool result_set_builder::restrictions_filter::do_filter(const selection& selecti } restrictions::single_column_restriction& restriction = *restr_it->second; if (!expr::is_satisfied_by( - restriction.expression, partition_key, clustering_key, static_row, row, selection, _options)) { + restriction.expression, + expr::evaluation_inputs{ + .partition_key = &partition_key, + .clustering_key = &clustering_key, + .static_row = &static_row, + .row = row, + .selection = &selection, + .options = &_options, + })) { _current_partition_key_does_not_match = true; return false; } @@ -486,7 +509,15 @@ bool result_set_builder::restrictions_filter::do_filter(const selection& selecti } restrictions::single_column_restriction& restriction = *restr_it->second; if (!expr::is_satisfied_by( - restriction.expression, partition_key, clustering_key, static_row, row, selection, _options)) { + restriction.expression, + expr::evaluation_inputs{ + .partition_key = &partition_key, + .clustering_key = &clustering_key, + .static_row = &static_row, + .row = row, + .selection = &selection, + .options = &_options, + })) { return false; } } diff --git a/db/view/view.cc b/db/view/view.cc index c4559ce676..18073bdea5 100644 --- a/db/view/view.cc +++ b/db/view/view.cc @@ -242,8 +242,18 @@ bool partition_key_matches(const schema& base, const view_info& view, const dht: auto selection = cql3::selection::selection::for_columns(base.shared_from_this(), pk_columns); uint64_t zero = 0; auto dummy_row = query::result_row_view(ser::qr_row_view{simple_memory_input_stream(reinterpret_cast(&zero), 8)}); + auto dummy_options = cql3::query_options({ }); + // FIXME: pass nullptrs for some of theses dummies return cql3::expr::is_satisfied_by( - r->expression, exploded_pk, exploded_ck, dummy_row, &dummy_row, *selection, cql3::query_options({ })); + r->expression, + cql3::expr::evaluation_inputs{ + .partition_key = &exploded_pk, + .clustering_key = &exploded_ck, + .static_row = &dummy_row, + .row = &dummy_row, + .selection = selection.get(), + .options = &dummy_options, + }); } bool clustering_prefix_matches(const schema& base, const view_info& view, const partition_key& key, const clustering_key_prefix& ck) { @@ -258,8 +268,18 @@ bool clustering_prefix_matches(const schema& base, const view_info& view, const auto selection = cql3::selection::selection::for_columns(base.shared_from_this(), ck_columns); uint64_t zero = 0; auto dummy_row = query::result_row_view(ser::qr_row_view{simple_memory_input_stream(reinterpret_cast(&zero), 8)}); + auto dummy_options = cql3::query_options({ }); + // FIXME: pass nullptrs for some of theses dummies return cql3::expr::is_satisfied_by( - r->expression, exploded_pk, exploded_ck, dummy_row, &dummy_row, *selection, cql3::query_options({ })); + r->expression, + cql3::expr::evaluation_inputs{ + .partition_key = &exploded_pk, + .clustering_key = &exploded_ck, + .static_row = &dummy_row, + .row = &dummy_row, + .selection = selection.get(), + .options = &dummy_options, + }); } bool may_be_affected_by(const schema& base, const view_info& view, const dht::decorated_key& key, const rows_entry& update) { @@ -320,8 +340,18 @@ public: return boost::algorithm::all_of( _view.select_statement().get_restrictions()->get_non_pk_restriction() | boost::adaptors::map_values, [&] (auto&& r) { + // FIXME: pass dummy_options as nullptr + auto dummy_options = cql3::query_options({}); return cql3::expr::is_satisfied_by( - r->expression, _pk, ck, static_row, &row, *_selection, cql3::query_options({ })); + r->expression, + cql3::expr::evaluation_inputs{ + .partition_key = &_pk, + .clustering_key = &ck, + .static_row = &static_row, + .row = &row, + .selection = _selection.get(), + .options = &dummy_options, + }); } ); }