def search():
query = request.args.get('q', '')
keywords = query.split()
if len(keywords) > 5:
# Let's not overload the DB with crazy queries.
raise ApiException(requests.codes.bad_request, "Too many search terms (max is 5)")
filter_list = [
sa.func.instr(
sa.sql.collate(sa.func.concat(Package.owner, '/', Package.name), UTF8_GENERAL_CI),
keyword
) > 0
for keyword in keywords
]
results = (
db.session.query(Package, sa.func.max(Access.user == PUBLIC))
.filter(sa.and_(*filter_list))
.join(Package.access)
.filter(Access.user.in_([g.auth.user, PUBLIC]))
.group_by(Package.id)
.order_by(
sa.sql.collate(Package.owner, UTF8_GENERAL_CI),
sa.sql.collate(Package.name, UTF8_GENERAL_CI)
)
.all()
)
return dict(
packages=[
dict(
owner=package.owner,
name=package.name,
is_public=is_public,
) for package, is_public in results
]
)
评论列表
文章目录