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_user = False
self._joined_keywords = False self._joined_keywords = False
self._joined_comaint = False
def _join_user(self, outer: bool = True) -> orm.Query: def _join_user(self, outer: bool = True) -> orm.Query:
""" Centralized joining of a package base's maintainer. """ """ Centralized joining of a package base's maintainer. """
@ -73,13 +74,23 @@ class PackageSearch:
isouter=outer isouter=outer
) )
self._joined_user = True self._joined_user = True
return self.query return self.query
def _join_keywords(self) -> orm.Query: def _join_keywords(self) -> orm.Query:
if not self._joined_keywords: if not self._joined_keywords:
self.query = self.query.join(PackageKeyword) self.query = self.query.join(PackageKeyword)
self._joined_keywords = True self._joined_keywords = True
return self.query 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: def _search_by_namedesc(self, keywords: str) -> orm.Query:
self._join_user() self._join_user()
@ -102,6 +113,7 @@ class PackageSearch:
def _search_by_pkgbase(self, keywords: str) -> orm.Query: def _search_by_pkgbase(self, keywords: str) -> orm.Query:
self._join_user() self._join_user()
self.query = self.query.filter(PackageBase.Name.like(f"%{keywords}%")) self.query = self.query.filter(PackageBase.Name.like(f"%{keywords}%"))
return self return self
def _search_by_exact_pkgbase(self, keywords: str) -> orm.Query: 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: def _search_by_keywords(self, keywords: Set[str]) -> orm.Query:
self._join_user() self._join_user()
self._join_keywords() self._join_keywords()
self.query = self.query.filter( self.query = self.query.filter(PackageKeyword.Keyword.in_(keywords))
PackageKeyword.Keyword.in_(keywords)
).group_by(Package.Name)
return self return self
def _search_by_maintainer(self, keywords: str) -> orm.Query: def _search_by_maintainer(self, keywords: str) -> orm.Query:
@ -130,25 +140,20 @@ class PackageSearch:
def _search_by_comaintainer(self, keywords: str) -> orm.Query: def _search_by_comaintainer(self, keywords: str) -> orm.Query:
self._join_user() self._join_user()
self._join_comaint()
user = db.query(User).filter(User.Username == keywords).first() user = db.query(User).filter(User.Username == keywords).first()
uid = 0 if not user else user.ID uid = 0 if not user else user.ID
self.query = self.query.join( self.query = self.query.filter(PackageComaintainer.UsersID == uid)
PackageComaintainer,
PackageComaintainer.PackageBaseID == PackageBase.ID
).filter(PackageComaintainer.UsersID == uid)
return self return self
def _search_by_co_or_maintainer(self, keywords: str) -> orm.Query: def _search_by_co_or_maintainer(self, keywords: str) -> orm.Query:
self._join_user() self._join_user()
self._join_comaint(True)
user = db.query(User).filter(User.Username == keywords).first() user = db.query(User).filter(User.Username == keywords).first()
uid = 0 if not user else user.ID uid = 0 if not user else user.ID
self.query = self.query.join( self.query = self.query.filter(
PackageComaintainer, or_(PackageComaintainer.UsersID == uid, User.ID == uid)
PackageComaintainer.PackageBaseID == PackageBase.ID, )
isouter=True
).filter(or_(PackageComaintainer.UsersID == uid, User.ID == uid))
return self return self
def _search_by_submitter(self, keywords: str) -> orm.Query: def _search_by_submitter(self, keywords: str) -> orm.Query:
@ -323,4 +328,6 @@ class RPCSearch(PackageSearch):
return result return result
def results(self) -> orm.Query: 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.User.Username.label("Maintainer"),
models.PackageVote.PackageBaseID.label("Voted"), models.PackageVote.PackageBaseID.label("Voted"),
models.PackageNotification.PackageBaseID.label("Notify") models.PackageNotification.PackageBaseID.label("Notify")
) ).group_by(models.Package.Name)
packages = results.limit(per_page).offset(offset) packages = results.limit(per_page).offset(offset)
context["packages"] = packages context["packages"] = packages