diff --git a/CommonData/column.cpp b/CommonData/column.cpp index 6fad9abf0f..54c43414e8 100644 --- a/CommonData/column.cpp +++ b/CommonData/column.cpp @@ -27,8 +27,8 @@ void Column::dbLoad(int id, bool getValues) db().transactionReadBegin(); - db().columnGetBasicInfo( _id, _name, _title, _description, _type, _revision); - _isComputed = db().columnGetComputedInfo( _id, _analysisId, _invalidated, _codeType, _rCode, _error, _constructorJson); + db().columnGetBasicInfo( _id, _name, _title, _description, _type, _revision); + db().columnGetComputedInfo( _id, _analysisId, _invalidated, _codeType, _rCode, _error, _constructorJson); db().labelsLoad(this); @@ -66,7 +66,7 @@ void Column::loadComputedColumnJsonBackwardsCompatibly(const Json::Value & json) //_column = DataSetPackage::pkg()->dataSet()->column(json["name"].asString()); const std::string & rCode = json["rCode"].asString(); - + setCompColStuff ( json["invalidated"].asBool(), @@ -178,7 +178,7 @@ void Column::setCustomEmptyValues(const stringset& customEmptyValues) void Column::dbUpdateComputedColumnStuff() { - db().columnSetComputedInfo(_id, _analysisId, _isComputed, _invalidated, _codeType, _rCode, _error, constructorJsonStr()); + db().columnSetComputedInfo(_id, _analysisId, _invalidated, _codeType, _rCode, _error, constructorJsonStr()); incRevision(); } @@ -211,7 +211,6 @@ void Column::setCodeType(computedColumnType codeType) _analysisId = -1; _codeType = codeType; - _isComputed = _codeType != computedColumnType::notComputed && _codeType != computedColumnType::analysisNotComputed; dbUpdateComputedColumnStuff(); } @@ -299,7 +298,6 @@ void Column::setCompColStuff(bool invalidated, computedColumnType codeType, cons { JASPTIMER_SCOPE(Column::setCompColStuff); - _isComputed = true; _invalidated = invalidated; _codeType = codeType; _rCode = rCode; @@ -2121,7 +2119,6 @@ Json::Value Column::serialize() const json["rCode"] = _rCode; json["type"] = int(_type); json["analysisId"] = _analysisId; - json["isComputed"] = _isComputed; json["invalidated"] = _invalidated; json["codeType"] = int(_codeType); json["error"] = _error; @@ -2181,10 +2178,9 @@ void Column::deserialize(const Json::Value &json) _rCode = json["rCode"].asString(); _error = json["error"].asString(); _constructorJson = json["constructorJson"]; - _isComputed = json["isComputed"].asBool(); _analysisId = json["analysisId"].asInt(); - db().columnSetComputedInfo(_id, _analysisId, _isComputed, _invalidated, _codeType, _rCode, _error, constructorJsonStr()); + db().columnSetComputedInfo(_id, _analysisId, _invalidated, _codeType, _rCode, _error, constructorJsonStr()); _dbls.clear(); diff --git a/CommonData/column.h b/CommonData/column.h index c8ca774f4e..6cfe316a43 100644 --- a/CommonData/column.h +++ b/CommonData/column.h @@ -82,7 +82,7 @@ class Column : public DataSetBaseNode columnType type() const { return _type; } int id() const { return _id; } int analysisId() const { return _analysisId; } - bool isComputed() const { return _isComputed; } + bool isComputed() const { return _codeType != computedColumnType::notComputed && _codeType != computedColumnType::analysisNotComputed; } bool invalidated() const { return _invalidated; } computedColumnType codeType() const { return _codeType; } const std::string & name() const { return _name; } @@ -198,8 +198,7 @@ class Column : public DataSetBaseNode _preEditType = columnType::unknown; int _id = -1, _analysisId = -1; // Actually initialized in DatabaseInterface::columnInsert - bool _isComputed = false, // Actually initialized in DatabaseInterface::columnInsert - _invalidated = false, + bool _invalidated = false, _batchedLabel = false; computedColumnType _codeType = computedColumnType::notComputed; std::string _name, diff --git a/CommonData/databaseinterface.cpp b/CommonData/databaseinterface.cpp index 1adc0eb0d3..b5caa1eea2 100644 --- a/CommonData/databaseinterface.cpp +++ b/CommonData/databaseinterface.cpp @@ -4,7 +4,6 @@ #include "log.h" #include "dataset.h" #include "columntype.h" -#include "version" DatabaseInterface * DatabaseInterface::_singleton = nullptr; @@ -27,6 +26,8 @@ void DatabaseInterface::upgradeDBFromVersion(Version originalVersion) if(originalVersion < "0.18.2") runStatements("ALTER TABLE DataSets ADD COLUMN description TEXT;" "\n"); + //Are you going to 0.19 or higher? Maybe drop isComputed from Columns as its not needed anymore + //Later versions can add new originalVersion < blabla blocks at the end of this "list" transactionWriteEnd(); @@ -1015,10 +1016,14 @@ void DatabaseInterface::columnSetDescription(int columnId, const std::string & d }); } -void DatabaseInterface::columnSetComputedInfo(int columnId, int analysisId, bool isComputed, bool invalidated, computedColumnType codeType, const std::string & rCode, const std::string & error, const std::string & constructorJsonStr) +void DatabaseInterface::columnSetComputedInfo(int columnId, int analysisId, bool invalidated, computedColumnType codeType, const std::string & rCode, const std::string & error, const std::string & constructorJsonStr) { JASPTIMER_SCOPE(DatabaseInterface::columnSetComputedInfo); + // The isComputed is not longer needed in the database (this can be deduced by codeType), but for downgrade purpose, the isComputed is still needed. + // In 0.19 we can remove it from the database. + bool isComputed = codeType != computedColumnType::notComputed && codeType != computedColumnType::analysisNotComputed; + runStatements("UPDATE Columns SET isComputed=?, invalidated=?, codeType=?, rCode=?, error=?, constructorJson=?, analysisId=? WHERE id=?;", [&](sqlite3_stmt * stmt) { std::string codeT = computedColumnTypeToString(codeType); @@ -1068,10 +1073,9 @@ std::string DatabaseInterface::_wrap_sqlite3_column_text(sqlite3_stmt * stmt, in return !col ? "" : std::string(reinterpret_cast(col)); } -bool DatabaseInterface::columnGetComputedInfo(int columnId, int &analysisId, bool &invalidated, computedColumnType &codeType, std::string &rCode, std::string &error, Json::Value &constructorJson) +void DatabaseInterface::columnGetComputedInfo(int columnId, int &analysisId, bool &invalidated, computedColumnType &codeType, std::string &rCode, std::string &error, Json::Value &constructorJson) { JASPTIMER_SCOPE(DatabaseInterface::columnGetComputedInfo); - bool isComputed = false; std::function prepare = [&](sqlite3_stmt *stmt) { @@ -1082,25 +1086,27 @@ bool DatabaseInterface::columnGetComputedInfo(int columnId, int &analysisId, boo { int colCount = sqlite3_column_count(stmt); - assert(colCount == 7); + assert(colCount == 6); - isComputed = sqlite3_column_int( stmt, 0); - invalidated = sqlite3_column_int( stmt, 1); - std::string codeTypeStr = _wrap_sqlite3_column_text(stmt, 2); - rCode = _wrap_sqlite3_column_text(stmt, 3); - error = _wrap_sqlite3_column_text(stmt, 4); - std::string constructorJsonStr = _wrap_sqlite3_column_text(stmt, 5); - analysisId = sqlite3_column_int( stmt, 6); + invalidated = sqlite3_column_int( stmt, 0); + std::string codeTypeStr = _wrap_sqlite3_column_text(stmt, 1); + rCode = _wrap_sqlite3_column_text(stmt, 2); + error = _wrap_sqlite3_column_text(stmt, 3); + std::string constructorJsonStr = _wrap_sqlite3_column_text(stmt, 4); + analysisId = sqlite3_column_int( stmt, 5); - codeType = codeTypeStr.empty() ? computedColumnType::notComputed : computedColumnTypeFromString(codeTypeStr); + codeType = computedColumnType::notComputed; + if (!codeTypeStr.empty()) + { + try { codeType = computedColumnTypeFromString(codeTypeStr); } + catch(...) {} + } constructorJson = Json::objectValue; Json::Reader().parse(constructorJsonStr, constructorJson); }; - runStatements("SELECT isComputed, invalidated, codeType, rCode, error, constructorJson, analysisId FROM Columns WHERE id = ?;", prepare, processRow); - - return isComputed; + runStatements("SELECT invalidated, codeType, rCode, error, constructorJson, analysisId FROM Columns WHERE id = ?;", prepare, processRow); } void DatabaseInterface::labelsClear(int columnId) diff --git a/CommonData/databaseinterface.h b/CommonData/databaseinterface.h index a78047ce71..b2136530f3 100644 --- a/CommonData/databaseinterface.h +++ b/CommonData/databaseinterface.h @@ -127,8 +127,8 @@ class DatabaseInterface void columnSetTitle( int columnId, const std::string & title); void columnSetDescription( int columnId, const std::string & description); void columnGetBasicInfo( int columnId, std::string & name, std::string & title, std::string & description, columnType & colType, int & revision); - void columnSetComputedInfo( int columnId, int analysisId, bool isComputed, bool invalidated, computedColumnType codeType, const std::string & rCode, const std::string & error, const std::string & constructorJson); - bool columnGetComputedInfo( int columnId, int &analysisId, bool & invalidated, computedColumnType & codeType, std::string & rCode, std::string & error, Json::Value & constructorJson); + void columnSetComputedInfo( int columnId, int analysisId, bool invalidated, computedColumnType codeType, const std::string & rCode, const std::string & error, const std::string & constructorJson); + void columnGetComputedInfo( int columnId, int &analysisId, bool & invalidated, computedColumnType & codeType, std::string & rCode, std::string & error, Json::Value & constructorJson); void columnSetValues( int columnId, const intvec & ints); void columnSetValues( int columnId, const doublevec & dbls); void columnSetValue( int columnId, size_t row, int value);