IODA Bundle
MetaData.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 1996-2012 ECMWF.
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  * In applying this licence, ECMWF does not waive the privileges and immunities
7  * granted to it by virtue of its status as an intergovernmental organisation nor
8  * does it submit to any jurisdiction.
9  */
10 
11 #ifndef odc_core_MetaData_H
12 #define odc_core_MetaData_H
13 
14 #include "odc/core/Column.h"
15 #include "eckit/sql/SQLTypedefs.h"
16 
17 #ifdef SWIGPYTHON
18 #include "odc/IteratorProxy.h"
19 #endif
20 
21 namespace eckit { class PathName; }
22 
23 namespace odc {
24 namespace core {
25 
26 //----------------------------------------------------------------------------------------------------------------------
27 
28 typedef std::vector<Column*> MetaDataBase;
29 using Properties = std::map<std::string, std::string>;
30 
31 class MetaData : public MetaDataBase {
32 public:
33  MetaData();
34  MetaData(int);
35  MetaData(int, Column *);
36  MetaData(const MetaData&);
37  MetaData* clone() const;
38 
39  unsigned long long rowsNumber() const { return rowsNumber_; }
40  void rowsNumber(unsigned long long n) { rowsNumber_ = n; }
41 
42  unsigned long long dataSize() const { return dataSize_; }
43  void dataSize(unsigned long long n) { dataSize_ = n; }
44 
45  MetaData& operator=(const MetaData&);
46  MetaData& operator+=(const MetaData&);
47  MetaData operator+(const MetaData&);
48 
49  /// Check if number of columns, column names and column types are equal. Values not checked.
50  bool operator==(const MetaData&) const;
51  bool equals(const MetaData& md, bool compareDataSizes=true) const;
52 
53  bool equalsIncludingConstants(const MetaData&, const std::vector<std::string>& constColumns) const;
54 
55  bool operator!=(const MetaData& other) const { return ! (*this == other); }
56  bool compatible(const MetaData& other) const;
57 
58  void operator|=(const MetaData& other);
59 
60  template<typename ByteStream> void save(DataStream<ByteStream>& ds) const;
61  template<typename ByteStream> void load(DataStream<ByteStream>& ds);
62 
63  void setSize(size_t);
64 
65  MetaData& addColumn(const std::string& name, const std::string& type);
66 
67  template<typename ByteOrder>
68  MetaData& addColumnPrivate(const std::string& name, const std::string& type);
69 
70  bool allColumnsInitialised() const;
71 
72  MetaData& addBitfield(const std::string& name, const eckit::sql::BitfieldDef&);
73  template<typename ByteOrder> MetaData& addBitfieldPrivate(const std::string& name, const eckit::sql::BitfieldDef&);
74 
75  bool hasColumn(const std::string&) const;
76  Column* columnByName(const std::string&) const;
77  size_t columnIndex(const std::string&) const;
78 
79  static api::ColumnType convertType(const std::string&);
80 #ifdef SWIGPYTHON
81  std::string __str__()
82  {
83  std::stringstream s;
84  s << "[";
85  for (size_t i = 0; i < size(); ++i)
86  {
87  s << at(i)->__repr__() << ",";
88  }
89  s << "]";
90  return s.str();
91  }
92 #endif
93 
94  void resetStats();
95 
96  template <typename ByteOrder> void resetCodecs() { for (auto& col : *this) col->resetCodec<ByteOrder>(); }
97 
98  virtual ~MetaData();
99 
100  virtual void print(std::ostream& s) const;
101 
102  friend std::ostream& operator<<(std::ostream& s, const MetaData& p)
103  { p.print(s); return s; }
104 
105 private:
106  unsigned long long rowsNumber_;
107  unsigned long long dataSize_;
108 };
109 
110 
111 template<typename ByteOrder>
113 {
114  ds.write(static_cast<int32_t>(size()));
115  for(size_t i = 0; i < size(); i++) {
116  at(i)->save(ds);
117  }
118 }
119 
120 template<typename ByteOrder>
122 {
123  for (size_t i = 0; i < size(); i++)
124  delete at(i);
125  clear();
126 
127  int32_t nCols;
128  ds.read(nCols);
129  resize(nCols, NULL);
130  for (size_t i = 0; i < size(); i++)
131  {
132  delete at(i);
133  at(i) = new Column(*this);
134  at(i)->load(ds);
135  }
136 }
137 
138 template <typename ByteOrder>
139 MetaData& MetaData::addColumnPrivate(const std::string& name, const std::string& type)
140 {
141  Column* c = new Column(*this);
142  ASSERT(c);
143 
144  c->name(name);
145  c->type<ByteOrder>(Column::type(type));
146 
147  push_back(c);
148  return *this;
149 }
150 
151 template<typename ByteOrder>
152 MetaData& MetaData::addBitfieldPrivate(const std::string& name, const eckit::sql::BitfieldDef& bd)
153 {
154  Column* c = new Column(*this);
155  ASSERT(c);
156  c->name(name);
157  c->type<ByteOrder>(api::BITFIELD);
158  c->bitfieldDef(bd);
159  push_back(c);
160 
161  return *this;
162 }
163 
164 //----------------------------------------------------------------------------------------------------------------------
165 
166 } // namespace core
167 } // namespace odc
168 
169 #endif
170 
api::ColumnType type() const
Definition: Column.h:64
void read(T &elem)
Definition: DataStream.h:205
void write(const T &elem)
Definition: DataStream.h:276
unsigned long long dataSize() const
Definition: MetaData.h:42
bool operator==(const MetaData &) const
Check if number of columns, column names and column types are equal. Values not checked.
Definition: MetaData.cc:212
void setSize(size_t)
Definition: MetaData.cc:64
size_t columnIndex(const std::string &) const
Definition: MetaData.cc:95
MetaData & addBitfield(const std::string &name, const eckit::sql::BitfieldDef &)
Definition: MetaData.cc:297
static api::ColumnType convertType(const std::string &)
Definition: MetaData.cc:35
bool hasColumn(const std::string &) const
Definition: MetaData.cc:87
friend std::ostream & operator<<(std::ostream &s, const MetaData &p)
Definition: MetaData.h:102
MetaData operator+(const MetaData &)
Definition: MetaData.cc:164
void load(DataStream< ByteStream > &ds)
unsigned long long dataSize_
Definition: MetaData.h:107
void save(DataStream< ByteStream > &ds) const
unsigned long long rowsNumber_
Definition: MetaData.h:106
bool compatible(const MetaData &other) const
Definition: MetaData.cc:231
MetaData & operator=(const MetaData &)
Definition: MetaData.cc:112
MetaData & addColumnPrivate(const std::string &name, const std::string &type)
Definition: MetaData.h:139
void dataSize(unsigned long long n)
Definition: MetaData.h:43
bool equalsIncludingConstants(const MetaData &, const std::vector< std::string > &constColumns) const
Definition: MetaData.cc:171
virtual void print(std::ostream &s) const
Definition: MetaData.cc:272
virtual ~MetaData()
Definition: MetaData.cc:77
MetaData * clone() const
Definition: MetaData.cc:57
bool operator!=(const MetaData &other) const
Definition: MetaData.h:55
void resetCodecs()
Definition: MetaData.h:96
MetaData & operator+=(const MetaData &)
Definition: MetaData.cc:136
bool equals(const MetaData &md, bool compareDataSizes=true) const
Definition: MetaData.cc:216
MetaData & addColumn(const std::string &name, const std::string &type)
Definition: MetaData.cc:279
MetaData & addBitfieldPrivate(const std::string &name, const eckit::sql::BitfieldDef &)
Definition: MetaData.h:152
bool allColumnsInitialised() const
Definition: MetaData.cc:284
Column * columnByName(const std::string &) const
Definition: MetaData.cc:84
unsigned long long rowsNumber() const
Definition: MetaData.h:39
void operator|=(const MetaData &other)
Definition: MetaData.cc:151
void rowsNumber(unsigned long long n)
Definition: MetaData.h:40
@ BITFIELD
Definition: ColumnType.h:27
std::map< std::string, std::string > Properties
Definition: Header.h:35
std::vector< Column * > MetaDataBase
Definition: MetaData.h:28
Definition: ColumnInfo.h:23