data.model.repository: add back search fields

This commit is contained in:
Jimmy Zelinskie 2017-03-23 10:46:04 -04:00
parent 2bdd3d4fa1
commit d20ff785e6
2 changed files with 27 additions and 5 deletions

View file

@ -1,6 +1,7 @@
import logging
import random
from enum import Enum
from datetime import timedelta, datetime
from peewee import JOIN_LEFT_OUTER, fn, SQL, IntegrityError
from cachetools import ttl_cache
@ -17,6 +18,7 @@ from util.itertoolrecipes import take
logger = logging.getLogger(__name__)
SEARCH_FIELDS = Enum("SearchFields", ["name", "description"])
def get_repo_kind_name(repo):
@ -356,20 +358,26 @@ def get_app_repository(namespace_name, repository_name):
return None
def get_app_search(lookup, username=None, limit=50):
def get_app_search(lookup, search_fields=None, username=None, limit=50):
if search_fields is None:
search_fields = set([SEARCH_FIELDS.description.name])
return get_filtered_matching_repositories(lookup, filter_username=username,
search_fields=search_fields,
repo_kind='application', offset=0, limit=limit)
def get_filtered_matching_repositories(lookup_value, filter_username=None, repo_kind='image',
offset=0, limit=25):
offset=0, limit=25, search_fields=None):
""" Returns an iterator of all repositories matching the given lookup value, with optional
filtering to a specific user. If the user is unspecified, only public repositories will
be returned.
"""
if search_fields is None:
search_fields = set([SEARCH_FIELDS.description.name, SEARCH_FIELDS.name.name])
# Build the unfiltered search query.
unfiltered_query = _get_sorted_matching_repositories(lookup_value, repo_kind=repo_kind,
search_fields=search_fields,
include_private=filter_username is not None)
# Add a filter to the iterator, if necessary.
@ -427,18 +435,29 @@ def _filter_repositories_visible_to_username(unfiltered_query, filter_username,
iteration_count = iteration_count + 1
def _get_sorted_matching_repositories(lookup_value, repo_kind='image', include_private=False):
def _get_sorted_matching_repositories(lookup_value, repo_kind='image', include_private=False,
search_fields=None):
""" Returns a query of repositories matching the given lookup string, with optional inclusion of
private repositories. Note that this method does *not* filter results based on visibility
to users.
"""
if search_fields is None:
search_fields = set([SEARCH_FIELDS.description.name, SEARCH_FIELDS.name.name])
# Always search at least on name (init clause)
clause = Repository.name.match(lookup_value)
if SEARCH_FIELDS.description.name in search_fields:
clause = Repository.description.match(lookup_value) | clause
last_week = datetime.now() - timedelta(weeks=1)
query = (Repository
.select(Repository, Namespace)
.join(Namespace, on=(Namespace.id == Repository.namespace_user))
.where(Repository.name.match(lookup_value) | Repository.description.match(lookup_value),
Repository.kind == Repository.kind.get_id(repo_kind))
.where(clause,
Repository.repo_kind == Repository.repo_kind.get_id(repo_kind))
.group_by(Repository.id, Namespace.id))
if not include_private:

View file

@ -9,9 +9,12 @@ from data.oci_model import tag as tag_model
def list_packages_query(namespace=None, media_type=None, search_query=None, username=None):
""" List and filter repository by search query. """
fields = [model.repository.SEARCH_FIELDS.name.name]
if search_query is not None:
repositories = model.repository.get_app_search(search_query,
username=username,
search_fields=fields,
limit=50)
repo_query = (Repository
.select(Repository, Namespace.username)