15 #ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_BIGTABLE_MUTATIONS_H
16 #define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_BIGTABLE_MUTATIONS_H
18 #include "google/cloud/bigtable/cell.h"
19 #include "google/cloud/bigtable/row_key.h"
20 #include "google/cloud/bigtable/version.h"
21 #include "google/cloud/grpc_error_delegate.h"
22 #include "google/cloud/internal/big_endian.h"
23 #include "google/cloud/status.h"
24 #include "google/cloud/status_or.h"
25 #include "absl/meta/type_traits.h"
26 #include <google/bigtable/v2/bigtable.pb.h>
27 #include <google/bigtable/v2/data.pb.h>
28 #include <grpcpp/grpcpp.h>
31 #include <type_traits>
57 template <
typename ColumnType,
typename ValueType>
59 std::chrono::milliseconds timestamp, ValueType&& value) {
61 auto& set_cell = *m
.op.mutable_set_cell();
62 set_cell.set_family_name(std::move(family));
63 set_cell.set_column_qualifier(std::forward<ColumnType>(column));
64 set_cell.set_timestamp_micros(
65 std::chrono::duration_cast<std::chrono::microseconds>(timestamp).count());
66 set_cell.set_value(std::forward<ValueType>(value));
71 template <
typename ColumnType>
73 std::chrono::milliseconds timestamp, std::int64_t value) {
75 auto& set_cell = *m
.op.mutable_set_cell();
76 set_cell.set_family_name(std::move(family));
77 set_cell.set_column_qualifier(std::forward<ColumnType>(column));
78 set_cell.set_timestamp_micros(
79 std::chrono::duration_cast<std::chrono::microseconds>(timestamp).count());
80 set_cell.set_value(
google::
cloud::internal::EncodeBigEndian(value));
89 template <
typename ColumnType,
typename ValueType>
92 auto& set_cell = *m
.op.mutable_set_cell();
93 set_cell.set_family_name(std::move(family));
94 set_cell.set_column_qualifier(std::forward<ColumnType>(column));
96 set_cell.set_value(std::forward<ValueType>(value));
106 template <
typename ColumnType>
109 auto& set_cell = *m
.op.mutable_set_cell();
110 set_cell.set_family_name(std::move(family));
111 set_cell.set_column_qualifier(std::forward<ColumnType>(column));
113 set_cell.set_value(
google::
cloud::internal::EncodeBigEndian(value));
166 template <
typename Rep1,
typename Period1,
typename Rep2,
typename Period2,
169 std::chrono::duration<Rep1, Period1> timestamp_begin,
170 std::chrono::duration<Rep2, Period2> timestamp_end) {
172 auto& d = *m
.op.mutable_delete_from_column();
173 d.set_family_name(std::move(family));
174 d.set_column_qualifier(std::forward<ColumnType>(column));
175 d.mutable_time_range()->set_start_timestamp_micros(
176 std::chrono::duration_cast<std::chrono::microseconds>(timestamp_begin)
178 d.mutable_time_range()->set_end_timestamp_micros(
179 std::chrono::duration_cast<std::chrono::microseconds>(timestamp_end)
213 template <
typename Rep1,
typename Period1,
typename ColumnType>
215 std::string family, ColumnType&& column,
216 std::chrono::duration<Rep1, Period1> timestamp_begin) {
218 auto& d = *m
.op.mutable_delete_from_column();
219 d.set_family_name(std::move(family));
220 d.set_column_qualifier(std::forward<ColumnType>(column));
221 d.mutable_time_range()->set_start_timestamp_micros(
222 std::chrono::duration_cast<std::chrono::microseconds>(timestamp_begin)
256 template <
typename Rep2,
typename Period2,
typename ColumnType>
258 std::string family, ColumnType&& column,
259 std::chrono::duration<Rep2, Period2> timestamp_end) {
261 auto& d = *m
.op.mutable_delete_from_column();
262 d.set_family_name(std::move(family));
263 d.set_column_qualifier(std::forward<ColumnType>(column));
264 d.mutable_time_range()->set_end_timestamp_micros(
265 std::chrono::duration_cast<std::chrono::microseconds>(timestamp_end)
271 template <
typename ColumnType>
274 auto& d = *m
.op.mutable_delete_from_column();
275 d.set_family_name(std::move(family));
276 d.set_column_qualifier(std::forward<ColumnType>(column));
300 typename std::enable_if<std::is_constructible<RowKeyType, RowKey>::value,
304 request_.set_row_key(RowKeyType(std::forward<RowKey>(row_key)));
308 template <
typename RowKey>
310 request_.set_row_key(std::forward<RowKey>(row_key));
311 for (
auto&& i : list) {
312 *request_.add_mutations() = i
.op;
318 typename RowKey,
typename... M,
319 typename std::enable_if<std::is_constructible<RowKeyType, RowKey>::value,
323 absl::conjunction<std::is_convertible<M,
Mutation>...>::value,
324 "The arguments passed to SingleRowMutation(std::string, ...) must be "
325 "convertible to Mutation");
326 request_.set_row_key(std::forward<RowKey>(row_key));
327 emplace_many(std::forward<M>(m)...);
332 ::
google::bigtable::v2::MutateRowsRequest::Entry entry) {
334 swap(*request_.mutable_row_key(), *entry.mutable_row_key());
335 swap(*request_.mutable_mutations(), *entry.mutable_mutations());
340 : request_(std::move(request)) {}
344 *request_.add_mutations() = std::move(mut
.op);
349 RowKeyType
const&
row_key()
const {
return request_.row_key(); }
360 entry->set_row_key(std::move(*request_.mutable_row_key()));
361 *entry->mutable_mutations() = std::move(*request_.mutable_mutations());
366 request.set_row_key(std::move(*request_.mutable_row_key()));
367 *request.mutable_mutations() = std::move(*request_.mutable_mutations());
375 template <
typename... M>
376 void emplace_many(
Mutation first, M&&... tail) {
378 emplace_many(std::forward<M>(tail)...);
383 ::
google::bigtable::v2::MutateRowRequest request_;
397 : status_
(std::move(status)
), original_index_(index) {}
427 : std::runtime_error(msg), failures_(std::move(failures)) {}
431 : std::runtime_error(msg),
432 failures_(std::move(failures)),
433 status_(std::move(status)) {}
454 grpc::Status
const&
status()
const {
return status_; }
458 grpc::Status status_;
474 template <
typename Iterator>
478 "The iterator value type must be convertible to SingleRowMutation");
479 for (
auto i = begin; i != end; ++i) {
500 template <
typename... M,
501 typename std::enable_if<absl::conjunction<std::is_convertible<
506 emplace_many(std::forward<M>(m)...);
529 request_.Swap(request);
534 bool empty()
const {
return request_.entries().empty(); }
537 std::size_t
size()
const {
return request_.entries().size(); }
541 return request_.ByteSizeLong();
545 template <
typename... M>
548 emplace_many(std::forward<M>(tail)...);
553 google::bigtable::v2::MutateRowsRequest request_;