Module: check_mk
Branch: master
Commit: ed63d20dea5c81442e1a15454784631e732f7e6b
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=ed63d20dea5c81…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Wed May 18 14:18:53 2016 +0200
Fetched livestatus from downstream.
---
livestatus/src/Query.cc | 24 ++++++++++++++++++++++++
livestatus/src/Query.h | 4 ++++
livestatus/src/StatsColumn.h | 1 +
3 files changed, 29 insertions(+)
diff --git a/livestatus/src/Query.cc b/livestatus/src/Query.cc
index 5ef1847..154fc64 100644
--- a/livestatus/src/Query.cc
+++ b/livestatus/src/Query.cc
@@ -53,8 +53,25 @@ extern int g_data_encoding;
using std::list;
using std::string;
+using std::unordered_set;
using std::vector;
+namespace {
+void collectFilterColumns(unordered_set<Column *> &filter_columns,
+ Filter *filter) {
+ if (filter->isAndingFilter()) {
+ for (const auto &sub_filter : *static_cast<AndingFilter *>(filter)) {
+ collectFilterColumns(filter_columns, sub_filter);
+ }
+ } else if (filter->isNegatingFilter()) {
+ collectFilterColumns(
+ filter_columns, static_cast<NegatingFilter
*>(filter)->subfilter());
+ } else {
+ filter_columns.insert(filter->column());
+ }
+}
+} // namespace
+
Query::Query(const list<string> &lines, OutputBuffer *output, Table *table)
: _output(output)
, _table(table)
@@ -179,6 +196,13 @@ Query::Query(const list<string> &lines, OutputBuffer
*output, Table *table)
// here, is that really what we want?
_show_column_headers = true;
}
+
+ _all_columns.insert(_columns.begin(), _columns.end());
+ for (const auto &sc : _stats_columns) {
+ _all_columns.insert(sc->column());
+ }
+ collectFilterColumns(_all_columns, &_filter);
+ collectFilterColumns(_all_columns, &_wait_condition);
}
Query::~Query() {
diff --git a/livestatus/src/Query.h b/livestatus/src/Query.h
index 2fe2074..3f1eda9 100644
--- a/livestatus/src/Query.h
+++ b/livestatus/src/Query.h
@@ -31,6 +31,7 @@
#include <list>
#include <map>
#include <string>
+#include <unordered_set>
#include <vector>
#include "AndingFilter.h"
#include "global_counters.h"
@@ -90,6 +91,8 @@ class Query {
typedef std::map<_stats_group_spec_t, Aggregator **> _stats_groups_t;
_stats_groups_t _stats_groups;
+ std::unordered_set<Column *> _all_columns;
+
public:
Query(const std::list<std::string> &lines, OutputBuffer *output, Table *);
~Query();
@@ -129,6 +132,7 @@ public:
void optimizeBitmask(const char *columnname, uint32_t *bitmask);
int timezoneOffset() { return _timezone_offset; }
AndingFilter *filter() { return &_filter; }
+ std::unordered_set<Column*> *allColumns() { return &_all_columns; }
private:
bool doStats();
diff --git a/livestatus/src/StatsColumn.h b/livestatus/src/StatsColumn.h
index 635f00a..c13d599 100644
--- a/livestatus/src/StatsColumn.h
+++ b/livestatus/src/StatsColumn.h
@@ -48,6 +48,7 @@ public:
StatsColumn(Column *c, Filter *f, int o)
: _column(c), _filter(f), _operation(o) {}
~StatsColumn();
+ Column *column() const { return _column; }
int operation() { return _operation; }
Filter *stealFilter() {
Filter *f = _filter;