Kudu C++ client API
Loading...
Searching...
No Matches
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
42namespace kudu {
43class ColumnSchema;
44namespace client {
45class ClientTest_TestProjectionPredicatesFuzz_Test;
46class KuduWriteOperation;
47namespace internal {
48class WriteRpc;
49} // namespace internal
50template<typename KeyTypeWrapper> struct SliceKeysTestSetup;// IWYU pragma: keep
51template<typename KeyTypeWrapper> struct IntKeysTestSetup; // IWYU pragma: keep
52} // namespace client
53
54namespace tablet {
55 template<typename KeyTypeWrapper> struct SliceTypeRowOps; // IWYU pragma: keep
56 template<typename KeyTypeWrapper> struct NumTypeRowOps; // IWYU pragma: keep
57} // namespace tablet
58
59namespace tools {
60class TableScanner;
61} // namespace tools
62
64
65class Schema;
66
72class KUDU_EXPORT KuduPartialRow {
73 public:
77 explicit KuduPartialRow(const Schema* schema);
78
79 virtual ~KuduPartialRow();
80
86
93
96
104 Status SetBool(const Slice& col_name, bool val) WARN_UNUSED_RESULT;
105 Status SetInt8(const Slice& col_name, int8_t val) WARN_UNUSED_RESULT;
106 Status SetInt16(const Slice& col_name, int16_t val) WARN_UNUSED_RESULT;
107 Status SetInt32(const Slice& col_name, int32_t val) WARN_UNUSED_RESULT;
108 Status SetInt64(const Slice& col_name, int64_t val) WARN_UNUSED_RESULT;
109 Status SetSerial(const Slice& col_name, uint64_t val) WARN_UNUSED_RESULT;
117 Status SetUnixTimeMicros(const Slice& col_name,
118 int64_t micros_since_utc_epoch) WARN_UNUSED_RESULT;
126 Status SetDate(const Slice& col_name, int32_t days_since_unix_epoch) WARN_UNUSED_RESULT;
127 Status SetFloat(const Slice& col_name, float val) WARN_UNUSED_RESULT;
128 Status SetDouble(const Slice& col_name, double val) WARN_UNUSED_RESULT;
129#if KUDU_INT128_SUPPORTED
130 Status SetUnscaledDecimal(const Slice& col_name, int128_t val) WARN_UNUSED_RESULT;
131#endif
133
141
147 Status SetBool(int col_idx, bool val) WARN_UNUSED_RESULT;
148
149 Status SetInt8(int col_idx, int8_t val) WARN_UNUSED_RESULT;
150 Status SetInt16(int col_idx, int16_t val) WARN_UNUSED_RESULT;
151 Status SetInt32(int col_idx, int32_t val) WARN_UNUSED_RESULT;
152 Status SetInt64(int col_idx, int64_t val) WARN_UNUSED_RESULT;
153 Status SetSerial(int col_idx, uint64_t val) WARN_UNUSED_RESULT;
154
160 Status SetUnixTimeMicros(int col_idx, int64_t micros_since_utc_epoch) WARN_UNUSED_RESULT;
161
167 Status SetDate(int col_idx, int32_t days_since_unix_epoch) WARN_UNUSED_RESULT;
168
169 Status SetFloat(int col_idx, float val) WARN_UNUSED_RESULT;
170 Status SetDouble(int col_idx, double val) WARN_UNUSED_RESULT;
171#if KUDU_INT128_SUPPORTED
172 Status SetUnscaledDecimal(int col_idx, int128_t val) WARN_UNUSED_RESULT;
173#endif
175
178
192 Status SetBinary(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
193 Status SetString(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
195
205 Status SetVarchar(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
206
209
228 Status SetBinary(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
229 Status SetString(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
231
245 Status SetVarchar(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
246
249
258 Status SetBinaryCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
259 Status SetStringCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
261
264
278 Status SetStringCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
279 Status SetBinaryCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
281
284
298 Status SetBinaryNoCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
299 Status SetStringNoCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
301
307
326 Status SetVarcharNoCopyUnsafe(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
327
351 Status SetVarcharNoCopyUnsafe(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
353
356
375 Status SetBinaryNoCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
376 Status SetStringNoCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
378
387 Status SetNull(const Slice& col_name) WARN_UNUSED_RESULT;
388
397 Status SetNull(int col_idx) WARN_UNUSED_RESULT;
398
406 Status Unset(const Slice& col_name) WARN_UNUSED_RESULT;
407
415 Status Unset(int col_idx) WARN_UNUSED_RESULT;
416
422 bool IsColumnSet(const Slice& col_name) const;
423
429 bool IsColumnSet(int col_idx) const;
430
436 bool IsNull(const Slice& col_name) const;
437
443 bool IsNull(int col_idx) const;
444
447
459 Status GetBool(const Slice& col_name, bool* val) const WARN_UNUSED_RESULT;
460
461 Status GetInt8(const Slice& col_name, int8_t* val) const WARN_UNUSED_RESULT;
462 Status GetInt16(const Slice& col_name, int16_t* val) const WARN_UNUSED_RESULT;
463 Status GetInt32(const Slice& col_name, int32_t* val) const WARN_UNUSED_RESULT;
464 Status GetInt64(const Slice& col_name, int64_t* val) const WARN_UNUSED_RESULT;
465 Status GetSerial(const Slice& col_name, uint64_t* val) const WARN_UNUSED_RESULT;
466
476 Status GetUnixTimeMicros(const Slice& col_name,
477 int64_t* micros_since_utc_epoch) const WARN_UNUSED_RESULT;
478
488 Status GetDate(const Slice& col_name, int32_t* days_since_unix_epoch) const WARN_UNUSED_RESULT;
489 Status GetFloat(const Slice& col_name, float* val) const WARN_UNUSED_RESULT;
490 Status GetDouble(const Slice& col_name, double* val) const WARN_UNUSED_RESULT;
491#if KUDU_INT128_SUPPORTED
492 // NOTE: The non-const version of this function is kept for backwards compatibility.
493 Status GetUnscaledDecimal(const Slice& col_name, int128_t* val) WARN_UNUSED_RESULT;
494 Status GetUnscaledDecimal(const Slice& col_name, int128_t* val) const WARN_UNUSED_RESULT;
495#endif
497
505
517 Status GetBool(int col_idx, bool* val) const WARN_UNUSED_RESULT;
518 Status GetInt8(int col_idx, int8_t* val) const WARN_UNUSED_RESULT;
519 Status GetInt16(int col_idx, int16_t* val) const WARN_UNUSED_RESULT;
520 Status GetInt32(int col_idx, int32_t* val) const WARN_UNUSED_RESULT;
521 Status GetInt64(int col_idx, int64_t* val) const WARN_UNUSED_RESULT;
522 Status GetSerial(int col_idx, uint64_t* val) const WARN_UNUSED_RESULT;
523
533 Status GetUnixTimeMicros(int col_idx, int64_t* micros_since_utc_epoch) const WARN_UNUSED_RESULT;
534
544 Status GetDate(int col_idx, int32_t* days_since_unix_epoch) const WARN_UNUSED_RESULT;
545 Status GetFloat(int col_idx, float* val) const WARN_UNUSED_RESULT;
546 Status GetDouble(int col_idx, double* val) const WARN_UNUSED_RESULT;
547#if KUDU_INT128_SUPPORTED
548 // NOTE: The non-const version of this function is kept for backwards compatibility.
549 Status GetUnscaledDecimal(int col_idx, int128_t* val) WARN_UNUSED_RESULT;
550 Status GetUnscaledDecimal(int col_idx, int128_t* val) const WARN_UNUSED_RESULT;
551#endif
553
556
570 Status GetString(const Slice& col_name, Slice* val) const WARN_UNUSED_RESULT;
571 Status GetBinary(const Slice& col_name, Slice* val) const WARN_UNUSED_RESULT;
572 Status GetVarchar(const Slice& col_name, Slice* val) const WARN_UNUSED_RESULT;
574
577
595 Status GetString(int col_idx, Slice* val) const WARN_UNUSED_RESULT;
596 Status GetBinary(int col_idx, Slice* val) const WARN_UNUSED_RESULT;
597 Status GetVarchar(int col_idx, Slice* val) const WARN_UNUSED_RESULT;
599
600 //------------------------------------------------------------
601 // Key-encoding related functions
602 //------------------------------------------------------------
603
615 Status EncodeRowKey(std::string* encoded_key) const;
616
623 std::string ToEncodedRowKeyOrDie() const;
624
625 //------------------------------------------------------------
626 // Utility code
627 //------------------------------------------------------------
628
631 bool IsKeySet() const;
632
635 bool IsNonUniqueKeySet() const;
636
640
642 bool AllColumnsSet() const;
643
649 std::string ToString() const;
650
652 const Schema* schema() const { return schema_; }
653
654 private:
655 friend class client::KuduWriteOperation; // for row_data_.
656 friend class client::internal::WriteRpc; // for row_data_.
657 friend class KeyUtilTest;
658 friend class PartitionSchema;
659 friend class RowOperationsPBDecoder;
660 friend class RowOperationsPBEncoder;
661 friend class ScanSpec; // for Set(int32_t column_idx, const uint8_t* val)
662 friend class tools::TableScanner;
663 friend class TestScanSpec;
664 template<typename KeyTypeWrapper> friend struct client::SliceKeysTestSetup;
665 template<typename KeyTypeWrapper> friend struct client::IntKeysTestSetup;
666 template<typename KeyTypeWrapper> friend struct tablet::SliceTypeRowOps;
667 template<typename KeyTypeWrapper> friend struct tablet::NumTypeRowOps;
668 FRIEND_TEST(client::ClientTest, TestProjectionPredicatesFuzz);
669 FRIEND_TEST(KeyUtilTest, TestIncrementInt128PrimaryKey);
670 FRIEND_TEST(PartitionPrunerTest, TestIntPartialPrimaryKeyRangePruning);
671 FRIEND_TEST(PartitionPrunerTest, TestPartialPrimaryKeyRangePruning);
672 FRIEND_TEST(PartitionPrunerTest, TestPrimaryKeyRangePruning);
673 FRIEND_TEST(PartitionPrunerTest, TestHashSchemasPerRangeWithPartialPrimaryKeyRangePruning);
674 FRIEND_TEST(RowOperationsTest, ProjectionTestWholeSchemaSpecified);
675 FRIEND_TEST(RowOperationsTest, TestProjectUpdates);
676 FRIEND_TEST(RowOperationsTest, TestProjectDeletes);
677
678 template<typename T>
679 Status Set(const Slice& col_name, const typename T::cpp_type& val,
680 bool owned = false);
681
682 template<typename T>
683 Status Set(int col_idx, const typename T::cpp_type& val,
684 bool owned = false);
685
686 // Runtime version of the generic setter.
687 Status Set(int32_t column_idx, const uint8_t* val);
688
689 template<typename T>
690 Status Get(const Slice& col_name, typename T::cpp_type* val) const;
691
692 template<typename T>
693 Status Get(int col_idx, typename T::cpp_type* val) const;
694
695 template<typename T>
696 Status SetSliceCopy(const Slice& col_name, const Slice& val);
697
698 template<typename T>
699 Status SetSliceCopy(int col_idx, const Slice& val);
700
701 // If the given column is a variable length column whose memory is owned by this instance,
702 // deallocates the value.
703 // NOTE: Does not mutate the isset bitmap.
704 // REQUIRES: col_idx must be a variable length column.
705 void DeallocateStringIfSet(int col_idx, const ColumnSchema& col);
706
707 // Deallocate any string/binary values whose memory is managed by this object.
708 void DeallocateOwnedStrings();
709
710 const Schema* schema_;
711
712 // 1-bit set for any field which has been explicitly set. This is distinct
713 // from NULL -- an "unset" field will take the server-side default on insert,
714 // whereas a field explicitly set to NULL will override the default.
715 uint8_t* isset_bitmap_;
716
717 // 1-bit set for any variable length columns whose memory is managed by this instance.
718 // These strings need to be deallocated whenever the value is reset,
719 // or when the instance is destructed.
720 uint8_t* owned_strings_bitmap_;
721
722 // The normal "contiguous row" format row data. Any column whose data is unset
723 // or NULL can have undefined bytes.
724 uint8_t* row_data_;
725};
726
727} // namespace kudu
728#endif /* KUDU_COMMON_PARTIAL_ROW_H */
A row which may only contain values for a subset of the columns.
Definition partial_row.h:72
Status GetDate(const Slice &col_name, int32_t *days_since_unix_epoch) const WARN_UNUSED_RESULT
Status SetInt32(const Slice &col_name, int32_t val) WARN_UNUSED_RESULT
Status GetString(const Slice &col_name, Slice *val) const WARN_UNUSED_RESULT
Status SetString(int col_idx, const Slice &val) WARN_UNUSED_RESULT
Status SetUnixTimeMicros(const Slice &col_name, int64_t micros_since_utc_epoch) WARN_UNUSED_RESULT
const Schema * schema() const
Definition partial_row.h:652
std::string ToString() const
Status GetFloat(int col_idx, float *val) const WARN_UNUSED_RESULT
Status SetBinaryCopy(int col_idx, const Slice &val) WARN_UNUSED_RESULT
Status SetDate(int col_idx, int32_t days_since_unix_epoch) WARN_UNUSED_RESULT
Status GetBinary(int col_idx, Slice *val) const WARN_UNUSED_RESULT
Status SetStringNoCopy(const Slice &col_name, const Slice &val) WARN_UNUSED_RESULT
bool IsNull(int col_idx) const
Status SetSerial(const Slice &col_name, uint64_t val) WARN_UNUSED_RESULT
Status GetInt8(const Slice &col_name, int8_t *val) const WARN_UNUSED_RESULT
bool IsKeySet() const
Status SetInt16(const Slice &col_name, int16_t val) WARN_UNUSED_RESULT
Status GetDouble(int col_idx, double *val) const WARN_UNUSED_RESULT
Status EncodeRowKey(std::string *encoded_key) const
bool IsNonUniqueKeySet() const
Status GetUnixTimeMicros(const Slice &col_name, int64_t *micros_since_utc_epoch) const WARN_UNUSED_RESULT
Status GetInt16(const Slice &col_name, int16_t *val) const WARN_UNUSED_RESULT
Status GetDouble(const Slice &col_name, double *val) const WARN_UNUSED_RESULT
Status SetVarchar(int col_idx, const Slice &val) WARN_UNUSED_RESULT
Status SetInt64(int col_idx, int64_t val) WARN_UNUSED_RESULT
Status SetFloat(const Slice &col_name, float val) WARN_UNUSED_RESULT
Status SetBinaryNoCopy(int col_idx, const Slice &val) WARN_UNUSED_RESULT
Status GetString(int col_idx, Slice *val) const WARN_UNUSED_RESULT
Status SetUnixTimeMicros(int col_idx, int64_t micros_since_utc_epoch) WARN_UNUSED_RESULT
std::string ToEncodedRowKeyOrDie() const
bool IsColumnSet(int col_idx) const
Status SetSerial(int col_idx, uint64_t val) WARN_UNUSED_RESULT
bool IsAutoIncrementingColumnSet() const
Status SetBinaryNoCopy(const Slice &col_name, const Slice &val) WARN_UNUSED_RESULT
Status SetDouble(int col_idx, double val) WARN_UNUSED_RESULT
Status GetBool(const Slice &col_name, bool *val) const WARN_UNUSED_RESULT
Status SetInt8(const Slice &col_name, int8_t val) WARN_UNUSED_RESULT
Status SetBool(int col_idx, bool val) WARN_UNUSED_RESULT
Status GetSerial(int col_idx, uint64_t *val) const WARN_UNUSED_RESULT
Status GetInt32(int col_idx, int32_t *val) const WARN_UNUSED_RESULT
Status SetString(const Slice &col_name, const Slice &val) WARN_UNUSED_RESULT
Status Unset(int col_idx) WARN_UNUSED_RESULT
Status GetInt16(int col_idx, int16_t *val) const WARN_UNUSED_RESULT
bool IsNull(const Slice &col_name) const
Status GetVarchar(int col_idx, Slice *val) const WARN_UNUSED_RESULT
Status GetInt32(const Slice &col_name, int32_t *val) const WARN_UNUSED_RESULT
Status GetSerial(const Slice &col_name, uint64_t *val) const WARN_UNUSED_RESULT
Status GetFloat(const Slice &col_name, float *val) const WARN_UNUSED_RESULT
Status SetStringCopy(int col_idx, const Slice &val) WARN_UNUSED_RESULT
Status GetInt64(int col_idx, int64_t *val) const WARN_UNUSED_RESULT
KuduPartialRow(const Schema *schema)
Status GetBinary(const Slice &col_name, Slice *val) const WARN_UNUSED_RESULT
Status SetBinary(int col_idx, const Slice &val) WARN_UNUSED_RESULT
bool IsColumnSet(const Slice &col_name) const
Status SetStringCopy(const Slice &col_name, const Slice &val) WARN_UNUSED_RESULT
Status GetUnixTimeMicros(int col_idx, int64_t *micros_since_utc_epoch) const WARN_UNUSED_RESULT
KuduPartialRow(const KuduPartialRow &other)
Status SetVarcharNoCopyUnsafe(const Slice &col_name, const Slice &val) WARN_UNUSED_RESULT
Status SetDouble(const Slice &col_name, double val) WARN_UNUSED_RESULT
Status SetInt64(const Slice &col_name, int64_t val) WARN_UNUSED_RESULT
Status SetNull(int col_idx) WARN_UNUSED_RESULT
Status SetInt32(int col_idx, int32_t val) WARN_UNUSED_RESULT
Status SetDate(const Slice &col_name, int32_t days_since_unix_epoch) WARN_UNUSED_RESULT
Status SetBinaryCopy(const Slice &col_name, const Slice &val) WARN_UNUSED_RESULT
Status SetFloat(int col_idx, float val) WARN_UNUSED_RESULT
Status SetVarchar(const Slice &col_name, const Slice &val) WARN_UNUSED_RESULT
Status GetVarchar(const Slice &col_name, Slice *val) const WARN_UNUSED_RESULT
Status GetInt8(int col_idx, int8_t *val) const WARN_UNUSED_RESULT
Status SetInt16(int col_idx, int16_t val) WARN_UNUSED_RESULT
Status Unset(const Slice &col_name) WARN_UNUSED_RESULT
Status SetBinary(const Slice &col_name, const Slice &val) WARN_UNUSED_RESULT
Status GetInt64(const Slice &col_name, int64_t *val) const WARN_UNUSED_RESULT
Status SetStringNoCopy(int col_idx, const Slice &val) WARN_UNUSED_RESULT
bool AllColumnsSet() const
Status SetBool(const Slice &col_name, bool val) WARN_UNUSED_RESULT
Status SetNull(const Slice &col_name) WARN_UNUSED_RESULT
Status SetVarcharNoCopyUnsafe(int col_idx, const Slice &val) WARN_UNUSED_RESULT
KuduPartialRow & operator=(KuduPartialRow other)
Status GetDate(int col_idx, int32_t *days_since_unix_epoch) const WARN_UNUSED_RESULT
Status SetInt8(int col_idx, int8_t val) WARN_UNUSED_RESULT
Status GetBool(int col_idx, bool *val) const WARN_UNUSED_RESULT