Kudu C++ client API
partial_row.h
1 // Licensed to the Apache Software Foundation (ASF) under one
2 // or more contributor license agreements. See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership. The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License. You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied. See the License for the
15 // specific language governing permissions and limitations
16 // under the License.
17 #ifndef KUDU_COMMON_PARTIAL_ROW_H
18 #define KUDU_COMMON_PARTIAL_ROW_H
19 
20 // NOTE: using stdint.h instead of cstdint because this file is supposed
21 // to be processed by a compiler lacking C++11 support.
22 #include <stdint.h>
23 
24 #include <string>
25 
26 #ifdef KUDU_HEADERS_NO_STUBS
27 #include <gtest/gtest_prod.h>
28 
29 #include "kudu/gutil/port.h"
30 #else
31 // This is a poor module interdependency, but the stubs are header-only and
32 // it's only for exported header builds, so we'll make an exception.
33 #include "kudu/client/stubs.h"
34 #endif
35 
36 #include "kudu/util/int128.h"
37 #include "kudu/util/kudu_export.h"
38 #include "kudu/util/slice.h"
39 #include "kudu/util/status.h"
40 
42 namespace kudu {
43 class ColumnSchema;
44 namespace client {
45 class ClientTest_TestProjectionPredicatesFuzz_Test;
46 class KuduWriteOperation;
47 namespace internal {
48 class WriteRpc;
49 } // namespace internal
50 template<typename KeyTypeWrapper> struct SliceKeysTestSetup;// IWYU pragma: keep
51 template<typename KeyTypeWrapper> struct IntKeysTestSetup; // IWYU pragma: keep
52 } // namespace client
53 
54 namespace tablet {
55  template<typename KeyTypeWrapper> struct SliceTypeRowOps; // IWYU pragma: keep
56  template<typename KeyTypeWrapper> struct NumTypeRowOps; // IWYU pragma: keep
57 } // namespace tablet
58 
59 namespace tools {
60 class TableScanner;
61 } // namespace tools
62 
64 
65 class Schema;
66 
72 class KUDU_EXPORT KuduPartialRow {
73  public:
77  explicit KuduPartialRow(const Schema* schema);
78 
79  virtual ~KuduPartialRow();
80 
85  KuduPartialRow(const KuduPartialRow& other);
86 
92  KuduPartialRow& operator=(KuduPartialRow other);
93 
105  Status SetBool(const Slice& col_name, bool val) WARN_UNUSED_RESULT;
106 
107  Status SetInt8(const Slice& col_name, int8_t val) WARN_UNUSED_RESULT;
108  Status SetInt16(const Slice& col_name, int16_t val) WARN_UNUSED_RESULT;
109  Status SetInt32(const Slice& col_name, int32_t val) WARN_UNUSED_RESULT;
110  Status SetInt64(const Slice& col_name, int64_t val) WARN_UNUSED_RESULT;
111  Status SetUnixTimeMicros(const Slice& col_name,
112  int64_t micros_since_utc_epoch) WARN_UNUSED_RESULT;
113  Status SetDate(const Slice& col_name,
114  int32_t days_since_unix_epoch) WARN_UNUSED_RESULT;
115 
116  Status SetFloat(const Slice& col_name, float val) WARN_UNUSED_RESULT;
117  Status SetDouble(const Slice& col_name, double val) WARN_UNUSED_RESULT;
118 #if KUDU_INT128_SUPPORTED
119  Status SetUnscaledDecimal(const Slice& col_name, int128_t val) WARN_UNUSED_RESULT;
120 #endif
121 
139  Status SetBool(int col_idx, bool val) WARN_UNUSED_RESULT;
140 
141  Status SetInt8(int col_idx, int8_t val) WARN_UNUSED_RESULT;
142  Status SetInt16(int col_idx, int16_t val) WARN_UNUSED_RESULT;
143  Status SetInt32(int col_idx, int32_t val) WARN_UNUSED_RESULT;
144  Status SetInt64(int col_idx, int64_t val) WARN_UNUSED_RESULT;
145  Status SetUnixTimeMicros(int col_idx, int64_t micros_since_utc_epoch) WARN_UNUSED_RESULT;
146  Status SetDate(int col_idx, int32_t days_since_unix_epoch) WARN_UNUSED_RESULT;
147 
148  Status SetFloat(int col_idx, float val) WARN_UNUSED_RESULT;
149  Status SetDouble(int col_idx, double val) WARN_UNUSED_RESULT;
150 #if KUDU_INT128_SUPPORTED
151  Status SetUnscaledDecimal(int col_idx, int128_t val) WARN_UNUSED_RESULT;
152 #endif
153 
172  Status SetBinary(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
173  Status SetString(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
175 
187  Status SetVarchar(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
188 
211  Status SetBinary(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
212  Status SetString(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
214 
231  Status SetVarchar(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
232 
245  Status SetBinaryCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
246  Status SetStringCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
248 
266  Status SetStringCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
267  Status SetBinaryCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
269 
287  Status SetBinaryNoCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
288  Status SetStringNoCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
290 
313  Status SetVarcharNoCopyUnsafe(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
314 
337  Status SetBinaryNoCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
338  Status SetStringNoCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
340 
367  Status SetVarcharNoCopyUnsafe(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
368 
377  Status SetNull(const Slice& col_name) WARN_UNUSED_RESULT;
378 
387  Status SetNull(int col_idx) WARN_UNUSED_RESULT;
388 
396  Status Unset(const Slice& col_name) WARN_UNUSED_RESULT;
397 
405  Status Unset(int col_idx) WARN_UNUSED_RESULT;
406 
412  bool IsColumnSet(const Slice& col_name) const;
413 
419  bool IsColumnSet(int col_idx) const;
420 
426  bool IsNull(const Slice& col_name) const;
427 
433  bool IsNull(int col_idx) const;
434 
446  Status GetBool(const Slice& col_name, bool* val) const WARN_UNUSED_RESULT;
447 
448  Status GetInt8(const Slice& col_name, int8_t* val) const WARN_UNUSED_RESULT;
449  Status GetInt16(const Slice& col_name, int16_t* val) const WARN_UNUSED_RESULT;
450  Status GetInt32(const Slice& col_name, int32_t* val) const WARN_UNUSED_RESULT;
451  Status GetInt64(const Slice& col_name, int64_t* val) const WARN_UNUSED_RESULT;
452  Status GetUnixTimeMicros(const Slice& col_name, int64_t* micros_since_utc_epoch)
453  const WARN_UNUSED_RESULT;
454  Status GetDate(const Slice& col_name, int32_t* days_since_unix_epoch) const WARN_UNUSED_RESULT;
455  Status GetFloat(const Slice& col_name, float* val) const WARN_UNUSED_RESULT;
456  Status GetDouble(const Slice& col_name, double* val) const WARN_UNUSED_RESULT;
457 #if KUDU_INT128_SUPPORTED
458  // NOTE: The non-const version of this function is kept for backwards compatibility.
459  Status GetUnscaledDecimal(const Slice& col_name, int128_t* val) WARN_UNUSED_RESULT;
460  Status GetUnscaledDecimal(const Slice& col_name, int128_t* val) const WARN_UNUSED_RESULT;
461 #endif
462 
482  Status GetBool(int col_idx, bool* val) const WARN_UNUSED_RESULT;
483 
484  Status GetInt8(int col_idx, int8_t* val) const WARN_UNUSED_RESULT;
485  Status GetInt16(int col_idx, int16_t* val) const WARN_UNUSED_RESULT;
486  Status GetInt32(int col_idx, int32_t* val) const WARN_UNUSED_RESULT;
487  Status GetInt64(int col_idx, int64_t* val) const WARN_UNUSED_RESULT;
488  Status GetUnixTimeMicros(int col_idx, int64_t* micros_since_utc_epoch) const WARN_UNUSED_RESULT;
489  Status GetDate(int col_idx, int32_t* days_since_unix_epoch) const WARN_UNUSED_RESULT;
490 
491  Status GetFloat(int col_idx, float* val) const WARN_UNUSED_RESULT;
492  Status GetDouble(int col_idx, double* val) const WARN_UNUSED_RESULT;
493 #if KUDU_INT128_SUPPORTED
494  // NOTE: The non-const version of this function is kept for backwards compatibility.
495  Status GetUnscaledDecimal(int col_idx, int128_t* val) WARN_UNUSED_RESULT;
496  Status GetUnscaledDecimal(int col_idx, int128_t* val) const WARN_UNUSED_RESULT;
497 #endif
498 
517  Status GetString(const Slice& col_name, Slice* val) const WARN_UNUSED_RESULT;
518  Status GetBinary(const Slice& col_name, Slice* val) const WARN_UNUSED_RESULT;
519  Status GetVarchar(const Slice& col_name, Slice* val) const WARN_UNUSED_RESULT;
521 
543  Status GetString(int col_idx, Slice* val) const WARN_UNUSED_RESULT;
544  Status GetBinary(int col_idx, Slice* val) const WARN_UNUSED_RESULT;
545  Status GetVarchar(int col_idx, Slice* val) const WARN_UNUSED_RESULT;
547 
548  //------------------------------------------------------------
549  // Key-encoding related functions
550  //------------------------------------------------------------
551 
563  Status EncodeRowKey(std::string* encoded_key) const;
564 
571  std::string ToEncodedRowKeyOrDie() const;
572 
573  //------------------------------------------------------------
574  // Utility code
575  //------------------------------------------------------------
576 
579  bool IsKeySet() const;
580 
582  bool AllColumnsSet() const;
583 
589  std::string ToString() const;
590 
592  const Schema* schema() const { return schema_; }
593 
594  private:
595  friend class client::KuduWriteOperation; // for row_data_.
596  friend class client::internal::WriteRpc; // for row_data_.
597  friend class KeyUtilTest;
598  friend class PartitionSchema;
599  friend class RowOperationsPBDecoder;
600  friend class RowOperationsPBEncoder;
601  friend class tools::TableScanner;
602  friend class TestScanSpec;
603  template<typename KeyTypeWrapper> friend struct client::SliceKeysTestSetup;
604  template<typename KeyTypeWrapper> friend struct client::IntKeysTestSetup;
605  template<typename KeyTypeWrapper> friend struct tablet::SliceTypeRowOps;
606  template<typename KeyTypeWrapper> friend struct tablet::NumTypeRowOps;
607  FRIEND_TEST(client::ClientTest, TestProjectionPredicatesFuzz);
608  FRIEND_TEST(KeyUtilTest, TestIncrementInt128PrimaryKey);
609  FRIEND_TEST(PartitionPrunerTest, TestIntPartialPrimaryKeyRangePruning);
610  FRIEND_TEST(PartitionPrunerTest, TestPartialPrimaryKeyRangePruning);
611  FRIEND_TEST(PartitionPrunerTest, TestPrimaryKeyRangePruning);
612  FRIEND_TEST(RowOperationsTest, ProjectionTestWholeSchemaSpecified);
613  FRIEND_TEST(RowOperationsTest, TestProjectUpdates);
614  FRIEND_TEST(RowOperationsTest, TestProjectDeletes);
615 
616  template<typename T>
617  Status Set(const Slice& col_name, const typename T::cpp_type& val,
618  bool owned = false);
619 
620  template<typename T>
621  Status Set(int col_idx, const typename T::cpp_type& val,
622  bool owned = false);
623 
624  // Runtime version of the generic setter.
625  Status Set(int32_t column_idx, const uint8_t* val);
626 
627  template<typename T>
628  Status Get(const Slice& col_name, typename T::cpp_type* val) const;
629 
630  template<typename T>
631  Status Get(int col_idx, typename T::cpp_type* val) const;
632 
633  template<typename T>
634  Status SetSliceCopy(const Slice& col_name, const Slice& val);
635 
636  template<typename T>
637  Status SetSliceCopy(int col_idx, const Slice& val);
638 
639  // If the given column is a variable length column whose memory is owned by this instance,
640  // deallocates the value.
641  // NOTE: Does not mutate the isset bitmap.
642  // REQUIRES: col_idx must be a variable length column.
643  void DeallocateStringIfSet(int col_idx, const ColumnSchema& col);
644 
645  // Deallocate any string/binary values whose memory is managed by this object.
646  void DeallocateOwnedStrings();
647 
648  const Schema* schema_;
649 
650  // 1-bit set for any field which has been explicitly set. This is distinct
651  // from NULL -- an "unset" field will take the server-side default on insert,
652  // whereas a field explicitly set to NULL will override the default.
653  uint8_t* isset_bitmap_;
654 
655  // 1-bit set for any variable length columns whose memory is managed by this instance.
656  // These strings need to be deallocated whenever the value is reset,
657  // or when the instance is destructed.
658  uint8_t* owned_strings_bitmap_;
659 
660  // The normal "contiguous row" format row data. Any column whose data is unset
661  // or NULL can have undefined bytes.
662  uint8_t* row_data_;
663 };
664 
665 } // namespace kudu
666 #endif /* KUDU_COMMON_PARTIAL_ROW_H */
Definition: callbacks.h:28
const Schema * schema() const
Definition: partial_row.h:592
A row which may only contain values for a subset of the columns.
Definition: partial_row.h:72