[ARVADOS] created: b82eca689e7374cdafbb3435c4168579850649ac
git at public.curoverse.com
git at public.curoverse.com
Mon Oct 6 18:04:19 EDT 2014
at b82eca689e7374cdafbb3435c4168579850649ac (commit)
commit b82eca689e7374cdafbb3435c4168579850649ac
Author: Phil Hodgson <bitbucket at philhodgson.net>
Date: Mon Oct 6 17:56:06 2014 -0400
3618: allow for orders to be parameterized for showing records; proof of concept here for project tabs, sorting Data Collections by name
diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb
index 4f5d8fd..a027e2e 100644
--- a/apps/workbench/app/controllers/application_controller.rb
+++ b/apps/workbench/app/controllers/application_controller.rb
@@ -105,8 +105,23 @@ class ApplicationController < ActionController::Base
end
end
+ # params[:order]:
+ #
+ # The order can be unspecified, or it can be a column name.
+ # Column names should always be qualified by a table name and a direction is optional, defaulting to asc
+ # (e.g. "collections.name" or "collections.name desc").
+ # If a column name is specified, that table will be sorted by that column.
+ # If there are objects from different models that will be shown (such as in Jobs and Pipelines tab),
+ # then a sort column name can optionally be specified for each model, passed as an array (e.g. "['jobs.description', 'pipeline_instances.name']")
+ # Currently only one sort column name and direction can be specified for each model.
def load_filters_and_paging_params
- @order = params[:order] || 'created_at desc'
+ if params[:order].blank?
+ @order = 'created_at desc'
+ elsif params[:order].starts_with? '['
+ @order = Oj.load params[:order]
+ else
+ @order = params[:order]
+ end
@order = [@order] unless @order.is_a? Array
@limit ||= 200
diff --git a/apps/workbench/app/models/arvados_api_client.rb b/apps/workbench/app/models/arvados_api_client.rb
index 78d3bee..7076799 100644
--- a/apps/workbench/app/models/arvados_api_client.rb
+++ b/apps/workbench/app/models/arvados_api_client.rb
@@ -124,7 +124,7 @@ class ArvadosApiClient
header = {"Accept" => "application/json"}
- profile_checkpoint { "Prepare request #{url} #{query[:uuid]} #{query[:where]} #{query[:filters]}" }
+ profile_checkpoint { "Prepare request #{url} #{query[:uuid]} #{query[:where]} #{query[:filters]} #{query[:order]}" }
msg = @client_mtx.synchronize do
begin
@api_client.post(url, query, header: header)
diff --git a/apps/workbench/app/views/projects/_show_data_collections.html.erb b/apps/workbench/app/views/projects/_show_data_collections.html.erb
index e56321d..a2df49e 100644
--- a/apps/workbench/app/views/projects/_show_data_collections.html.erb
+++ b/apps/workbench/app/views/projects/_show_data_collections.html.erb
@@ -1,3 +1,4 @@
<%= render_pane 'tab_contents', to_string: true, locals: {
- filters: [['uuid', 'is_a', "arvados#collection"]]
+ filters: [['uuid', 'is_a', "arvados#collection"]],
+ order: 'collections.name'
}.merge(local_assigns) %>
diff --git a/apps/workbench/app/views/projects/_show_tab_contents.html.erb b/apps/workbench/app/views/projects/_show_tab_contents.html.erb
index 0f9901a..52fd0a3 100644
--- a/apps/workbench/app/views/projects/_show_tab_contents.html.erb
+++ b/apps/workbench/app/views/projects/_show_tab_contents.html.erb
@@ -1,3 +1,4 @@
+<% order = nil if local_assigns[:order].nil? %>
<div class="selection-action-container">
<div class="row">
<div class="col-sm-5">
@@ -75,7 +76,7 @@
<col width="60%" style="width: 60%;" />
<col width="40%" style="width: 40%;" />
</colgroup>
- <tbody data-infinite-scroller="#<%= tab_pane %>-scroll" data-infinite-content-href="<%= url_for partial: :contents_rows %>" data-infinite-content-params-projecttab="<%= {filters: filters}.to_json %>">
+ <tbody data-infinite-scroller="#<%= tab_pane %>-scroll" data-infinite-content-href="<%= url_for partial: :contents_rows %>" data-infinite-content-params-projecttab="<%= {filters: filters, order: order}.to_json %>">
</tbody>
<thead>
<tr>
diff --git a/services/api/app/controllers/arvados/v1/groups_controller.rb b/services/api/app/controllers/arvados/v1/groups_controller.rb
index 9fca207..be873fb 100644
--- a/services/api/app/controllers/arvados/v1/groups_controller.rb
+++ b/services/api/app/controllers/arvados/v1/groups_controller.rb
@@ -71,6 +71,10 @@ class Arvados::V1::GroupsController < ApplicationController
# aggregate set.
limit_all = @limit
offset_all = @offset
+ # save the orders from the current request as determined by load_param,
+ # but otherwise discard them because we're going to be getting objects
+ # from many models
+ request_orders = @orders.clone
@orders = []
[Group,
@@ -92,7 +96,15 @@ class Arvados::V1::GroupsController < ApplicationController
end
end
- @objects = @objects.order("#{klass.table_name}.uuid")
+ # If the currently requested orders specifically match the table_name for the current klass, apply the order
+ request_order = request_orders && request_orders.find{ |r| r =~ /^#{klass.table_name}\./i }
+ if request_order
+ @objects = @objects.order(request_order)
+ else
+ # default to UUID, ignoring any currently requested ordering because it doesn't apply to this klass
+ @objects = @objects.order("#{klass.table_name}.uuid")
+ end
+
@limit = limit_all - all_objects.count
apply_where_limit_order_params klass
klass_items_available = @objects.
diff --git a/services/api/lib/load_param.rb b/services/api/lib/load_param.rb
index 71678cd..fb580f2 100644
--- a/services/api/lib/load_param.rb
+++ b/services/api/lib/load_param.rb
@@ -70,7 +70,7 @@ module LoadParam
end
@orders = []
- if params[:order]
+ if (params[:order].is_a?(Array) && !params[:order].empty?) || !params[:order].blank?
od = []
(case params[:order]
when String
@@ -93,6 +93,8 @@ module LoadParam
model_class.columns.collect(&:name).index(attr) and
['asc','desc'].index direction.downcase
@orders << "#{table_name}.#{attr} #{direction.downcase}"
+ elsif attr.match /^([a-z][_a-z0-9]+)\.([a-z][_a-z0-9]+)$/
+ @orders << "#{attr} #{direction.downcase}"
end
end
end
commit 3103c676533ec17bed96cf38a264a2415534499a
Merge: 0c6b792 6b19642
Author: Phil Hodgson <bitbucket at philhodgson.net>
Date: Mon Oct 6 15:12:55 2014 -0400
Merge branch 'master' into 3618-column-ordering
commit 0c6b79271aa6cc8cf4f3b125a9d7a7f5645b027b
Merge: c6b1493 78ae561
Author: Phil Hodgson <bitbucket at philhodgson.net>
Date: Mon Oct 6 14:53:32 2014 -0400
Merge branch '3634-tab-state'
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list