diff --git a/cpp/src/db/DB.h b/cpp/src/db/DB.h index 450a980c4a5ab04583fa0da9653533df579812b0..6f922475b5f7ca915fdc6c2f590de2c1c89443e3 100644 --- a/cpp/src/db/DB.h +++ b/cpp/src/db/DB.h @@ -23,6 +23,8 @@ public: virtual Status add_group(meta::GroupSchema& group_info_) = 0; virtual Status get_group(meta::GroupSchema& group_info_) = 0; + virtual Status delete_vectors(const std::string& group_id, + const meta::DatesT& dates) = 0; virtual Status has_group(const std::string& group_id_, bool& has_or_not_) = 0; virtual Status get_group_files(const std::string& group_id_, const int date_delta_, diff --git a/cpp/src/db/DBImpl.cpp b/cpp/src/db/DBImpl.cpp index 216a9b352df593f3949cdc3989208e3d268fa3ed..72b053231b8d90fd3b303e2290f85cad90075d76 100644 --- a/cpp/src/db/DBImpl.cpp +++ b/cpp/src/db/DBImpl.cpp @@ -44,6 +44,12 @@ Status DBImpl::get_group(meta::GroupSchema& group_info) { return _pMeta->get_group(group_info); } +template +Status DBImpl::delete_vectors(const std::string& group_id, + const meta::DatesT& dates) { + return _pMeta->delete_group_partitions(group_id, dates); +} + template Status DBImpl::has_group(const std::string& group_id_, bool& has_or_not_) { return _pMeta->has_group(group_id_, has_or_not_); diff --git a/cpp/src/db/DBImpl.h b/cpp/src/db/DBImpl.h index d2aed0af1d1d729adc520b45fb11c74335c8e8d5..45f249bd068d85a8cd15ac21c93d719322cdd087 100644 --- a/cpp/src/db/DBImpl.h +++ b/cpp/src/db/DBImpl.h @@ -35,6 +35,7 @@ public: virtual Status add_group(meta::GroupSchema& group_info) override; virtual Status get_group(meta::GroupSchema& group_info) override; + virtual Status delete_vectors(const std::string& group_id, const meta::DatesT& dates) override; virtual Status has_group(const std::string& group_id_, bool& has_or_not_) override; virtual Status get_group_files(const std::string& group_id_, diff --git a/cpp/src/db/DBMetaImpl.cpp b/cpp/src/db/DBMetaImpl.cpp index aaaaf21ce4ef93e8812b5d17c742d5b946ed6a14..b15180817da93dcd2a21020793c2d335a1e9d3b3 100644 --- a/cpp/src/db/DBMetaImpl.cpp +++ b/cpp/src/db/DBMetaImpl.cpp @@ -104,6 +104,44 @@ Status DBMetaImpl::initialize() { return Status::OK(); } +// PXU TODO: Temp solution. Will fix later +Status DBMetaImpl::delete_group_partitions(const std::string& group_id, + const meta::DatesT& dates) { + if (dates.size() == 0) { + return Status::OK(); + } + + GroupSchema group_info; + group_info.group_id = group_id; + auto status = get_group(group_info); + if (!status.ok()) { + return status; + } + + auto yesterday = GetDate(-2); + + for (auto& date : dates) { + if (date >= yesterday) { + return Status::Error("Could not delete partitions with 2 days"); + } + } + + try { + ConnectorPtr->update_all( + set( + c(&GroupFileSchema::file_type) = (int)GroupFileSchema::TO_DELETE + ), + where( + c(&GroupFileSchema::group_id) == group_id and + in(&GroupFileSchema::date, dates) + )); + } catch (std::exception & e) { + LOG(DEBUG) << e.what(); + throw e; + } + return Status::OK(); +} + Status DBMetaImpl::add_group(GroupSchema& group_info) { if (group_info.group_id == "") { std::stringstream ss; diff --git a/cpp/src/db/DBMetaImpl.h b/cpp/src/db/DBMetaImpl.h index aca0ec31416ed523ffd2911c1a9fd4c6852222d7..fab2e1560ad74a378805cc96d862d5f13a1d8001 100644 --- a/cpp/src/db/DBMetaImpl.h +++ b/cpp/src/db/DBMetaImpl.h @@ -24,6 +24,8 @@ public: virtual Status has_group(const std::string& group_id_, bool& has_or_not_) override; virtual Status add_group_file(GroupFileSchema& group_file_info) override; + virtual Status delete_group_partitions(const std::string& group_id, + const meta::DatesT& dates) override; virtual Status has_group_file(const std::string& group_id_, const std::string& file_id_, diff --git a/cpp/src/db/LocalMetaImpl.h b/cpp/src/db/LocalMetaImpl.h index 4c324c57965ce8de4548df3aa4b7649738065474..116c9e4672079f5cd9ffd08c8b2b2dc3a01e909c 100644 --- a/cpp/src/db/LocalMetaImpl.h +++ b/cpp/src/db/LocalMetaImpl.h @@ -22,7 +22,9 @@ public: virtual Status get_group(GroupSchema& group_info_) override; virtual Status has_group(const std::string& group_id_, bool& has_or_not_) override; - virtual Status add_group_file(GroupFileSchema& group_file_info) = 0; + virtual Status add_group_file(GroupFileSchema& group_file_info) override; + /* virtual Status delete_group_partitions(const std::string& group_id, */ + /* const meta::DatesT& dates) override; */ virtual Status has_group_file(const std::string& group_id_, const std::string& file_id_, diff --git a/cpp/src/db/Meta.cpp b/cpp/src/db/Meta.cpp index 1b97c06c79021114360928ea69ebf13de67d6cf9..1bd3a2062250646b31969ee94ee1e4d72cbb0378 100644 --- a/cpp/src/db/Meta.cpp +++ b/cpp/src/db/Meta.cpp @@ -11,13 +11,28 @@ namespace vecwise { namespace engine { namespace meta { -DateT Meta::GetDate(const std::time_t& t) { +DateT Meta::GetDate(const std::time_t& t, int day_delta) { tm *ltm = std::localtime(&t); + if (day_delta > 0) { + do { + ++ltm->tm_mday; + --day_delta; + } while(day_delta > 0); + mktime(ltm); + } else if (day_delta < 0) { + do { + --ltm->tm_mday; + ++day_delta; + } while(day_delta < 0); + mktime(ltm); + } else { + ltm->tm_mday; + } return ltm->tm_year*10000 + ltm->tm_mon*100 + ltm->tm_mday; } -DateT Meta::GetDate() { - return GetDate(std::time(nullptr)); +DateT Meta::GetDate(int day_delta) { + return GetDate(std::time(nullptr), day_delta); } } // namespace meta diff --git a/cpp/src/db/Meta.h b/cpp/src/db/Meta.h index e0c1a84c76f594c99adc74a4b94b23c5d1b82e5e..ffc35b060672c5a76a2853549b14b58319367c68 100644 --- a/cpp/src/db/Meta.h +++ b/cpp/src/db/Meta.h @@ -67,6 +67,8 @@ public: virtual Status has_group(const std::string& group_id_, bool& has_or_not_) = 0; virtual Status add_group_file(GroupFileSchema& group_file_info) = 0; + virtual Status delete_group_partitions(const std::string& group_id, + const meta::DatesT& dates) = 0; virtual Status has_group_file(const std::string& group_id_, const std::string& file_id_, @@ -98,8 +100,8 @@ public: virtual Status count(const std::string& group_id, long& result) = 0; - static DateT GetDate(const std::time_t& t); - static DateT GetDate(); + static DateT GetDate(const std::time_t& t, int day_delta); + static DateT GetDate(int day_delta = 0); }; // MetaData diff --git a/cpp/unittest/db/meta_tests.cpp b/cpp/unittest/db/meta_tests.cpp index 2ede53980390c90338c543c59a9ff2a7177dd0a1..dc11feafad0f478e12127cf535a4c5768c9aaef3 100644 --- a/cpp/unittest/db/meta_tests.cpp +++ b/cpp/unittest/db/meta_tests.cpp @@ -59,6 +59,11 @@ TEST_F(MetaTest, GROUP_FILE_TEST) { ASSERT_TRUE(status.ok()); ASSERT_EQ(group_file.file_type, new_file_type); + meta::DatesT dates; + dates.push_back(meta::Meta::GetDate()); + status = impl_->delete_group_partitions(group_file.group_id, dates); + ASSERT_FALSE(status.ok()); + /* group_file.file_type = meta::GroupFileSchema::NEW; */ /* status = impl_->get_group_file(group_file.group_id, group_file.file_id, group_file); */ /* ASSERT_TRUE(status.ok()); */