History

TimeSeriesPlatformLibrary: Updated DataRow to properly delete filter expression parser for computed columns upon destruction.

J. Ritchie Carroll committed 7 years ago

Commit d716f1b1 parent c0299365 files · +279 −274Browse files

Showing the changes to Source/Libraries/TimeSeriesPlatformLibrary/Data/DataRow.cpp (1 of 5 files). Show all

Unified · Split

Source/Libraries/TimeSeriesPlatformLibrary/Data/DataRow.cpp+33−21
@@ -49,7 +49,14 @@ DataRow::DataRow(DataTablePtr parent) : · 48 unmodified lines
49DataRow::~DataRow()49DataRow::~DataRow()
50{50{
51 for (uint32_t i = 0; i < m_values.size(); i++)51 for (uint32_t i = 0; i < m_values.size(); i++)
52 free(m_values[i]);52 {
53 const DataColumnPtr column = m_parent->Column(i);
54
55 if (column != nullptr && column->Computed())
56 delete static_cast<FilterExpressionParser*>(m_values[i]);
57 else
58 free(m_values[i]);
59 }
53}60}
54 61
55int32_t DataRow::GetColumnIndex(const string& columnName) const62int32_t DataRow::GetColumnIndex(const string& columnName) const
@@ -88,30 +95,30 @@ ExpressionTreePtr DataRow::GetExpressionTree(const DataColumnPtr& column) · 32 unmodified lines
88{95{
89 const int columnIndex = column->Index();96 const int columnIndex = column->Index();
90 97
91 FilterExpressionParser* parser = static_cast<FilterExpressionParser*>(m_values[columnIndex]);98 if (m_values[columnIndex] == nullptr)
99 {
100 const DataTablePtr& dataTable = column->Parent();
101 FilterExpressionParser* parser = new FilterExpressionParser(column->Expression());
92 102
93 if (parser)103 parser->SetDataSet(dataTable->Parent());
94 return parser->GetExpressionTrees()[0];104 parser->SetPrimaryTableName(dataTable->Name());
105 parser->SetTrackFilteredSignalIDs(false);
106 parser->SetTrackFilteredRows(false);
95 107
96 const DataTablePtr& dataTable = column->Parent();108 const auto expressionTrees = parser->GetExpressionTrees();
97 parser = new FilterExpressionParser(column->Expression());
98 109
99 parser->SetDataSet(dataTable->Parent());110 if (expressionTrees.empty())
100 parser->SetPrimaryTableName(dataTable->Name());111 {
101 parser->SetTrackFilteredSignalIDs(false);112 delete parser;
102 parser->SetTrackFilteredRows(false);113 throw DataSetException("Expression defined for computed DataColumn \"" + column->Name() + " for table \"" + m_parent->Name() + "\" cannot produce a value");
114 }
103 115
104 const auto expressionTrees = parser->GetExpressionTrees();116 m_values[columnIndex] = parser;
105 117
106 if (expressionTrees.empty())118 return expressionTrees[0];
107 {
108 delete parser;
109 throw DataSetException("Expression defined for computed DataColumn \"" + column->Name() + " for table \"" + m_parent->Name() + "\" cannot produce a value");
110 }119 }
111 120
112 m_values[columnIndex] = parser;121 return static_cast<FilterExpressionParser*>(m_values[columnIndex])->GetExpressionTrees()[0];
113
114 return expressionTrees[0];
115}122}
116 123
117Object DataRow::GetComputedValue(const DataColumnPtr& column, DataType targetType)124Object DataRow::GetComputedValue(const DataColumnPtr& column, DataType targetType)
@@ -334,7 +341,7 @@ Object DataRow::GetComputedValue(const DataColumnPtr& column, DataType targetTyp · 216 unmodified lines
334 case DataType::Single:341 case DataType::Single:
335 return static_cast<float32_t>(stod(value));342 return static_cast<float32_t>(stod(value));
336 case DataType::Double:343 case DataType::Double:
337 return stod(value);344 return static_cast<float64_t>(stod(value));
338 case DataType::Decimal:345 case DataType::Decimal:
339 return decimal_t(value);346 return decimal_t(value);
340 case DataType::Guid:347 case DataType::Guid:
@@ -436,7 +443,7 @@ Object DataRow::GetComputedValue(const DataColumnPtr& column, DataType targetTyp · 95 unmodified lines
436 }443 }
437}444}
438 445
439template<typename T>446template<class T>
440Nullable<T> DataRow::GetValue(const int32_t columnIndex, DataType targetType)447Nullable<T> DataRow::GetValue(const int32_t columnIndex, DataType targetType)
441{448{
442 const DataColumnPtr& column = ValidateColumnType(columnIndex, targetType, true);449 const DataColumnPtr& column = ValidateColumnType(columnIndex, targetType, true);
@@ -452,7 +459,7 @@ Nullable<T> DataRow::GetValue(const int32_t columnIndex, DataType targetType) · 9 unmodified lines
452 return nullptr;459 return nullptr;
453}460}
454 461
455template<typename T>462template<class T>
456void DataRow::SetValue(const int32_t columnIndex, const Nullable<T>& value, DataType targetType)463void DataRow::SetValue(const int32_t columnIndex, const Nullable<T>& value, DataType targetType)
457{464{
458 ValidateColumnType(columnIndex, targetType);465 ValidateColumnType(columnIndex, targetType);
@@ -521,6 +528,11 @@ bool DataRow::IsNull(const int32_t columnIndex) · 62 unmodified lines
521 }528 }
522}529}
523 530
531bool DataRow::IsNull(const std::string& columnName)
532{
533 return IsNull(GetColumnIndex(columnName));
534}
535
524void DataRow::SetNullValue(const int32_t columnIndex)536void DataRow::SetNullValue(const int32_t columnIndex)
525{537{
526 const DataColumnPtr column = m_parent->Column(columnIndex);538 const DataColumnPtr column = m_parent->Column(columnIndex);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t