Merge pull request #5515 from jmchilton/optimize_workflow_list

[18.01] Optimize database interaction for user workflow list.
This commit is contained in:
Martin Cech
2018-02-13 15:15:04 -05:00
committed by GitHub
2 changed files with 14 additions and 6 deletions
+7 -1
View File
@@ -14,6 +14,7 @@ from sqlalchemy import (
desc,
false,
ForeignKey,
func,
Integer,
MetaData,
not_,
@@ -2115,7 +2116,12 @@ mapper(model.Workflow, model.Workflow.table, properties=dict(
primaryjoin=((model.Workflow.table.c.id == model.WorkflowStep.table.c.workflow_id)),
order_by=asc(model.WorkflowStep.table.c.order_index),
cascade="all, delete-orphan",
lazy=False)
lazy=False),
step_count=column_property(
select([func.count(model.WorkflowStep.table.c.id)]).where(model.Workflow.table.c.id == model.WorkflowStep.table.c.workflow_id),
deferred=True
)
))
mapper(model.WorkflowStep, model.WorkflowStep.table, properties=dict(
+7 -5
View File
@@ -7,6 +7,7 @@ import logging
from six.moves.urllib.parse import unquote_plus
from sqlalchemy import desc, false, or_, true
from sqlalchemy.orm import eagerload
from galaxy import (
exceptions,
@@ -125,7 +126,8 @@ class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesAnn
user = trans.get_user()
if show_published:
filter1 = or_(filter1, (trans.app.model.StoredWorkflow.published == true()))
for wf in trans.sa_session.query(trans.app.model.StoredWorkflow).filter(
for wf in trans.sa_session.query(trans.app.model.StoredWorkflow).options(
eagerload("latest_workflow").undefer("step_count").lazyload("steps")).filter(
filter1, trans.app.model.StoredWorkflow.table.c.deleted == false()).order_by(
desc(trans.app.model.StoredWorkflow.table.c.update_time)).all():
@@ -133,15 +135,15 @@ class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesAnn
encoded_id = trans.security.encode_id(wf.id)
item['url'] = url_for('workflow', id=encoded_id)
item['owner'] = wf.user.username
item['number_of_steps'] = len(wf.latest_workflow.steps)
item['number_of_steps'] = wf.latest_workflow.step_count
item['show_in_tool_panel'] = False
for x in user.stored_workflow_menu_entries:
if x.stored_workflow_id == wf.id:
item['show_in_tool_panel'] = True
break
rval.append(item)
for wf_sa in trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(
user=trans.user).join('stored_workflow').filter(
for wf_sa in trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).options(
eagerload("stored_workflow").joinedload("latest_workflow").undefer("step_count").lazyload("steps")).filter_by(user=trans.user).filter(
trans.app.model.StoredWorkflow.deleted == false()).order_by(
desc(trans.app.model.StoredWorkflow.update_time)).all():
item = wf_sa.stored_workflow.to_dict(value_mapper={'id': trans.security.encode_id})
@@ -149,7 +151,7 @@ class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesAnn
item['url'] = url_for('workflow', id=encoded_id)
item['slug'] = wf_sa.stored_workflow.slug
item['owner'] = wf_sa.stored_workflow.user.username
item['number_of_steps'] = len(wf_sa.stored_workflow.latest_workflow.steps)
item['number_of_steps'] = wf_sa.stored_workflow.latest_workflow.step_count
item['show_in_tool_panel'] = False
for x in user.stored_workflow_menu_entries:
if x.stored_workflow_id == wf_sa.id: