diff --git a/Desktop/analysis/analysis.cpp b/Desktop/analysis/analysis.cpp index b49004f83d..895a3df905 100644 --- a/Desktop/analysis/analysis.cpp +++ b/Desktop/analysis/analysis.cpp @@ -518,13 +518,18 @@ performType Analysis::desiredPerformTypeFromAnalysisStatus() const } } -std::set Analysis::usedVariables() +stringset Analysis::usedVariables() { if (form()) return form()->usedVariables(); return {}; } +stringset Analysis::createdVariables() +{ + return DataSetPackage::pkg()->columnsCreatedByAnalysis(this); +} + void Analysis::runScriptRequestDone(const QString& result, const QString& controlName, bool hasError) { if (_analysisForm) diff --git a/Desktop/analysis/analysis.h b/Desktop/analysis/analysis.h index 7fea9594a1..748d9708f3 100644 --- a/Desktop/analysis/analysis.h +++ b/Desktop/analysis/analysis.h @@ -146,6 +146,7 @@ class Analysis : public AnalysisBase performType desiredPerformTypeFromAnalysisStatus() const; stringset usedVariables(); + stringset createdVariables(); void runScriptRequestDone(const QString & result, const QString & controlName, bool hasError); void setUpgradeMsgs(const Modules::UpgradeMsgs & msgs); diff --git a/Desktop/data/computedcolumnsmodel.cpp b/Desktop/data/computedcolumnsmodel.cpp index b50037ad20..beb6833e13 100644 --- a/Desktop/data/computedcolumnsmodel.cpp +++ b/Desktop/data/computedcolumnsmodel.cpp @@ -268,9 +268,11 @@ void ComputedColumnsModel::checkForDependentAnalyses(const std::string & columnN { Analyses::analyses()->applyToAll([&](Analysis * analysis) { - std::set usedCols = analysis->usedVariables(); + stringset usedCols = analysis->usedVariables(), + createdCols = analysis->createdVariables(); - if(usedCols.count(columnName) > 0) + //Dont create an infinite loop please + if(usedCols.count(columnName) && !createdCols.count(columnName)) { bool allColsValidated = true; diff --git a/Desktop/data/datasetpackage.cpp b/Desktop/data/datasetpackage.cpp index f9c149c42d..2257182dd5 100644 --- a/Desktop/data/datasetpackage.cpp +++ b/Desktop/data/datasetpackage.cpp @@ -2602,11 +2602,25 @@ void DataSetPackage::checkComputedColumnDependenciesForAnalysis(Analysis * analy { if(!_dataSet) return; - + for(Column * col : _dataSet->columns()) if(col->isComputedByAnalysis(analysis->id())) col->setDependsOn(analysis->usedVariables()); - + +} + +stringset DataSetPackage::columnsCreatedByAnalysis(Analysis * analysis) +{ + if(!_dataSet) + return {}; + + stringset cols; + + for(Column * col : _dataSet->columns()) + if(col->analysisId() == analysis->id()) + cols.insert(col->name()); + + return cols; } Column * DataSetPackage::createComputedColumn(const std::string & name, columnType type, computedColumnType desiredType, Analysis * analysis) diff --git a/Desktop/data/datasetpackage.h b/Desktop/data/datasetpackage.h index 5eb721e94e..f12e93e248 100644 --- a/Desktop/data/datasetpackage.h +++ b/Desktop/data/datasetpackage.h @@ -281,7 +281,8 @@ class DataSetPackage : public QAbstractItemModel //Not QAbstractTableModel becau void databaseStartSynching(bool syncImmediately); void databaseStopSynching(); bool synchingExternally() const; - void checkComputedColumnDependenciesForAnalysis(Analysis * analysis); + void checkComputedColumnDependenciesForAnalysis( Analysis * analysis); + stringset columnsCreatedByAnalysis( Analysis * analysis); std::string freeNewColumnName(size_t startHere); void dbDelete();