7 #include <QProgressDialog> 9 #include <QInputDialog> 10 #include <QListWidget> 14 ui =
new Ui::DialogParquet();
19 connect(
ui->checkBoxDateFormat, &QCheckBox::toggled,
this,
21 ui->lineEditDateFormat->setEnabled(checked);
24 connect(
ui->listWidgetSeries, &QListWidget::currentTextChanged,
this,
26 ui->buttonBox->setEnabled( !text.isEmpty() );
29 connect(
ui->listWidgetSeries, &QListWidget::doubleClicked,
this,
30 [=](
const QModelIndex &) {
34 connect(
ui->radioButtonIndex, &QRadioButton::toggled,
this,
36 ui->buttonBox->setEnabled(checked );
37 ui->listWidgetSeries->setEnabled( !checked );
42 bool radio_index_checked = settings.value(
"DataLoadParquet::radioIndexChecked",
false).toBool();
43 ui->radioButtonIndex->setChecked( radio_index_checked );
45 bool parse_date_time = settings.value(
"DataLoadParquet::parseDateTime",
false).toBool();
46 ui->checkBoxDateFormat->setChecked(parse_date_time);
48 QString date_format = settings.value(
"DataLoadParquet::dateFromat",
false).toString();
49 if (date_format.isEmpty() ==
false)
51 ui->lineEditDateFormat->setText(date_format);
62 static std::vector<const char*> extensions = {
"parquet"};
70 using parquet::ConvertedType;
79 std::shared_ptr<parquet::FileMetaData> file_metadata =
parquet_reader_->metadata();
80 const auto schema = file_metadata->schema();
81 const size_t num_columns = file_metadata->num_columns();
83 std::vector<parquet::Type::type> column_type;
84 std::vector<parquet::ConvertedType::type> converted_column_type;
85 std::vector<bool> valid_column( num_columns,
true );
87 for(
size_t col=0; col<num_columns; col++ )
89 auto column = schema->Column(col);
90 auto type = column->physical_type();
91 auto converted_type = column->converted_type();
93 column_type.push_back(
type );
94 converted_column_type.push_back( converted_type );
96 valid_column[col] = (
type == Type::BOOLEAN ||
99 type == Type::FLOAT ||
100 type == Type::DOUBLE);
102 ui->listWidgetSeries->addItem( QString::fromStdString(column->name()) );
115 if( items.size() > 0 )
117 ui->listWidgetSeries->setCurrentItem(items.front());
123 if (ret != QDialog::Accepted)
128 QString selected_stamp;
130 if(
ui->radioButtonSelect->isChecked() )
132 auto selected =
ui->listWidgetSeries->selectedItems();
133 if( selected.size() == 1)
135 selected_stamp = selected.front()->text();
140 settings.setValue(
"DataLoadParquet::prevTimestamp", selected_stamp);
141 settings.setValue(
"DataLoadParquet::radioIndexChecked",
ui->radioButtonIndex->isChecked());
142 settings.setValue(
"DataLoadParquet::parseDateTime",
ui->checkBoxDateFormat->isChecked());
143 settings.setValue(
"DataLoadParquet::dateFromat",
ui->lineEditDateFormat->text());
147 int timestamp_column = -1;
149 std::vector<PlotData*> series(num_columns,
nullptr);
151 for(
size_t col=0; col<num_columns; col++)
153 auto column = schema->Column(col);
154 const std::string&
name = column->name();
155 if( name == selected_stamp.toStdString() )
157 timestamp_column = col;
159 if( valid_column[col] )
161 series[col] = &(plot_data.
addNumeric(name)->second);
167 std::vector<double> row_values( num_columns, 0.0 );
173 for(
size_t col=0; col<num_columns; col++)
175 if( !valid_column[col] )
179 auto type = column_type[col];
180 auto converted_type = converted_column_type[col];
184 case Type::BOOLEAN: {
187 row_values[col] =
static_cast<double>(tmp);
192 switch(converted_type)
194 case ConvertedType::INT_8:
198 row_values[col] =
static_cast<double>(tmp);
201 case ConvertedType::INT_16:
205 row_values[col] =
static_cast<double>(tmp);
208 case ConvertedType::INT_32:
212 row_values[col] =
static_cast<double>(tmp);
215 case ConvertedType::INT_64:
219 row_values[col] =
static_cast<double>(tmp);
222 case ConvertedType::UINT_8:
226 row_values[col] =
static_cast<double>(tmp);
229 case ConvertedType::UINT_16:
233 row_values[col] =
static_cast<double>(tmp);
236 case ConvertedType::UINT_32:
240 row_values[col] =
static_cast<double>(tmp);
243 case ConvertedType::UINT_64:
247 row_values[col] =
static_cast<double>(tmp);
258 row_values[col] =
static_cast<double>(tmp);
265 row_values[col] =
static_cast<double>(tmp);
276 row_values[col] =
static_cast<double>(tmp);
280 os >> row_values[col];
288 os >> parquet::EndRow;
290 double timestamp = timestamp_column >= 0 ? row_values[timestamp_column] : row;
293 for(
size_t col=0; col<num_columns; col++)
295 if( !valid_column[col] )
300 if( valid_column[col] )
302 series[col]->pushBack( {timestamp, row_values[col] });
311 QDomElement elem = doc.createElement(
"default");
313 elem.setAttribute(
"radioIndexChecked",
ui->radioButtonIndex->isChecked());
314 elem.setAttribute(
"parseDateTime",
ui->checkBoxDateFormat->isChecked());
315 elem.setAttribute(
"dateFromat",
ui->lineEditDateFormat->text());
317 parent_element.appendChild(elem);
323 QDomElement elem = parent_element.firstChildElement(
"default");
326 if (elem.hasAttribute(
"prevTimestamp"))
330 if (elem.hasAttribute(
"radioIndexChecked"))
332 bool checked = elem.attribute(
"radioIndexChecked").toInt();
333 ui->radioButtonIndex->setChecked(checked);
335 if (elem.hasAttribute(
"parseDateTime"))
337 bool checked = elem.attribute(
"parseDateTime").toInt();
338 ui->checkBoxDateFormat->setChecked(checked);
340 if (elem.hasAttribute(
"dateFromat"))
342 ui->lineEditDateFormat->setText( elem.attribute(
"dateFromat") );
~DataLoadParquet() override
QString filename
name of the file to open
virtual bool readDataFromFile(PJ::FileLoadInfo *fileload_info, PlotDataMapRef &destination) override
std::unique_ptr< parquet::ParquetFileReader > parquet_reader_
virtual const std::vector< const char * > & compatibleFileExtensions() const override
Provide a list of file extensions that this plugin can open.
TimeseriesMap::iterator addNumeric(const std::string &name, PlotGroup::Ptr group={})
const T & move(const T &v)
QString _default_time_axis
virtual bool xmlSaveState(QDomDocument &doc, QDomElement &parent_element) const override
Override this method to save the status of the plugin to XML.
virtual bool xmlLoadState(const QDomElement &parent_element) override
Override this method to load the status of the plugin from XML.
virtual const char * name() const override
Name of the plugin type, NOT the particular instance.