Skip to content

Commit

Permalink
Merge remote-tracking branch 'jmchilton/release_18.01' into dev_merge_0
Browse files Browse the repository at this point in the history
  • Loading branch information
jmchilton committed Feb 14, 2018
2 parents 0b13766 + c20b68a commit 043fe35
Show file tree
Hide file tree
Showing 12 changed files with 88 additions and 53 deletions.
26 changes: 14 additions & 12 deletions client/galaxy/scripts/onload.js
Original file line number Diff line number Diff line change
Expand Up @@ -179,18 +179,20 @@ $(document).ready(() => {

function onloadWebhooks() {
if (Galaxy.root !== undefined) {
// Load all webhooks with the type 'onload'
Webhooks.load({
type: "onload",
callback: function(webhooks) {
webhooks.each(model => {
var webhook = model.toJSON();
if (webhook.activate && webhook.script) {
Utils.appendScriptStyle(webhook);
}
});
}
});
if (Galaxy.config.enable_webhooks) {
// Load all webhooks with the type 'onload'
Webhooks.load({
type: "onload",
callback: function(webhooks) {
webhooks.each(model => {
var webhook = model.toJSON();
if (webhook.activate && webhook.script) {
Utils.appendScriptStyle(webhook);
}
});
}
});
}
} else {
setTimeout(onloadWebhooks, 100);
}
Expand Down
22 changes: 5 additions & 17 deletions lib/galaxy/datatypes/binary.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import tarfile
import tempfile
import zipfile
from collections import OrderedDict
from json import dumps

import h5py
Expand Down Expand Up @@ -234,10 +235,10 @@ def set_meta(self, dataset, overwrite=True, **kwd):
# TODO: Reference names, lengths, read_groups and headers can become very large, truncate when necessary
dataset.metadata.reference_names = list(bam_file.references)
dataset.metadata.reference_lengths = list(bam_file.lengths)
dataset.metadata.bam_header = bam_file.header
dataset.metadata.bam_header = OrderedDict((k, v) for k, v in bam_file.header.items())
dataset.metadata.read_groups = [read_group['ID'] for read_group in dataset.metadata.bam_header.get('RG', []) if 'ID' in read_group]
dataset.metadata.sort_order = bam_file.header.get('HD', {}).get('SO', None)
dataset.metadata.bam_version = bam_file.header.get('HD', {}).get('VN', None)
dataset.metadata.sort_order = dataset.metadata.bam_header.get('HD', {}).get('SO', None)
dataset.metadata.bam_version = dataset.metadata.bam_header.get('HD', {}).get('VN', None)
except Exception:
# Per Dan, don't log here because doing so will cause datasets that
# fail metadata to end in the error state
Expand Down Expand Up @@ -383,25 +384,12 @@ def groom_dataset_content(self, file_name):

def set_meta(self, dataset, overwrite=True, **kwd):
# These metadata values are not accessible by users, always overwrite
super(Bam, self).set_meta(dataset=dataset, overwrite=overwrite, **kwd)
index_file = dataset.metadata.bam_index
if not index_file:
index_file = dataset.metadata.spec['bam_index'].param.new_file(dataset=dataset)
pysam.index(dataset.file_name, index_file.file_name)
dataset.metadata.bam_index = index_file
# Now use pysam with BAI index to determine additional metadata
try:
bam_file = pysam.AlignmentFile(dataset.file_name, mode='rb', index_filename=index_file.file_name)
# TODO: Reference names, lengths, read_groups and headers can become very large, truncate when necessary
dataset.metadata.reference_names = list(bam_file.references)
dataset.metadata.reference_lengths = list(bam_file.lengths)
dataset.metadata.bam_header = bam_file.header
dataset.metadata.read_groups = [read_group['ID'] for read_group in dataset.metadata.bam_header.get('RG', []) if 'ID' in read_group]
dataset.metadata.sort_order = bam_file.header.get('HD', {}).get('SO', None)
dataset.metadata.bam_version = bam_file.header.get('HD', {}).get('VN', None)
except Exception:
# Per Dan, don't log here because doing so will cause datasets that
# fail metadata to end in the error state
pass

def sniff(self, file_name):
return super(Bam, self).sniff(file_name) and not self.dataset_content_needs_grooming(file_name)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<tool id="CONVERTER_bam_native_to_bam" name="Convert BAM native to BAM" version="1.0.0" hidden="true">
<tool id="CONVERTER_bam_native_to_bam" name="Convert BAM native to BAM" version="1.0.0" hidden="true" profile="18.01">
<!-- <description>__NOT_USED_CURRENTLY_FOR_CONVERTERS__</description> -->
<requirements>
<requirement type="package" version="1.6">samtools</requirement>
Expand Down
2 changes: 1 addition & 1 deletion lib/galaxy/datatypes/converters/sam_to_bam_native.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<tool id="CONVERTER_sam_to_bam_native" name="Convert SAM to BAM native - without sorting" version="1.0.0">
<tool id="CONVERTER_sam_to_bam_native" name="Convert SAM to BAM native - without sorting" version="1.0.0" profile="18.01">
<!-- <description>__NOT_USED_CURRENTLY_FOR_CONVERTERS__</description> -->
<requirements>
<requirement type="package" version="1.6">samtools</requirement>
Expand Down
2 changes: 1 addition & 1 deletion lib/galaxy/dependencies/pinned-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ mercurial==3.7.3; python_version < '3.0'
pycrypto==2.6.1
uWSGI==2.0.15
# Flexible BAM index naming is new to core pysam
pysam>=0.13
pysam==0.14

# Install python_lzo if you want to support indexed access to lzo-compressed
# locally cached maf files via bx-python
Expand Down
32 changes: 27 additions & 5 deletions lib/galaxy/model/mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
desc,
false,
ForeignKey,
func,
Integer,
MetaData,
not_,
Expand Down Expand Up @@ -1569,7 +1570,11 @@ def simple_mapping(model, **kwds):
backref="histories"),
ratings=relation(model.HistoryRatingAssociation,
order_by=model.HistoryRatingAssociation.table.c.id,
backref="histories")
backref="histories"),
average_rating=column_property(
select([func.avg(model.HistoryRatingAssociation.table.c.rating)]).where(model.HistoryRatingAssociation.table.c.history_id == model.History.table.c.id),
deferred=True
)
))

