From a2bc6d55d3b14832bab5f4ccc3ef8f69f42942f9 Mon Sep 17 00:00:00 2001
From: Martin Hanzik <martin@hanzik.com>
Date: Wed, 9 May 2018 18:18:43 +0200
Subject: [PATCH] Sequential processing fixes

---
 agui2/src/MainWindow.cpp               |  5 +++++
 agui2/src/Models/AlgorithmModelBox.cpp |  9 ++++-----
 agui2/src/Models/AlgorithmModelBox.hpp |  3 ++-
 agui2/src/Models/InputModelBox.cpp     |  2 +-
 agui2/src/Models/InputModelBox.hpp     |  4 +++-
 agui2/src/Models/ModelBox.cpp          | 15 +++++++++++++++
 agui2/src/Models/ModelBox.hpp          |  6 +++++-
 agui2/src/Models/OutputModelBox.cpp    |  5 ++---
 agui2/src/Models/OutputModelBox.hpp    |  2 +-
 9 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/agui2/src/MainWindow.cpp b/agui2/src/MainWindow.cpp
index cbaa1c4460..53c956c88a 100644
--- a/agui2/src/MainWindow.cpp
+++ b/agui2/src/MainWindow.cpp
@@ -57,7 +57,12 @@ void MainWindow::on_RunBtn_clicked()
 {
     std::shared_ptr<abstraction::OperationAbstraction> result;
     try {
+#if 0
+        this->outputBox->getModelBox()->clearResultRecursive();
+        result = this->outputBox->getModelBox()->run();
+#else
         result = ParallelExecutor::getInstance()->execute(dynamic_cast<OutputModelBox*>(this->outputBox->getModelBox()));
+#endif
     }
     catch (const exception::CommonException& e) {
         this->displayError(QString::fromStdString(e.getCause()));
diff --git a/agui2/src/Models/AlgorithmModelBox.cpp b/agui2/src/Models/AlgorithmModelBox.cpp
index 2b7ff128ce..261ad6a481 100644
--- a/agui2/src/Models/AlgorithmModelBox.cpp
+++ b/agui2/src/Models/AlgorithmModelBox.cpp
@@ -10,18 +10,17 @@ AlgorithmModelBox::AlgorithmModelBox(Algorithm* algorithm)
     : ModelBox(ModelType::Algorithm, algorithm->getInputCount())
     , algorithm(algorithm) {}
 
-std::shared_ptr<abstraction::OperationAbstraction> AlgorithmModelBox::run() {
+std::shared_ptr<abstraction::OperationAbstraction> AlgorithmModelBox::runInternal() {
     std::vector<std::shared_ptr<abstraction::OperationAbstraction>> params;
-    for (const auto* input: this->inputs)
+    for (auto* input: this->inputs)
     {
         if (!input)
             return nullptr;
-        params.push_back(input->getResult());
+        params.push_back(input->run());
         if (!params.back())
             return nullptr;
     }
-    this->result = this->algorithm->execute(params);
-    return this->result;
+    return this->algorithm->execute(params);
 }
 
 std::string AlgorithmModelBox::getName() const {
diff --git a/agui2/src/Models/AlgorithmModelBox.hpp b/agui2/src/Models/AlgorithmModelBox.hpp
index b5f5ba172d..6aa0293628 100644
--- a/agui2/src/Models/AlgorithmModelBox.hpp
+++ b/agui2/src/Models/AlgorithmModelBox.hpp
@@ -9,7 +9,8 @@ public:
     std::string getName() const override;
     Algorithm* getAlgorithm() const { return this->algorithm; }
 
-    std::shared_ptr<abstraction::OperationAbstraction> run() override;
+protected:
+    std::shared_ptr<abstraction::OperationAbstraction> runInternal() override;
 
 private:
     Algorithm* algorithm;
diff --git a/agui2/src/Models/InputModelBox.cpp b/agui2/src/Models/InputModelBox.cpp
index 68886f469f..0456e740c8 100644
--- a/agui2/src/Models/InputModelBox.cpp
+++ b/agui2/src/Models/InputModelBox.cpp
@@ -4,7 +4,7 @@ InputModelBox::InputModelBox()
     : ModelBox(ModelType::Input, 0)
 {}
 
-std::shared_ptr<abstraction::OperationAbstraction> InputModelBox::run() {
+std::shared_ptr<abstraction::OperationAbstraction> InputModelBox::runInternal() {
     return this->result;
 }
 
diff --git a/agui2/src/Models/InputModelBox.hpp b/agui2/src/Models/InputModelBox.hpp
index 0f64c44bb1..8e4a01105f 100644
--- a/agui2/src/Models/InputModelBox.hpp
+++ b/agui2/src/Models/InputModelBox.hpp
@@ -6,7 +6,9 @@ class InputModelBox : public ModelBox {
 public:
     explicit InputModelBox();
 
-    std::shared_ptr<abstraction::OperationAbstraction> run() override;
+    void clearResultRecursive() override {}
+
+    std::shared_ptr<abstraction::OperationAbstraction> runInternal() override;
 
     std::string getName() const override;
 
diff --git a/agui2/src/Models/ModelBox.cpp b/agui2/src/Models/ModelBox.cpp
index d4df67e28e..89ef621d54 100644
--- a/agui2/src/Models/ModelBox.cpp
+++ b/agui2/src/Models/ModelBox.cpp
@@ -34,3 +34,18 @@ void ModelBox::removeOutput(ModelBox* model, uint8_t slot) {
     Q_ASSERT(this->canHaveOutput());
     this->outputs.erase({model, slot});
 }
+
+std::shared_ptr<abstraction::OperationAbstraction> ModelBox::run() {
+    if (!this->result)
+        this->result = this->runInternal();
+
+    return this->result;
+}
+
+void ModelBox::clearResultRecursive() {
+    this->result.reset();
+    for (auto* input: this->inputs) {
+        input->clearResultRecursive();
+    }
+
+}
diff --git a/agui2/src/Models/ModelBox.hpp b/agui2/src/Models/ModelBox.hpp
index 5227ff4fc3..747c27d970 100644
--- a/agui2/src/Models/ModelBox.hpp
+++ b/agui2/src/Models/ModelBox.hpp
@@ -34,9 +34,13 @@ public:
     virtual bool canHaveOutput() const { return true; }
 
     std::shared_ptr<abstraction::OperationAbstraction> getResult() const { return this->result; }
+    virtual void clearResultRecursive();
+
+    std::shared_ptr<abstraction::OperationAbstraction> run();
 
-    virtual std::shared_ptr<abstraction::OperationAbstraction> run() = 0;
 protected:
+    virtual std::shared_ptr<abstraction::OperationAbstraction> runInternal() = 0;
+
     ModelType type;
 
     uint8_t maxInputCount = 0;
diff --git a/agui2/src/Models/OutputModelBox.cpp b/agui2/src/Models/OutputModelBox.cpp
index c33a92d082..b7a54af9f4 100644
--- a/agui2/src/Models/OutputModelBox.cpp
+++ b/agui2/src/Models/OutputModelBox.cpp
@@ -6,12 +6,11 @@ OutputModelBox::OutputModelBox()
     : ModelBox(ModelType::Output, 1)
 {}
 
-std::shared_ptr<abstraction::OperationAbstraction> OutputModelBox::run() {
+std::shared_ptr<abstraction::OperationAbstraction> OutputModelBox::runInternal() {
     assert(this->inputs.size() == 1);
     if (!this->inputs[0])
         return nullptr;
-    this->result = inputs[0]->getResult();
-    return this->result;
+    return inputs[0]->run();
 }
 
 std::string OutputModelBox::getName() const {
diff --git a/agui2/src/Models/OutputModelBox.hpp b/agui2/src/Models/OutputModelBox.hpp
index ef4d513766..3bfb8545b2 100644
--- a/agui2/src/Models/OutputModelBox.hpp
+++ b/agui2/src/Models/OutputModelBox.hpp
@@ -9,7 +9,7 @@ public:
 
     bool canHaveOutput() const override { return false; }
 
-    std::shared_ptr<abstraction::OperationAbstraction> run() override;
+    std::shared_ptr<abstraction::OperationAbstraction> runInternal() override;
 };
 
 
-- 
GitLab