From 227aa8ab8c8130a584a4a8da2e22444e203136f5 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 4 May 2017 11:25:57 -0400 Subject: [PATCH] Ensure that search doesn't make extra SQL lookups Before this change, we were accessing the `.kind` on the repository object, which caused peewee to make an extra lookup for each result --- endpoints/api/search.py | 3 ++- endpoints/api/test/test_search.py | 39 ++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/endpoints/api/search.py b/endpoints/api/search.py index 68d927d85..8fe3de3ba 100644 --- a/endpoints/api/search.py +++ b/endpoints/api/search.py @@ -3,6 +3,7 @@ from endpoints.api import (ApiResource, parse_args, query_param, truthy_bool, nickname, resource, require_scope, path_param, internal_only, Unauthorized, InvalidRequest, show_if) +from data.database import Repository from data import model from auth.permissions import (OrganizationMemberPermission, ReadRepositoryPermission, UserAdminPermission, AdministerOrganizationPermission, @@ -266,7 +267,7 @@ def conduct_robot_search(username, query, results): def repo_result_view(repo, username, last_modified=None, stars=None, popularity=None): - kind = 'application' if repo.kind.name == 'application' else 'repository' + kind = 'application' if Repository.kind.get_name(repo.kind_id) == 'application' else 'repository' view = { 'kind': kind, 'title': 'app' if kind == 'application' else 'repo', diff --git a/endpoints/api/test/test_search.py b/endpoints/api/test/test_search.py index 212377352..4efba0841 100644 --- a/endpoints/api/test/test_search.py +++ b/endpoints/api/test/test_search.py @@ -1,12 +1,35 @@ -from endpoints.api.search import ConductRepositorySearch +import pytest + +from playhouse.test_utils import assert_query_count + +from data.model import _basequery +from endpoints.api.search import ConductRepositorySearch, ConductSearch from endpoints.api.test.shared import client_with_identity, conduct_api_call from test.fixtures import * -def test_repository_search(client): +@pytest.mark.parametrize('query, expected_query_count', [ + ('simple', 7), + ('public', 6), + ('repository', 6), +]) +def test_repository_search(query, expected_query_count, client): with client_with_identity('devtable', client) as cl: - params = {'query': 'simple'} - result = conduct_api_call(cl, ConductRepositorySearch, 'GET', params, None, 200).json - assert not result['has_additional'] - assert result['start_index'] == 0 - assert result['page'] == 1 - assert result['results'][0]['name'] == 'simple' + params = {'query': query} + with assert_query_count(expected_query_count): + result = conduct_api_call(cl, ConductRepositorySearch, 'GET', params, None, 200).json + assert result['start_index'] == 0 + assert result['page'] == 1 + assert len(result['results']) + + +@pytest.mark.parametrize('query, expected_query_count', [ + ('simple', 8), + ('public', 8), + ('repository', 8), +]) +def test_search_query_count(query, expected_query_count, client): + with client_with_identity('devtable', client) as cl: + params = {'query': query} + with assert_query_count(expected_query_count): + result = conduct_api_call(cl, ConductSearch, 'GET', params, None, 200).json + assert len(result['results'])