From 93b406d1914a5512aec6ca737ba8326a21191227 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 1 Dec 2015 21:29:42 +0100 Subject: HAWD: Ensure the column order is maintained By turning the columns into an array instead of an object, we can print the values in the same order as in the definition file. Previosly the order was random, and even headers and values were somtimes mixed up. --- tests/hawd/dataset.cpp | 43 ++++++++++++++++++++-------------------- tests/hawd/dataset.h | 2 +- tests/hawd/datasetdefinition.cpp | 11 +++++----- tests/hawd/datasetdefinition.h | 4 ++-- tests/hawd/modules/list.cpp | 6 ++---- 5 files changed, 32 insertions(+), 34 deletions(-) (limited to 'tests') diff --git a/tests/hawd/dataset.cpp b/tests/hawd/dataset.cpp index 585406b..93eb5cd 100644 --- a/tests/hawd/dataset.cpp +++ b/tests/hawd/dataset.cpp @@ -49,10 +49,8 @@ Dataset::Row::Row(const Dataset &dataset, qint64 key) m_dataset(&dataset) { // TODO: pre-populate m_data, or do that on buffer creation? - QHashIterator it(dataset.definition().columns()); - while (it.hasNext()) { - it.next(); - m_data.insert(it.key(), QVariant()); + for (const auto &colum : dataset.definition().columns()) { + m_data.insert(colum.first, QVariant()); } } @@ -67,13 +65,16 @@ Dataset::Row &Dataset::Row::operator=(const Row &rhs) return *this; } -void Dataset::Row::setValue(const QString &column, const QVariant &value) +void Dataset::Row::setValue(const QString &col, const QVariant &value) { - if (!m_columns.contains(column) || !value.canConvert(m_columns[column].type())) { - return; + for (const auto &column : m_columns) { + if (column.first == col) { + if (value.canConvert(column.second.type())) { + m_data[col] = value; + } + return; + } } - - m_data[column] = value; } void Dataset::Row::annotate(const QString ¬e) @@ -158,13 +159,11 @@ QString Dataset::tableHeaders(const QStringList &cols, int standardCols, const Q strings << QObject::tr("Commit").leftJustified(s_fieldWidth, ' '); } - QHashIterator it(m_definition.columns()); - while (it.hasNext()) { - it.next(); - QString header = it.key(); + for (const auto &column : m_definition.columns()) { + QString header = column.first; if (cols.isEmpty() || cols.contains(header)) { - if (!it.value().unit().isEmpty()) { - header.append(" (").append(it.value().unit()).append(")"); + if (!column.second.unit().isEmpty()) { + header.append(" (").append(column.second.unit()).append(")"); } strings << header.leftJustified(s_fieldWidth, ' '); } @@ -195,14 +194,14 @@ QString Dataset::Row::toString(const QStringList &cols, int standardCols, const strings << m_commitHash.leftJustified(s_fieldWidth, ' '); } - QHashIterator it(m_data); - while (it.hasNext()) { - it.next(); - if (cols.isEmpty() || cols.contains(it.key())) { - if (it.value().canConvert()) { - strings << QString("%1").arg(it.value().toDouble(), s_fieldWidth, 'f', 3); + for (const auto &column : m_columns) { + const auto key = column.first; + if (cols.isEmpty() || cols.contains(key)) { + const auto value = m_data.value(key); + if (value.canConvert()) { + strings << QString("%1").arg(value.toDouble(), s_fieldWidth, 'f', 3); } else { - strings << it.value().toString().leftJustified(s_fieldWidth, ' '); + strings << value.toString().leftJustified(s_fieldWidth, ' '); } } } diff --git a/tests/hawd/dataset.h b/tests/hawd/dataset.h index cf84d7b..cdfd3f2 100644 --- a/tests/hawd/dataset.h +++ b/tests/hawd/dataset.h @@ -60,7 +60,7 @@ public: void fromBinary(QByteArray binary); qint64 m_key; - QHash m_columns; + QList > m_columns; QHash m_data; QString m_annotation; QString m_commitHash; diff --git a/tests/hawd/datasetdefinition.cpp b/tests/hawd/datasetdefinition.cpp index a4a95dd..e2af2b9 100644 --- a/tests/hawd/datasetdefinition.cpp +++ b/tests/hawd/datasetdefinition.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -119,11 +120,11 @@ DatasetDefinition::DatasetDefinition(const QString &path) } m_description = json.value("description").toString(); - QJsonObject cols = json.value("columns").toObject(); - for (const QString &key: cols.keys()) { - QJsonObject def = cols.value(key).toObject(); + auto cols = json.value("columns").toArray(); + for (const auto &entry: cols) { + QJsonObject def = entry.toObject(); if (!def.isEmpty()) { - m_columns.insert(key, DataDefinition(def)); + m_columns << qMakePair(def.value("name").toString(), DataDefinition(def)); } } } @@ -152,7 +153,7 @@ QString DatasetDefinition::description() const return m_description; } -QHash DatasetDefinition::columns() const +QList > DatasetDefinition::columns() const { return m_columns; } diff --git a/tests/hawd/datasetdefinition.h b/tests/hawd/datasetdefinition.h index cf1a797..6c844ba 100644 --- a/tests/hawd/datasetdefinition.h +++ b/tests/hawd/datasetdefinition.h @@ -60,14 +60,14 @@ public: QString lastError() const; QString name() const; QString description() const; - QHash columns() const; + QList > columns() const; private: bool m_valid; QString m_name; QString m_description; QString m_lastError; - QHash m_columns; + QList > m_columns; }; } // namespace HAWD diff --git a/tests/hawd/modules/list.cpp b/tests/hawd/modules/list.cpp index efb000b..aa80126 100644 --- a/tests/hawd/modules/list.cpp +++ b/tests/hawd/modules/list.cpp @@ -60,10 +60,8 @@ bool List::list(const QStringList &commands, State &state) if (dataset.isValid()) { DatasetDefinition dataset(project.absoluteFilePath(file)); std::cout << '\t' << QObject::tr("Dataset: %1").arg(dataset.name()).toStdString() << std::endl; - QHashIterator it(dataset.columns()); - while (it.hasNext()) { - it.next(); - std::cout << "\t\t" << it.value().typeString().toStdString() << ' ' << it.key().toStdString() << std::endl; + for (const auto &column : dataset.columns()) { + std::cout << "\t\t" << column.second.typeString().toStdString() << ' ' << column.first.toStdString() << std::endl; } } else { std::cout << QObject::tr("Problem with dataset %1. Check with 'check' command.").arg(file).toStdString() << std::endl; -- cgit v1.2.3