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 
273  bool Equals(const KuduColumnSchema& other) const
274  ATTRIBUTE_DEPRECATED("use operator==(const KuduColumnSchema&) instead");
275 
282  bool operator==(const KuduColumnSchema& rhs) const;
283 
290  bool operator!=(const KuduColumnSchema& rhs) const;
291 
298  const std::string& name() const;
299 
301  DataType type() const;
302 
304  bool is_nullable() const;
306 
308  KuduColumnTypeAttributes type_attributes() const;
309 
313  const std::string& comment() const;
314 
315  private:
316  friend class KuduColumnSpec;
317  friend class KuduSchema;
318  friend class KuduSchemaBuilder;
319  // KuduTableAlterer::Data needs to be a friend. Friending the parent class
320  // is transitive to nested classes. See https://s.apache.org/inner-class-friends
321  friend class KuduTableAlterer;
322 
323 #ifdef KUDU_HEADERS_NO_STUBS
324  FRIEND_TEST(KuduColumnSchemaTest, TestEquals);
325 #endif
326 
328 
329 #if defined(__clang__) || \
330  (defined(__GNUC__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40600)
331 #pragma GCC diagnostic push
332 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
333 #endif
336  const std::string &name,
337  DataType type,
338  bool is_nullable = false,
339  const void* default_value = NULL, //NOLINT(modernize-use-nullptr)
340  const KuduColumnStorageAttributes& storage_attributes = KuduColumnStorageAttributes(),
341  const KuduColumnTypeAttributes& type_attributes = KuduColumnTypeAttributes(),
342  const std::string& comment = "");
343 #if defined(__clang__) || \
344  (defined(__GNUC__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40600)
345 #pragma GCC diagnostic pop
346 #endif
347 
348  // Owned.
349  ColumnSchema* col_;
350 };
351 
360 class KUDU_EXPORT KuduColumnSpec {
361  public:
374 
381 
390 
410  KuduColumnSpec* BlockSize(int32_t block_size);
411 
413 
430  KuduColumnSpec* Precision(int8_t precision);
431 
447  KuduColumnSpec* Scale(int8_t scale);
449 
451 
465  KuduColumnSpec* Length(uint16_t length);
467 
469 
481 
488 
495 
505 
507 
516 
522  KuduColumnSpec* RenameTo(const std::string& new_name);
524 
530  KuduColumnSpec* Comment(const std::string& comment);
531 
532  private:
533  class KUDU_NO_EXPORT Data;
534 
535  friend class KuduSchemaBuilder;
536  friend class KuduTableAlterer;
537 
538  // This class should always be owned and deleted by one of its friends,
539  // not the user.
540  ~KuduColumnSpec();
541 
542  explicit KuduColumnSpec(const std::string& col_name);
543 
544  Status ToColumnSchema(KuduColumnSchema* col) const;
545 
546  Status ToColumnSchemaDelta(ColumnSchemaDelta* col_delta) const;
547 
548  Slice DefaultValueAsSlice() const;
549 
550  // Owned.
551  Data* data_;
552 };
553 
575 class KUDU_EXPORT KuduSchemaBuilder {
576  public:
579 
586  KuduColumnSpec* AddColumn(const std::string& name);
587 
595  KuduSchemaBuilder* SetPrimaryKey(const std::vector<std::string>& key_col_names);
596 
607 
608  private:
609  class KUDU_NO_EXPORT Data;
610 
611  // Owned.
612  Data* data_;
613 };
614 
616 class KUDU_EXPORT KuduSchema {
617  public:
618  KuduSchema();
619 
624  KuduSchema(const KuduSchema& other);
625  ~KuduSchema();
626 
629 
634 
637  void CopyFrom(const KuduSchema& other);
639 
649  Status Reset(const std::vector<KuduColumnSchema>& columns, int key_columns)
650  ATTRIBUTE_DEPRECATED("this method will be removed in a future release")
651  WARN_UNUSED_RESULT;
652 
661  bool Equals(const KuduSchema& other) const
662  ATTRIBUTE_DEPRECATED("use operator==(const KuduSchema&) instead");
663 
670  bool operator==(const KuduSchema& rhs) const;
671 
678  bool operator!=(const KuduSchema& rhs) const;
679 
683  KuduColumnSchema Column(size_t idx) const;
684 
690  bool HasColumn(const std::string& col_name, KuduColumnSchema* col_schema) const;
691 
693  size_t num_columns() const;
694 
703  void GetPrimaryKeyColumnIndexes(std::vector<int>* indexes) const;
704 
712  KuduPartialRow* NewRow() const;
713 
717  std::string ToString() const;
718 
720 
728  static KuduSchema FromSchema(const Schema& schema) KUDU_NO_EXPORT;
729 
737  static Schema ToSchema(const KuduSchema& kudu_schema) KUDU_NO_EXPORT;
738 
740 
741  private:
742  friend class ClientTest;
743  friend class KuduClient;
744  friend class KuduScanner;
745  friend class KuduScanToken;
746  friend class KuduScanTokenBuilder;
747  friend class KuduSchemaBuilder;
748  friend class KuduTable;
749  friend class KuduTableCreator;
750  friend class KuduWriteOperation;
751  friend class ScanConfiguration;
752  friend class internal::GetTableSchemaRpc;
753  friend class internal::LookupRpc;
754  friend class internal::MetaCache;
755  friend class internal::MetaCacheEntry;
756  friend class internal::WriteRpc;
757  friend class tools::RemoteKsckCluster;
758  friend class tools::ReplicaDumper;
759 
760  // For use by KuduSchema::FromSchema.
761  explicit KuduSchema(const Schema& schema);
762 #if __cplusplus >= 201103
763  explicit KuduSchema(Schema&& schema);
764 #endif
765 
766  // Private since we don't want users to rely on the first N columns
767  // being the keys.
768  size_t num_key_columns() const;
769 
770  // Owned.
771  Schema* schema_;
772 };
773 
774 } // namespace client
775 } // namespace kudu
776 #endif // KUDU_CLIENT_SCHEMA_H
A row which may only contain values for a subset of the columns.
Definition: partial_row.h:72
A wrapper around externally allocated data.
Definition: slice.h:51
A representation of an operation's outcome.
Definition: status.h:165
A handle for a connection to a cluster.
Definition: client.h:615
Representation of the column schema.
Definition: schema.h:214
void CopyFrom(const KuduColumnSchema &other)
KuduColumnSchema & operator=(const KuduColumnSchema &other)
DataType
Supported data types for columns.
Definition: schema.h:217
static Status StringToDataType(const std::string &type_str, DataType *type)
static std::string DataTypeToString(DataType type)
KuduColumnSchema(const KuduColumnSchema &other)
Builder API for specifying or altering a column within a table schema.
Definition: schema.h:360
KuduColumnSpec * PrimaryKey()
KuduColumnSpec * Type(KuduColumnSchema::DataType type)
KuduColumnSpec * BlockSize(int32_t block_size)
KuduColumnSpec * Default(KuduValue *value)
KuduColumnSpec * Nullable()
KuduColumnSpec * RenameTo(const std::string &new_name)
KuduColumnSpec * Scale(int8_t scale)
KuduColumnSpec * Comment(const std::string &comment)
KuduColumnSpec * Compression(KuduColumnStorageAttributes::CompressionType compression)
KuduColumnSpec * RemoveDefault()
KuduColumnSpec * Encoding(KuduColumnStorageAttributes::EncodingType encoding)
KuduColumnSpec * Length(uint16_t length)
KuduColumnSpec * Precision(int8_t precision)
KuduColumnSpec * NotNull()
Representation of column storage attributes.
Definition: schema.h:129
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
const CompressionType compression() const
Definition: schema.h:182
static Status StringToEncodingType(const std::string &encoding, EncodingType *type)
const EncodingType encoding() const
Definition: schema.h:177
EncodingType
Column encoding types.
Definition: schema.h:132
static Status StringToCompressionType(const std::string &compression, CompressionType *type)
CompressionType
Column compression types.
Definition: schema.h:146
Representation of column type attributes.
Definition: schema.h:67
void CopyFrom(const KuduColumnTypeAttributes &other)
KuduColumnTypeAttributes(int8_t precision, int8_t scale)
KuduColumnTypeAttributes & operator=(const KuduColumnTypeAttributes &other)
KuduColumnTypeAttributes(const KuduColumnTypeAttributes &other)
Builds scan tokens for a table.
Definition: client.h:3013
A scan descriptor limited to a single physical contiguous location.
Definition: client.h:2952
This class is a representation of a single scan.
Definition: client.h:2456
Builder API for constructing a KuduSchema object.
Definition: schema.h:575
KuduColumnSpec * AddColumn(const std::string &name)
KuduSchemaBuilder * SetPrimaryKey(const std::vector< std::string > &key_col_names)
Status Build(KuduSchema *schema)
A representation of a table's schema.
Definition: schema.h:616
Status Reset(const std::vector< KuduColumnSchema > &columns, int key_columns) WARN_UNUSED_RESULT
KuduSchema(const KuduSchema &other)
KuduSchema & operator=(const KuduSchema &other)
void CopyFrom(const KuduSchema &other)
Alters an existing table based on the provided steps.
Definition: client.h:1666
A helper class to create a new table with the desired options.
Definition: client.h:1084
A representation of a table on a particular cluster.
Definition: client.h:1389
A constant cell value with a specific type.
Definition: value.h:35
A single-row write operation to be sent to a Kudu table.
Definition: write_op.h:64