Use lazy-deserialization and package cache when searching in package name
This commit is contained in:
parent
3d7310af30
commit
a7de520549
|
@ -1 +1 @@
|
||||||
Subproject commit b302cdfabe190ad4b1853a6e8b1837886c58dd4a
|
Subproject commit b87dd49bbaef54d71c3cd25e46db0ff86e73f469
|
|
@ -186,8 +186,27 @@ std::vector<PackageSearchResult> Config::findPackages(const std::regex ®ex)
|
||||||
{
|
{
|
||||||
auto pkgs = std::vector<PackageSearchResult>();
|
auto pkgs = std::vector<PackageSearchResult>();
|
||||||
for (auto &db : databases) {
|
for (auto &db : databases) {
|
||||||
db.allPackages([&](StorageID packageID, const std::shared_ptr<Package> &package) {
|
db.allPackagesByName([&](std::string_view packageName, const std::function<PackageSpec(void)> &getPackage) {
|
||||||
if (std::regex_match(package->name, regex)) {
|
if (std::regex_match(packageName.begin(), packageName.end(), regex)) {
|
||||||
|
auto [packageID, package] = getPackage();
|
||||||
|
pkgs.emplace_back(db, package, packageID);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return pkgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<PackageSearchResult> Config::findPackages(const std::function<bool(const Database &)> &databasePred, std::string_view term)
|
||||||
|
{
|
||||||
|
auto pkgs = std::vector<PackageSearchResult>();
|
||||||
|
for (auto &db : databases) {
|
||||||
|
if (!databasePred(db)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
db.allPackagesByName([&](std::string_view packageName, const std::function<PackageSpec(void)> &getPackage) {
|
||||||
|
if (packageName.find(term) != std::string_view::npos) {
|
||||||
|
const auto [packageID, package] = getPackage();
|
||||||
pkgs.emplace_back(db, package, packageID);
|
pkgs.emplace_back(db, package, packageID);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -147,6 +147,7 @@ struct LIBPKG_EXPORT Config : public Lockable, public ReflectiveRapidJSON::Binar
|
||||||
std::vector<PackageSearchResult> findPackages(const Dependency &dependency, bool reverse = false);
|
std::vector<PackageSearchResult> findPackages(const Dependency &dependency, bool reverse = false);
|
||||||
std::vector<PackageSearchResult> findPackagesProvidingLibrary(const std::string &library, bool reverse = false);
|
std::vector<PackageSearchResult> findPackagesProvidingLibrary(const std::string &library, bool reverse = false);
|
||||||
std::vector<PackageSearchResult> findPackages(const std::regex ®ex);
|
std::vector<PackageSearchResult> findPackages(const std::regex ®ex);
|
||||||
|
std::vector<PackageSearchResult> findPackages(const std::function<bool(const Database &)> &databasePred, std::string_view term);
|
||||||
std::vector<PackageSearchResult> findPackages(const Package &package);
|
std::vector<PackageSearchResult> findPackages(const Package &package);
|
||||||
std::vector<PackageSearchResult> findPackages(
|
std::vector<PackageSearchResult> findPackages(
|
||||||
const std::function<bool(const Database &)> &databasePred, const std::function<bool(const Database &, const Package &)> &packagePred);
|
const std::function<bool(const Database &)> &databasePred, const std::function<bool(const Database &, const Package &)> &packagePred);
|
||||||
|
|
|
@ -104,12 +104,11 @@ void Database::clearPackages()
|
||||||
std::vector<std::shared_ptr<Package>> Database::findPackages(const std::function<bool(const Database &, const Package &)> &pred)
|
std::vector<std::shared_ptr<Package>> Database::findPackages(const std::function<bool(const Database &, const Package &)> &pred)
|
||||||
{
|
{
|
||||||
// TODO: use cache here
|
// TODO: use cache here
|
||||||
// TODO: avoid std::move()
|
|
||||||
auto pkgs = std::vector<std::shared_ptr<Package>>();
|
auto pkgs = std::vector<std::shared_ptr<Package>>();
|
||||||
auto txn = m_storage->packages.getROTransaction();
|
auto txn = m_storage->packages.getROTransaction();
|
||||||
for (auto i = txn.begin(); i != txn.end(); ++i) {
|
for (auto i = txn.begin<std::shared_ptr>(); i != txn.end(); ++i) {
|
||||||
if (pred(*this, *i)) {
|
if (pred(*this, *i)) {
|
||||||
pkgs.emplace_back(std::make_shared<Package>(std::move(*i)));
|
pkgs.emplace_back(std::move(i.getPointer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pkgs;
|
return pkgs;
|
||||||
|
@ -257,6 +256,17 @@ void Database::allPackages(const PackageVisitor &visitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LibPkg::Database::allPackagesByName(const PackageVisitorByName &visitor)
|
||||||
|
{
|
||||||
|
auto txn = m_storage->packages.getROTransaction();
|
||||||
|
for (auto i = txn.begin_idx<0, std::shared_ptr>(); i != txn.end(); ++i) {
|
||||||
|
const auto packageName = i.getKey().get<string_view>();
|
||||||
|
if (visitor(packageName, [this, &txn, &i]() { return m_storage->packageCache.retrieve(*m_storage, &txn, i.value()); })) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::size_t Database::packageCount() const
|
std::size_t Database::packageCount() const
|
||||||
{
|
{
|
||||||
return m_storage->packages.getROTransaction().size();
|
return m_storage->packages.getROTransaction().size();
|
||||||
|
|
|
@ -113,6 +113,7 @@ private:
|
||||||
|
|
||||||
struct LIBPKG_EXPORT Database : public ReflectiveRapidJSON::JsonSerializable<Database>, public ReflectiveRapidJSON::BinarySerializable<Database> {
|
struct LIBPKG_EXPORT Database : public ReflectiveRapidJSON::JsonSerializable<Database>, public ReflectiveRapidJSON::BinarySerializable<Database> {
|
||||||
using PackageVisitor = std::function<bool(StorageID, const std::shared_ptr<Package> &)>;
|
using PackageVisitor = std::function<bool(StorageID, const std::shared_ptr<Package> &)>;
|
||||||
|
using PackageVisitorByName = std::function<bool(std::string_view, const std::function<PackageSpec(void)> &)>;
|
||||||
|
|
||||||
friend struct PackageUpdater;
|
friend struct PackageUpdater;
|
||||||
|
|
||||||
|
@ -134,6 +135,7 @@ struct LIBPKG_EXPORT Database : public ReflectiveRapidJSON::JsonSerializable<Dat
|
||||||
void removePackageDependencies(StorageID packageID, const std::shared_ptr<Package> &package);
|
void removePackageDependencies(StorageID packageID, const std::shared_ptr<Package> &package);
|
||||||
void addPackageDependencies(StorageID packageID, const std::shared_ptr<Package> &package);
|
void addPackageDependencies(StorageID packageID, const std::shared_ptr<Package> &package);
|
||||||
void allPackages(const PackageVisitor &visitor);
|
void allPackages(const PackageVisitor &visitor);
|
||||||
|
void allPackagesByName(const PackageVisitorByName &visitor);
|
||||||
std::size_t packageCount() const;
|
std::size_t packageCount() const;
|
||||||
void providingPackages(const Dependency &dependency, bool reverse, const PackageVisitor &visitor);
|
void providingPackages(const Dependency &dependency, bool reverse, const PackageVisitor &visitor);
|
||||||
void providingPackages(const std::string &libraryName, bool reverse, const PackageVisitor &visitor);
|
void providingPackages(const std::string &libraryName, bool reverse, const PackageVisitor &visitor);
|
||||||
|
|
|
@ -265,8 +265,7 @@ void getPackages(const Params ¶ms, ResponseHandler &&handler)
|
||||||
}
|
}
|
||||||
case Mode::NameContains:
|
case Mode::NameContains:
|
||||||
pushPackages(params.setup.config.findPackages(
|
pushPackages(params.setup.config.findPackages(
|
||||||
[&dbs, onlyFromAur](const LibPkg::Database &db) { return (dbs.empty() && !onlyFromAur) || dbs.find(db.name) != dbs.end(); },
|
[&dbs, onlyFromAur](const LibPkg::Database &db) { return (dbs.empty() && !onlyFromAur) || dbs.find(db.name) != dbs.end(); }, name));
|
||||||
[&name](const LibPkg::Database &, const LibPkg::Package &pkg) { return pkg.name.find(name) != std::string::npos; }));
|
|
||||||
if (fromAur && !name.empty()) {
|
if (fromAur && !name.empty()) {
|
||||||
neededAurPackages.emplace_back(std::move(name));
|
neededAurPackages.emplace_back(std::move(name));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue