forked from scylladb/scylladb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpartition_slice_builder.cc
122 lines (107 loc) · 3.88 KB
/
partition_slice_builder.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
* Copyright (C) 2015 Cloudius Systems, Ltd.
*/
/*
* 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/>.
*/
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/range/algorithm_ext/push_back.hpp>
#include "partition_slice_builder.hh"
partition_slice_builder::partition_slice_builder(const schema& schema)
: _schema(schema)
{
_options.set<query::partition_slice::option::send_partition_key>();
_options.set<query::partition_slice::option::send_clustering_key>();
_options.set<query::partition_slice::option::send_timestamp_and_expiry>();
}
query::partition_slice
partition_slice_builder::build() {
std::vector<query::clustering_range> ranges;
if (_row_ranges) {
ranges = std::move(*_row_ranges);
} else {
ranges.emplace_back(query::clustering_range::make_open_ended_both_sides());
}
std::vector<column_id> static_columns;
if (_static_columns) {
static_columns = std::move(*_static_columns);
} else {
boost::range::push_back(static_columns,
_schema.static_columns() | boost::adaptors::transformed(std::mem_fn(&column_definition::id)));
}
std::vector<column_id> regular_columns;
if (_regular_columns) {
regular_columns = std::move(*_regular_columns);
} else {
boost::range::push_back(regular_columns,
_schema.regular_columns() | boost::adaptors::transformed(std::mem_fn(&column_definition::id)));
}
return {
std::move(ranges),
std::move(static_columns),
std::move(regular_columns),
std::move(_options)
};
}
partition_slice_builder&
partition_slice_builder::with_range(query::clustering_range range) {
if (!_row_ranges) {
_row_ranges = std::vector<query::clustering_range>();
}
_row_ranges->emplace_back(std::move(range));
return *this;
}
partition_slice_builder&
partition_slice_builder::with_no_regular_columns() {
_regular_columns = std::vector<column_id>();
return *this;
}
partition_slice_builder&
partition_slice_builder::with_regular_column(bytes name) {
if (!_regular_columns) {
_regular_columns = std::vector<column_id>();
}
const column_definition* def = _schema.get_column_definition(name);
if (!def) {
throw std::runtime_error(sprint("No such column: %s", _schema.regular_column_name_type()->to_string(name)));
}
if (!def->is_regular()) {
throw std::runtime_error(sprint("Column is not regular: %s", _schema.regular_column_name_type()->to_string(name)));
}
_regular_columns->push_back(def->id);
return *this;
}
partition_slice_builder&
partition_slice_builder::with_no_static_columns() {
_static_columns = std::vector<column_id>();
return *this;
}
partition_slice_builder&
partition_slice_builder::with_static_column(bytes name) {
if (!_static_columns) {
_static_columns = std::vector<column_id>();
}
const column_definition* def = _schema.get_column_definition(name);
if (!def) {
throw std::runtime_error(sprint("No such column: %s", utf8_type->to_string(name)));
}
if (!def->is_static()) {
throw std::runtime_error(sprint("Column is not static: %s", utf8_type->to_string(name)));
}
_static_columns->push_back(def->id);
return *this;
}