IODA Bundle
ODAOutput.cc
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 #include "eckit/sql/expression/SQLExpressions.h"
12 #include "eckit/sql/SQLSelect.h"
13 
14 #include "odc/api/ColumnType.h"
15 #include "odc/DispatchingWriter.h"
16 #include "odc/LibOdc.h"
17 #include "odc/sql/ODAOutput.h"
18 #include "odc/sql/Types.h"
19 #include "odc/Writer.h"
20 
21 using namespace eckit;
22 using namespace eckit::sql;
23 using namespace odc::api;
24 
25 namespace odc {
26 namespace sql {
27 
28 //----------------------------------------------------------------------------------------------------------------------
29 
30 /*template<typename WRITER>
31 ODAOutput<WRITER>::ODAOutput(WRITER* writer, const MetaData& columns)
32 : writer_(writer), it_(writer->begin()), count_(0), metaData_(0)
33 {
34  metaData_ = columns;
35 }*/
36 
37 template<typename WRITER>
39  writer_(writer),
40  it_(writer->begin()),
41  count_(0)
42 {}
43 
44 template<typename WRITER>
46 
47 template<typename WRITER>
48 void ODAOutput<WRITER>::print(std::ostream& s) const
49 {
50  s << "ODAOutput: iterator: " << it_ << std::endl; // " metaData_: " << metaData_ << std::endl;;
51 }
52 
53 template<typename WRITER>
54 unsigned long long ODAOutput<WRITER>::count() { return count_; }
55 
56 template<typename WRITER>
57 void ODAOutput<WRITER>::reset() { count_ = 0; }
58 
59 template<typename WRITER>
61 
62 template<typename WRITER>
63 void ODAOutput<WRITER>::cleanup(SQLSelect& sql) { sql.outputFiles((**it_).outputFiles()); }
64 
65 template<typename WRITER>
66 bool ODAOutput<WRITER>::output(const expression::Expressions& results)
67 {
68  size_t nCols (results.size());
69  for(size_t i (0); i < nCols; ++i)
70  {
71  bool missing = false;
72  // TODO: pass the context to it_
73  (*it_)[i] = results[i]->eval(missing);
74  }
75 
76  ++it_;
77  ++count_;
78  return true;
79 }
80 
81 template<typename WRITER>
82 void ODAOutput<WRITER>::preprepare(SQLSelect& sql) {}
83 
84 template<typename WRITER>
85 void ODAOutput<WRITER>::prepare(SQLSelect& sql)
86 {
87  const expression::Expressions& columns (sql.output());
88 
89  //if (metaData_.size()) {
90  // Log::debug<LibOdc>() << "ODAOutput: Using meta of INTO table" << std::endl;
91  // ASSERT(metaData_.size() == n);
92  // const_cast<MetaData&>(it_->columns()) = metaData_;
93  //}
94  //else
95  //{
96 
97  const_cast<MetaData&>(it_->columns()).setSize(columns.size());
98 
99  for (size_t i = 0; i < columns.size(); i++) {
100 
101  SQLExpression& c(*columns[i]);
102  api::ColumnType typ = sqlToOdbType(*c.type());
103 
104  if (typ == BITFIELD) {
105  (**it_).setBitfieldColumn(i, c.title(), typ, c.bitfieldDef());
106  } else {
107  (**it_).setColumn(i, c.title(), typ);
108  }
109 
110  (**it_).missingValue(i, c.missingValue());
111  }
112  //}
113  (**it_).writeHeader();
114  Log::debug<LibOdc>() << " => ODAOutput: " << std::endl << (**it_).columns() << std::endl;
115 }
116 
117 // Direct output functions removed in order output
118 
119 template <typename WRITER> void ODAOutput<WRITER>::outputReal(double, bool) { NOTIMP; }
120 template <typename WRITER> void ODAOutput<WRITER>::outputDouble(double, bool) { NOTIMP; }
121 template <typename WRITER> void ODAOutput<WRITER>::outputInt(double, bool) { NOTIMP; }
122 template <typename WRITER> void ODAOutput<WRITER>::outputUnsignedInt(double, bool) { NOTIMP; }
123 template <typename WRITER> void ODAOutput<WRITER>::outputString(const char*, size_t, bool) { NOTIMP; }
124 template <typename WRITER> void ODAOutput<WRITER>::outputBitfield(double, bool) { NOTIMP; }
125 
126 
127 // Explicit template instantiations.
128 
129 template class ODAOutput<Writer<>>;
130 template class ODAOutput<DispatchingWriter>;
131 
132 //----------------------------------------------------------------------------------------------------------------------
133 
134 } // namespace sql
135 } // namespace odc
virtual void preprepare(eckit::sql::SQLSelect &) override
Definition: ODAOutput.cc:82
virtual ~ODAOutput()
Definition: ODAOutput.cc:45
virtual void prepare(eckit::sql::SQLSelect &) override
Definition: ODAOutput.cc:85
virtual void flush() override
Definition: ODAOutput.cc:60
virtual bool output(const eckit::sql::expression::Expressions &) override
Definition: ODAOutput.cc:66
virtual void outputBitfield(double, bool) override
Definition: ODAOutput.cc:124
virtual void outputUnsignedInt(double, bool) override
Definition: ODAOutput.cc:122
virtual void outputInt(double, bool) override
Definition: ODAOutput.cc:121
virtual void reset() override
Definition: ODAOutput.cc:57
virtual unsigned long long count() override
Definition: ODAOutput.cc:54
virtual void cleanup(eckit::sql::SQLSelect &) override
Definition: ODAOutput.cc:63
virtual void print(std::ostream &) const override
Definition: ODAOutput.cc:48
virtual void outputString(const char *, size_t, bool) override
Definition: ODAOutput.cc:123
virtual void outputDouble(double, bool) override
Definition: ODAOutput.cc:120
virtual void outputReal(double, bool) override
Definition: ODAOutput.cc:119
@ BITFIELD
Definition: ColumnType.h:27
ColumnType sqlToOdbType(const SQLType &t)
Definition: Types.cc:26
Definition: ColumnInfo.h:23