1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-09 05:29:32 +00:00

bitbake: toaster: orm remove the complicated querying on the ORM

We no longer need to compute each layer_version and all the recipes
which belong to this.

[YOCTO #8147]

(Bitbake rev: 505979ab931e3a2a218d7030d6064987e8f9ff14)

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: brian avery <avery.brian@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Michael Wood
2015-09-29 10:50:10 +01:00
committed by Richard Purdie
parent fe29297c6a
commit f902dc646d
3 changed files with 34 additions and 22 deletions
+30 -19
View File
@@ -191,6 +191,7 @@ class Project(models.Model):
# returns a queryset of compatible layers for a project # returns a queryset of compatible layers for a project
def compatible_layerversions(self, release = None, layer_name = None): def compatible_layerversions(self, release = None, layer_name = None):
logger.warning("This function is deprecated")
if release == None: if release == None:
release = self.release release = self.release
# layers on the same branch or layers specifically set for this project # layers on the same branch or layers specifically set for this project
@@ -205,45 +206,55 @@ class Project(models.Model):
return queryset return queryset
def projectlayer_equivalent_set(self): def get_all_compatible_layer_versions(self):
return self.compatible_layerversions().filter(layer__name__in = [x.layercommit.layer.name for x in self.projectlayer_set.all()]).select_related("up_branch") """ Returns Queryset of all Layer_Versions which are compatible with
this project"""
queryset = Layer_Version.objects.filter(
(Q(up_branch__name=self.release.branch_name) & Q(build=None))
| Q(project=self))
return queryset
def get_project_layer_versions(self, pk=False):
""" Returns the Layer_Versions currently added to this project """
layer_versions = self.projectlayer_set.all().values('layercommit')
if pk is False:
return layer_versions
else:
return layer_versions.values_list('pk', flat=True)
def get_available_machines(self): def get_available_machines(self):
""" Returns QuerySet of all Machines which are provided by the """ Returns QuerySet of all Machines which are provided by the
Layers currently added to the Project """ Layers currently added to the Project """
queryset = Machine.objects.filter(layer_version__in=self.projectlayer_equivalent_set) queryset = Machine.objects.filter(
layer_version__in=self.get_project_layer_versions(self))
return queryset return queryset
def get_all_compatible_machines(self): def get_all_compatible_machines(self):
""" Returns QuerySet of all the compatible machines available to the """ Returns QuerySet of all the compatible machines available to the
project including ones from Layers not currently added """ project including ones from Layers not currently added """
compatible_layers = self.compatible_layerversions() queryset = Machine.objects.filter(
layer_version__in=self.get_all_compatible_layer_versions())
queryset = Machine.objects.filter(layer_version__in=compatible_layers)
return queryset return queryset
def get_available_recipes(self): def get_available_recipes(self):
""" Returns QuerySet of all Recipes which are provided by the Layers """ Returns QuerySet of all the recipes that are provided by layers
currently added to the Project """ added to this project """
project_layers = self.projectlayer_equivalent_set() queryset = Recipe.objects.filter(
queryset = Recipe.objects.filter(layer_version__in = project_layers) layer_version__in=self.get_project_layer_versions())
# Copied from get_all_compatible_recipes
search_maxids = map(lambda i: i[0], list(queryset.values('name').distinct().annotate(max_id=Max('id')).values_list('max_id')))
queryset = queryset.filter(id__in=search_maxids).select_related('layer_version', 'layer_version__layer', 'layer_version__up_branch', 'layer_source')
# End copy
return queryset return queryset
def get_all_compatible_recipes(self): def get_all_compatible_recipes(self):
""" Returns QuerySet of all the compatible Recipes available to the """ Returns QuerySet of all the compatible Recipes available to the
project including ones from Layers not currently added """ project including ones from Layers not currently added """
compatible_layerversions = self.compatible_layerversions() queryset = Recipe.objects.filter(
queryset = Recipe.objects.filter(layer_version__in = compatible_layerversions) layer_version__in=self.get_all_compatible_layer_versions())
search_maxids = map(lambda i: i[0], list(queryset.values('name').distinct().annotate(max_id=Max('id')).values_list('max_id')))
queryset = queryset.filter(id__in=search_maxids).select_related('layer_version', 'layer_version__layer', 'layer_version__up_branch', 'layer_source')
return queryset return queryset
+1 -1
View File
@@ -221,7 +221,7 @@ class MachinesTable(ToasterTable, ProjectFiltersMixin):
def setup_filters(self, *args, **kwargs): def setup_filters(self, *args, **kwargs):
project = Project.objects.get(pk=kwargs['pid']) project = Project.objects.get(pk=kwargs['pid'])
self.project_layers = project.projectlayer_equivalent_set() self.project_layers = project.get_project_layer_versions()
self.add_filter(title="Filter by project machines", self.add_filter(title="Filter by project machines",
name="in_current_project", name="in_current_project",
+3 -2
View File
@@ -27,7 +27,7 @@ class LayersTypeAhead(ToasterTypeAhead):
super(LayersTypeAhead, self).__init__() super(LayersTypeAhead, self).__init__()
def apply_search(self, search_term, prj, request): def apply_search(self, search_term, prj, request):
layers = prj.compatible_layerversions() layers = prj.get_all_compatible_layer_versions()
layers = layers.order_by('layer__name') layers = layers.order_by('layer__name')
# Unlike the other typeaheads we also don't want to show suggestions # Unlike the other typeaheads we also don't want to show suggestions
@@ -35,7 +35,8 @@ class LayersTypeAhead(ToasterTypeAhead):
# layerdeps to a new layer. # layerdeps to a new layer.
if ("include_added" in request.GET and if ("include_added" in request.GET and
request.GET['include_added'] != "true"): request.GET['include_added'] != "true"):
layers = layers.exclude(pk__in=prj.projectlayer_equivalent_set) layers = layers.exclude(
pk__in=prj.get_project_layer_versions(pk=True))
primary_results = layers.filter(layer__name__istartswith=search_term) primary_results = layers.filter(layer__name__istartswith=search_term)
secondary_results = layers.filter(layer__name__icontains=search_term).exclude(pk__in=primary_results) secondary_results = layers.filter(layer__name__icontains=search_term).exclude(pk__in=primary_results)