Usage of itertools.chain() that was introduced in
3155206e54413f72df3b3b41280eafd332a58ba4 in order to prioritise matches
in the recipe name resulted in recipes showing up twice in the results
if they matched in both the name and the recipe name. Use a custom
chaining function that skips duplicate results in order to fix this.

Fixes [YOCTO #10177].

Signed-off-by: Paul Eggleton <paul.eggle...@linux.intel.com>
---
 layerindex/utils.py | 10 ++++++++++
 layerindex/views.py |  9 ++++-----
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/layerindex/utils.py b/layerindex/utils.py
index 484d3fe..e3be631 100644
--- a/layerindex/utils.py
+++ b/layerindex/utils.py
@@ -237,3 +237,13 @@ def lock_file(fn):
 
 def unlock_file(lock):
     fcntl.flock(lock, fcntl.LOCK_UN)
+
+def chain_unique(*iterables):
+    """Chain unique objects in a list of querysets, preserving order"""
+    seen = set()
+    for element in iterables:
+        for item in element:
+            k = item.id
+            if k not in seen:
+                seen.add(k)
+                yield item
diff --git a/layerindex/views.py b/layerindex/views.py
index 06045ae..3e78c58 100644
--- a/layerindex/views.py
+++ b/layerindex/views.py
@@ -12,7 +12,6 @@ from django.core.exceptions import PermissionDenied
 from django.template import RequestContext
 from layerindex.models import Branch, LayerItem, LayerMaintainer, LayerBranch, 
LayerDependency, LayerNote, Recipe, Machine, Distro, BBClass, BBAppend, 
RecipeChange, RecipeChangeset, ClassicRecipe
 from datetime import datetime
-from itertools import chain
 from django.views.generic import TemplateView, DetailView, ListView
 from django.views.generic.edit import CreateView, DeleteView, UpdateView
 from django.views.generic.base import RedirectView
@@ -27,6 +26,7 @@ from django.utils.decorators import method_decorator
 from django.contrib.auth.decorators import login_required
 from django.contrib import messages
 from reversion.models import Revision
+from . import utils
 from . import simplesearch
 import settings
 from django.dispatch import receiver
@@ -213,12 +213,11 @@ def bulk_change_edit_view(request, template_name, pk):
 def bulk_change_patch_view(request, pk):
     import os
     import os.path
-    from layerindex.utils import runcmd
     changeset = get_object_or_404(RecipeChangeset, pk=pk)
     # FIXME this couples the web server and machine running the update script 
together,
     # but given that it's a separate script the way is open to decouple them 
in future
     try:
-        ret = runcmd('%s bulkchange.py %d %s' % (sys.executable, int(pk), 
settings.TEMP_BASE_DIR), os.path.dirname(__file__))
+        ret = utils.runcmd('%s bulkchange.py %d %s' % (sys.executable, 
int(pk), settings.TEMP_BASE_DIR), os.path.dirname(__file__))
         if ret:
             fn = ret.splitlines()[-1].decode('utf-8')
             if os.path.exists(fn):
@@ -387,7 +386,7 @@ class RecipeSearchView(ListView):
             qs2 = init_qs.filter(entry_query).order_by(*order_by)
             qs2 = recipes_preferred_count(qs2)
 
-            qs = list(chain(qs1, qs2))
+            qs = list(utils.chain_unique(qs1, qs2))
         else:
             if 'q' in self.request.GET:
                 qs = init_qs.order_by('pn', 'layerbranch__layer')
@@ -739,7 +738,7 @@ class ClassicRecipeSearchView(RecipeSearchView):
             entry_query = simplesearch.get_query(query_string, ['summary', 
'description'])
             qs2 = init_qs.filter(entry_query).order_by(*order_by)
 
-            qs = list(chain(qs1, qs2))
+            qs = list(utils.chain_unique(qs1, qs2))
         else:
             if 'q' in self.request.GET:
                 qs = init_qs.order_by('pn', 'layerbranch__layer')
-- 
2.5.5

-- 
_______________________________________________
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto

Reply via email to