1 #ifndef DBALLE_DB_SUMMARY_H
2 #define DBALLE_DB_SUMMARY_H
4 #include <dballe/core/fwd.h>
6 #include <dballe/core/query.h>
7 #include <dballe/core/smallset.h>
29 : level(level), trange(trange), varcode(varcode) {}
33 bool operator==(
const VarDesc& o)
const {
return std::tie(level, trange, varcode) == std::tie(o.level, o.trange, o.varcode); }
34 bool operator!=(
const VarDesc& o)
const {
return std::tie(level, trange, varcode) != std::tie(o.level, o.trange, o.varcode); }
35 bool operator< (
const VarDesc& o)
const {
return std::tie(level, trange, varcode) < std::tie(o.level, o.trange, o.varcode); }
36 bool operator<=(
const VarDesc& o)
const {
return std::tie(level, trange, varcode) <= std::tie(o.level, o.trange, o.varcode); }
37 bool operator> (
const VarDesc& o)
const {
return std::tie(level, trange, varcode) > std::tie(o.level, o.trange, o.varcode); }
38 bool operator>=(
const VarDesc& o)
const {
return std::tie(level, trange, varcode) >= std::tie(o.level, o.trange, o.varcode); }
54 : var(var), dtrange(dtrange), count(count)
60 bool operator==(
const VarEntry& o)
const {
return std::tie(var, dtrange, count) == std::tie(o.var, o.dtrange, o.count); }
61 bool operator!=(
const VarEntry& o)
const {
return std::tie(var, dtrange, count) != std::tie(o.var, o.dtrange, o.count); }
65 this->dtrange.
merge(dtrange);
72 DBALLE_TEST_ONLY
void dump(FILE* out)
const;
76 inline const VarDesc& station_entry_get_value(
const VarEntry& item) {
return item.var; }
83 template<
typename Station>
86 using SmallSet::iterator;
87 using SmallSet::const_iterator;
88 using SmallSet::reverse_iterator;
89 using SmallSet::const_reverse_iterator;
90 using SmallSet::begin;
92 using SmallSet::rbegin;
95 using SmallSet::empty;
97 bool operator==(
const StationEntry& o)
const {
return SmallSet::operator==(o); }
98 bool operator!=(
const StationEntry& o)
const {
return SmallSet::operator!=(o); }
104 template<
typename OStation>
108 for (
const auto& item: entry)
115 add(vd, dtrange, count);
119 : station(entries.station)
121 add_filtered(entries, query);
127 template<
typename OStation>
134 DBALLE_TEST_ONLY
void dump(FILE* out)
const;
138 template<
typename Station>
146 template<
typename Station>
150 typedef typename Parent::iterator iterator;
151 typedef typename Parent::const_iterator const_iterator;
152 typedef typename Parent::reverse_iterator reverse_iterator;
153 typedef typename Parent::const_reverse_iterator const_reverse_iterator;
156 using Parent::rbegin;
167 template<
typename OStation>
178 bool has(
const Station& station)
const {
return this->find(station) != this->end(); }
180 const StationEntries& sorted()
const {
if (this->dirty) this->rearrange_dirty();
return *
this; }
184 template<
typename Station>
192 : station_entry(station_entry), var_entry(var_entry) {}
194 std::vector<Entry> results;
195 typename std::vector<Entry>::const_iterator cur;
196 bool at_start =
true;
200 bool has_value()
const {
return !at_start && cur != results.end(); }
204 if (at_start)
return results.size();
205 return results.end() - cur;
212 cur = results.begin();
215 else if (cur != results.end())
217 return cur != results.end();
229 res.
report = station.report;
230 res.
coords = station.coords;
231 res.
ident = station.ident;
234 static int _get_station_id(
const DBStation& s) {
return s.
id; }
235 static int _get_station_id(
const dballe::Station& s) {
return MISSING_INT; }
239 return _get_dbstation(cur->station_entry.station);
243 int get_station_id()
const override
245 return _get_station_id(cur->station_entry.station);
248 Coords get_coords()
const override {
return cur->station_entry.station.coords; }
249 Ident get_ident()
const override {
return cur->station_entry.station.ident; }
250 std::string get_report()
const override {
return cur->station_entry.station.report; }
252 unsigned test_iterate(FILE* dump=0)
override
255 for (count = 0;
next(); ++count)
269 size_t get_count()
const override {
return cur->var_entry.count; }
284 template<
typename Station>
296 mutable size_t count = 0;
298 mutable bool dirty =
false;
300 void recompute_summaries()
const;
311 return entries == o.entries;
327 const Datetime& datetime_max()
const {
if (dirty) recompute_summaries();
return dtrange.
max; }
328 unsigned data_count()
const {
if (dirty) recompute_summaries();
return count; }
340 std::unique_ptr<dballe::CursorSummary> query_summary(
const Query& query)
const;
343 void add(
const Station& station,
const summary::VarDesc& vd,
const dballe::DatetimeRange& dtrange,
size_t count);
352 void add_messages(
const std::vector<std::shared_ptr<dballe::Message>>& messages);
355 template<
typename OSummary>
356 void add_summary(
const BaseSummary<OSummary>& summary);
359 void add_filtered(
const BaseSummary& summary,
const dballe::Query& query);
368 void merge_entries();
372 void to_json(core::JSONWriter& writer)
const;
375 void load_json(core::json::Stream& in);
377 DBALLE_TEST_ONLY
void dump(FILE* out)
const;
383 typedef BaseSummary<dballe::Station> Summary;
388 typedef BaseSummary<dballe::DBStation> DBSummary;
390 extern template class BaseSummary<dballe::Station>;
393 extern template class BaseSummary<dballe::DBStation>;