From 5732b5008fb080ab5a7b68a01dba0b37adfc2efa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jacob=20St=C3=B8ren?= <jacob.storen@ceetronSolutions.com>
Date: Tue, 31 May 2016 13:37:50 +0200
Subject: [PATCH] Cached result variables in the summary reader Fixed late
 field initialization Additional cleanup and rename

---
 .../Application/RiaPreferences.cpp            |  2 +-
 .../FileInterface/RifReaderEclipseSummary.cpp | 20 +++++++++++--------
 .../FileInterface/RifReaderEclipseSummary.h   | 17 +++++++++-------
 ApplicationCode/ProjectDataModel/RimCase.h    |  5 ++---
 .../RimSummaryPlotCollection.cpp              | 14 ++++++-------
 .../RimSummaryPlotCollection.h                |  4 ++--
 6 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/ApplicationCode/Application/RiaPreferences.cpp b/ApplicationCode/Application/RiaPreferences.cpp
index aabcf2ae8a..5a970e0b40 100644
--- a/ApplicationCode/Application/RiaPreferences.cpp
+++ b/ApplicationCode/Application/RiaPreferences.cpp
@@ -81,8 +81,8 @@ RiaPreferences::RiaPreferences(void)
     CAF_PDM_InitField(&loadAndShowSoil, "loadAndShowSoil", true, "Load and show SOIL", "", "", "");
     loadAndShowSoil.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN);
 
-    readerSettings = new RifReaderSettings;
     CAF_PDM_InitFieldNoDefault(&readerSettings,        "readerSettings", "Reader settings", "", "", "");
+    readerSettings = new RifReaderSettings;
 }
 
 //--------------------------------------------------------------------------------------------------
diff --git a/ApplicationCode/FileInterface/RifReaderEclipseSummary.cpp b/ApplicationCode/FileInterface/RifReaderEclipseSummary.cpp
index 15b39e07bb..e8aa075be4 100644
--- a/ApplicationCode/FileInterface/RifReaderEclipseSummary.cpp
+++ b/ApplicationCode/FileInterface/RifReaderEclipseSummary.cpp
@@ -47,7 +47,10 @@ RifReaderEclipseSummary::~RifReaderEclipseSummary()
 //--------------------------------------------------------------------------------------------------
 bool RifReaderEclipseSummary::open(const std::string& headerFileName, const std::vector<std::string>& dataFileNames)
 {
-    assert(ecl_sum == NULL);
+    assert(ecl_sum == NULL); 
+    
+    if (headerFileName.empty() || dataFileNames.size() == 0) return false;
+
     assert(!headerFileName.empty());
     assert(dataFileNames.size() > 0);
 
@@ -106,17 +109,18 @@ std::vector<std::string> RifReaderEclipseSummary::variableNames() const
 //--------------------------------------------------------------------------------------------------
 /// 
 //--------------------------------------------------------------------------------------------------
-std::vector<RifEclipseSummaryAddress> RifReaderEclipseSummary::allResultAddresses() const
+const std::vector<RifEclipseSummaryAddress>& RifReaderEclipseSummary::allResultAddresses() 
 {
-    std::vector<RifEclipseSummaryAddress> addresses;
-
-    std::vector<std::string> fileVariableNames = variableNames();
-    for (size_t i = 0; i < fileVariableNames.size(); i++)
+    if (m_allResultAddresses.size() == 0)
     {
-        addresses.push_back(RifEclipseSummaryAddress(fileVariableNames[i]));
+        std::vector<std::string> fileVariableNames = variableNames();
+        for(size_t i = 0; i < fileVariableNames.size(); i++)
+        {
+            m_allResultAddresses.push_back(RifEclipseSummaryAddress(fileVariableNames[i]));
+        }
     }
 
-    return addresses;
+    return m_allResultAddresses;
 }
 
 //--------------------------------------------------------------------------------------------------
diff --git a/ApplicationCode/FileInterface/RifReaderEclipseSummary.h b/ApplicationCode/FileInterface/RifReaderEclipseSummary.h
index d4024ae211..d17a350fd4 100644
--- a/ApplicationCode/FileInterface/RifReaderEclipseSummary.h
+++ b/ApplicationCode/FileInterface/RifReaderEclipseSummary.h
@@ -23,20 +23,17 @@
 #include <string>
 #include <vector>
 
+#include "cvfObject.h"
+
 
 class QDateTime;
 
-// Taken from ecl_sum.h
-typedef struct ecl_sum_struct ecl_sum_type;
-
-// Taken from stringlist.h
-typedef struct stringlist_struct stringlist_type;
 
 //==================================================================================================
 //
 //
 //==================================================================================================
-class RifReaderEclipseSummary
+class RifReaderEclipseSummary : public cvf::Object
 {
 public:
     RifReaderEclipseSummary();
@@ -46,7 +43,7 @@ public:
     void    close();
 
     std::vector<std::string> variableNames() const;
-    std::vector<RifEclipseSummaryAddress> allResultAddresses() const;
+    const std::vector<RifEclipseSummaryAddress>& allResultAddresses();
 
     std::vector<time_t> timeSteps() const;
 
@@ -61,8 +58,14 @@ private:
 
     int     timeStepCount() const;
 
+    // Taken from stringlist.h
+    typedef struct stringlist_struct stringlist_type;
     static void    populateVectorFromStringList(stringlist_type* stringList, std::vector<std::string>* strings);
 
 private:
+    // Taken from ecl_sum.h
+    typedef struct ecl_sum_struct ecl_sum_type;
     ecl_sum_type* ecl_sum;
+    std::vector<RifEclipseSummaryAddress> m_allResultAddresses;
 };
+
diff --git a/ApplicationCode/ProjectDataModel/RimCase.h b/ApplicationCode/ProjectDataModel/RimCase.h
index fefae0e538..934c7c80b6 100644
--- a/ApplicationCode/ProjectDataModel/RimCase.h
+++ b/ApplicationCode/ProjectDataModel/RimCase.h
@@ -40,15 +40,13 @@ public:
     RimCase();
     virtual ~RimCase();
     
+    caf::PdmField<int>                          caseId;
     caf::PdmField<QString>                      caseUserDescription;
 
-    caf::PdmField<int>                          caseId;
     virtual std::vector<RimView*>               views() = 0;
 
     virtual void                                updateFilePathsFromProjectPath(const QString& projectPath, const QString& oldProjectPath) = 0;
 
-    virtual caf::PdmFieldHandle*                userDescriptionField()  { return &caseUserDescription; }
-
     virtual QStringList                         timeStepStrings() = 0;
     virtual QString                             timeStepName(int frameIdx) = 0;
 
@@ -61,6 +59,7 @@ protected:
     static QString                              relocateFile(const QString& fileName, const QString& newProjectPath, const QString& oldProjectPath, 
                                                              bool* foundFile, std::vector<QString>* searchedPaths);
 private:
+    virtual caf::PdmFieldHandle*                userDescriptionField() override { return &caseUserDescription; }
 };
 
 
