IODA Bundle
Odb.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019- 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 
12 /// @author Simon Smart
13 /// @date January 2019
14 
15 #ifndef odc_api_Odb_H
16 #define odc_api_Odb_H
17 
18 #include <string>
19 #include <memory>
20 #include <vector>
21 #include <type_traits>
22 #include <set>
23 #include <map>
24 
25 #include "eckit/io/Length.h"
26 #include "eckit/io/Offset.h"
27 
28 #include "odc/api/ColumnType.h"
29 #include "odc/api/ColumnInfo.h"
30 #include "odc/api/StridedData.h"
31 
32 namespace eckit {
33  class DataHandle;
34 }
35 
36 
37 namespace odc {
38 namespace api {
39 
40 //----------------------------------------------------------------------------------------------------------------------
41 
42 // Global settings
43 
44 class Settings {
45 public: // methods
46 
47  static void treatIntegersAsDoubles(bool flag);
48 
49  static long integerMissingValue();
50  static void setIntegerMissingValue(long val);
51 
52  static double doubleMissingValue();
53  static void setDoubleMissingValue(double val);
54 
55  static const std::string& version();
56  static const std::string& gitsha1();
57 };
58 
59 //----------------------------------------------------------------------------------------------------------------------
60 
61 struct SpanImpl;
62 
63 class SpanVisitor {
64 public:
65  virtual ~SpanVisitor();
66  virtual void operator()(const std::string& columnName, const std::set<long>& vals) = 0;
67  virtual void operator()(const std::string& columnName, const std::set<double>& vals) = 0;
68  virtual void operator()(const std::string& columnName, const std::set<std::string>& vals) = 0;
69 };
70 
71 
72 class Span {
73 
74 public: // methods
75 
76  Span(std::shared_ptr<SpanImpl> s);
77 
78  void visit(SpanVisitor& visitor) const;
79 
80  eckit::Offset offset() const;
81  eckit::Length length() const;
82 
83 private: // members
84 
85  std::shared_ptr<SpanImpl> impl_;
86 };
87 
88 //----------------------------------------------------------------------------------------------------------------------
89 
90 struct FrameImpl;
91 
92 class ReaderImpl;
93 
94 class Reader {
95 
96 public: // methods
97 
98  Reader(const std::string& path);
99  Reader(eckit::DataHandle& dh);
100  Reader(eckit::DataHandle* dh); // takes ownership
101  ~Reader();
102 
103 private: // members
104 
105  std::shared_ptr<ReaderImpl> impl_;
106 
107  friend class FrameImpl;
108 };
109 
110 
111 //----------------------------------------------------------------------------------------------------------------------
112 
113 class Decoder;
114 
115 class Frame {
116 
117 public: // methods
118 
119  Frame(Reader& reader);
120  Frame(const Frame& reader);
121  ~Frame();
122 
123  // Get the next frame
124  bool next(bool aggregated=true, long rowlimit=-1);
125 
126  size_t rowCount() const;
127  size_t columnCount() const;
128 
129  const std::vector<ColumnInfo>& columnInfo() const;
130 
131  void decode(Decoder& target, size_t nthreads) const;
132 
133  Span span(const std::vector<std::string>& columns, bool onlyConstantValues) const;
134 
135 private: // members
136 
137  std::unique_ptr<FrameImpl> impl_;
138 };
139 
140 //----------------------------------------------------------------------------------------------------------------------
141 
142 struct DecoderImpl;
143 
144 class Decoder {
145 
146 public: // methods
147 
148  Decoder(const std::vector<std::string>& columns,
149  std::vector<StridedData>& columnFacades);
150  ~Decoder();
151 
152  Decoder slice(size_t rowOffset, size_t nrows) const;
153 
154 private: // members
155 
156  std::shared_ptr<DecoderImpl> impl_;
157 
158  friend class FrameImpl;
159 };
160 
161 //----------------------------------------------------------------------------------------------------------------------
162 
163 void encode(eckit::DataHandle& out,
164  const std::vector<ColumnInfo>& columns,
165  const std::vector<ConstStridedData>& data,
166  const std::map<std::string, std::string>& properties = {},
167  size_t maxRowsPerFrame=10000);
168 
169 //----------------------------------------------------------------------------------------------------------------------
170 
171 /// odbFromCSV returns number of lines imported
172 
173 size_t odbFromCSV(eckit::DataHandle& dh_in, eckit::DataHandle& dh_out, const std::string& delimiter=",");
174 size_t odbFromCSV(std::istream& is, eckit::DataHandle& dh_out, const std::string& delimiter=",");
175 size_t odbFromCSV(const std::string& in, eckit::DataHandle& dh_out, const std::string& delimiter=",");
176 
177 //----------------------------------------------------------------------------------------------------------------------
178 
179 } // namespace api
180 } // namespace odc
181 
182 #endif // odc_api_Odb_H
std::shared_ptr< DecoderImpl > impl_
Definition: Odb.h:156
Decoder slice(size_t rowOffset, size_t nrows) const
Decoder(const std::vector< std::string > &columns, std::vector< StridedData > &columnFacades)
Definition: Odb.cc:100
const std::vector< ColumnInfo > & columnInfo() const
Definition: Odb.cc:326
Frame(Reader &reader)
Definition: Odb.cc:303
Span span(const std::vector< std::string > &columns, bool onlyConstantValues) const
Definition: Odb.cc:336
std::unique_ptr< FrameImpl > impl_
Definition: Odb.h:137
bool next(bool aggregated=true, long rowlimit=-1)
Definition: Odb.cc:311
void decode(Decoder &target, size_t nthreads) const
Definition: Odb.cc:331
size_t rowCount() const
Definition: Odb.cc:316
size_t columnCount() const
Definition: Odb.cc:321
std::shared_ptr< ReaderImpl > impl_
Definition: Odb.h:105
Reader(const std::string &path)
Definition: Odb.cc:81
static void setDoubleMissingValue(double val)
Definition: Odb.cc:351
static void treatIntegersAsDoubles(bool flag)
Definition: Odb.cc:343
static const std::string & version()
Definition: Odb.cc:355
static void setIntegerMissingValue(long val)
Definition: Odb.cc:347
static long integerMissingValue()
Definition: Odb.cc:365
static const std::string & gitsha1()
Definition: Odb.cc:360
static double doubleMissingValue()
Definition: Odb.cc:369
eckit::Length length() const
Definition: Odb.cc:126
Span(std::shared_ptr< SpanImpl > s)
Definition: Odb.cc:116
std::shared_ptr< SpanImpl > impl_
Definition: Odb.h:85
void visit(SpanVisitor &visitor) const
Definition: Odb.cc:118
eckit::Offset offset() const
Definition: Odb.cc:122
virtual void operator()(const std::string &columnName, const std::set< double > &vals)=0
virtual void operator()(const std::string &columnName, const std::set< std::string > &vals)=0
virtual void operator()(const std::string &columnName, const std::set< long > &vals)=0
virtual ~SpanVisitor()
Definition: Odb.cc:108
void encode(DataHandle &out, const std::vector< ColumnInfo > &columns, const std::vector< ConstStridedData > &data, const std::map< std::string, std::string > &properties, size_t maxRowsPerFrame)
Definition: Odb.cc:400
size_t odbFromCSV(DataHandle &dh_in, DataHandle &dh_out, const std::string &delimiter)
odbFromCSV returns number of lines imported
Definition: Odb.cc:375
Definition: ColumnInfo.h:23
Internal types.
Definition: Odb.cc:43