Kudu C++ client API
schema.h
1 //
2 // Licensed to the Apache Software Foundation (ASF) under one
3 // or more contributor license agreements. See the NOTICE file
4 // distributed with this work for additional information
5 // regarding copyright ownership. The ASF licenses this file
6 // to you under the Apache License, Version 2.0 (the
7 // "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 //
10 // http://www.apache.org/licenses/LICENSE-2.0
11 //
12 // Unless required by applicable law or agreed to in writing,
13 // software distributed under the License is distributed on an
14 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 // KIND, either express or implied. See the License for the
16 // specific language governing permissions and limitations
17 // under the License.
18 #ifndef KUDU_CLIENT_SCHEMA_H
19 #define KUDU_CLIENT_SCHEMA_H
20 
21 // NOTE: using stdint.h instead of cstdint because this file is supposed
22 // to be processed by a compiler lacking C++11 support.
23 #include <stdint.h>
24 
25 #include <cstddef>
26 #include <string>
27 #include <vector>
28 
29 #ifdef KUDU_HEADERS_NO_STUBS
30 #include <gtest/gtest_prod.h>
31 
32 #include "kudu/gutil/port.h"
33 #else
34 #include "kudu/client/stubs.h"
35 #endif
36 
37 #include "kudu/util/kudu_export.h"
38 #include "kudu/util/status.h"
39 
40 namespace kudu {
41 
42 class ColumnSchema;
43 class KuduPartialRow;
44 class Schema;
45 class Slice;
46 struct ColumnSchemaDelta;
47 
48 namespace tools {
49 class RemoteKsckCluster;
50 class ReplicaDumper;
51 }
52 
53 namespace client {
54 
55 namespace internal {
56 class GetTableSchemaRpc;
57 class LookupRpc;
58 class MetaCache;
59 class MetaCacheEntry;
60 class WriteRpc;
61 } // namespace internal
62 
63 class KuduSchema;
64 class KuduValue;
65 
67 class KUDU_EXPORT KuduColumnTypeAttributes {
68  public:
70 
76 
83  KuduColumnTypeAttributes(int8_t precision, int8_t scale);
84 
89  explicit KuduColumnTypeAttributes(uint16_t length);
90 
92 
95 
100 
103  void CopyFrom(const KuduColumnTypeAttributes& other);
105 
107  int8_t precision() const;
108 
110  int8_t scale() const;
111 
113  uint16_t length() const;
114 
115  private:
116  friend class KuduColumnSchema;
117  friend class KuduColumnSpec;
118  friend class KuduSchema;
119 
120  KuduColumnTypeAttributes(int8_t precision, int8_t scale, uint16_t length);
121 
122  class KUDU_NO_EXPORT Data;
123 
124  // Owned.
125  Data* data_;
126 };
127 
129 class KUDU_EXPORT KuduColumnStorageAttributes {
130  public:
133  AUTO_ENCODING = 0,
134  PLAIN_ENCODING = 1,
135  PREFIX_ENCODING = 2,
136  RLE = 4,
137  DICT_ENCODING = 5,
138  BIT_SHUFFLE = 6,
139 
142  GROUP_VARINT = 3
143  };
144 
147  DEFAULT_COMPRESSION = 0,
148  NO_COMPRESSION = 1,
149  SNAPPY = 2,
150  LZ4 = 3,
151  ZLIB = 4,
152  };
153 
154 
167  EncodingType encoding = AUTO_ENCODING,
168  CompressionType compression = DEFAULT_COMPRESSION,
169  int32_t block_size = 0)
170  ATTRIBUTE_DEPRECATED("this constructor will be private in a future release")
171  : encoding_(encoding),
172  compression_(compression),
173  block_size_(block_size) {
174  }
175 
177  const EncodingType encoding() const {
178  return encoding_;
179  }
180 
182  const CompressionType compression() const {
183  return compression_;
184  }
185 
187  std::string ToString() const;
188 
195  static Status StringToEncodingType(const std::string& encoding,
196  EncodingType* type);
197 
204  static Status StringToCompressionType(const std::string& compression,
205  CompressionType* type);
206 
207  private:
208  EncodingType encoding_;
209  CompressionType compression_;
210  int32_t block_size_;
211 };
212 
214 class KUDU_EXPORT KuduColumnSchema {
215  public:
217  enum DataType {
218  INT8 = 0,
219  INT16 = 1,
220  INT32 = 2,
221  INT64 = 3,
222  STRING = 4,
223  BOOL = 5,
224  FLOAT = 6,
225  DOUBLE = 7,
226  BINARY = 8,
227  UNIXTIME_MICROS = 9,
228  DECIMAL = 10,
229  VARCHAR = 11,
230  TIMESTAMP = UNIXTIME_MICROS,
231  DATE = 12
232  };
233 
237  static std::string DataTypeToString(DataType type);
238 
244  static Status StringToDataType(const std::string& type_str, DataType* type);
245 
251  ~KuduColumnSchema();
252 
259 
264  void CopyFrom(const KuduColumnSchema& other);
265 
271  bool Equals(const KuduColumnSchema& other) const;
272 
279  const std::string& name() const;
280 
282  DataType type() const;
283 
285  bool is_nullable() const;
287 
290 
294  const std::string& comment() const;
295 
296  private:
297  friend class KuduColumnSpec;
298  friend class KuduSchema;
299  friend class KuduSchemaBuilder;
300  // KuduTableAlterer::Data needs to be a friend. Friending the parent class
301  // is transitive to nested classes. See https://s.apache.org/inner-class-friends
302  friend class KuduTableAlterer;
303 
304 #ifdef KUDU_HEADERS_NO_STUBS
305  FRIEND_TEST(KuduColumnSchemaTest, TestEquals);
306 #endif
307 
309 
310 #if defined(__clang__) || \
311  (defined(__GNUC__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40600)
312 #pragma GCC diagnostic push
313 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
314 #endif
317  const std::string &name,
318  DataType type,
319  bool is_nullable = false,
320  const void* default_value = NULL, //NOLINT(modernize-use-nullptr)
321  const KuduColumnStorageAttributes& storage_attributes = KuduColumnStorageAttributes(),
322  const KuduColumnTypeAttributes& type_attributes = KuduColumnTypeAttributes(),
323  const std::string& comment = "");
324 #if defined(__clang__) || \
325  (defined(__GNUC__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40600)
326 #pragma GCC diagnostic pop
327 #endif
328 
329  // Owned.
330  ColumnSchema* col_;
331 };
332 
341 class KUDU_EXPORT KuduColumnSpec {
342  public:
355 
362 
371 
391  KuduColumnSpec* BlockSize(int32_t block_size);
392 
394 
411  KuduColumnSpec* Precision(int8_t precision);
412 
428  KuduColumnSpec* Scale(int8_t scale);
430 
432 
446  KuduColumnSpec* Length(uint16_t length);
448 
450 
462 
469 
476 
486 
488 
497 
503  KuduColumnSpec* RenameTo(const std::string& new_name);
505 
511  KuduColumnSpec* Comment(const std::string& comment);
512 
513  private:
514  class KUDU_NO_EXPORT Data;
515 
516  friend class KuduSchemaBuilder;
517  friend class KuduTableAlterer;
518 
519  // This class should always be owned and deleted by one of its friends,
520  // not the user.
521  ~KuduColumnSpec();
522 
523  explicit KuduColumnSpec(const std::string& col_name);
524 
525  Status ToColumnSchema(KuduColumnSchema* col) const;
526 
527  Status ToColumnSchemaDelta(ColumnSchemaDelta* col_delta) const;
528 
529  Slice DefaultValueAsSlice() const;
530 
531  // Owned.
532  Data* data_;
533 };
534 
556 class KUDU_EXPORT KuduSchemaBuilder {
557  public:
560 
567  KuduColumnSpec* AddColumn(const std::string& name);
568 
576  KuduSchemaBuilder* SetPrimaryKey(const std::vector<std::string>& key_col_names);
577 
588 
589  private:
590  class KUDU_NO_EXPORT Data;
591 
592  // Owned.
593  Data* data_;
594 };
595 
597 class KUDU_EXPORT KuduSchema {
598  public:
599  KuduSchema();
600 
605  KuduSchema(const KuduSchema& other);
606  ~KuduSchema();
607 
610 
615 
618  void CopyFrom(const KuduSchema& other);
620 
630  Status Reset(const std::vector<KuduColumnSchema>& columns, int key_columns)
631  ATTRIBUTE_DEPRECATED("this method will be removed in a future release")
632  WARN_UNUSED_RESULT;
633 
640  bool Equals(const KuduSchema& other) const;
641 
645  KuduColumnSchema Column(size_t idx) const;
646 
652  bool HasColumn(const std::string& col_name, KuduColumnSchema* col_schema) const;
653 
655  size_t num_columns() const;
656 
665  void GetPrimaryKeyColumnIndexes(std::vector<int>* indexes) const;
666 
674  KuduPartialRow* NewRow() const;
675 
679  std::string ToString() const;
680 
682 
690  static KuduSchema FromSchema(const Schema& schema) KUDU_NO_EXPORT;
691 
699  static Schema ToSchema(const KuduSchema& kudu_schema) KUDU_NO_EXPORT;
700 
702 
703  private:
704  friend class ClientTest;
705  friend class KuduClient;
706  friend class KuduScanner;
707  friend class KuduScanToken;
708  friend class KuduScanTokenBuilder;
709  friend class KuduSchemaBuilder;
710  friend class KuduTable;
711  friend class KuduTableCreator;
712  friend class KuduWriteOperation;
713  friend class ScanConfiguration;
714  friend class internal::GetTableSchemaRpc;
715  friend class internal::LookupRpc;
716  friend class internal::MetaCache;
717  friend class internal::MetaCacheEntry;
718  friend class internal::WriteRpc;
719  friend class tools::RemoteKsckCluster;
720  friend class tools::ReplicaDumper;
721 
722  // For use by KuduSchema::FromSchema.
723  explicit KuduSchema(const Schema& schema);
724 #if __cplusplus >= 201103
725  explicit KuduSchema(Schema&& schema);
726 #endif
727 
728  // Private since we don't want users to rely on the first N columns
729  // being the keys.
730  size_t num_key_columns() const;
731 
732  // Owned.
733  Schema* schema_;
734 };
735 
736 } // namespace client
737 } // namespace kudu
738 #endif // KUDU_CLIENT_SCHEMA_H
kudu::client::KuduSchemaBuilder::SetPrimaryKey
KuduSchemaBuilder * SetPrimaryKey(const std::vector< std::string > &key_col_names)
kudu::client::KuduColumnTypeAttributes::precision
int8_t precision() const
kudu::client::KuduColumnTypeAttributes
Representation of column type attributes.
Definition: schema.h:67
kudu::client::KuduColumnSchema::DataType
DataType
Supported data types for columns.
Definition: schema.h:217
kudu::client::KuduColumnSpec::Type
KuduColumnSpec * Type(KuduColumnSchema::DataType type)
kudu::client::KuduColumnSchema::KuduColumnSchema
KuduColumnSchema(const KuduColumnSchema &other)
kudu::client::KuduColumnSpec::Scale
KuduColumnSpec * Scale(int8_t scale)
kudu::client::KuduColumnSpec::Nullable
KuduColumnSpec * Nullable()
kudu::client::KuduSchema::Reset
Status Reset(const std::vector< KuduColumnSchema > &columns, int key_columns) WARN_UNUSED_RESULT
kudu::client::KuduColumnSpec::Compression
KuduColumnSpec * Compression(KuduColumnStorageAttributes::CompressionType compression)
kudu::client::KuduColumnStorageAttributes::StringToCompressionType
static Status StringToCompressionType(const std::string &compression, CompressionType *type)
kudu::client::KuduScanner
This class is a representation of a single scan.
Definition: client.h:2051
kudu::client::KuduValue
A constant cell value with a specific type.
Definition: value.h:35
kudu::client::KuduColumnSchema::StringToDataType
static Status StringToDataType(const std::string &type_str, DataType *type)
kudu::client::KuduColumnSchema::is_nullable
bool is_nullable() const
KuduPartialRow
A row which may only contain values for a subset of the columns.
Definition: partial_row.h:72
kudu::client::KuduColumnSchema::DataTypeToString
static std::string DataTypeToString(DataType type)
kudu::client::KuduColumnStorageAttributes::EncodingType
EncodingType
Column encoding types.
Definition: schema.h:132
kudu::client::KuduSchemaBuilder::AddColumn
KuduColumnSpec * AddColumn(const std::string &name)
kudu::client::KuduColumnSchema::Equals
bool Equals(const KuduColumnSchema &other) const
kudu::client::KuduTableCreator
A helper class to create a new table with the desired options.
Definition: client.h:755
kudu::client::KuduColumnStorageAttributes::encoding
const EncodingType encoding() const
Definition: schema.h:177
kudu::client::KuduColumnSpec::NotNull
KuduColumnSpec * NotNull()
kudu::client::KuduSchema::CopyFrom
void CopyFrom(const KuduSchema &other)
kudu::client::KuduColumnSpec::Comment
KuduColumnSpec * Comment(const std::string &comment)
kudu::client::KuduColumnSpec
Builder API for specifying or altering a column within a table schema.
Definition: schema.h:341
kudu::client::KuduColumnTypeAttributes::KuduColumnTypeAttributes
KuduColumnTypeAttributes(const KuduColumnTypeAttributes &other)
kudu::client::KuduColumnStorageAttributes::KuduColumnStorageAttributes
KuduColumnStorageAttributes(EncodingType encoding=AUTO_ENCODING, CompressionType compression=DEFAULT_COMPRESSION, int32_t block_size=0) ATTRIBUTE_DEPRECATED("this const ructor will be private in a future release")
Definition: schema.h:166
kudu::client::KuduColumnTypeAttributes::operator=
KuduColumnTypeAttributes & operator=(const KuduColumnTypeAttributes &other)
kudu::client::KuduColumnTypeAttributes::CopyFrom
void CopyFrom(const KuduColumnTypeAttributes &other)
kudu::client::KuduColumnSchema::type_attributes
KuduColumnTypeAttributes type_attributes() const
kudu::client::KuduColumnStorageAttributes
Representation of column storage attributes.
Definition: schema.h:129
kudu::client::KuduColumnSpec::PrimaryKey
KuduColumnSpec * PrimaryKey()
kudu::client::KuduScanTokenBuilder
Builds scan tokens for a table.
Definition: client.h:2607
kudu::client::KuduColumnTypeAttributes::KuduColumnTypeAttributes
KuduColumnTypeAttributes(int8_t precision, int8_t scale)
kudu::client::KuduWriteOperation
A single-row write operation to be sent to a Kudu table.
Definition: write_op.h:64
kudu::client::KuduColumnSpec::Encoding
KuduColumnSpec * Encoding(KuduColumnStorageAttributes::EncodingType encoding)
kudu::client::KuduColumnSchema::name
const std::string & name() const
kudu::client::KuduSchema
A representation of a table's schema.
Definition: schema.h:597
kudu::client::KuduScanToken
A scan descriptor limited to a single physical contiguous location.
Definition: client.h:2547
kudu::Status
A representation of an operation's outcome.
Definition: status.h:165
kudu::client::KuduSchemaBuilder::Build
Status Build(KuduSchema *schema)
kudu::client::KuduColumnTypeAttributes::KuduColumnTypeAttributes
KuduColumnTypeAttributes(uint16_t length)
kudu::client::KuduTable
A representation of a table on a particular cluster.
Definition: client.h:1037
kudu::client::KuduColumnStorageAttributes::ToString
std::string ToString() const
kudu::client::KuduColumnSpec::Default
KuduColumnSpec * Default(KuduValue *value)
kudu::client::KuduColumnSpec::Length
KuduColumnSpec * Length(uint16_t length)
kudu::client::KuduColumnSpec::BlockSize
KuduColumnSpec * BlockSize(int32_t block_size)
kudu::client::KuduColumnSchema::type
DataType type() const
kudu::client::KuduColumnTypeAttributes::scale
int8_t scale() const
kudu::client::KuduColumnSchema::CopyFrom
void CopyFrom(const KuduColumnSchema &other)
kudu::client::KuduColumnSchema::operator=
KuduColumnSchema & operator=(const KuduColumnSchema &other)
kudu::Slice
A wrapper around externally allocated data.
Definition: slice.h:51
kudu::client::KuduColumnSchema::comment
const std::string & comment() const
kudu::client::KuduColumnSpec::Precision
KuduColumnSpec * Precision(int8_t precision)
kudu::client::KuduSchemaBuilder
Builder API for constructing a KuduSchema object.
Definition: schema.h:556
kudu::client::KuduSchema::KuduSchema
KuduSchema(const KuduSchema &other)
kudu::client::KuduColumnStorageAttributes::CompressionType
CompressionType
Column compression types.
Definition: schema.h:146
kudu::client::KuduColumnTypeAttributes::length
uint16_t length() const
kudu::client::KuduColumnSpec::RenameTo
KuduColumnSpec * RenameTo(const std::string &new_name)
kudu::client::KuduTableAlterer
Alters an existing table based on the provided steps.
Definition: client.h:1300
kudu::client::KuduColumnSpec::RemoveDefault
KuduColumnSpec * RemoveDefault()
kudu::client::KuduColumnSchema
Representation of the column schema.
Definition: schema.h:214
kudu::client::KuduColumnStorageAttributes::compression
const CompressionType compression() const
Definition: schema.h:182
status.h
kudu::client::KuduSchema::operator=
KuduSchema & operator=(const KuduSchema &other)
kudu::client::KuduColumnStorageAttributes::StringToEncodingType
static Status StringToEncodingType(const std::string &encoding, EncodingType *type)
kudu::client::KuduClient
A handle for a connection to a cluster.
Definition: client.h:332