fix: M/c search with multiple keywords

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2022-02-07 16:12:26 -08:00
parent 828847cfcd
commit 957803a70b
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
2 changed files with 25 additions and 18 deletions

View file

@ -63,6 +63,7 @@ class PackageSearch:
self._joined_user = False
self._joined_keywords = False
self._joined_comaint = False
def _join_user(self, outer: bool = True) -> orm.Query:
""" Centralized joining of a package base's maintainer. """
@ -81,6 +82,16 @@ class PackageSearch:
self._joined_keywords = True
return self.query
def _join_comaint(self, isouter: bool = False) -> orm.Query:
if not self._joined_comaint:
self.query = self.query.join(
PackageComaintainer,
PackageComaintainer.PackageBaseID == PackageBase.ID,
isouter=isouter
)
self._joined_comaint = True
return self.query
def _search_by_namedesc(self, keywords: str) -> orm.Query:
self._join_user()
self.query = self.query.filter(
@ -102,6 +113,7 @@ class PackageSearch:
def _search_by_pkgbase(self, keywords: str) -> orm.Query:
self._join_user()
self.query = self.query.filter(PackageBase.Name.like(f"%{keywords}%"))
return self
def _search_by_exact_pkgbase(self, keywords: str) -> orm.Query:
@ -112,9 +124,7 @@ class PackageSearch:
def _search_by_keywords(self, keywords: Set[str]) -> orm.Query:
self._join_user()
self._join_keywords()
self.query = self.query.filter(
PackageKeyword.Keyword.in_(keywords)
).group_by(Package.Name)
self.query = self.query.filter(PackageKeyword.Keyword.in_(keywords))
return self
def _search_by_maintainer(self, keywords: str) -> orm.Query:
@ -130,25 +140,20 @@ class PackageSearch:
def _search_by_comaintainer(self, keywords: str) -> orm.Query:
self._join_user()
self._join_comaint()
user = db.query(User).filter(User.Username == keywords).first()
uid = 0 if not user else user.ID
self.query = self.query.join(
PackageComaintainer,
PackageComaintainer.PackageBaseID == PackageBase.ID
).filter(PackageComaintainer.UsersID == uid)
self.query = self.query.filter(PackageComaintainer.UsersID == uid)
return self
def _search_by_co_or_maintainer(self, keywords: str) -> orm.Query:
self._join_user()
self._join_comaint(True)
user = db.query(User).filter(User.Username == keywords).first()
uid = 0 if not user else user.ID
self.query = self.query.join(
PackageComaintainer,
PackageComaintainer.PackageBaseID == PackageBase.ID,
isouter=True
).filter(or_(PackageComaintainer.UsersID == uid, User.ID == uid))
self.query = self.query.filter(
or_(PackageComaintainer.UsersID == uid, User.ID == uid)
)
return self
def _search_by_submitter(self, keywords: str) -> orm.Query:
@ -323,4 +328,6 @@ class RPCSearch(PackageSearch):
return result
def results(self) -> orm.Query:
return self.query.filter(models.PackageBase.PackagerUID.isnot(None))
return self.query.filter(
models.PackageBase.PackagerUID.isnot(None)
)

View file

@ -113,7 +113,7 @@ async def packages_get(request: Request, context: Dict[str, Any],
models.User.Username.label("Maintainer"),
models.PackageVote.PackageBaseID.label("Voted"),
models.PackageNotification.PackageBaseID.label("Notify")
)
).group_by(models.Package.Name)
packages = results.limit(per_page).offset(offset)
context["packages"] = packages