[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