1
0
Fork 0
mirror of https://github.com/KingDuckZ/dindexer.git synced 2025-02-27 13:33:56 +00:00

Implement locate_sets_in_db().

It's finally got fast & easy to write! Too bad it was the last one...
This commit is contained in:
King_DuckZ 2016-07-12 19:01:31 +01:00
parent 346f7ce971
commit 5e69367c2c
4 changed files with 26 additions and 11 deletions

View file

@ -254,12 +254,12 @@ namespace dindb {
return dindb::locate_in_db(m_redis, parSearch, parTags); return dindb::locate_in_db(m_redis, parSearch, parTags);
} }
std::vector<LocatedSet> BackendRedis::locate_sets_in_db (const std::string& parSearch, bool parCaseInsensitive) { std::vector<LocatedSet> BackendRedis::locate_sets_in_db (const std::string& parSubstr, bool parCaseInsensitive) {
return dindb::locate_sets_in_db(m_redis, parSearch, parCaseInsensitive); return dindb::locate_sets_in_db(m_redis, parSubstr, parCaseInsensitive);
} }
std::vector<LocatedSet> BackendRedis::locate_sets_in_db (const std::string& parSearch, const std::vector<GroupIDType>& parSets, bool parCaseInsensitive) { std::vector<LocatedSet> BackendRedis::locate_sets_in_db (const std::string& parSubstr, const std::vector<GroupIDType>& parSets, bool parCaseInsensitive) {
return std::vector<LocatedSet>(); return dindb::locate_sets_in_db(m_redis, parSubstr, parSets, parCaseInsensitive);
} }
std::vector<GroupIDType> BackendRedis::find_all_sets() { std::vector<GroupIDType> BackendRedis::find_all_sets() {

View file

@ -49,8 +49,8 @@ namespace dindb {
virtual std::vector<LocatedItem> locate_in_db ( const std::string& parSearch, const TagList& parTags ) override; virtual std::vector<LocatedItem> locate_in_db ( const std::string& parSearch, const TagList& parTags ) override;
virtual std::vector<LocatedItem> locate_in_db ( const mchlib::TigerHash& parSearch, const TagList& parTags ) override; virtual std::vector<LocatedItem> locate_in_db ( const mchlib::TigerHash& parSearch, const TagList& parTags ) override;
virtual std::vector<LocatedSet> locate_sets_in_db ( const std::string& parSearch, bool parCaseInsensitive ) override; virtual std::vector<LocatedSet> locate_sets_in_db ( const std::string& parSubstr, bool parCaseInsensitive ) override;
virtual std::vector<LocatedSet> locate_sets_in_db ( const std::string& parSearch, const std::vector<GroupIDType>& parSets, bool parCaseInsensitive ) override; virtual std::vector<LocatedSet> locate_sets_in_db ( const std::string& parSubstr, const std::vector<GroupIDType>& parSets, bool parCaseInsensitive ) override;
virtual std::vector<GroupIDType> find_all_sets ( void ) override; virtual std::vector<GroupIDType> find_all_sets ( void ) override;
virtual std::vector<dinhelp::MaxSizedArray<std::string, 4>> find_set_details ( const std::vector<GroupIDType>& parSets ) override; virtual std::vector<dinhelp::MaxSizedArray<std::string, 4>> find_set_details ( const std::vector<GroupIDType>& parSets ) override;

View file

@ -226,18 +226,31 @@ namespace dindb {
} }
std::vector<LocatedSet> locate_sets_in_db (redis::IncRedis& parRedis, const std::string& parSubstr, bool parCaseInsensitive) { std::vector<LocatedSet> locate_sets_in_db (redis::IncRedis& parRedis, const std::string& parSubstr, bool parCaseInsensitive) {
auto filter_case_ins = [&parSubstr](const boost::tuple<std::vector<redis::Reply>, std::string>& t) { return locate_sets_in_db(parRedis, parSubstr, std::vector<GroupIDType>(), parCaseInsensitive);
}
std::vector<LocatedSet> locate_sets_in_db (redis::IncRedis& parRedis, const std::string& parSubstr, const std::vector<GroupIDType>& parSets, bool parCaseInsensitive) {
using dinhelp::lexical_cast;
auto filter_case_ins = [&parSubstr, &parSets](const boost::tuple<std::vector<redis::Reply>, std::string>& t) {
const auto& s = redis::get_string(t.get<0>()[0]); const auto& s = redis::get_string(t.get<0>()[0]);
return s.end() != std::search( return s.end() != std::search(
s.begin(), s.begin(),
s.end(), s.end(),
parSubstr.begin(), parSubstr.begin(),
parSubstr.end(), parSubstr.end(),
[](char c1, char c2) {return std::toupper(c1) == std::toupper(c2);} [](char c1, char c2) {return std::toupper(c1) == std::toupper(c2);}) and
(
parSets.empty() or
std::find(parSets.begin(), parSets.end(), lexical_cast<GroupIDType>(t.get<1>())) != parSets.end()
); );
}; };
auto filter_case_sens = [&parSubstr](const boost::tuple<std::vector<redis::Reply>, std::string>& t) { auto filter_case_sens = [&parSubstr, &parSets](const boost::tuple<std::vector<redis::Reply>, std::string>& t) {
return redis::get_string(t.get<0>()[0]).find(parSubstr) != std::string::npos; return redis::get_string(t.get<0>()[0]).find(parSubstr) != std::string::npos and
(
parSets.empty() or
std::find(parSets.begin(), parSets.end(), lexical_cast<GroupIDType>(t.get<1>())) != parSets.end()
);
}; };
std::function<bool(const boost::tuple<std::vector<redis::Reply>, std::string>&)> filter; std::function<bool(const boost::tuple<std::vector<redis::Reply>, std::string>&)> filter;
if (parCaseInsensitive) if (parCaseInsensitive)
@ -246,5 +259,6 @@ namespace dindb {
filter = filter_case_sens; filter = filter_case_sens;
return locate_in_bursts<LocatedSet>(parRedis, PROGRAM_NAME ":set:*", filter, "desc", "item_count", "dir_count"); return locate_in_bursts<LocatedSet>(parRedis, PROGRAM_NAME ":set:*", filter, "desc", "item_count", "dir_count");
} }
} //namespace dindb } //namespace dindb

View file

@ -30,6 +30,7 @@ namespace dindb {
std::vector<LocatedItem> locate_in_db ( redis::IncRedis& parRedis, const std::string& parRegex, const TagList& parTags ); std::vector<LocatedItem> locate_in_db ( redis::IncRedis& parRedis, const std::string& parRegex, const TagList& parTags );
std::vector<LocatedItem> locate_in_db ( redis::IncRedis& parRedis, const mchlib::TigerHash& parSearch, const TagList& parTags ); std::vector<LocatedItem> locate_in_db ( redis::IncRedis& parRedis, const mchlib::TigerHash& parSearch, const TagList& parTags );
std::vector<LocatedSet> locate_sets_in_db ( redis::IncRedis& parRedis, const std::string& parSubstr, bool parCaseInsensitive ); std::vector<LocatedSet> locate_sets_in_db ( redis::IncRedis& parRedis, const std::string& parSubstr, bool parCaseInsensitive );
std::vector<LocatedSet> locate_sets_in_db ( redis::IncRedis& parRedis, const std::string& parSubstr, const std::vector<GroupIDType>& parSets, bool parCaseInsensitive );
} //namespace dindb } //namespace dindb
#endif #endif