[ARVADOS] created: dca6cfe9750d8d1be4f3b63895b8cb73cc6c4cfe

git at public.curoverse.com git at public.curoverse.com
Fri May 2 15:55:00 EDT 2014


        at  dca6cfe9750d8d1be4f3b63895b8cb73cc6c4cfe (commit)


commit dca6cfe9750d8d1be4f3b63895b8cb73cc6c4cfe
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Fri May 2 15:54:45 2014 -0400

    Fixed botched 'distinct' parameter, now is a boolean instead of taking a
    column.  New tests.  Also changed syntax of 'order' to take a JSON array for
    consistency with 'filters' and 'select'.

diff --git a/apps/workbench/app/controllers/users_controller.rb b/apps/workbench/app/controllers/users_controller.rb
index 8638761..5cfa487 100644
--- a/apps/workbench/app/controllers/users_controller.rb
+++ b/apps/workbench/app/controllers/users_controller.rb
@@ -74,7 +74,7 @@ class UsersController < ApplicationController
       storage_log = Log.
         filter([[:object_uuid, '=', u.uuid],
                 [:event_type, '=', 'user-storage-report']]).
-        order(:created_at => :desc).
+        order(['created_at desc']).
         limit(1)
       storage_log.each do |log_entry|
         # We expect this block to only execute once since we specified limit(1)
@@ -122,12 +122,12 @@ class UsersController < ApplicationController
 
     @my_jobs = Job.
       limit(10).
-      order('created_at desc').
+      order(['created_at desc']).
       where(created_by: current_user.uuid)
 
     @my_collections = Collection.
       limit(10).
-      order('created_at desc').
+      order(['created_at desc']).
       where(created_by: current_user.uuid)
     collection_uuids = @my_collections.collect &:uuid
 
@@ -151,7 +151,7 @@ class UsersController < ApplicationController
 
     @my_pipelines = PipelineInstance.
       limit(10).
-      order('created_at desc').
+      order(['created_at desc']).
       where(created_by: current_user.uuid)
 
     respond_to do |f|
diff --git a/doc/api/methods.html.textile.liquid b/doc/api/methods.html.textile.liquid
index 9078720..3d93e88 100644
--- a/doc/api/methods.html.textile.liquid
+++ b/doc/api/methods.html.textile.liquid
@@ -14,7 +14,7 @@ h2(#index). Index, list, search
 
 <pre>
 GET https://{{ site.arvados_api_host }}/arvados/v1/groups?filters=[["owner_uuid","=","xyzzy-tpzed-a4lcehql0dv2u25"]]
- 
+
 POST https://{{ site.arvados_api_host }}/arvados/v1/groups
 _method=GET
 filters=[["owner_uuid","=","xyzzy-tpzed-a4lcehql0dv2u25"]]
@@ -24,8 +24,12 @@ filters=[["owner_uuid","=","xyzzy-tpzed-a4lcehql0dv2u25"]]
 
 table(table table-bordered table-condensed).
 |*Parameter name*|*Value*|*Description*|
-|limit|integer|Maximum number of resources to return|
-|filters|array|Conditions for selecting resources to return|
+|limit   |integer|Maximum number of resources to return|
+|offset  |integer|Skip the first 'offset' objects|
+|filters |array  |Conditions for selecting resources to return|
+|order   |array  |List of fields to use to determine sorting order for returned objects|
+|select  |array  |Specify which fields to return|
+|distinct|boolean|true: do not return duplicate objects, default; false: permitted to return duplicates|
 
 h2. Create
 
diff --git a/services/api/app/controllers/application_controller.rb b/services/api/app/controllers/application_controller.rb
index 30027c8..4d23b0b 100644
--- a/services/api/app/controllers/application_controller.rb
+++ b/services/api/app/controllers/application_controller.rb
@@ -261,10 +261,10 @@ class ApplicationController < ActionController::Base
     end
 
     @objects = @objects.select(@select.map { |s| "#{table_name}.#{ActiveRecord::Base.connection.quote_column_name s.to_s}" }.join ", ") if @select
-    @objects = @objects.uniq(ActiveRecord::Base.connection.quote_column_name @distinct.to_s) if @distinct
     @objects = @objects.order(@orders.join ", ") if @orders.any?
     @objects = @objects.limit(@limit)
     @objects = @objects.offset(@offset)
+    @objects = @objects.uniq(@distinct) if not @distinct.nil?
   end
 
   def resource_attrs
@@ -444,7 +444,9 @@ class ApplicationController < ActionController::Base
     {
       filters: { type: 'array', required: false },
       where: { type: 'object', required: false },
-      order: { type: 'string', required: false },
+      order: { type: 'array', required: false },
+      select: { type: 'array', required: false },
+      distinct: { type: 'boolean', required: false },
       limit: { type: 'integer', required: false, default: DEFAULT_LIMIT },
       offset: { type: 'integer', required: false, default: 0 },
     }
diff --git a/services/api/app/controllers/arvados/v1/jobs_controller.rb b/services/api/app/controllers/arvados/v1/jobs_controller.rb
index 8ef6acd..b0d93a4 100644
--- a/services/api/app/controllers/arvados/v1/jobs_controller.rb
+++ b/services/api/app/controllers/arvados/v1/jobs_controller.rb
@@ -173,7 +173,7 @@ class Arvados::V1::JobsController < ApplicationController
                     cancelled_at: nil,
                     success: nil
                   })
