diff --git a/cpp/src/db/DB.h b/cpp/src/db/DB.h index f52042b22f..da3c50a8b9 100644 --- a/cpp/src/db/DB.h +++ b/cpp/src/db/DB.h @@ -30,6 +30,9 @@ public: virtual Status search(const std::string& group_id, size_t k, size_t nq, const float* vectors, QueryResults& results) = 0; + virtual Status search(const std::string& group_id, size_t k, size_t nq, + const float* vectors, const meta::DatesT& dates, QueryResults& results) = 0; + virtual Status drop_all() = 0; virtual Status count(const std::string& group_id, long& result) = 0; diff --git a/cpp/src/db/DBImpl.cpp b/cpp/src/db/DBImpl.cpp index ff65f4e91e..0720e6a99f 100644 --- a/cpp/src/db/DBImpl.cpp +++ b/cpp/src/db/DBImpl.cpp @@ -57,14 +57,21 @@ Status DBImpl::add_vectors(const std::string& group_id_, } } -// TODO(XUPENG): add search range based on time Status DBImpl::search(const std::string &group_id, size_t k, size_t nq, const float *vectors, QueryResults &results) { + meta::DatesT dates = {meta::Meta::GetDate()}; + return search(group_id, k, nq, vectors, dates, results); +} + +Status DBImpl::search(const std::string& group_id, size_t k, size_t nq, + const float* vectors, const meta::DatesT& dates, QueryResults& results) { + meta::DatePartionedGroupFilesSchema files; - std::vector partition; - auto status = _pMeta->files_to_search(group_id, partition, files); + auto status = _pMeta->files_to_search(group_id, dates, files); if (!status.ok()) { return status; } + LOG(DEBUG) << "Search DateT Size=" << files.size(); + meta::GroupFilesSchema index_files; meta::GroupFilesSchema raw_files; for (auto &day_files : files) { diff --git a/cpp/src/db/DBImpl.h b/cpp/src/db/DBImpl.h index e7d0d48056..eda179a9b2 100644 --- a/cpp/src/db/DBImpl.h +++ b/cpp/src/db/DBImpl.h @@ -36,6 +36,9 @@ public: virtual Status search(const std::string& group_id, size_t k, size_t nq, const float* vectors, QueryResults& results) override; + virtual Status search(const std::string& group_id, size_t k, size_t nq, + const float* vectors, const meta::DatesT& dates, QueryResults& results) override; + virtual Status drop_all() override; virtual Status count(const std::string& group_id, long& result) override; diff --git a/cpp/src/db/DBMetaImpl.cpp b/cpp/src/db/DBMetaImpl.cpp index 38295974ea..ba8373ab5c 100644 --- a/cpp/src/db/DBMetaImpl.cpp +++ b/cpp/src/db/DBMetaImpl.cpp @@ -253,10 +253,12 @@ Status DBMetaImpl::files_to_index(GroupFilesSchema& files) { } Status DBMetaImpl::files_to_search(const std::string &group_id, - std::vector partition, + const DatesT& partition, DatePartionedGroupFilesSchema &files) { - // TODO: support data partition files.clear(); + DatesT today = {Meta::GetDate()}; + const DatesT& dates = (partition.empty() == true) ? today : partition; + try { auto selected = ConnectorPtr->select(columns(&GroupFileSchema::id, &GroupFileSchema::group_id, @@ -265,6 +267,7 @@ Status DBMetaImpl::files_to_search(const std::string &group_id, &GroupFileSchema::rows, &GroupFileSchema::date), where(c(&GroupFileSchema::group_id) == group_id and + in(&GroupFileSchema::date, dates) and (c(&GroupFileSchema::file_type) == (int) GroupFileSchema::RAW or c(&GroupFileSchema::file_type) == (int) GroupFileSchema::INDEX))); diff --git a/cpp/src/db/DBMetaImpl.h b/cpp/src/db/DBMetaImpl.h index 303c0f84b4..5fbf04c1b6 100644 --- a/cpp/src/db/DBMetaImpl.h +++ b/cpp/src/db/DBMetaImpl.h @@ -39,7 +39,7 @@ public: DatePartionedGroupFilesSchema& files) override; virtual Status files_to_search(const std::string& group_id, - std::vector partition, + const DatesT& partition, DatePartionedGroupFilesSchema& files) override; virtual Status files_to_index(GroupFilesSchema&) override; diff --git a/cpp/src/db/Meta.h b/cpp/src/db/Meta.h index e79e472518..bf9d55847c 100644 --- a/cpp/src/db/Meta.h +++ b/cpp/src/db/Meta.h @@ -15,6 +15,7 @@ namespace meta { typedef int DateT; const DateT EmptyDate = -1; +typedef std::vector DatesT; struct GroupSchema { size_t id; @@ -72,7 +73,7 @@ public: virtual Status update_files(GroupFilesSchema& files) = 0; virtual Status files_to_search(const std::string& group_id, - std::vector partition, + const DatesT& partition, DatePartionedGroupFilesSchema& files) = 0; virtual Status files_to_merge(const std::string& group_id,