From 852d05fa3c9347fea41c0e620485659ffda27646 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 8 Dec 2015 14:48:00 +0000 Subject: Add the extended user friendly models --- gentoobrowse-api/api/portage.ice | 4 +++- gentoobrowse-api/domain/extended-models.ice | 20 ++++++++++++++++++++ gentoobrowse-api/domain/portage-models.ice | 5 +++++ gentoobrowse-api/service/portageimpl.cpp | 22 ++++++++++++++++++---- gentoobrowse-api/service/portageimpl.h | 3 ++- gentoobrowse-api/unittests/testPortage.cpp | 17 +++++++++++++++++ 6 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 gentoobrowse-api/domain/extended-models.ice diff --git a/gentoobrowse-api/api/portage.ice b/gentoobrowse-api/api/portage.ice index d7a8a05..9ac9899 100644 --- a/gentoobrowse-api/api/portage.ice +++ b/gentoobrowse-api/api/portage.ice @@ -1,15 +1,17 @@ #include +#include module Gentoo { interface Portage { idempotent Category getCategory(int id); idempotent Categories getAllCategories(); idempotent Categories getCategoriesInSuper(string super); + idempotent OverviewCategories getOverviewCategoriesInSuper(string super); idempotent Package getPackage(int id); idempotent optional(0) Package findPackage(string category, string package); idempotent Packages getPackagesInCategory(int id); - idempotent Packages getPackagesSearch(string query); + idempotent SearchResultPackages getPackagesSearch(string query); }; }; diff --git a/gentoobrowse-api/domain/extended-models.ice b/gentoobrowse-api/domain/extended-models.ice new file mode 100644 index 0000000..956692f --- /dev/null +++ b/gentoobrowse-api/domain/extended-models.ice @@ -0,0 +1,20 @@ +#ifndef GENTOO_PORTAGE_EXTENDEDMODELS +#define GENTOO_PORTAGE_EXTENDEDMODELS + +#include "portage-models.ice" + +module Gentoo { + class OverviewCategory extends Category { + int packagecount; + }; + + class SearchResultPackage extends Package { + double rank; + }; + + sequence SearchResultPackages; + sequence OverviewCategories; +}; + +#endif + diff --git a/gentoobrowse-api/domain/portage-models.ice b/gentoobrowse-api/domain/portage-models.ice index ea8d53d..9593315 100644 --- a/gentoobrowse-api/domain/portage-models.ice +++ b/gentoobrowse-api/domain/portage-models.ice @@ -1,3 +1,6 @@ +#ifndef GENTOO_PORTAGE_MODELS +#define GENTOO_PORTAGE_MODELS + module Gentoo { sequence Image; @@ -36,3 +39,5 @@ module Gentoo { sequence Ebuilds; }; +#endif + diff --git a/gentoobrowse-api/service/portageimpl.cpp b/gentoobrowse-api/service/portageimpl.cpp index 5adc4d0..362483b 100644 --- a/gentoobrowse-api/service/portageimpl.cpp +++ b/gentoobrowse-api/service/portageimpl.cpp @@ -33,6 +33,19 @@ Portage::getCategoriesInSuper(const std::string & super, const Ice::Current &) ORDER BY c.name", super); } +Gentoo::OverviewCategories +Portage::getOverviewCategoriesInSuper(const std::string & super, const Ice::Current &) +{ + return fetch( + "SELECT c.categoryid, c.name, c.summary, COUNT(p.packageid) packagecount \ + FROM gentoobrowse.categories c \ + LEFT OUTER JOIN gentoobrowse.packages p \ + ON p.categoryid = c.categoryid \ + WHERE c.name LIKE ? || '-%'::text \ + GROUP BY c.categoryid \ + ORDER BY c.name", super); +} + Gentoo::PackagePtr Portage::getPackage(Ice::Int id, const Ice::Current &) { @@ -63,13 +76,14 @@ Portage::getPackagesInCategory(Ice::Int id, const Ice::Current &) ORDER BY p.name", id); } -Gentoo::Packages +Gentoo::SearchResultPackages Portage::getPackagesSearch(const std::string & query, const Ice::Current &) { - return fetch( - "SELECT p.packageid, p.categoryid, p.name, p.description, p.summary, p.maintainer, p.maintainername, p.herd \ + return fetch( + "SELECT p.packageid, p.categoryid, p.name, p.description, p.summary, p.maintainer, p.maintainername, p.herd, \ + ts_rank(gentoobrowse.packagefts(p), plainto_tsquery('english', ?)) rank \ FROM gentoobrowse.packages p \ WHERE gentoobrowse.packagefts(p) @@ plainto_tsquery('english', ?) \ - ORDER BY ts_rank(gentoobrowse.packagefts(p), plainto_tsquery('english', ?)) DESC, p.name", query, query); + ORDER BY rank DESC, p.name", query, query); } diff --git a/gentoobrowse-api/service/portageimpl.h b/gentoobrowse-api/service/portageimpl.h index 69e6021..f72fee2 100644 --- a/gentoobrowse-api/service/portageimpl.h +++ b/gentoobrowse-api/service/portageimpl.h @@ -12,11 +12,12 @@ class DLL_PUBLIC Portage : public Gentoo::Portage, AbstractDatabaseClient { Gentoo::CategoryPtr getCategory(Ice::Int id, const Ice::Current &) override; Gentoo::Categories getAllCategories(const Ice::Current &) override; Gentoo::Categories getCategoriesInSuper(const std::string &, const Ice::Current &) override; + Gentoo::OverviewCategories getOverviewCategoriesInSuper(const std::string &, const Ice::Current &) override; Gentoo::PackagePtr getPackage(Ice::Int id, const Ice::Current &) override; IceUtil::Optional findPackage(const std::string &, const std::string &, const Ice::Current &) override; Gentoo::Packages getPackagesInCategory(Ice::Int id, const Ice::Current &) override; - Gentoo::Packages getPackagesSearch(const std::string & query, const Ice::Current &) override; + Gentoo::SearchResultPackages getPackagesSearch(const std::string & query, const Ice::Current &) override; }; #endif diff --git a/gentoobrowse-api/unittests/testPortage.cpp b/gentoobrowse-api/unittests/testPortage.cpp index 70afd86..a0b62a8 100644 --- a/gentoobrowse-api/unittests/testPortage.cpp +++ b/gentoobrowse-api/unittests/testPortage.cpp @@ -59,6 +59,22 @@ BOOST_AUTO_TEST_CASE( getCategoriesInSuper ) BOOST_REQUIRE_EQUAL(0, cats.size()); } +BOOST_AUTO_TEST_CASE( getOverviewCategoriesInSuper ) +{ + MockPool mp; + auto p = Portage::PointerType(new Portage(mp)); + auto cats = p->getOverviewCategoriesInSuper("dev", Ice::Current()); + BOOST_REQUIRE_EQUAL(2, cats.size()); + BOOST_REQUIRE_EQUAL("dev-ml", cats.front()->name); + BOOST_REQUIRE_EQUAL("dev-vcs", cats.back()->name); + BOOST_REQUIRE_EQUAL(136, cats.front()->packagecount); + BOOST_REQUIRE_EQUAL(88, cats.back()->packagecount); + cats = p->getOverviewCategoriesInSuper("net", Ice::Current()); + BOOST_REQUIRE_EQUAL(1, cats.size()); + cats = p->getOverviewCategoriesInSuper("sys", Ice::Current()); + BOOST_REQUIRE_EQUAL(0, cats.size()); +} + BOOST_AUTO_TEST_CASE( getPackageMissing ) { MockPool mp; @@ -123,6 +139,7 @@ BOOST_AUTO_TEST_CASE( search ) auto matches = p->getPackagesSearch("git", Ice::Current()); BOOST_REQUIRE_EQUAL(40, matches.size()); BOOST_REQUIRE_EQUAL(58252, matches.front()->packageid); + BOOST_REQUIRE_CLOSE(0.72, matches.front()->rank, 1.0); } BOOST_AUTO_TEST_CASE( searchNotFound ) -- cgit v1.2.3