mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
fix: /packages search by keywords
Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
parent
83f5d9e460
commit
26f0b014f9
2 changed files with 24 additions and 9 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
from typing import Set
|
||||||
|
|
||||||
from sqlalchemy import and_, case, or_, orm
|
from sqlalchemy import and_, case, or_, orm
|
||||||
|
|
||||||
from aurweb import db, models
|
from aurweb import db, models
|
||||||
|
@ -59,17 +61,24 @@ class PackageSearch:
|
||||||
"l": self._sort_by_last_modified
|
"l": self._sort_by_last_modified
|
||||||
}
|
}
|
||||||
|
|
||||||
self._joined = False
|
self._joined_user = False
|
||||||
|
self._joined_keywords = 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. """
|
||||||
if not self._joined:
|
if not self._joined_user:
|
||||||
self.query = self.query.join(
|
self.query = self.query.join(
|
||||||
User,
|
User,
|
||||||
User.ID == PackageBase.MaintainerUID,
|
User.ID == PackageBase.MaintainerUID,
|
||||||
isouter=outer
|
isouter=outer
|
||||||
)
|
)
|
||||||
self._joined = True
|
self._joined_user = True
|
||||||
|
return self.query
|
||||||
|
|
||||||
|
def _join_keywords(self) -> orm.Query:
|
||||||
|
if not self._joined_keywords:
|
||||||
|
self.query = self.query.join(PackageKeyword)
|
||||||
|
self._joined_keywords = True
|
||||||
return self.query
|
return self.query
|
||||||
|
|
||||||
def _search_by_namedesc(self, keywords: str) -> orm.Query:
|
def _search_by_namedesc(self, keywords: str) -> orm.Query:
|
||||||
|
@ -100,11 +109,12 @@ class PackageSearch:
|
||||||
self.query = self.query.filter(PackageBase.Name == keywords)
|
self.query = self.query.filter(PackageBase.Name == keywords)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def _search_by_keywords(self, keywords: str) -> orm.Query:
|
def _search_by_keywords(self, keywords: Set[str]) -> orm.Query:
|
||||||
self._join_user()
|
self._join_user()
|
||||||
self.query = self.query.join(PackageKeyword).filter(
|
self._join_keywords()
|
||||||
PackageKeyword.Keyword == keywords
|
self.query = self.query.filter(
|
||||||
)
|
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:
|
||||||
|
|
|
@ -52,9 +52,14 @@ async def packages_get(request: Request, context: Dict[str, Any],
|
||||||
# This means that for any sentences separated by spaces,
|
# This means that for any sentences separated by spaces,
|
||||||
# they are used as if they were ANDed.
|
# they are used as if they were ANDed.
|
||||||
keywords = context["K"] = request.query_params.get("K", str())
|
keywords = context["K"] = request.query_params.get("K", str())
|
||||||
|
|
||||||
keywords = keywords.split(" ")
|
keywords = keywords.split(" ")
|
||||||
for keyword in keywords:
|
if search_by == "k":
|
||||||
search.search_by(search_by, keyword)
|
# If we're searchin by keywords, supply a set of keywords.
|
||||||
|
search.search_by(search_by, set(keywords))
|
||||||
|
else:
|
||||||
|
for keyword in keywords:
|
||||||
|
search.search_by(search_by, keyword)
|
||||||
|
|
||||||
# Collect search result count here; we've applied our keywords.
|
# Collect search result count here; we've applied our keywords.
|
||||||
# Including more query operations below, like ordering, will
|
# Including more query operations below, like ordering, will
|
||||||
|
|
Loading…
Add table
Reference in a new issue