-    params[:order] ||= 'priority desc, created_at'
+    params[:order] ||= ['priority desc', 'created_at']
     find_objects_for_index
     index
   end
diff --git a/services/api/app/controllers/arvados/v1/schema_controller.rb b/services/api/app/controllers/arvados/v1/schema_controller.rb
index a0f4fce..1db5eff 100644
--- a/services/api/app/controllers/arvados/v1/schema_controller.rb
+++ b/services/api/app/controllers/arvados/v1/schema_controller.rb
@@ -238,8 +238,8 @@ class Arvados::V1::SchemaController < ApplicationController
                   location: "query"
                 },
                 distinct: {
-                  type: "string",
-                  description: "Return each distinct value exactly once for the specified column (may skip rows)",
+                  type: "boolean",
+                  description: "Return each distinct object",
                   location: "query"
                 }
               },
diff --git a/services/api/lib/load_param.rb b/services/api/lib/load_param.rb
index 69d74f4..11f18f7 100644
--- a/services/api/lib/load_param.rb
+++ b/services/api/lib/load_param.rb
@@ -69,7 +69,18 @@ module LoadParam
 
     @orders = []
     if params[:order]
-      params[:order].split(',').each do |order|
+      od = []
+      (case params[:order]
+       when String
+         od = Oj.load(params[:order])
+         raise unless od.is_a? Array
+         od
+       when Array
+         params[:order]
+       else
+         []
+       end).each do |order|
+        order = order.to_s
         attr, direction = order.strip.split " "
         direction ||= 'asc'
         if attr.match /^[a-z][_a-z0-9]+$/ and
@@ -79,6 +90,7 @@ module LoadParam
         end
       end
     end
+
     if @orders.empty?
       @orders = default_orders
     end
@@ -104,10 +116,8 @@ module LoadParam
       }
     end
 
-    if params[:distinct].is_a? String
-      @distinct = params[:distinct]
-    end
-
+    @distinct = true if (params[:distinct] == true || params[:distinct] == "true")
+    @distinct = false if (params[:distinct] == false || params[:distinct] == "false")
   end
 
 
diff --git a/services/api/test/integration/select_test.rb b/services/api/test/integration/select_test.rb
index 28651f8..cf4d951 100644
--- a/services/api/test/integration/select_test.rb
+++ b/services/api/test/integration/select_test.rb
@@ -5,18 +5,25 @@ class SelectTest < ActionDispatch::IntegrationTest
     get "/arvados/v1/links", {:format => :json, :select => ['uuid', 'link_class']}, auth(:active)
     assert_response :success
     assert_equal json_response['items'].count, json_response['items'].select { |i|
-      i['uuid'] != nil and i['link_class'] != nil and i['head_uuid'] == nil and i['tail_uuid'] == nil
+      i.count == 2 and i['uuid'] != nil and i['link_class'] != nil
     }.count
   end
 
-  test "should only get distinct values" do
-    get "/arvados/v1/links", {:format => :json, :select => ['link_class'], :distinct => "link_class"}, auth(:active)
+  test "fewer distinct than total count" do
+    get "/arvados/v1/links", {:format => :json, :select => ['link_class'], :distinct => false}, auth(:active)
     assert_response :success
-    assert_equal json_response['items'].uniq.count, json_response['items'].count
+    links = json_response['items']
+
+    get "/arvados/v1/links", {:format => :json, :select => ['link_class'], :distinct => true}, auth(:active)
+    assert_response :success
+    distinct = json_response['items']
+
+    assert distinct.count < links.count, "distinct count should be less than link count"
+    assert_equal links.uniq.count, distinct.count
   end
 
   test "select with order" do
-    get "/arvados/v1/links", {:format => :json, :select => ['uuid'], :order => "uuid asc"}, auth(:active)
+    get "/arvados/v1/links", {:format => :json, :select => ['uuid'], :order => ["uuid asc"]}, auth(:active)
     assert_response :success
 
     assert json_response['items'].length > 0
@@ -28,4 +35,26 @@ class SelectTest < ActionDispatch::IntegrationTest
     end
   end
 
+  test "select two columns with order" do
+    get "/arvados/v1/links", {:format => :json, :select => ['link_class', 'uuid'], :order => ['link_class asc', "uuid desc"]}, auth(:active)
+    assert_response :success
+
+    assert json_response['items'].length > 0
+
+    prev_link_class = ""
+    prev_uuid = "zzzzz-zzzzz-zzzzzzzzzzzzzzz"
+
+    json_response['items'].each do |i|
+      if prev_link_class != i['link_class']
+        prev_uuid = "zzzzz-zzzzz-zzzzzzzzzzzzzzz"
+      end
+
+      assert i['link_class'] >= prev_link_class
+      assert i['uuid'] < prev_uuid
+
+      prev_link_class = i['link_class']
+      prev_uuid = i['uuid']
+    end
+  end
+
 end
diff --git a/services/api/test/test_helper.rb b/services/api/test/test_helper.rb
index 869d87f..1bd1b51 100644
--- a/services/api/test/test_helper.rb
+++ b/services/api/test/test_helper.rb
@@ -4,7 +4,7 @@ require 'rails/test_help'
 
 module ArvadosTestSupport
   def json_response
-    @json_response ||= ActiveSupport::JSON.decode @response.body
+    ActiveSupport::JSON.decode @response.body
   end
 
   def api_token(api_client_auth_name)

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list