Convert model to use moved prefix_search method

This commit is contained in:
Joseph Schorr 2017-01-11 14:53:14 -05:00
parent d89c79b92d
commit d65d32b284
5 changed files with 13 additions and 22 deletions

View file

@ -1,4 +1,4 @@
from peewee import Clause, SQL, fn from peewee import fn
from cachetools import lru_cache from cachetools import lru_cache
from data.model import DataModelException from data.model import DataModelException
@ -6,18 +6,6 @@ from data.database import (Repository, User, Team, TeamMember, RepositoryPermiss
Namespace, Visibility, ImageStorage, Image, db_for_update) Namespace, Visibility, ImageStorage, Image, db_for_update)
def prefix_search(field, prefix_query):
""" Returns the wildcard match for searching for the given prefix query. """
# Escape the known wildcard characters.
prefix_query = (prefix_query
.replace('!', '!!')
.replace('%', '!%')
.replace('_', '!_')
.replace('[', '!['))
return field ** Clause(prefix_query + '%', SQL("ESCAPE '!'"))
def get_existing_repository(namespace_name, repository_name, for_update=False): def get_existing_repository(namespace_name, repository_name, for_update=False):
query = (Repository query = (Repository
.select(Repository, Namespace) .select(Repository, Namespace)

View file

@ -4,7 +4,7 @@ from cachetools import lru_cache
from data.database import Label, TagManifestLabel, MediaType, LabelSourceType, db_transaction from data.database import Label, TagManifestLabel, MediaType, LabelSourceType, db_transaction
from data.model import InvalidLabelKeyException, InvalidMediaTypeException, DataModelException from data.model import InvalidLabelKeyException, InvalidMediaTypeException, DataModelException
from data.model._basequery import prefix_search from data.text import prefix_search
from util.validation import validate_label_key from util.validation import validate_label_key
from util.validation import is_json from util.validation import is_json

View file

@ -12,6 +12,7 @@ from data.database import (Repository, Namespace, RepositoryTag, Star, Image, Im
Role, RepositoryAuthorizedEmail, TagManifest, DerivedStorageForImage, Role, RepositoryAuthorizedEmail, TagManifest, DerivedStorageForImage,
Label, TagManifestLabel, db_for_update, get_epoch_timestamp, Label, TagManifestLabel, db_for_update, get_epoch_timestamp,
db_random_func, db_concat_func) db_random_func, db_concat_func)
from data.text import prefix_search
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -1,6 +1,7 @@
from data.database import Team, TeamMember, TeamRole, User, TeamMemberInvite, RepositoryPermission from data.database import Team, TeamMember, TeamRole, User, TeamMemberInvite, RepositoryPermission
from data.model import (DataModelException, InvalidTeamException, UserAlreadyInTeam, from data.model import (DataModelException, InvalidTeamException, UserAlreadyInTeam,
InvalidTeamMemberException, user, _basequery) InvalidTeamMemberException, user, _basequery)
from data.text import prefix_search
from util.validation import validate_username from util.validation import validate_username
from peewee import fn, JOIN_LEFT_OUTER from peewee import fn, JOIN_LEFT_OUTER
from util.morecollections import AttrDict from util.morecollections import AttrDict
@ -137,7 +138,7 @@ def add_or_invite_to_team(inviter, team, user_obj=None, email=None, requires_inv
def get_matching_user_teams(team_prefix, user_obj, limit=10): def get_matching_user_teams(team_prefix, user_obj, limit=10):
team_prefix_search = _basequery.prefix_search(Team.name, team_prefix) team_prefix_search = prefix_search(Team.name, team_prefix)
query = (Team query = (Team
.select() .select()
.join(User) .join(User)
@ -163,7 +164,7 @@ def get_organization_team(orgname, teamname):
def get_matching_admined_teams(team_prefix, user_obj, limit=10): def get_matching_admined_teams(team_prefix, user_obj, limit=10):
team_prefix_search = _basequery.prefix_search(Team.name, team_prefix) team_prefix_search = prefix_search(Team.name, team_prefix)
admined_orgs = (_basequery.get_user_organizations(user_obj.username) admined_orgs = (_basequery.get_user_organizations(user_obj.username)
.switch(Team) .switch(Team)
.join(TeamRole) .join(TeamRole)
@ -182,7 +183,7 @@ def get_matching_admined_teams(team_prefix, user_obj, limit=10):
def get_matching_teams(team_prefix, organization): def get_matching_teams(team_prefix, organization):
team_prefix_search = _basequery.prefix_search(Team.name, team_prefix) team_prefix_search = prefix_search(Team.name, team_prefix)
query = Team.select().where(team_prefix_search, Team.organization == organization) query = Team.select().where(team_prefix_search, Team.organization == organization)
return query.limit(10) return query.limit(10)

View file

@ -18,6 +18,7 @@ from data.model import (DataModelException, InvalidPasswordException, InvalidRob
InvalidUsernameException, InvalidEmailAddressException, InvalidUsernameException, InvalidEmailAddressException,
TooManyLoginAttemptsException, db_transaction, TooManyLoginAttemptsException, db_transaction,
notification, config, repository, _basequery) notification, config, repository, _basequery)
from data.text import prefix_search
from util.names import format_robot_username, parse_robot_username from util.names import format_robot_username, parse_robot_username
from util.validation import (validate_username, validate_email, validate_password, from util.validation import (validate_username, validate_email, validate_password,
INVALID_PASSWORD_MESSAGE) INVALID_PASSWORD_MESSAGE)
@ -259,10 +260,10 @@ def get_matching_robots(name_prefix, username, limit=10):
prefix_checks = False prefix_checks = False
for org in admined_orgs: for org in admined_orgs:
org_search = _basequery.prefix_search(User.username, org.username + '+' + name_prefix) org_search = prefix_search(User.username, org.username + '+' + name_prefix)
prefix_checks = prefix_checks | org_search prefix_checks = prefix_checks | org_search
user_search = _basequery.prefix_search(User.username, username + '+' + name_prefix) user_search = prefix_search(User.username, username + '+' + name_prefix)
prefix_checks = prefix_checks | user_search prefix_checks = prefix_checks | user_search
return User.select().where(prefix_checks).limit(limit) return User.select().where(prefix_checks).limit(limit)
@ -562,7 +563,7 @@ def get_user_or_org_by_customer_id(customer_id):
def get_matching_user_namespaces(namespace_prefix, username, limit=10): def get_matching_user_namespaces(namespace_prefix, username, limit=10):
namespace_search = _basequery.prefix_search(Namespace.username, namespace_prefix) namespace_search = prefix_search(Namespace.username, namespace_prefix)
base_query = (Namespace base_query = (Namespace
.select() .select()
.distinct() .distinct()
@ -573,12 +574,12 @@ def get_matching_user_namespaces(namespace_prefix, username, limit=10):
return _basequery.filter_to_repos_for_user(base_query, username).limit(limit) return _basequery.filter_to_repos_for_user(base_query, username).limit(limit)
def get_matching_users(username_prefix, robot_namespace=None, organization=None, limit=20): def get_matching_users(username_prefix, robot_namespace=None, organization=None, limit=20):
user_search = _basequery.prefix_search(User.username, username_prefix) user_search = prefix_search(User.username, username_prefix)
direct_user_query = (user_search & (User.organization == False) & (User.robot == False)) direct_user_query = (user_search & (User.organization == False) & (User.robot == False))
if robot_namespace: if robot_namespace:
robot_prefix = format_robot_username(robot_namespace, username_prefix) robot_prefix = format_robot_username(robot_namespace, username_prefix)
robot_search = _basequery.prefix_search(User.username, robot_prefix) robot_search = prefix_search(User.username, robot_prefix)
direct_user_query = ((robot_search & (User.robot == True)) | direct_user_query) direct_user_query = ((robot_search & (User.robot == True)) | direct_user_query)
query = (User query = (User