Skip to content

Commit 4dbeb48

Browse files
Barthelemyknopers8
authored andcommitted
Extend CCDB interface to get past data (QC-186) (#181)
* QC-186 extend CCDB interface to get past data * fix for CC7 * formatting
1 parent 4e85147 commit 4dbeb48

6 files changed

Lines changed: 49 additions & 10 deletions

File tree

Framework/include/QualityControl/CcdbDatabase.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,18 @@ class CcdbDatabase : public DatabaseInterface
5555
void connect(std::string host, std::string database, std::string username, std::string password) override;
5656
void connect(const std::unordered_map<std::string, std::string>& config) override;
5757
void store(std::shared_ptr<o2::quality_control::core::MonitorObject> mo) override;
58-
core::MonitorObject* retrieve(std::string taskName, std::string objectName) override;
58+
core::MonitorObject* retrieve(std::string taskName, std::string objectName, long timestamp = 0) override;
5959
std::string retrieveJson(std::string taskName, std::string objectName) override;
6060
void disconnect() override;
6161
void prepareTaskDataContainer(std::string taskName) override;
6262
std::vector<std::string> getListOfTasksWithPublications() override;
6363
std::vector<std::string> getPublishedObjectNames(std::string taskName) override;
6464
void truncate(std::string taskName, std::string objectName) override;
6565
void storeStreamerInfosToFile(std::string filename);
66-
67-
private:
6866
static long getCurrentTimestamp();
6967
static long getFutureTimestamp(int secondsInFuture);
68+
69+
private:
7070
/**
7171
* \brief Load StreamerInfos from a ROOT file.
7272
* When we were not saving TFiles in the CCDB, we streamed ROOT objects without their StreamerInfos.

Framework/include/QualityControl/DatabaseInterface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class DatabaseInterface
6565
* templates)
6666
* TODO evaluate whether we should have a method to retrieve a list of objects (optimization)
6767
*/
68-
virtual o2::quality_control::core::MonitorObject* retrieve(std::string taskName, std::string objectName) = 0;
68+
virtual o2::quality_control::core::MonitorObject* retrieve(std::string taskName, std::string objectName, long timestamp = 0) = 0;
6969

7070
/**
7171
* Returns JSON encoded object

Framework/include/QualityControl/MySqlDatabase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class MySqlDatabase : public DatabaseInterface
3939
void connect(std::string host, std::string database, std::string username, std::string password) override;
4040
void connect(const std::unordered_map<std::string, std::string>& config) override;
4141
void store(std::shared_ptr<o2::quality_control::core::MonitorObject> mo) override;
42-
o2::quality_control::core::MonitorObject* retrieve(std::string taskName, std::string objectName) override;
42+
o2::quality_control::core::MonitorObject* retrieve(std::string taskName, std::string objectName, long timestamp = 0) override;
4343
std::string retrieveJson(std::string taskName, std::string objectName) override;
4444
void disconnect() override;
4545
std::vector<std::string> getPublishedObjectNames(std::string taskName) override;

Framework/src/CcdbDatabase.cxx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,17 @@ void CcdbDatabase::store(std::shared_ptr<o2::quality_control::core::MonitorObjec
114114
ccdbApi.store(mo.get(), path, metadata, from, to);
115115
}
116116

117-
core::MonitorObject* CcdbDatabase::retrieve(std::string taskName, std::string objectName)
117+
core::MonitorObject* CcdbDatabase::retrieve(std::string taskName, std::string objectName, long timestamp)
118118
{
119119
string path = taskName + "/" + objectName;
120120
map<string, string> metadata;
121+
long when = timestamp == 0 ? getCurrentTimestamp() : timestamp;
121122

122123
// we try first to load a TFile
123-
TObject* object = ccdbApi.retrieveFromTFile(path, metadata, getCurrentTimestamp());
124+
TObject* object = ccdbApi.retrieveFromTFile(path, metadata, when);
124125
if (object == nullptr) {
125126
// We could not open a TFile we should now try to open an object directly serialized
126-
object = ccdbApi.retrieve(path, metadata, getCurrentTimestamp());
127+
object = ccdbApi.retrieve(path, metadata, when);
127128
LOG(INFO) << "We could retrieve the object " << path << " as a streamed object.";
128129
if (object == nullptr) {
129130
return nullptr;

Framework/src/MySqlDatabase.cxx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,10 @@ void MySqlDatabase::storeForTask(std::string taskName)
161161
objects.clear();
162162
}
163163

164-
o2::quality_control::core::MonitorObject* MySqlDatabase::retrieve(std::string taskName, std::string objectName)
164+
o2::quality_control::core::MonitorObject* MySqlDatabase::retrieve(std::string taskName, std::string objectName, long timestamp)
165165
{
166+
// TODO use the timestamp
167+
166168
string query;
167169
TMySQLStatement* statement = nullptr;
168170

Framework/test/testCcdbDatabase.cxx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
///
1212
/// \file testCcdbDatabase.cxx
1313
/// \author Adam Wegrzynek
14+
/// \author Bartheley von Haller
1415
///
1516

1617
#include <QualityControl/DatabaseFactory.h>
1718
#include <unordered_map>
19+
#include <QualityControl/CcdbDatabase.h>
1820

1921
#define BOOST_TEST_MODULE CcdbDatabase test
2022
#define BOOST_TEST_MAIN
@@ -26,6 +28,8 @@
2628
#include <TH1F.h>
2729
#include <TFile.h>
2830

31+
namespace utf = boost::unit_test;
32+
2933
namespace o2::quality_control::core
3034
{
3135

@@ -83,7 +87,7 @@ BOOST_AUTO_TEST_CASE(ccdb_store)
8387
f.backend->store(mo1);
8488
}
8589

86-
BOOST_AUTO_TEST_CASE(ccdb_retrieve)
90+
BOOST_AUTO_TEST_CASE(ccdb_retrieve, *utf::depends_on("ccdb_store"))
8791
{
8892
test_fixture f;
8993
MonitorObject* mo = f.backend->retrieve("my/task", "asdf/asdf");
@@ -124,5 +128,37 @@ BOOST_AUTO_TEST_CASE(ccdb_retrievejson)
124128
}
125129
}
126130

131+
BOOST_AUTO_TEST_CASE(ccdb_retrieve_former_versions, *utf::depends_on("ccdb_store"))
132+
{
133+
// store a new object
134+
long initialTimestamp = CcdbDatabase::getCurrentTimestamp();
135+
test_fixture f;
136+
TH1F* h1 = new TH1F("asdf/asdf", "asdf", 100, 0, 99);
137+
h1->FillRandom("gaus", 10001);
138+
shared_ptr<MonitorObject> mo1 = make_shared<MonitorObject>(h1, "my/task");
139+
f.backend->store(mo1);
140+
141+
// Retrieve old object stored at timestampStorage
142+
MonitorObject* mo = f.backend->retrieve("my/task", "asdf/asdf", initialTimestamp);
143+
BOOST_CHECK_NE(mo, nullptr);
144+
TH1F* old = dynamic_cast<TH1F*>(mo->getObject());
145+
BOOST_CHECK_NE(old, nullptr);
146+
BOOST_CHECK_EQUAL(old->GetEntries(), 10000);
147+
148+
// Retrieve latest object with timestamp
149+
MonitorObject* mo2 = f.backend->retrieve("my/task", "asdf/asdf", CcdbDatabase::getCurrentTimestamp());
150+
BOOST_CHECK_NE(mo2, nullptr);
151+
TH1F* latest = dynamic_cast<TH1F*>(mo2->getObject());
152+
BOOST_CHECK_NE(latest, nullptr);
153+
BOOST_CHECK_EQUAL(latest->GetEntries(), 10001);
154+
155+
// Retrieve latest object without timetsamp
156+
MonitorObject* mo3 = f.backend->retrieve("my/task", "asdf/asdf");
157+
BOOST_CHECK_NE(mo3, nullptr);
158+
TH1F* latest2 = dynamic_cast<TH1F*>(mo3->getObject());
159+
BOOST_CHECK_NE(latest2, nullptr);
160+
BOOST_CHECK_EQUAL(latest2->GetEntries(), 10001);
161+
}
162+
127163
} // namespace
128164
} // namespace o2::quality_control::core

0 commit comments

Comments
 (0)