GPUdb C++ API  Version 7.2.2.4
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 #include <boost/lexical_cast.hpp>
10 #if BOOST_VERSION >= 105600
11  #include <boost/core/demangle.hpp>
12 #else
13  #include <boost/units/detail/utility.hpp> // Old versions have demangle() here.
14  namespace boost { namespace core { using boost::units::detail::demangle; } }
15 #endif
16 
17 namespace gpudb
18 {
19  typedef boost::shared_ptr<Type> gpudb_type_ptr_t;
20 
21  template<typename T> std::string JsonStringFromVector(const std::vector<T>& vector);
22 
24  {
25  friend class GPUdb;
26 
27  friend struct ::avro::codec_traits<GenericRecord>;
28 
29  public:
31  GenericRecord(const Type& type);
32 
33  const Type& getType() const;
34  const ::avro::ValidSchema& getSchema() const;
35 
36  template<typename T> T& value(const size_t index)
37  {
38  T* o = boost::any_cast<T>(&m_values.at(index));
39  if (!o) throw std::runtime_error("Error converting GenericRecord column " + boost::lexical_cast<std::string>(index) + " to type " + boost::core::demangle(typeid(T).name() ));
40  return *o;
41  }
42 
43  template<typename T> const T& value(const size_t index) const
44  {
45  const T* o = boost::any_cast<T>(&m_values.at(index));
46  if (!o) throw std::runtime_error("Error converting GenericRecord column " + boost::lexical_cast<std::string>(index) + " to type " + boost::core::demangle(typeid(T).name() ));
47  return *o;
48  }
49 
50  template<typename T> T& value(const std::string& name)
51  {
52  T* o = boost::any_cast<T>(&m_values[m_type.getColumnIndex(name)]);
53  if (!o) throw std::runtime_error("Error converting GenericRecord column '" + name + "' to type " + boost::core::demangle(typeid(T).name() ));
54  return *o;
55  }
56 
57  template<typename T> const T& value(const std::string& name) const
58  {
59  const T* o = boost::any_cast<T>(&m_values[m_type.getColumnIndex(name)]);
60  if (!o) throw std::runtime_error("Error converting GenericRecord column '" + name + "' to type " + boost::core::demangle(typeid(T).name() ));
61  return *o;
62  }
63 
64  std::vector<uint8_t>& bytesValue(const size_t index);
65  const std::vector<uint8_t>& bytesValue(const size_t index) const;
66  std::vector<uint8_t>& bytesValue(const std::string& name);
67  const std::vector<uint8_t>& bytesValue(const std::string& name) const;
68 
69  double& doubleValue(const size_t index);
70  const double& doubleValue(const size_t index) const;
71  double& doubleValue(const std::string& name);
72  const double& doubleValue(const std::string& name) const;
73 
74  float& floatValue(const size_t index);
75  const float& floatValue(const size_t index) const;
76  float& floatValue(const std::string& name);
77  const float& floatValue(const std::string& name) const;
78 
79  int32_t& intValue(const size_t index);
80  const int32_t& intValue(const size_t index) const;
81  int32_t& intValue(const std::string& name);
82  const int32_t& intValue(const std::string& name) const;
83 
84  int64_t& longValue(const size_t index);
85  const int64_t& longValue(const size_t index) const;
86  int64_t& longValue(const std::string& name);
87  const int64_t& longValue(const std::string& name) const;
88 
89  std::string& stringValue(const size_t index);
90  const std::string& stringValue(const size_t index) const;
91  std::string& stringValue(const std::string& name);
92  const std::string& stringValue(const std::string& name) const;
93 
94  boost::optional<std::vector<uint8_t> >& nullableBytesValue(const size_t index);
95  const boost::optional<std::vector<uint8_t> >& nullableBytesValue(const size_t index) const;
96  boost::optional<std::vector<uint8_t> >& nullableBytesValue(const std::string& name);
97  const boost::optional<std::vector<uint8_t> >& nullableBytesValue(const std::string& name) const;
98 
99  boost::optional<double>& nullableDoubleValue(const size_t index);
100  const boost::optional<double>& nullableDoubleValue(const size_t index) const;
101  boost::optional<double>& nullableDoubleValue(const std::string& name);
102  const boost::optional<double>& nullableDoubleValue(const std::string& name) const;
103 
104  boost::optional<float>& nullableFloatValue(const size_t index);
105  const boost::optional<float>& nullableFloatValue(const size_t index) const;
106  boost::optional<float>& nullableFloatValue(const std::string& name);
107  const boost::optional<float>& nullableFloatValue(const std::string& name) const;
108 
109  boost::optional<int32_t>& nullableIntValue(const size_t index);
110  const boost::optional<int32_t>& nullableIntValue(const size_t index) const;
111  boost::optional<int32_t>& nullableIntValue(const std::string& name);
112  const boost::optional<int32_t>& nullableIntValue(const std::string& name) const;
113 
114  boost::optional<int64_t>& nullableLongValue(const size_t index);
115  const boost::optional<int64_t>& nullableLongValue(const size_t index) const;
116  boost::optional<int64_t>& nullableLongValue(const std::string& name);
117  const boost::optional<int64_t>& nullableLongValue(const std::string& name) const;
118 
119  boost::optional<std::string>& nullableStringValue(const size_t index);
120  const boost::optional<std::string>& nullableStringValue(const size_t index) const;
121  boost::optional<std::string>& nullableStringValue(const std::string& name);
122  const boost::optional<std::string>& nullableStringValue(const std::string& name) const;
123 
124  bool isNull(const size_t index) const;
125  bool isNull(const std::string& name) const;
126 
127  template<typename T> void getAsArray(const size_t index, std::vector<T>& result) const;
128  template<typename T> void getAsArray(const std::string& name, std::vector<T>& result) const;
129  template<typename T> std::vector<T> getAsArray(const size_t index) const;
130  template<typename T> std::vector<T> getAsArray(const std::string& name) const;
131 
132  void getAsBytes(const size_t index, std::vector<uint8_t>& result) const;
133  void getAsBytes(const std::string& name, std::vector<uint8_t>& result) const;
134  std::vector<uint8_t> getAsBytes(const size_t index) const;
135  std::vector<uint8_t> getAsBytes(const std::string& name) const;
136 
137  void getAsDouble(const size_t index, double& result) const;
138  void getAsDouble(const std::string& name, double& result) const;
139  double getAsDouble(const size_t index) const;
140  double getAsDouble(const std::string& name) const;
141 
142  void getAsFloat(const size_t index, float& result) const;
143  void getAsFloat(const std::string& name, float& result) const;
144  float getAsFloat(const size_t index) const;
145  float getAsFloat(const std::string& name) const;
146 
147  void getAsInt(const size_t index, int32_t& result) const;
148  void getAsInt(const std::string& name, int32_t& result) const;
149  int32_t getAsInt(const size_t index) const;
150  int32_t getAsInt(const std::string& name) const;
151 
152  void getAsLong(const size_t index, int64_t& result) const;
153  void getAsLong(const std::string& name, int64_t& result) const;
154  int64_t getAsLong(const size_t index) const;
155  int64_t getAsLong(const std::string& name) const;
156 
157  void getAsString(const size_t index, std::string& result) const;
158  void getAsString(const std::string& name, std::string& result) const;
159  std::string getAsString(const size_t index) const;
160  std::string getAsString(const std::string& name) const;
161 
162  void getAsVector(const size_t index, std::vector<float>& result) const;
163  void getAsVector(const std::string& name, std::vector<float>& result) const;
164  std::vector<float> getAsVector(const size_t index) const;
165  std::vector<float> getAsVector(const std::string& name) const;
166 
167  void getAsNullableBytes(const size_t index, boost::optional<std::vector<uint8_t> >& result) const;
168  void getAsNullableBytes(const std::string& name, boost::optional<std::vector<uint8_t> >& result) const;
169  boost::optional<std::vector<uint8_t> > getAsNullableBytes(const size_t index) const;
170  boost::optional<std::vector<uint8_t> > getAsNullableBytes(const std::string& name) const;
171 
172  void getAsNullableDouble(const size_t index, boost::optional<double>& result) const;
173  void getAsNullableDouble(const std::string& name, boost::optional<double>& result) const;
174  boost::optional<double> getAsNullableDouble(const size_t index) const;
175  boost::optional<double> getAsNullableDouble(const std::string& name) const;
176 
177  void getAsNullableFloat(const size_t index, boost::optional<float>& result) const;
178  void getAsNullableFloat(const std::string& name, boost::optional<float>& result) const;
179  boost::optional<float> getAsNullableFloat(const size_t index) const;
180  boost::optional<float> getAsNullableFloat(const std::string& name) const;
181 
182  void getAsNullableInt(const size_t index, boost::optional<int32_t>& result) const;
183  void getAsNullableInt(const std::string& name, boost::optional<int32_t>& result) const;
184  boost::optional<int32_t> getAsNullableInt(const size_t index) const;
185  boost::optional<int32_t> getAsNullableInt(const std::string& name) const;
186 
187  void getAsNullableLong(const size_t index, boost::optional<int64_t>& result) const;
188  void getAsNullableLong(const std::string& name, boost::optional<int64_t>& result) const;
189  boost::optional<int64_t> getAsNullableLong(const size_t index) const;
190  boost::optional<int64_t> getAsNullableLong(const std::string& name) const;
191 
192  void getAsNullableString(const size_t index, boost::optional<std::string>& result) const;
193  void getAsNullableString(const std::string& name, boost::optional<std::string>& result) const;
194  boost::optional<std::string> getAsNullableString(const size_t index) const;
195  boost::optional<std::string> getAsNullableString(const std::string& name) const;
196 
197  void setNull(const size_t index);
198  void setNull(const std::string& name);
199 
200  template<typename T> void setAsArray(const size_t index, const std::vector<T>& newValue);
201  template<typename T> void setAsArray(const std::string& name, const std::vector<T>& newValue);
202 
203  void setAsBytes(const size_t index, const std::vector<uint8_t>& newValue);
204  void setAsBytes(const std::string& name, const std::vector<uint8_t>& newValue);
205 
206  void setAsDouble(const size_t index, const double& newValue);
207  void setAsDouble(const std::string& name, const double& newValue);
208 
209  void setAsFloat(const size_t index, const float& newValue);
210  void setAsFloat(const std::string& name, const float& newValue);
211 
212  void setAsInt(const size_t index, const int32_t& newValue);
213  void setAsInt(const std::string& name, const int32_t& newValue);
214 
215  void setAsLong(const size_t index, const int64_t& newValue);
216  void setAsLong(const std::string& name, const int64_t& newValue);
217 
218  void setAsString(const size_t index, const std::string& newValue);
219  void setAsString(const std::string& name, const std::string& newValue);
220 
221  void setAsVector(const size_t index, const std::vector<float>& newValue);
222  void setAsVector(const std::string& name, const std::vector<float>& newValue);
223 
224  void setAsNullableBytes(const size_t index, const boost::optional<std::vector<uint8_t> >& newValue);
225  void setAsNullableBytes(const std::string& name, const boost::optional<std::vector<uint8_t> >& newValue);
226 
227  void setAsNullableDouble(const size_t index, const boost::optional<double>& newValue);
228  void setAsNullableDouble(const std::string& name, const boost::optional<double>& newValue);
229 
230  void setAsNullableFloat(const size_t index, const boost::optional<float>& newValue);
231  void setAsNullableFloat(const std::string& name, const boost::optional<float>& newValue);
232 
233  void setAsNullableInt(const size_t index, const boost::optional<int32_t>& newValue);
234  void setAsNullableInt(const std::string& name, const boost::optional<int32_t>& newValue);
235 
236  void setAsNullableLong(const size_t index, const boost::optional<int64_t>& newValue);
237  void setAsNullableLong(const std::string& name, const boost::optional<int64_t>& newValue);
238 
239  void setAsNullableString(const size_t index, const boost::optional<std::string>& newValue);
240  void setAsNullableString(const std::string& name, const boost::optional<std::string>& newValue);
241 
242  void toString(const size_t index, std::string& result) const;
243  void toString(const std::string& name, std::string& result) const;
244  std::string toString(const size_t index) const;
245  std::string toString(const std::string& name) const;
246 
247  friend std::ostream &operator << (std::ostream &os, GenericRecord &gr);
248  friend std::ostream &operator << (std::ostream &os, const GenericRecord &gr);
249 
258  static void decode(const std::string& schemaString, const std::vector<std::vector<uint8_t> >& encodedData, std::vector<GenericRecord>& data );
259 
267  static void decode(const std::string& schemaString, const std::vector<uint8_t>& encodedData, GenericRecord& data );
268 
269  private:
270 
271  Type m_type;
272  std::vector<boost::any> m_values;
273 
274  GenericRecord(const std::vector<std::pair<Type::Column::ColumnType, bool> >& columnTypes);
275  void initializeColumn(const Type::Column::ColumnType type, const bool isNullable);
276 
277  static void transpose(const std::string& schemaString, const std::vector<uint8_t>& encodedData, std::vector<GenericRecord>& data, gpudb_type_ptr_t &dataTypePtr );
278 
279  };
280 
282 }
283 
284 namespace avro
285 {
286  template<> struct codec_traits<gpudb::GenericRecord>
287  {
288  static void encode(Encoder& e, const gpudb::GenericRecord& v);
289  static void decode(Decoder& d, gpudb::GenericRecord& v);
290  };
291 }
292 
293 #endif
void setAsBytes(const size_t index, const std::vector< uint8_t > &newValue)
void setAsFloat(const size_t index, const float &newValue)
void setAsNullableFloat(const size_t index, const boost::optional< float > &newValue)
GenericRecord(const Type &type)
Create a blank GenericRecord object from a given type.
T & value(const size_t index)
boost::shared_ptr< Type > gpudb_type_ptr_t
const Type & getType() const
boost::optional< double > & nullableDoubleValue(const size_t index)
void getAsBytes(const size_t index, std::vector< uint8_t > &result) const
const T & value(const std::string &name) const
bool isNull(const size_t index) const
void getAsNullableFloat(const size_t index, boost::optional< float > &result) const
int32_t & intValue(const size_t index)
void getAsNullableInt(const size_t index, boost::optional< int32_t > &result) const
boost::optional< int32_t > & nullableIntValue(const size_t index)
void setAsDouble(const size_t index, const double &newValue)
GenericRecord DynamicTableRecord
void setAsNullableLong(const size_t index, const boost::optional< int64_t > &newValue)
void getAsArray(const size_t index, std::vector< T > &result) const
std::string & stringValue(const size_t index)
void getAsNullableBytes(const size_t index, boost::optional< std::vector< uint8_t > > &result) const
static void decode(const std::string &schemaString, const std::vector< std::vector< uint8_t > > &encodedData, std::vector< GenericRecord > &data)
Decodes avro encoded data (given the schema string) into GenericRecord objects.
void getAsString(const size_t index, std::string &result) const
void setAsNullableInt(const size_t index, const boost::optional< int32_t > &newValue)
void getAsDouble(const size_t index, double &result) const
void setAsNullableDouble(const size_t index, const boost::optional< double > &newValue)
void setAsString(const size_t index, const std::string &newValue)
boost::optional< int64_t > & nullableLongValue(const size_t index)
void getAsFloat(const size_t index, float &result) const
void getAsLong(const size_t index, int64_t &result) const
void getAsInt(const size_t index, int32_t &result) const
boost::optional< float > & nullableFloatValue(const size_t index)
void getAsNullableString(const size_t index, boost::optional< std::string > &result) const
float & floatValue(const size_t index)
int64_t & longValue(const size_t index)
void setAsVector(const size_t index, const std::vector< float > &newValue)
friend std::ostream & operator<<(std::ostream &os, GenericRecord &gr)
std::string JsonStringFromVector(const std::vector< T > &vector)
void setAsArray(const size_t index, const std::vector< T > &newValue)
void setAsLong(const size_t index, const int64_t &newValue)
size_t getColumnIndex(const std::string &name) const
void getAsNullableDouble(const size_t index, boost::optional< double > &result) const
double & doubleValue(const size_t index)
const ::avro::ValidSchema & getSchema() const
void getAsVector(const size_t index, std::vector< float > &result) const
void setAsNullableBytes(const size_t index, const boost::optional< std::vector< uint8_t > > &newValue)
boost::optional< std::string > & nullableStringValue(const size_t index)
void setNull(const size_t index)
void toString(const size_t index, std::string &result) const
T & value(const std::string &name)
void getAsNullableLong(const size_t index, boost::optional< int64_t > &result) const
boost::optional< std::vector< uint8_t > > & nullableBytesValue(const size_t index)
const T & value(const size_t index) const
void setAsNullableString(const size_t index, const boost::optional< std::string > &newValue)
void setAsInt(const size_t index, const int32_t &newValue)
std::vector< uint8_t > & bytesValue(const size_t index)