summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Reyna <david.reyna@windriver.com>2014-05-21 15:15:09 +0100
committerAlexandru DAMIAN <alexandru.damian@intel.com>2014-06-20 14:46:36 +0100
commite068727de686cd6c43cebacdac5b898c134705ef (patch)
tree94326aea7fadd9fedeb82522a14fd8140170071b
parent23908ecddb908d8238be0c1bdbcf2ecf6a9a088f (diff)
downloadbitbake-e068727de686cd6c43cebacdac5b898c134705ef.tar.gz
toaster: reduce redundant foreign key lookups
Replace redundant foreign key lookups with "with" to improve all recipes page load time. Do depends pre-lookup in the view class, and use python itertation instead of filter() all to achieve x16 processing speedup. [YOCTO #6137] Signed-off-by: David Reyna <David.Reyna@windriver.com> Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> Conflicts: bitbake/lib/toaster/toastergui/views.py Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rwxr-xr-xlib/toaster/toastergui/templates/recipes.html20
-rwxr-xr-x[-rw-r--r--]lib/toaster/toastergui/views.py15
2 files changed, 29 insertions, 6 deletions
diff --git a/lib/toaster/toastergui/templates/recipes.html b/lib/toaster/toastergui/templates/recipes.html
index 907b83d26..791a487a8 100755
--- a/lib/toaster/toastergui/templates/recipes.html
+++ b/lib/toaster/toastergui/templates/recipes.html
@@ -45,31 +45,39 @@
<td><a href="{% url "recipe" build.pk recipe.pk %}">{{recipe.version}}</a></td>
<!-- Depends -->
<td class="depends_on">
- {% if recipe.r_dependencies_recipe.all.count %}
+ {% with deps=recipe_deps|get_dict_value:recipe.pk %}
+ {% with count=deps|length %}
+ {% if count %}
<a class="btn"
title="<a href='{% url "recipe" build.pk recipe.pk %}#dependencies'>{{recipe.name}}</a> dependencies"
data-content="<ul class='unstyled'>
- {% for i in recipe.r_dependencies_recipe.all|dictsort:"depends_on.name"%}
+ {% for i in deps|dictsort:"depends_on.name"%}
<li><a href='{% url "recipe" build.pk i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
{% endfor %}
</ul>">
- {{recipe.r_dependencies_recipe.all.count}}
+ {{count}}
</a>
{% endif %}
+ {% endwith %}
+ {% endwith %}
</td>
<!-- Brought in by -->
<td class="depends_by">
- {% if recipe.r_dependencies_depends.all.count %}
+ {% with revs=recipe_revs|get_dict_value:recipe.pk %}
+ {% with count=revs|length %}
+ {% if count %}
<a class="btn"
title="<a href='{% url "recipe" build.pk recipe.pk %}#brought-in-by'>{{recipe.name}}</a> reverse dependencies"
data-content="<ul class='unstyled'>
- {% for i in recipe.r_dependencies_depends.all|dictsort:"recipe.name"%}
+ {% for i in revs|dictsort:"recipe.name" %}
<li><a href='{% url "recipe" build.pk i.recipe.pk %}'>{{i.recipe.name}}</a></li>
{% endfor %}
</ul>">
- {{recipe.r_dependencies_depends.all.count}}
+ {{count}}
</a>
{% endif %}
+ {% endwith %}
+ {% endwith %}
</td>
<!-- Recipe file -->
<td class="recipe_file">{{recipe.file_path}}</td>
diff --git a/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py
index 4622810cf..686cd5c8c 100644..100755
--- a/lib/toaster/toastergui/views.py
+++ b/lib/toaster/toastergui/views.py
@@ -1074,11 +1074,26 @@ def recipes(request, build_id):
recipes = _build_page_range(Paginator(queryset, request.GET.get('count', 100)),request.GET.get('page', 1))
+ # prefetch the forward and reverse recipe dependencies
+ deps = { }; revs = { }
+ queryset_dependency=Recipe_Dependency.objects.filter(recipe__layer_version__build_id = build_id)
+ for recipe in recipes:
+ deplist = [ ]
+ for recipe_dep in [x for x in queryset_dependency if x.recipe_id == recipe.id]:
+ deplist.append(recipe_dep)
+ deps[recipe.id] = deplist
+ revlist = [ ]
+ for recipe_dep in [x for x in queryset_dependency if x.depends_on_id == recipe.id]:
+ revlist.append(recipe_dep)
+ revs[recipe.id] = revlist
+
context = {
'objectname': 'recipes',
'build': Build.objects.filter(pk=build_id)[0],
'objects': recipes,
'default_orderby' : 'name:+',
+ 'recipe_deps' : deps,
+ 'recipe_revs' : revs,
'tablecols':[
{
'name':'Recipe',