Files
scylladb/tests/result_set_assertions.hh
Avi Kivity 2c3591cbd9 data_value de-any-fication
We use boost::any to convert to and from database values (stored in
serlialized form) and native C++ values.  boost::any captures information
about the data type (how to copy/move/delete etc.) and stores it inside
the boost::any instance.  We later retrieve the real value using
boost::any_cast.

However, data_value (which has a boost::any member) already has type
information as a data_type instance.  By teaching data_type intances about
the corresponding native type, we can elimiante the use of boost::any.

While boost::any is evil and eliminating it improves efficiency somewhat,
the real goal is growing native type support in data_type.  We will use that
later to store native types in the cache, enabling O(log n) access to
collections, O(1) access to tuples, and more efficient large blob support.
2015-10-30 17:38:51 +01:00

70 lines
1.9 KiB
C++

/*
* Copyright 2015 Cloudius Systems
*/
/*
* This file is part of Scylla.
*
* Scylla is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Scylla is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Scylla. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <map>
#include "query-result-set.hh"
//
// Contains assertions for query::result_set objects
//
// Example use:
//
// assert_that(rs)
// .has(a_row().with_column("column_name", "value"));
//
class row_assertion {
std::map<bytes, data_value> _expected_values;
public:
row_assertion& with_column(bytes name, data_value value) {
_expected_values.emplace(name, value);
return *this;
}
private:
friend class result_set_assertions;
bool matches(const query::result_set_row& row) const;
sstring describe(schema_ptr s) const;
};
inline
row_assertion a_row() {
return {};
}
class result_set_assertions {
const query::result_set& _rs;
public:
result_set_assertions(const query::result_set& rs) : _rs(rs) { }
const result_set_assertions& has(const row_assertion& ra) const;
const result_set_assertions& has_only(const row_assertion& ra) const;
const result_set_assertions& is_empty() const;
const result_set_assertions& has_size(int row_count) const;
};
// Make rs live as long as the returned assertion object is used
inline
result_set_assertions assert_that(const query::result_set& rs) {
return { rs };
}