mirror of
https://github.com/KingDuckZ/dindexer.git
synced 2025-08-14 14:49:48 +00:00
Implement searching for sets by name.
Searching for sets also prints the total count of files and directories in that set.
This commit is contained in:
parent
2593d46ed7
commit
1077661e50
5 changed files with 120 additions and 22 deletions
|
@ -27,6 +27,7 @@ namespace din {
|
|||
po::options_description set_options(ACTION_NAME " options");
|
||||
set_options.add_options()
|
||||
("case-insensitive,i", "Disable case sensitivity during search")
|
||||
("set,s", "Look for matching sets instead of files")
|
||||
//("option,o", po::value<std::string>()->default_value("default_value"), "Help message")
|
||||
//("option2", po::value<int>(), "Help message")
|
||||
;
|
||||
|
|
|
@ -29,6 +29,15 @@ namespace din {
|
|||
parStream << parItem.group_id << '\t' << parItem.id << '\t' << parItem.path;
|
||||
return parStream;
|
||||
}
|
||||
|
||||
std::ostream& operator<< (std::ostream& parStream, const LocatedSet& parItem) {
|
||||
const decltype(parItem.dir_count) one = 1;
|
||||
const auto dircount = std::max(parItem.dir_count, one) - one;
|
||||
|
||||
parStream << parItem.id << "\t\"" << parItem.desc << "\"\t" <<
|
||||
'\t' << parItem.files_count << '\t' << dircount;
|
||||
return parStream;
|
||||
}
|
||||
} //namespace din
|
||||
|
||||
int main (int parArgc, char* parArgv[]) {
|
||||
|
@ -59,7 +68,13 @@ int main (int parArgc, char* parArgv[]) {
|
|||
}
|
||||
}
|
||||
|
||||
const auto results = din::locate_in_db(settings.db, vm["substring"].as<std::string>(), not not vm.count("case-insensitive"));
|
||||
std::copy(results.begin(), results.end(), std::ostream_iterator<din::LocatedItem>(std::cout, "\n"));
|
||||
if (vm.count("set")) {
|
||||
const auto results = din::locate_sets_in_db(settings.db, vm["substring"].as<std::string>(), not not vm.count("case-insensitive"));
|
||||
std::copy(results.begin(), results.end(), std::ostream_iterator<din::LocatedSet>(std::cout, "\n"));
|
||||
}
|
||||
else {
|
||||
const auto results = din::locate_in_db(settings.db, vm["substring"].as<std::string>(), not not vm.count("case-insensitive"));
|
||||
std::copy(results.begin(), results.end(), std::ostream_iterator<din::LocatedItem>(std::cout, "\n"));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,33 @@
|
|||
namespace din {
|
||||
namespace {
|
||||
const int g_max_results = 200;
|
||||
|
||||
pq::Connection make_pq_conn ( const dinlib::SettingsDB& parDB, bool parOpen=true );
|
||||
|
||||
pq::Connection make_pq_conn (const dinlib::SettingsDB& parDB, bool parOpen) {
|
||||
auto conn = pq::Connection(std::string(parDB.username), std::string(parDB.password), std::string(parDB.dbname), std::string(parDB.address), parDB.port);
|
||||
if (parOpen) {
|
||||
conn.connect();
|
||||
}
|
||||
return std::move(conn);
|
||||
}
|
||||
|
||||
std::vector<LocatedSet> sets_result_to_vec (pq::ResultSet&& parResult) {
|
||||
using boost::lexical_cast;
|
||||
|
||||
std::vector<LocatedSet> retval;
|
||||
retval.reserve(parResult.size());
|
||||
for (const auto& record : parResult) {
|
||||
retval.push_back(LocatedSet{
|
||||
record["desc"],
|
||||
lexical_cast<decltype(LocatedSet::id)>(record["id"]),
|
||||
lexical_cast<decltype(LocatedSet::files_count)>(record["file_count"]),
|
||||
lexical_cast<decltype(LocatedSet::dir_count)>(record["dir_count"])
|
||||
});
|
||||
}
|
||||
|
||||
return std::move(retval);
|
||||
}
|
||||
} //unnamed namespace
|
||||
|
||||
std::vector<LocatedItem> locate_in_db (const dinlib::SettingsDB& parDB, const std::string& parSearch, bool parCaseInsensitive) {
|
||||
|
@ -33,8 +60,7 @@ namespace din {
|
|||
using boost::string_ref;
|
||||
namespace ba = boost::algorithm;
|
||||
|
||||
pq::Connection conn(std::string(parDB.username), std::string(parDB.password), std::string(parDB.dbname), std::string(parDB.address), parDB.port);
|
||||
conn.connect();
|
||||
auto conn = make_pq_conn(parDB);
|
||||
|
||||
const auto clean_string_with_quotes = conn.escaped_literal(parSearch);
|
||||
const auto clean_string = string_ref(clean_string_with_quotes).substr(1, clean_string_with_quotes.size() - 2);
|
||||
|
@ -64,4 +90,34 @@ namespace din {
|
|||
|
||||
return std::move(retval);
|
||||
}
|
||||
|
||||
std::vector<LocatedSet> locate_sets_in_db (const dinlib::SettingsDB& parDB, const std::string& parSearch, bool parCaseInsensitive) {
|
||||
auto conn = make_pq_conn(parDB);
|
||||
|
||||
const std::string query = std::string("SELECT \"id\", \"desc\", "
|
||||
"(SELECT COUNT(*) FROM \"files\" WHERE \"group_id\"=\"sets\".\"id\" AND NOT \"is_directory\") as \"file_count\", "
|
||||
"(SELECT COUNT(*) FROM \"files\" WHERE \"group_id\"=\"sets\".\"id\" AND \"is_directory\") as \"dir_count\" "
|
||||
"FROM \"sets\" WHERE str_match_partial(\"desc\", $1, $2) LIMIT "
|
||||
) + std::to_string(g_max_results) + ";";
|
||||
|
||||
auto result = conn.query(query, parSearch, parCaseInsensitive);
|
||||
return sets_result_to_vec(std::move(result));
|
||||
}
|
||||
|
||||
std::vector<LocatedSet> locate_sets_in_db (const dinlib::SettingsDB& parDB, const std::string& parSearch, const std::vector<uint32_t>& parSets, bool parCaseInsensitive) {
|
||||
if (parSets.empty()) {
|
||||
return locate_sets_in_db(parDB, parSearch, parCaseInsensitive);
|
||||
}
|
||||
|
||||
auto conn = make_pq_conn(parDB);
|
||||
|
||||
const std::string query = std::string("SELECT \"id\", \"desc\", "
|
||||
"(SELECT COUNT(*) FROM \"files\" WHERE \"group_id\"=\"sets\".\"id\" AND NOT \"is_directory\") as \"file_count\", "
|
||||
"(SELECT COUNT(*) FROM \"files\" WHERE \"group_id\"=\"sets\".\"id\" AND \"is_directory\") as \"dir_count\" "
|
||||
"FROM \"sets\" WHERE \"id\" = ANY($1) AND str_match_partial(\"desc\", $3, $2) LIMIT "
|
||||
) + std::to_string(g_max_results) + ";";
|
||||
|
||||
auto result = conn.query(query, parSearch, parCaseInsensitive, parSets);
|
||||
return sets_result_to_vec(std::move(result));
|
||||
}
|
||||
} //namespace din
|
||||
|
|
|
@ -30,7 +30,16 @@ namespace din {
|
|||
uint32_t group_id;
|
||||
};
|
||||
|
||||
struct LocatedSet {
|
||||
std::string desc;
|
||||
uint32_t id;
|
||||
uint32_t files_count;
|
||||
uint32_t dir_count;
|
||||
};
|
||||
|
||||
std::vector<LocatedItem> locate_in_db ( const dinlib::SettingsDB& parDB, const std::string& parSearch, bool parCaseInsensitive );
|
||||
std::vector<LocatedSet> locate_sets_in_db ( const dinlib::SettingsDB& parDB, const std::string& parSearch, bool parCaseInsensitive );
|
||||
std::vector<LocatedSet> locate_sets_in_db ( const dinlib::SettingsDB& parDB, const std::string& parSearch, const std::vector<uint32_t>& parSets, bool parCaseInsensitive );
|
||||
} //namespace din
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue