GPUdb C++ API  Version 5.2.0.0
GenericRecord.hpp
Go to the documentation of this file.
1 #ifndef __GPUDB__GENERICRECORD_HPP__
2 #define __GPUDB__GENERICRECORD_HPP__
3 
4 #include "gpudb/Type.hpp"
5 
6 #include <avro/Schema.hh>
7 #include <avro/Specific.hh>
8 
9 namespace gpudb
10 {
12  {
13  friend class GPUdb;
14 
15  friend struct ::avro::codec_traits<GenericRecord>;
16 
17  public:
18  GenericRecord(const Type& type);
19  const Type& getType() const;
20  const ::avro::ValidSchema& getSchema() const;
21 
22  template<typename T> T& value(const size_t index)
23  {
24  return *boost::any_cast<T>(&m_values[index]);
25  }
26 
27  template<typename T> const T& value(const size_t index) const
28  {
29  return *boost::any_cast<T>(&m_values[index]);
30  }
31 
32  template<typename T> T& value(const std::string& name)
33  {
34  return *boost::any_cast<T>(&m_values[m_type.getColumnIndex(name)]);
35  }
36 
37  template<typename T> const T& value(const std::string& name) const
38  {
39  return *boost::any_cast<T>(&m_values[m_type.getColumnIndex(name)]);
40  }
41 
42  std::vector<uint8_t>& asBytes(const size_t index);
43  const std::vector<uint8_t>& asBytes(const size_t index) const;
44  std::vector<uint8_t>& asBytes(const std::string& name);
45  const std::vector<uint8_t>& asBytes(const std::string& name) const;
46 
47  boost::optional<std::vector<uint8_t> >& asNullableBytes(const size_t index);
48  const boost::optional<std::vector<uint8_t> >& asNullableBytes(const size_t index) const;
49  boost::optional<std::vector<uint8_t> >& asNullableBytes(const std::string& name);
50  const boost::optional<std::vector<uint8_t> >& asNullableBytes(const std::string& name) const;
51 
52  double& asDouble(const size_t index);
53  const double& asDouble(const size_t index) const;
54  double& asDouble(const std::string& name);
55  const double& asDouble(const std::string& name) const;
56 
57  boost::optional<double>& asNullableDouble(const size_t index);
58  const boost::optional<double>& asNullableDouble(const size_t index) const;
59  boost::optional<double>& asNullableDouble(const std::string& name);
60  const boost::optional<double>& asNullableDouble(const std::string& name) const;
61 
62  float& asFloat(const size_t index);
63  const float& asFloat(const size_t index) const;
64  float& asFloat(const std::string& name);
65  const float& asFloat(const std::string& name) const;
66 
67  boost::optional<float>& asNullableFloat(const size_t index);
68  const boost::optional<float>& asNullableFloat(const size_t index) const;
69  boost::optional<float>& asNullableFloat(const std::string& name);
70  const boost::optional<float>& asNullableFloat(const std::string& name) const;
71 
72  int32_t& asInt(const size_t index);
73  const int32_t& asInt(const size_t index) const;
74  int32_t& asInt(const std::string& name);
75  const int32_t& asInt(const std::string& name) const;
76 
77  boost::optional<int32_t>& asNullableInt(const size_t index);
78  const boost::optional<int32_t>& asNullableInt(const size_t index) const;
79  boost::optional<int32_t>& asNullableInt(const std::string& name);
80  const boost::optional<int32_t>& asNullableInt(const std::string& name) const;
81 
82  int64_t& asLong(const size_t index);
83  const int64_t& asLong(const size_t index) const;
84  int64_t& asLong(const std::string& name);
85  const int64_t& asLong(const std::string& name) const;
86 
87  boost::optional<int64_t>& asNullableLong(const size_t index);
88  const boost::optional<int64_t>& asNullableLong(const size_t index) const;
89  boost::optional<int64_t>& asNullableLong(const std::string& name);
90  const boost::optional<int64_t>& asNullableLong(const std::string& name) const;
91 
92  std::string& asString(const size_t index);
93  const std::string& asString(const size_t index) const;
94  std::string& asString(const std::string& name);
95  const std::string& asString(const std::string& name) const;
96 
97  boost::optional<std::string>& asNullableString(const size_t index);
98  const boost::optional<std::string>& asNullableString(const size_t index) const;
99  boost::optional<std::string>& asNullableString(const std::string& name);
100  const boost::optional<std::string>& asNullableString(const std::string& name) const;
101 
102  private:
103  static void transpose(const std::string& schemaString, const std::vector<uint8_t>& encodedData, std::vector<GenericRecord>& data);
104 
105  Type m_type;
106  std::vector<boost::any> m_values;
107 
108  GenericRecord(const std::vector<std::pair<Type::Column::ColumnType, bool> >& columnTypes);
109  void initializeColumn(const Type::Column::ColumnType type, const bool isNullable);
110  };
111 
113 }
114 
115 namespace avro
116 {
117  template<> struct codec_traits<gpudb::GenericRecord>
118  {
119  static void encode(Encoder& e, const gpudb::GenericRecord& v);
120  static void decode(Decoder& d, gpudb::GenericRecord& v);
121  };
122 }
123 
124 #endif
GenericRecord(const Type &type)
T & value(const size_t index)
boost::optional< std::vector< uint8_t > > & asNullableBytes(const size_t index)
int32_t & asInt(const size_t index)
double & asDouble(const size_t index)
boost::optional< std::string > & asNullableString(const size_t index)
const T & value(const size_t index) const
size_t getColumnIndex(const std::string &name) const
boost::optional< float > & asNullableFloat(const size_t index)
GenericRecord DynamicTableRecord
boost::optional< int32_t > & asNullableInt(const size_t index)
int64_t & asLong(const size_t index)
std::string & asString(const size_t index)
boost::optional< double > & asNullableDouble(const size_t index)
const Type & getType() const
const T & value(const std::string &name) const
const ::avro::ValidSchema & getSchema() const
T & value(const std::string &name)
boost::optional< int64_t > & asNullableLong(const size_t index)
std::vector< uint8_t > & asBytes(const size_t index)
float & asFloat(const size_t index)