# Set up proxy so that
Expand Down Expand Up @@ -2115,7 +2120,12 @@ def simple_mapping(model, **kwds):
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(
Expand Down Expand Up @@ -2178,7 +2188,11 @@ def simple_mapping(model, **kwds):
backref="stored_workflows"),
ratings=relation(model.StoredWorkflowRatingAssociation,
order_by=model.StoredWorkflowRatingAssociation.table.c.id,
backref="stored_workflows")
backref="stored_workflows"),
average_rating=column_property(
select([func.avg(model.StoredWorkflowRatingAssociation.table.c.rating)]).where(model.StoredWorkflowRatingAssociation.table.c.stored_workflow_id == model.StoredWorkflow.table.c.id),
deferred=True
)
))

# Set up proxy so that
Expand Down Expand Up @@ -2310,7 +2324,11 @@ def simple_mapping(model, **kwds):
backref="pages"),
ratings=relation(model.PageRatingAssociation,
order_by=model.PageRatingAssociation.table.c.id,
backref="pages")
backref="pages"),
average_rating=column_property(
select([func.avg(model.PageRatingAssociation.table.c.rating)]).where(model.PageRatingAssociation.table.c.page_id == model.Page.table.c.id),
deferred=True
)
))

# Set up proxy so that
Expand Down Expand Up @@ -2342,7 +2360,11 @@ def simple_mapping(model, **kwds):
backref="visualizations"),
ratings=relation(model.VisualizationRatingAssociation,
order_by=model.VisualizationRatingAssociation.table.c.id,
backref="visualizations")
backref="visualizations"),
average_rating=column_property(
select([func.avg(model.VisualizationRatingAssociation.table.c.rating)]).where(model.VisualizationRatingAssociation.table.c.visualization_id == model.Visualization.table.c.id),
deferred=True
)
))

# Set up proxy so that
Expand Down
7 changes: 6 additions & 1 deletion lib/galaxy/web/framework/helpers/grids.py
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,12 @@ class CommunityRatingColumn(GridColumn, UsesItemRatings):
""" Column that displays community ratings for an item. """

def get_value(self, trans, grid, item):
ave_item_rating, num_ratings = self.get_ave_item_rating_data(trans.sa_session, item, webapp_model=trans.model)
if not hasattr(item, "average_rating"):
# No prefetched column property, generate it on the fly.
ave_item_rating, num_ratings = self.get_ave_item_rating_data(trans.sa_session, item, webapp_model=trans.model)
else:
ave_item_rating = item.average_rating
num_ratings = 2 # just used for pluralization
return trans.fill_template("tool_shed_rating.mako",
ave_item_rating=ave_item_rating,
num_ratings=num_ratings,
Expand Down
12 changes: 7 additions & 5 deletions lib/galaxy/webapps/galaxy/api/workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from six.moves.urllib.parse import unquote_plus
from sqlalchemy import desc, false, or_, true
from sqlalchemy.orm import eagerload

from galaxy import (
exceptions,
Expand Down Expand Up @@ -125,31 +126,32 @@ def get_workflows_list(self, trans, kwd):
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():

item = wf.to_dict(value_mapper={'id': trans.security.encode_id})
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})
encoded_id = trans.security.encode_id(wf_sa.stored_workflow.id)
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:
Expand Down
18 changes: 15 additions & 3 deletions lib/galaxy/webapps/galaxy/controllers/history.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from six import string_types
from six.moves.urllib.parse import unquote_plus
from sqlalchemy import and_, false, func, null, true
from sqlalchemy.orm import eagerload, eagerload_all
from sqlalchemy.orm import eagerload, eagerload_all, undefer

