From 8abcda74f878096c783527ae2ee51339d0dceda9 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 19 Feb 2021 11:00:26 +0000 Subject: [PATCH] testing product search utils directly, now they return sets --- products/tests.py | 32 ++++++++++++++++++++++++++++++++ products/utils.py | 17 ++++++++++------- products/views.py | 11 +++++------ 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/products/tests.py b/products/tests.py index 841c2f2..72c8aee 100644 --- a/products/tests.py +++ b/products/tests.py @@ -13,6 +13,7 @@ from rest_framework import status from companies.factories import CompanyFactory from products.factories import ProductFactory from products.models import Product +from products.utils import find_related_products_v3 from core.factories import CustomUserFactory from core.utils import get_tokens_for_user @@ -536,3 +537,34 @@ class MyProductsViewTest(APITestCase): # check response self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + +class FindRelatedProductsTest(APITestCase): + + def setUp(self): + """Tests setup + """ + self.factory = ProductFactory + self.model = Product + # clear table + self.model.objects.all().delete() + + def test_v3_find_by_single_tag(self): + # create tagged product + tag = 'cool' + expected_instances = [ + self.factory(tags=tag) + ] + # instance = self.factory() + # instance.tags.set(tag) + # instance.save() + # searh for it + results = find_related_products_v3(tag) + import ipdb; ipdb.set_trace() + + # assert result + self.assertTrue(len(results) == len(expected_instances)) + + + + diff --git a/products/utils.py b/products/utils.py index 51818a6..8353ef6 100644 --- a/products/utils.py +++ b/products/utils.py @@ -92,7 +92,7 @@ def find_related_products_v5(keyword): Q(category__name__icontains=keyword)| Q(attributes__label__icontains=keyword) ) - return products_qs + return set(products_qs) def find_related_products_v2(keyword): @@ -104,7 +104,7 @@ def find_related_products_v2(keyword): products_qs = Product.objects.annotate( search=vector ).filter(search=keyword) - return products_qs + return set(products_qs) def find_related_products_v3(keyword): @@ -118,13 +118,16 @@ def find_related_products_v3(keyword): PROBLEM: returns unrelated instances """ # TODO: figure out why it includes unrelated instances - fields=('name', 'description', 'tags__label', 'attributes__label', 'category__name') - vector = SearchVector(*fields) + # fields=('name', 'description', 'tags__label', 'attributes__label', 'category__name') + + vector = SearchVector('name') + SearchVector('description') + SearchVector('tags__label') + SearchVector('attributes__label') + SearchVector('category__name') query = SearchQuery(keyword) + products_qs = Product.objects.annotate( rank=SearchRank(vector, query) - ).order_by('-rank') - return products_qs + ).filter(rank__gt=0.05).order_by('-rank') + + return set(products_qs) def find_related_products_v4(keyword): @@ -137,4 +140,4 @@ def find_related_products_v4(keyword): similarity=TrigramSimilarity('name', keyword), ).order_by('-similarity') - return products_qs + return set(products_qs) diff --git a/products/views.py b/products/views.py index 33d65ea..44f8e6e 100644 --- a/products/views.py +++ b/products/views.py @@ -155,12 +155,11 @@ def product_search(request): chunks = query_string.split(' ') for chunk in chunks: - # import ipdb; ipdb.set_trace() - products_qs = find_related_products_v5(chunk) - # products_qs = find_related_products_v4(chunk) - # products_qs = find_related_products_v3(chunk) - for instance in products_qs: - result_set.add(instance) + product_set = find_related_products_v5(chunk) + # product_set = find_related_products_v4(chunk) + # product_set = find_related_products_v3(chunk) + # add to result set + result_set.update(product_set) # TODO: add search for entire phrase # extract filters from result_set