Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unknown computed column type #5377

Merged
merged 4 commits into from
Jan 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions CommonData/column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -211,7 +211,6 @@ void Column::setCodeType(computedColumnType codeType)
_analysisId = -1;

_codeType = codeType;
_isComputed = _codeType != computedColumnType::notComputed && _codeType != computedColumnType::analysisNotComputed;

dbUpdateComputedColumnStuff();
}
Expand Down Expand Up @@ -299,7 +298,6 @@ void Column::setCompColStuff(bool invalidated, computedColumnType codeType, cons
{
JASPTIMER_SCOPE(Column::setCompColStuff);

_isComputed = true;
_invalidated = invalidated;
_codeType = codeType;
_rCode = rCode;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
5 changes: 2 additions & 3 deletions CommonData/column.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down Expand Up @@ -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,
Expand Down
38 changes: 22 additions & 16 deletions CommonData/databaseinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include "log.h"
#include "dataset.h"
#include "columntype.h"
#include "version"

DatabaseInterface * DatabaseInterface::_singleton = nullptr;

Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -1068,10 +1073,9 @@ std::string DatabaseInterface::_wrap_sqlite3_column_text(sqlite3_stmt * stmt, in
return !col ? "" : std::string(reinterpret_cast<const char*>(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<void(sqlite3_stmt *stmt)> prepare = [&](sqlite3_stmt *stmt)
{
Expand All @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions CommonData/databaseinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down