import galaxy.util
from galaxy import exceptions
Expand Down Expand Up @@ -208,8 +208,20 @@ class NameURLColumn(grids.PublicURLColumn, NameColumn):
operations = []

def build_initial_query(self, trans, **kwargs):
# Join so that searching history.user makes sense.
return trans.sa_session.query(self.model_class).join(model.User.table)
# TODO: Tags are still loaded one at a time, consider doing this all at once:
# - eagerload would keep everything in one query but would explode the number of rows and potentially
# result in unneeded info transferred over the wire.
# - subqueryload("tags").subqueryload("tag") would probably be better under postgres but I'd
# like some performance data against a big database first - might cause problems?

# - Pull down only username from associated User table since that is all that is used
# (can be used during search). Need join in addition to the eagerload since it is used in
# the .count() query which doesn't respect the eagerload options (could eliminate this with #5523).
# - Undefer average_rating column to prevent loading individual ratings per-history.
# - Eager load annotations - this causes a left join which might be inefficient if there were
# potentially many items per history (like if joining HDAs for instance) but there should only
# be at most one so this is fine.
return trans.sa_session.query(self.model_class).join("user").options(eagerload("user").load_only("username"), eagerload("annotations"), undefer("average_rating"))

def apply_query_filter(self, trans, query, **kwargs):
# A public history is published, has a slug, and is not deleted.
Expand Down
5 changes: 3 additions & 2 deletions lib/galaxy/webapps/galaxy/controllers/page.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from markupsafe import escape
from sqlalchemy import and_, desc, false, true
from sqlalchemy.orm import eagerload, undefer

from galaxy import managers, model, util, web
from galaxy.model.item_attrs import UsesItemRatings
Expand Down Expand Up @@ -82,8 +83,8 @@ class PageAllPublishedGrid(grids.Grid):
)

def build_initial_query(self, trans, **kwargs):
# Join so that searching history.user makes sense.
return trans.sa_session.query(self.model_class).join(model.User.table)
# See optimization description comments and TODO for tags in matching public histories query.
return trans.sa_session.query(self.model_class).join("user").options(eagerload("user").load_only("username"), eagerload("annotations"), undefer("average_rating"))

def apply_query_filter(self, trans, query, **kwargs):
return query.filter(self.model_class.deleted == false()).filter(self.model_class.published == true())
Expand Down
5 changes: 3 additions & 2 deletions lib/galaxy/webapps/galaxy/controllers/visualization.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
)
from six import string_types
from sqlalchemy import and_, desc, false, or_, true
from sqlalchemy.orm import eagerload, undefer

from galaxy import managers, model, util, web
from galaxy.datatypes.interval import Bed
Expand Down Expand Up @@ -212,8 +213,8 @@ class VisualizationAllPublishedGrid(grids.Grid):
)

def build_initial_query(self, trans, **kwargs):
# Join so that searching history.user makes sense.
return trans.sa_session.query(self.model_class).join(model.User.table)
# See optimization description comments and TODO for tags in matching public histories query.
return trans.sa_session.query(self.model_class).join("user").options(eagerload("user").load_only("username"), eagerload("annotations"), undefer("average_rating"))

def apply_query_filter(self, trans, query, **kwargs):
return query.filter(self.model_class.deleted == false()).filter(self.model_class.published == true())
Expand Down
8 changes: 5 additions & 3 deletions lib/galaxy/webapps/galaxy/controllers/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from markupsafe import escape
from six.moves.http_client import HTTPConnection
from sqlalchemy import and_
from sqlalchemy.orm import joinedload
from sqlalchemy.orm import eagerload, joinedload, lazyload, undefer
from sqlalchemy.sql import expression

from galaxy import (
Expand Down Expand Up @@ -138,8 +138,10 @@ class StoredWorkflowAllPublishedGrid(grids.Grid):
]

def build_initial_query(self, trans, **kwargs):
# Join so that searching stored_workflow.user makes sense.
return trans.sa_session.query(self.model_class).join(model.User.table)
# See optimization description comments and TODO for tags in matching public histories query.
# In addition to that - be sure to lazyload the latest_workflow - it isn't needed and it causes all
# of its steps to be eagerly loaded.
return trans.sa_session.query(self.model_class).join("user").options(lazyload("latest_workflow"), eagerload("user").load_only("username"), eagerload("annotations"), undefer("average_rating"))

def apply_query_filter(self, trans, query, **kwargs):
# A public workflow is published, has a slug, and is not deleted.
Expand Down

0 comments on commit 043fe35

Please sign in to comment.