diff --git a/ApplicationCode/ProjectDataModel/RimSummaryPlotCollection.cpp b/ApplicationCode/ProjectDataModel/RimSummaryPlotCollection.cpp
index c1b323b8f8..96b0ff61fa 100644
--- a/ApplicationCode/ProjectDataModel/RimSummaryPlotCollection.cpp
+++ b/ApplicationCode/ProjectDataModel/RimSummaryPlotCollection.cpp
@@ -62,16 +62,16 @@ RimSummaryPlotCollection::~RimSummaryPlotCollection()
 //--------------------------------------------------------------------------------------------------
 /// 
 //--------------------------------------------------------------------------------------------------
-RifReaderEclipseSummary* RimSummaryPlotCollection::getOrCreateSummaryFileReader(const QString& eclipseCase)
+RifReaderEclipseSummary* RimSummaryPlotCollection::getOrCreateSummaryFileReader(const QString& eclipseCaseFilePathBasename)
 {
-    auto it = m_summaryFileReaders.find(eclipseCase);
+    auto it = m_summaryFileReaders.find(eclipseCaseFilePathBasename);
     if (it != m_summaryFileReaders.end())
     {
         return it->second;
     }
     else
     {
-        return createSummaryFileReader(eclipseCase);
+        return createSummaryFileReader(eclipseCaseFilePathBasename);
     }
 }
 
@@ -93,15 +93,15 @@ RifReaderEclipseSummary* RimSummaryPlotCollection::getOrCreateSummaryFileReader(
 //--------------------------------------------------------------------------------------------------
 /// 
 //--------------------------------------------------------------------------------------------------
-RifReaderEclipseSummary* RimSummaryPlotCollection::createSummaryFileReader(const QString& eclipseCase)
+RifReaderEclipseSummary* RimSummaryPlotCollection::createSummaryFileReader(const QString& eclipseCaseFilePathBasename)
 {
     std::string headerFile;
     bool isFormatted = false;
-    RifEclipseSummaryTools::findSummaryHeaderFile(eclipseCase.toStdString(), &headerFile, &isFormatted);
+    RifEclipseSummaryTools::findSummaryHeaderFile(eclipseCaseFilePathBasename.toStdString(), &headerFile, &isFormatted);
     
     if (headerFile.empty()) return nullptr;
 
-    std::vector<std::string> dataFiles = RifEclipseSummaryTools::findSummaryDataFiles(eclipseCase.toStdString());
+    std::vector<std::string> dataFiles = RifEclipseSummaryTools::findSummaryDataFiles(eclipseCaseFilePathBasename.toStdString());
 
     if (!dataFiles.size()) return nullptr;
 
@@ -114,7 +114,7 @@ RifReaderEclipseSummary* RimSummaryPlotCollection::createSummaryFileReader(const
     }
     else
     {
-        m_summaryFileReaders.insert(std::make_pair(eclipseCase, reader));
+        m_summaryFileReaders.insert(std::make_pair(eclipseCaseFilePathBasename, reader));
         return reader;
     }
 }
diff --git a/ApplicationCode/ProjectDataModel/RimSummaryPlotCollection.h b/ApplicationCode/ProjectDataModel/RimSummaryPlotCollection.h
index c26f3b1d94..2356522f9d 100644
--- a/ApplicationCode/ProjectDataModel/RimSummaryPlotCollection.h
+++ b/ApplicationCode/ProjectDataModel/RimSummaryPlotCollection.h
@@ -46,8 +46,8 @@ public:
     caf::PdmChildArrayField<RimSummaryPlot*> m_summaryPlots;
 
 private:
-    RifReaderEclipseSummary* createSummaryFileReader(const QString& eclipseCase);
-    RifReaderEclipseSummary* getOrCreateSummaryFileReader(const QString& eclipseCase);
+    RifReaderEclipseSummary* createSummaryFileReader(const QString& eclipseCaseFilePathBasename);
+    RifReaderEclipseSummary* getOrCreateSummaryFileReader(const QString& eclipseCaseFilePathBasename);
 
 private:
     // Map from path to case to summary file reader objects