File indexing completed on 2024-06-16 03:42:47

0001 /*
0002     File                 : JsonFilterPrivate.h
0003     Project              : LabPlot
0004     Description          : Private implementation class for JsonFilter.
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2018 Andrey Cygankov <craftplace.ms@gmail.com>
0007     SPDX-FileCopyrightText: 2018-2020 Alexander Semke <alexander.semke@web.de>
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #ifndef JSONFILTERPRIVATE_H
0012 #define JSONFILTERPRIVATE_H
0013 
0014 #include "QJsonModel.h"
0015 
0016 class QJsonDocument;
0017 class AbstractDataSource;
0018 class AbstractColumn;
0019 
0020 class JsonFilterPrivate {
0021 public:
0022     explicit JsonFilterPrivate(JsonFilter* owner);
0023 
0024     int checkRow(QJsonValueRef value, int& countCols);
0025     int parseColumnModes(const QJsonValue& row, const QString& rowName = QString());
0026     void setEmptyValue(int column, int row);
0027     void setValueFromString(int column, int row, const QString& value);
0028 
0029     int prepareDeviceToRead(QIODevice&);
0030     void
0031     readDataFromDevice(QIODevice&, AbstractDataSource* = nullptr, AbstractFileFilter::ImportMode = AbstractFileFilter::ImportMode::Replace, int lines = -1);
0032     void readDataFromFile(const QString& fileName, AbstractDataSource* = nullptr, AbstractFileFilter::ImportMode = AbstractFileFilter::ImportMode::Replace);
0033     void importData(AbstractDataSource* = nullptr, AbstractFileFilter::ImportMode = AbstractFileFilter::ImportMode::Replace, int lines = -1);
0034 
0035     void write(const QString& fileName, AbstractDataSource*);
0036     QVector<QStringList> preview(const QString& fileName, int lines);
0037     QVector<QStringList> preview(QIODevice& device, int lines);
0038     QVector<QStringList> preview(int lines);
0039 
0040     const JsonFilter* q;
0041     QJsonModel* model{nullptr};
0042 
0043     JsonFilter::DataContainerType containerType{JsonFilter::DataContainerType::Object};
0044     QJsonValue::Type rowType{QJsonValue::Object};
0045     QVector<int> modelRows;
0046 
0047     QString dateTimeFormat;
0048     QLocale::Language numberFormat{QLocale::C};
0049     double nanValue{qQNaN()};
0050     bool createIndexEnabled{false};
0051     bool importObjectNames{false};
0052     QStringList vectorNames;
0053     QVector<AbstractColumn::ColumnMode> columnModes;
0054 
0055     int startRow{1}; // start row
0056     int endRow{-1}; // end row
0057     int startColumn{1}; // start column
0058     int endColumn{-1}; // end column
0059 
0060 private:
0061     int m_actualRows{0};
0062     int m_actualCols{0};
0063     int m_prepared{false};
0064     int m_columnOffset{0}; // indexes the "start column" in the datasource. Data will be imported starting from this column.
0065     std::vector<void*> m_dataContainer; // pointers to the actual data containers (columns).
0066     QJsonDocument m_doc; // original and full JSON document
0067     QJsonDocument m_preparedDoc; // selected part of the full JSON document, the part that needs to be imported
0068 
0069     bool prepareDocumentToRead();
0070 };
0071 
0072 #endif